diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/multiprecision | |
parent | Initial commit. (diff) | |
download | ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.tar.xz ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.zip |
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/multiprecision')
434 files changed, 61591 insertions, 0 deletions
diff --git a/src/boost/libs/multiprecision/README.md b/src/boost/libs/multiprecision/README.md new file mode 100644 index 00000000..c4121aa1 --- /dev/null +++ b/src/boost/libs/multiprecision/README.md @@ -0,0 +1,49 @@ +Boost Multiprecision Library +============================ + + The Multiprecision Library provides integer, rational, floating-point, complex and interval number types in C++ that have more range and + precision than C++'s ordinary built-in types. The big number types in Multiprecision can be used with a wide selection of basic + mathematical operations, elementary transcendental functions as well as the functions in Boost.Math. The Multiprecision types can + also interoperate with the built-in types in C++ using clearly defined conversion rules. This allows Boost.Multiprecision to be + used for all kinds of mathematical calculations involving integer, rational and floating-point types requiring extended range and precision. + +Multiprecision consists of a generic interface to the mathematics of large numbers as well as a selection of big number back ends, with +support for integer, rational and floating-point types. Boost.Multiprecision provides a selection of back ends provided off-the-rack in +including interfaces to GMP, MPFR, MPIR, TomMath as well as its own collection of Boost-licensed, header-only back ends for integers, +rationals, floats and complex. In addition, user-defined back ends can be created and used with the interface of Multiprecision +, provided the class implementation adheres to the necessary concepts. + +Depending upon the number type, precision may be arbitrarily large (limited only by available memory), fixed at compile time +(for example 50 or 100 decimal digits), or a variable controlled at run-time by member functions. The types are expression-template-enabled +for better performance than naive user-defined types. + +The full documentation is available on [boost.org](http://www.boost.org/doc/libs/release/libs/multiprecision/index.html). + +## Support, bugs and feature requests ## + +Bugs and feature requests can be reported through the [Gitub issue tracker](https://github.com/boostorg/multiprecision/issues) +(see [open issues](https://github.com/boostorg/multiprecision/issues) and +[closed issues](https://github.com/boostorg/multiprecision/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aclosed)). + +You can submit your changes through a [pull request](https://github.com/boostorg/multiprecision/pulls). + +There is no mailing-list specific to Boost Multiprecision, although you can use the general-purpose Boost [mailing-list](http://lists.boost.org/mailman/listinfo.cgi/boost-users) using the tag [multiprecision]. + + +## Development ## + +Clone the whole boost project, which includes the individual Boost projects as submodules ([see boost+git doc](https://github.com/boostorg/boost/wiki/Getting-Started)): + + git clone https://github.com/boostorg/boost + cd boost + git submodule update --init + +The Boost Multiprecision Library is located in `libs/multiprecision/`. + +### Running tests ### +First, make sure you are in `libs/multiprecision/test`. +You can either run all the tests listed in `Jamfile.v2` or run a single test: + + ../../../b2 <- run all tests + ../../../b2 test_complex <- single test + diff --git a/src/boost/libs/multiprecision/config/Jamfile.v2 b/src/boost/libs/multiprecision/config/Jamfile.v2 new file mode 100644 index 00000000..ac88473b --- /dev/null +++ b/src/boost/libs/multiprecision/config/Jamfile.v2 @@ -0,0 +1,87 @@ +# copyright John Maddock 2008 +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt. + +import modules ; +import path ; + +local gmp_path = [ modules.peek : GMP_PATH ] ; +local mpfr_path = [ modules.peek : MPFR_PATH ] ; +local mpfi_path = [ modules.peek : MPFI_PATH ] ; +local tommath_path = [ modules.peek : TOMMATH_PATH ] ; + +project : requirements + <include>$(gmp_path) + <include>$(gmp_path)/mpfr + <include>$(gmp_path)/gmpfrxx + <include>$(mpfr_path) + <include>$(mpfi_path) + <include>$(mpfi_path)/src + <include>$(tommath_path) + <include>../../.. + <search>$(gmp_path) + <search>$(mpfr_path) + <search>$(mpfr_path)/build.vc10/lib/Win32/Debug + <search>$(tommath_path) + <search>$(mpfi_path) + <search>$(mpfi_path)/src + # We set these to make it easier to set up and test GMP and MPFR under Win32: + <toolset>msvc:<runtime-link>static + <toolset>msvc:<link>static + <toolset>intel-win:<runtime-link>static + <toolset>intel-win:<link>static + <toolset>msvc:<warnings>all + <toolset>gcc:<cxxflags>-Wall + <toolset>gcc:<cxxflags>-Wextra + ; + +lib gmp ; +lib mpfr ; +lib mpfi ; +lib mpc ; +lib quadmath ; +lib tommath ; + +actions mp_simple_run_action +{ + $(>) > $(<) +} + +rule mp-run-simple ( sources + : args * : input-files * : requirements * : target-name ) +{ + exe $(target-name)_exe : $(sources) : $(requirements) ; + explicit $(target-name)_exe ; + make $(target-name).output : $(target-name)_exe : @mp_simple_run_action ; + explicit $(target-name).output ; + alias $(target-name) : $(target-name).output ; +} + +mp-run-simple has_gmp.cpp gmp : : : + <include>$(gmp_path) <include>$(gmp_path)/mpfr <include>$(gmp_path)/gmpfrxx : has_gmp ; +mp-run-simple has_mpfr.cpp mpfr gmp : : : + <include>$(mpfr_path) <include>$(gmp_path)/mpfr <include>$(gmp_path)/gmpfrxx <include>$(gmp_path) : has_mpfr ; +mp-run-simple has_mpfi.cpp mpfi mpfr gmp : : : + <include>$(mpfr_path) <include>$(gmp_path)/mpfr <include>$(gmp_path)/gmpfrxx <include>$(gmp_path) : has_mpfi ; +mp-run-simple has_mpc.cpp mpc mpfr gmp : : : + <include>$(mpfr_path) <include>$(gmp_path)/mpfr <include>$(gmp_path)/gmpfrxx <include>$(gmp_path) : has_mpc ; +mp-run-simple has_tommath.cpp tommath : : : + <include>$(tommath_path) : has_tommath ; +mp-run-simple has_float128.cpp quadmath : : : : has_float128 ; +exe has_intel_quad : has_intel_quad.cpp : <cxxflags>-Qoption,cpp,--extended_float_type ; +exe has_eigen : has_eigen.cpp ; +obj has_is_constant_evaluated : has_is_constant_evaluated.cpp ; +obj has_constexpr_limits : has_constexpr_limits_cmd.cpp : <cxxflags>-fconstexpr-ops-limit=268435456 ; + +explicit has_gmp ; +explicit has_mpfr ; +explicit has_mpfi ; +explicit has_tommath ; +explicit has_float128 ; +explicit has_intel_quad ; +explicit has_mpc ; +explicit has_eigen ; +explicit has_is_constant_evaluated ; +explicit has_constexpr_limits ; + + diff --git a/src/boost/libs/multiprecision/config/has_constexpr_limits_cmd.cpp b/src/boost/libs/multiprecision/config/has_constexpr_limits_cmd.cpp new file mode 100644 index 00000000..8c96958e --- /dev/null +++ b/src/boost/libs/multiprecision/config/has_constexpr_limits_cmd.cpp @@ -0,0 +1,16 @@ +// Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef __GNUC__ +#error "Compiler is not GCC" +#endif +#if __GNUC__ < 9 +#error "Older GCC versions don't support -fconstexpr-ops-limit" +#endif + +int main() +{ + return 0; +} diff --git a/src/boost/libs/multiprecision/config/has_eigen.cpp b/src/boost/libs/multiprecision/config/has_eigen.cpp new file mode 100644 index 00000000..57d84bae --- /dev/null +++ b/src/boost/libs/multiprecision/config/has_eigen.cpp @@ -0,0 +1,15 @@ +// Copyright John Maddock 2011. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <Eigen/Dense> + +int main() +{ +#if EIGEN_VERSION_AT_LEAST(3, 3, 0) +#else +#error "Obsolete Eigen" +#endif + return 0; +} diff --git a/src/boost/libs/multiprecision/config/has_float128.cpp b/src/boost/libs/multiprecision/config/has_float128.cpp new file mode 100644 index 00000000..f46dbdcc --- /dev/null +++ b/src/boost/libs/multiprecision/config/has_float128.cpp @@ -0,0 +1,23 @@ +// Copyright John Maddock 2013. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/config.hpp> + +#ifndef BOOST_HAS_FLOAT128 +#error "This doesn't work unless Boost.Config enables __float128 support" +#endif + +extern "C" { +#include <quadmath.h> +} + +int main() +{ + __float128 f = -2.0Q; + f = fabsq(f); + f = expq(f); + + return 0; +} diff --git a/src/boost/libs/multiprecision/config/has_gmp.cpp b/src/boost/libs/multiprecision/config/has_gmp.cpp new file mode 100644 index 00000000..196b6e2f --- /dev/null +++ b/src/boost/libs/multiprecision/config/has_gmp.cpp @@ -0,0 +1,33 @@ +// Copyright John Maddock 2008. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <cstddef> // See https://gcc.gnu.org/gcc-4.9/porting_to.html +#include <gmp.h> +#include <boost/config.hpp> + +#ifdef __GNUC__ +#pragma message "__GNU_MP_VERSION=" BOOST_STRINGIZE(__GNU_MP_VERSION) +#pragma message "__GNU_MP_VERSION_MINOR=" BOOST_STRINGIZE(__GNU_MP_VERSION_MINOR) +#endif + +#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2)) +#error "Incompatible GMP version" +#endif + +int main() +{ + void* (*alloc_func_ptr)(size_t); + void* (*realloc_func_ptr)(void*, size_t, size_t); + void (*free_func_ptr)(void*, size_t); + + mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr); + + mpz_t integ; + mpz_init(integ); + if (integ[0]._mp_d) + mpz_clear(integ); + + return 0; +} diff --git a/src/boost/libs/multiprecision/config/has_intel_quad.cpp b/src/boost/libs/multiprecision/config/has_intel_quad.cpp new file mode 100644 index 00000000..e0b23eb0 --- /dev/null +++ b/src/boost/libs/multiprecision/config/has_intel_quad.cpp @@ -0,0 +1,14 @@ +// Copyright John Maddock 2013. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +extern "C" _Quad __fabs(_Quad); + +int main() +{ + _Quad f = -2.0Q; + f = __fabsq(f); + + return 0; +} diff --git a/src/boost/libs/multiprecision/config/has_is_constant_evaluated.cpp b/src/boost/libs/multiprecision/config/has_is_constant_evaluated.cpp new file mode 100644 index 00000000..808c396f --- /dev/null +++ b/src/boost/libs/multiprecision/config/has_is_constant_evaluated.cpp @@ -0,0 +1,10 @@ +// Copyright John Maddock 2013. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/number.hpp> + +#ifdef BOOST_MP_NO_CONSTEXPR_DETECTION +#error 1 +#endif diff --git a/src/boost/libs/multiprecision/config/has_mpc.cpp b/src/boost/libs/multiprecision/config/has_mpc.cpp new file mode 100644 index 00000000..256a70a9 --- /dev/null +++ b/src/boost/libs/multiprecision/config/has_mpc.cpp @@ -0,0 +1,59 @@ +// Copyright John Maddock 2018. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <cstddef> // See https://gcc.gnu.org/gcc-4.9/porting_to.html +#include <mpc.h> +#include <boost/config.hpp> + +#ifdef __GNUC__ +#pragma message "MPFR_VERSION_STRING=" MPFR_VERSION_STRING +#endif + +#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2)) +#error "Incompatible GMP version" +#endif + +#if (MPFR_VERSION < 3) +#error "Incompatible MPFR version" +#endif + +#ifdef __GNUC__ +#pragma message "__GNU_MP_VERSION=" BOOST_STRINGIZE(__GNU_MP_VERSION) +#pragma message "__GNU_MP_VERSION_MINOR=" BOOST_STRINGIZE(__GNU_MP_VERSION_MINOR) +#endif + +#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2)) +#error "Incompatible GMP version" +#endif + +/* +#ifdef __GNUC__ +#pragma message "MPFI_VERSION_MAJOR=" BOOST_STRINGIZE(MPFI_VERSION_MAJOR) +#pragma message "MPFI_VERSION_MAJOR=" BOOST_STRINGIZE(MPFI_VERSION_MAJOR) +#endif + +#if MPFI_VERSION_MAJOR < 1 +#error "Incompatible MPFI version" +#endif +#if (MPFI_VERSION_MAJOR == 1) && (MPFI_VERSION_MINOR < 5) +#error "Incompatible MPFI version" +#endif +*/ +int main() +{ + void* (*alloc_func_ptr)(size_t); + void* (*realloc_func_ptr)(void*, size_t, size_t); + void (*free_func_ptr)(void*, size_t); + + mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr); + + mpfr_buildopt_tls_p(); + + mpc_t t; + mpc_init2(t, 128); + mpc_clear(t); + + return 0; +} diff --git a/src/boost/libs/multiprecision/config/has_mpfi.cpp b/src/boost/libs/multiprecision/config/has_mpfi.cpp new file mode 100644 index 00000000..bc2e9c68 --- /dev/null +++ b/src/boost/libs/multiprecision/config/has_mpfi.cpp @@ -0,0 +1,60 @@ +// Copyright John Maddock 2012. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <cstddef> // See https://gcc.gnu.org/gcc-4.9/porting_to.html +#include <mpfi.h> +#include <boost/config.hpp> + +#ifdef __GNUC__ +#pragma message "MPFR_VERSION_STRING=" MPFR_VERSION_STRING +#endif + +#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2)) +#error "Incompatible GMP version" +#endif + +#if (MPFR_VERSION < 3) +#error "Incompatible MPFR version" +#endif + +#ifdef __GNUC__ +#pragma message "__GNU_MP_VERSION=" BOOST_STRINGIZE(__GNU_MP_VERSION) +#pragma message "__GNU_MP_VERSION_MINOR=" BOOST_STRINGIZE(__GNU_MP_VERSION_MINOR) +#endif + +#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2)) +#error "Incompatible GMP version" +#endif + +/* +#ifdef __GNUC__ +#pragma message "MPFI_VERSION_MAJOR=" BOOST_STRINGIZE(MPFI_VERSION_MAJOR) +#pragma message "MPFI_VERSION_MAJOR=" BOOST_STRINGIZE(MPFI_VERSION_MAJOR) +#endif + +#if MPFI_VERSION_MAJOR < 1 +#error "Incompatible MPFI version" +#endif +#if (MPFI_VERSION_MAJOR == 1) && (MPFI_VERSION_MINOR < 5) +#error "Incompatible MPFI version" +#endif +*/ +int main() +{ + void* (*alloc_func_ptr)(size_t); + void* (*realloc_func_ptr)(void*, size_t, size_t); + void (*free_func_ptr)(void*, size_t); + + mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr); + + mpfr_buildopt_tls_p(); + + mpfi_t t; + mpfi_init2(t, 128); + if (t[0].left._mpfr_d) + mpfi_clear(t); + + return 0; +} diff --git a/src/boost/libs/multiprecision/config/has_mpfr.cpp b/src/boost/libs/multiprecision/config/has_mpfr.cpp new file mode 100644 index 00000000..c82f28d7 --- /dev/null +++ b/src/boost/libs/multiprecision/config/has_mpfr.cpp @@ -0,0 +1,47 @@ +// Copyright John Maddock 2012. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <cstddef> // See https://gcc.gnu.org/gcc-4.9/porting_to.html +#include <mpfr.h> +#include <boost/config.hpp> + +#ifdef __GNUC__ +#pragma message "MPFR_VERSION_STRING=" MPFR_VERSION_STRING +#endif + +#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2)) +#error "Incompatible GMP version" +#endif + +#if (MPFR_VERSION < 3) +#error "Incompatible MPFR version" +#endif + +#ifdef __GNUC__ +#pragma message "__GNU_MP_VERSION=" BOOST_STRINGIZE(__GNU_MP_VERSION) +#pragma message "__GNU_MP_VERSION_MINOR=" BOOST_STRINGIZE(__GNU_MP_VERSION_MINOR) +#endif + +#if (__GNU_MP_VERSION < 4) || ((__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR < 2)) +#error "Incompatible GMP version" +#endif + +int main() +{ + void* (*alloc_func_ptr)(size_t); + void* (*realloc_func_ptr)(void*, size_t, size_t); + void (*free_func_ptr)(void*, size_t); + + mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr); + + mpfr_buildopt_tls_p(); + + mpfr_t t; + mpfr_init2(t, 128); + if (t[0]._mpfr_d) + mpfr_clear(t); + + return 0; +} diff --git a/src/boost/libs/multiprecision/config/has_tommath.cpp b/src/boost/libs/multiprecision/config/has_tommath.cpp new file mode 100644 index 00000000..e5d0a668 --- /dev/null +++ b/src/boost/libs/multiprecision/config/has_tommath.cpp @@ -0,0 +1,15 @@ +// Copyright John Maddock 2011. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <tommath.h> + +int main() +{ + mp_int v; + mp_init(&v); + if (v.dp) + mp_clear(&v); + return 0; +} diff --git a/src/boost/libs/multiprecision/example/Jamfile.v2 b/src/boost/libs/multiprecision/example/Jamfile.v2 new file mode 100644 index 00000000..0e09c848 --- /dev/null +++ b/src/boost/libs/multiprecision/example/Jamfile.v2 @@ -0,0 +1,112 @@ +# \libs\math\example\jamfile.v2 +# Runs multiprecision examples. +# Copyright 2014 John Maddock +# Copyright Paul A. Bristow 2014. +# Copyright Christpher Kormanyos 2014 + +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +# bring in the rules for testing +import testing ; +import modules ; +import path ; +import ../../config/checks/config : requires ; + +local ntl-path = [ modules.peek : NTL_PATH ] ; +local gmp_path = [ modules.peek : GMP_PATH ] ; +local mpfr_path = [ modules.peek : MPFR_PATH ] ; +local mpfi_path = [ modules.peek : MPFI_PATH ] ; +local tommath_path = [ modules.peek : TOMMATH_PATH ] ; + +project + : requirements + <include>$(gmp_path) + <include>$(gmp_path)/mpfr + <include>$(gmp_path)/gmpfrxx + <include>$(mpfr_path) + <include>$(mpfi_path) + <include>$(mpfi_path)/src + <include>$(tommath_path) + <include>../include + <include>../../.. + + <toolset>gcc:<cxxflags>-Wno-missing-braces + + # Assembler error "File too big" caused by lots of C++ templates, for example, math/floating_point_examples.cpp. + # Some projects on some toolsets may require + # <toolset>gcc-mingw:<cxxflags>\"-Wa,-mbig-obj\" + # See https://digitalkarabela.com/mingw-w64-how-to-fix-file-too-big-too-many-sections/ + # <toolset>gcc-mingw:<cxxflags>-Wa,-mbig-obj # Some projects may overflow assembler and require equivalent of MSVC /bigobj. + # Requires version 2.30 of GNU binutils. + # Best applied only to projects that require this, see run math/floating_point_examples.cpp below. + + <toolset>darwin:<cxxflags>-Wno-missing-braces + <toolset>acc:<cxxflags>+W2068,2461,2236,4070 + <toolset>intel:<cxxflags>-Qwd264,239 + <toolset>msvc:<runtime-link>static + <toolset>msvc:<link>static + <toolset>msvc:<warnings>all + <toolset>msvc:<asynch-exceptions>on + <toolset>msvc:<define>_CRT_SECURE_NO_DEPRECATE + <toolset>msvc:<define>_SCL_SECURE_NO_DEPRECATE + <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS + <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS + <toolset>msvc:<cxxflags>/wd4996 + <toolset>msvc:<cxxflags>/wd4512 + <toolset>msvc:<cxxflags>/wd4610 + <toolset>msvc:<cxxflags>/wd4510 + <toolset>msvc:<cxxflags>/wd4127 + <toolset>msvc:<cxxflags>/wd4701 + <toolset>msvc:<cxxflags>/wd4127 + <toolset>msvc:<cxxflags>/wd4305 + ; + +lib gmp : : <search>$(gmp_path) ; +lib mpfr : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug ; +lib mpfi : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug <search>$(mpfi_path) <search>$(mpfi_path)/src ; +lib quadmath ; + +if $(tommath_path) +{ + lib tommath : [ GLOB $(tommath_path) : *.c ] ; + TOMMATH = tommath ; +} +else +{ + lib tommath : : <search>$(tommath_path) ; + TOMMATH = tommath ; +} + +lib no_eh_eg_support : ../test/no_eh_test_support.cpp ; + +test-suite examples : + + [ run cpp_int_snips.cpp no_eh_eg_support ] + [ run cpp_int_import_export.cpp no_eh_eg_support ] + [ run cpp_bin_float_import_export.cpp no_eh_eg_support ] + + [ run cpp_dec_float_snips.cpp no_eh_eg_support ] + + [ run cpp_bin_float_snips.cpp no_eh_eg_support ] + + [ run debug_adaptor_snips.cpp no_eh_eg_support ] + [ run float128_snips.cpp quadmath no_eh_eg_support : : : [ check-target-builds ../config//has_float128 : : <build>no ] ] + + [ run floating_point_examples.cpp no_eh_eg_support : : : <toolset>gcc-mingw:<cxxflags>-Wa,-mbig-obj ] # See note above. + [ run gauss_laguerre_quadrature.cpp no_eh_eg_support : : : release [ requires cxx11_lambdas ] ] + [ run hypergeometric_luke_algorithms.cpp no_eh_eg_support ../../chrono/build//boost_chrono ../../system/build//boost_system : : : [ requires cxx11_nullptr ] ] + [ run integer_examples.cpp no_eh_eg_support ] + [ run logged_adaptor.cpp no_eh_eg_support mpfi mpfr gmp : : : [ check-target-builds ../config//has_mpfi : : <build>no ] ] + [ run mixed_integer_arithmetic.cpp no_eh_eg_support ] + [ run numeric_limits_snips.cpp no_eh_eg_support /boost//test_exec_monitor : : : [ requires cxx11_numeric_limits ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ] + [ run random_snips.cpp gmp no_eh_eg_support : : : [ requires cxx11_explicit_conversion_operators ] [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ run safe_prime.cpp no_eh_eg_support ] + + [ run gmp_snips.cpp gmp no_eh_eg_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ run mpfi_snips.cpp mpfi mpfr gmp no_eh_eg_support : : : [ check-target-builds ../config//has_mpfi : : <build>no ] ] + [ run mpfr_snips.cpp mpfr gmp no_eh_eg_support : : : [ check-target-builds ../config//has_mpfr : : <build>no ] ] + [ run tommath_snips.cpp $(TOMMATH) no_eh_eg_support : : : [ check-target-builds ../config//has_tommath : : <build>no ] ] + [ compile constexpr_float_arithmetic_examples.cpp : [ requires cxx14_constexpr cxx17_if_constexpr ] ] + +; diff --git a/src/boost/libs/multiprecision/example/complex128_examples.cpp b/src/boost/libs/multiprecision/example/complex128_examples.cpp new file mode 100644 index 00000000..49f57d18 --- /dev/null +++ b/src/boost/libs/multiprecision/example/complex128_examples.cpp @@ -0,0 +1,120 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2018 Nick Thompson. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +/*`This example demonstrates the usage of the MPC backend for multiprecision complex numbers. +In the following, we will show how using MPC backend allows for the same operations as the C++ standard library complex numbers. +*/ + +//[complex128_eg +#include <iostream> +#include <complex> +#include <boost/multiprecision/complex128.hpp> + +template<class Complex> +void complex_number_examples() +{ + Complex z1{0, 1}; + std::cout << std::setprecision(std::numeric_limits<typename Complex::value_type>::digits10); + std::cout << std::scientific << std::fixed; + std::cout << "Print a complex number: " << z1 << std::endl; + std::cout << "Square it : " << z1*z1 << std::endl; + std::cout << "Real part : " << z1.real() << " = " << real(z1) << std::endl; + std::cout << "Imaginary part : " << z1.imag() << " = " << imag(z1) << std::endl; + using std::abs; + std::cout << "Absolute value : " << abs(z1) << std::endl; + std::cout << "Argument : " << arg(z1) << std::endl; + std::cout << "Norm : " << norm(z1) << std::endl; + std::cout << "Complex conjugate : " << conj(z1) << std::endl; + std::cout << "Projection onto Riemann sphere: " << proj(z1) << std::endl; + typename Complex::value_type r = 1; + typename Complex::value_type theta = 0.8; + using std::polar; + std::cout << "Polar coordinates (phase = 0) : " << polar(r) << std::endl; + std::cout << "Polar coordinates (phase !=0) : " << polar(r, theta) << std::endl; + + std::cout << "\nElementary special functions:\n"; + using std::exp; + std::cout << "exp(z1) = " << exp(z1) << std::endl; + using std::log; + std::cout << "log(z1) = " << log(z1) << std::endl; + using std::log10; + std::cout << "log10(z1) = " << log10(z1) << std::endl; + using std::pow; + std::cout << "pow(z1, z1) = " << pow(z1, z1) << std::endl; + using std::sqrt; + std::cout << "Take its square root : " << sqrt(z1) << std::endl; + using std::sin; + std::cout << "sin(z1) = " << sin(z1) << std::endl; + using std::cos; + std::cout << "cos(z1) = " << cos(z1) << std::endl; + using std::tan; + std::cout << "tan(z1) = " << tan(z1) << std::endl; + using std::asin; + std::cout << "asin(z1) = " << asin(z1) << std::endl; + using std::acos; + std::cout << "acos(z1) = " << acos(z1) << std::endl; + using std::atan; + std::cout << "atan(z1) = " << atan(z1) << std::endl; + using std::sinh; + std::cout << "sinh(z1) = " << sinh(z1) << std::endl; + using std::cosh; + std::cout << "cosh(z1) = " << cosh(z1) << std::endl; + using std::tanh; + std::cout << "tanh(z1) = " << tanh(z1) << std::endl; + using std::asinh; + std::cout << "asinh(z1) = " << asinh(z1) << std::endl; + using std::acosh; + std::cout << "acosh(z1) = " << acosh(z1) << std::endl; + using std::atanh; + std::cout << "atanh(z1) = " << atanh(z1) << std::endl; +} + +int main() +{ + std::cout << "First, some operations we usually perform with std::complex:\n"; + complex_number_examples<std::complex<double>>(); + std::cout << "\nNow the same operations performed using quad precision complex numbers:\n"; + complex_number_examples<boost::multiprecision::complex128>(); + + return 0; +} +//] + +/* + +//[complex128_out + +Print a complex number: (0.000000000000000000000000000000000,1.000000000000000000000000000000000) +Square it : -1.000000000000000000000000000000000 +Real part : 0.000000000000000000000000000000000 = 0.000000000000000000000000000000000 +Imaginary part : 1.000000000000000000000000000000000 = 1.000000000000000000000000000000000 +Absolute value : 1.000000000000000000000000000000000 +Argument : 1.570796326794896619231321691639751 +Norm : 1.000000000000000000000000000000000 +Complex conjugate : (0.000000000000000000000000000000000,-1.000000000000000000000000000000000) +Projection onto Riemann sphere: (0.000000000000000000000000000000000,1.000000000000000000000000000000000) +Polar coordinates (phase = 0) : 1.000000000000000000000000000000000 +Polar coordinates (phase !=0) : (0.696706709347165389063740022772449,0.717356090899522792567167815703377) + +Elementary special functions: +exp(z1) = (0.540302305868139717400936607442977,0.841470984807896506652502321630299) +log(z1) = (0.000000000000000000000000000000000,1.570796326794896619231321691639751) +log10(z1) = (0.000000000000000000000000000000000,0.682188176920920673742891812715678) +pow(z1, z1) = 0.207879576350761908546955619834979 +Take its square root : (0.707106781186547524400844362104849,0.707106781186547524400844362104849) +sin(z1) = (0.000000000000000000000000000000000,1.175201193643801456882381850595601) +cos(z1) = 1.543080634815243778477905620757061 +tan(z1) = (0.000000000000000000000000000000000,0.761594155955764888119458282604794) +asin(z1) = (0.000000000000000000000000000000000,0.881373587019543025232609324979792) +acos(z1) = (1.570796326794896619231321691639751,-0.881373587019543025232609324979792) +atan(z1) = (0.000000000000000000000000000000000,inf) +sinh(z1) = (0.000000000000000000000000000000000,0.841470984807896506652502321630299) +cosh(z1) = 0.540302305868139717400936607442977 +tanh(z1) = (0.000000000000000000000000000000000,1.557407724654902230506974807458360) +asinh(z1) = (0.000000000000000000000000000000000,1.570796326794896619231321691639751) +acosh(z1) = (0.881373587019543025232609324979792,1.570796326794896619231321691639751) +atanh(z1) = (0.000000000000000000000000000000000,0.785398163397448309615660845819876) +//] +*/ diff --git a/src/boost/libs/multiprecision/example/constexpr_float_arithmetic_examples.cpp b/src/boost/libs/multiprecision/example/constexpr_float_arithmetic_examples.cpp new file mode 100644 index 00000000..ef2c4579 --- /dev/null +++ b/src/boost/libs/multiprecision/example/constexpr_float_arithmetic_examples.cpp @@ -0,0 +1,374 @@ +// (C) Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <iostream> +#include <boost/math/constants/constants.hpp> +#ifdef BOOST_HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif + +//[constexpr_circle + +template <class T> +inline constexpr T circumference(T radius) +{ + return 2 * boost::math::constants::pi<T>() * radius; +} + +template <class T> +inline constexpr T area(T radius) +{ + return boost::math::constants::pi<T>() * radius * radius; +} +//] + +template <class T, unsigned Order> +struct const_polynomial +{ + public: + T data[Order + 1]; + + public: + constexpr const_polynomial(T val = 0) : data{val} {} + constexpr const_polynomial(const std::initializer_list<T>& init) : data{} + { + if (init.size() > Order + 1) + throw std::range_error("Too many initializers in list"); + for (unsigned i = 0; i < init.size(); ++i) + data[i] = init.begin()[i]; + } + constexpr T& operator[](std::size_t N) + { + return data[N]; + } + constexpr const T& operator[](std::size_t N) const + { + return data[N]; + } + template <class U> + constexpr T operator()(U val)const + { + T result = data[Order]; + for (unsigned i = Order; i > 0; --i) + { + result *= val; + result += data[i - 1]; + } + return result; + } + constexpr const_polynomial<T, Order - 1> derivative() const + { + const_polynomial<T, Order - 1> result; + for (unsigned i = 1; i <= Order; ++i) + { + result[i - 1] = (*this)[i] * i; + } + return result; + } + constexpr const_polynomial operator-() + { + const_polynomial t(*this); + for (unsigned i = 0; i <= Order; ++i) + t[i] = -t[i]; + return t; + } + template <class U> + constexpr const_polynomial& operator*=(U val) + { + for (unsigned i = 0; i <= Order; ++i) + data[i] = data[i] * val; + return *this; + } + template <class U> + constexpr const_polynomial& operator/=(U val) + { + for (unsigned i = 0; i <= Order; ++i) + data[i] = data[i] / val; + return *this; + } + template <class U> + constexpr const_polynomial& operator+=(U val) + { + data[0] += val; + return *this; + } + template <class U> + constexpr const_polynomial& operator-=(U val) + { + data[0] -= val; + return *this; + } +}; + +template <class T, unsigned Order1, unsigned Order2> +inline constexpr const_polynomial<T, (Order1 > Order2 ? Order1 : Order2)> operator+(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b) +{ + if + constexpr(Order1 > Order2) + { + const_polynomial<T, Order1> result(a); + for (unsigned i = 0; i <= Order2; ++i) + result[i] += b[i]; + return result; + } + else + { + const_polynomial<T, Order2> result(b); + for (unsigned i = 0; i <= Order1; ++i) + result[i] += a[i]; + return result; + } +} +template <class T, unsigned Order1, unsigned Order2> +inline constexpr const_polynomial<T, (Order1 > Order2 ? Order1 : Order2)> operator-(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b) +{ + if + constexpr(Order1 > Order2) + { + const_polynomial<T, Order1> result(a); + for (unsigned i = 0; i <= Order2; ++i) + result[i] -= b[i]; + return result; + } + else + { + const_polynomial<T, Order2> result(b); + for (unsigned i = 0; i <= Order1; ++i) + result[i] = a[i] - b[i]; + return result; + } +} +template <class T, unsigned Order1, unsigned Order2> +inline constexpr const_polynomial<T, Order1 + Order2> operator*(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b) +{ + const_polynomial<T, Order1 + Order2> result; + for (unsigned i = 0; i <= Order1; ++i) + { + for (unsigned j = 0; j <= Order2; ++j) + { + result[i + j] += a[i] * b[j]; + } + } + return result; +} +template <class T, unsigned Order, class U> +inline constexpr const_polynomial<T, Order> operator*(const const_polynomial<T, Order>& a, const U& b) +{ + const_polynomial<T, Order> result(a); + for (unsigned i = 0; i <= Order; ++i) + { + result[i] *= b; + } + return result; +} +template <class U, class T, unsigned Order> +inline constexpr const_polynomial<T, Order> operator*(const U& b, const const_polynomial<T, Order>& a) +{ + const_polynomial<T, Order> result(a); + for (unsigned i = 0; i <= Order; ++i) + { + result[i] *= b; + } + return result; +} +template <class T, unsigned Order, class U> +inline constexpr const_polynomial<T, Order> operator/(const const_polynomial<T, Order>& a, const U& b) +{ + const_polynomial<T, Order> result; + for (unsigned i = 0; i <= Order; ++i) + { + result[i] /= b; + } + return result; +} + +//[hermite_example +template <class T, unsigned Order> +class hermite_polynomial +{ + const_polynomial<T, Order> m_data; + + public: + constexpr hermite_polynomial() : m_data(hermite_polynomial<T, Order - 1>().data() * const_polynomial<T, 1>{0, 2} - hermite_polynomial<T, Order - 1>().data().derivative()) + { + } + constexpr const const_polynomial<T, Order>& data() const + { + return m_data; + } + constexpr const T& operator[](std::size_t N)const + { + return m_data[N]; + } + template <class U> + constexpr T operator()(U val)const + { + return m_data(val); + } +}; +//] +//[hermite_example2 +template <class T> +class hermite_polynomial<T, 0> +{ + const_polynomial<T, 0> m_data; + + public: + constexpr hermite_polynomial() : m_data{1} {} + constexpr const const_polynomial<T, 0>& data() const + { + return m_data; + } + constexpr const T& operator[](std::size_t N) const + { + return m_data[N]; + } + template <class U> + constexpr T operator()(U val) + { + return m_data(val); + } +}; + +template <class T> +class hermite_polynomial<T, 1> +{ + const_polynomial<T, 1> m_data; + + public: + constexpr hermite_polynomial() : m_data{0, 2} {} + constexpr const const_polynomial<T, 1>& data() const + { + return m_data; + } + constexpr const T& operator[](std::size_t N) const + { + return m_data[N]; + } + template <class U> + constexpr T operator()(U val) + { + return m_data(val); + } +}; +//] + +void test_double() +{ + constexpr double radius = 2.25; + constexpr double c = circumference(radius); + constexpr double a = area(radius); + + std::cout << "Circumference = " << c << std::endl; + std::cout << "Area = " << a << std::endl; + + constexpr const_polynomial<double, 2> pa = {3, 4}; + constexpr const_polynomial<double, 2> pb = {5, 6}; + static_assert(pa[0] == 3); + static_assert(pa[1] == 4); + constexpr auto pc = pa * 2; + static_assert(pc[0] == 6); + static_assert(pc[1] == 8); + constexpr auto pd = 3 * pa; + static_assert(pd[0] == 3 * 3); + static_assert(pd[1] == 4 * 3); + constexpr auto pe = pa + pb; + static_assert(pe[0] == 3 + 5); + static_assert(pe[1] == 4 + 6); + constexpr auto pf = pa - pb; + static_assert(pf[0] == 3 - 5); + static_assert(pf[1] == 4 - 6); + constexpr auto pg = pa * pb; + static_assert(pg[0] == 15); + static_assert(pg[1] == 38); + static_assert(pg[2] == 24); + + constexpr hermite_polynomial<double, 2> h1; + static_assert(h1[0] == -2); + static_assert(h1[1] == 0); + static_assert(h1[2] == 4); + + constexpr hermite_polynomial<double, 3> h3; + static_assert(h3[0] == 0); + static_assert(h3[1] == -12); + static_assert(h3[2] == 0); + static_assert(h3[3] == 8); + + constexpr hermite_polynomial<double, 9> h9; + static_assert(h9[0] == 0); + static_assert(h9[1] == 30240); + static_assert(h9[2] == 0); + static_assert(h9[3] == -80640); + static_assert(h9[4] == 0); + static_assert(h9[5] == 48384); + static_assert(h9[6] == 0); + static_assert(h9[7] == -9216); + static_assert(h9[8] == 0); + static_assert(h9[9] == 512); + + static_assert(h9(0.5) == 6481); + +} + +void test_float128() +{ +#ifdef BOOST_HAS_FLOAT128 + //[constexpr_circle_usage + + using boost::multiprecision::float128; + + constexpr float128 radius = 2.25; + constexpr float128 c = circumference(radius); + constexpr float128 a = area(radius); + + std::cout << "Circumference = " << c << std::endl; + std::cout << "Area = " << a << std::endl; + + //] + + constexpr hermite_polynomial<float128, 2> h1; + static_assert(h1[0] == -2); + static_assert(h1[1] == 0); + static_assert(h1[2] == 4); + + constexpr hermite_polynomial<float128, 3> h3; + static_assert(h3[0] == 0); + static_assert(h3[1] == -12); + static_assert(h3[2] == 0); + static_assert(h3[3] == 8); + + //[hermite_example3 + constexpr hermite_polynomial<float128, 9> h9; + // + // Verify that the polynomial's coefficients match the known values: + // + static_assert(h9[0] == 0); + static_assert(h9[1] == 30240); + static_assert(h9[2] == 0); + static_assert(h9[3] == -80640); + static_assert(h9[4] == 0); + static_assert(h9[5] == 48384); + static_assert(h9[6] == 0); + static_assert(h9[7] == -9216); + static_assert(h9[8] == 0); + static_assert(h9[9] == 512); + // + // Define an abscissa value to evaluate at: + // + constexpr float128 abscissa(0.5); + // + // Evaluate H_9(0.5) using all constexpr arithmetic: + // + static_assert(h9(abscissa) == 6481); + //] +#endif +} + +int main() +{ + test_double(); + test_float128(); + std::cout << "Done!" << std::endl; +} diff --git a/src/boost/libs/multiprecision/example/cpp_bin_float_import_export.cpp b/src/boost/libs/multiprecision/example/cpp_bin_float_import_export.cpp new file mode 100644 index 00000000..3c9bc143 --- /dev/null +++ b/src/boost/libs/multiprecision/example/cpp_bin_float_import_export.cpp @@ -0,0 +1,49 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <iostream> +#include <iomanip> +#include <vector> +#include <iterator> + +// Contains Quickbook snippets in comments. + +//[IE2 + +/*` +Importing or exporting cpp_bin_float is similar, but we must procede via an intermediate integer: +*/ +/*= +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <iostream> +#include <iomanip> +#include <vector> +#include <iterator> +*/ + +int main() +{ + using boost::multiprecision::cpp_bin_float_100; + using boost::multiprecision::cpp_int; + // Create a cpp_bin_float to import/export: + cpp_bin_float_100 f(1); + f /= 3; + // export into 8-bit unsigned values, most significant bit first: + std::vector<unsigned char> v; + export_bits(cpp_int(f.backend().bits()), std::back_inserter(v), 8); + // Grab the exponent as well: + int e = f.backend().exponent(); + // Import back again, and check for equality, we have to procede via + // an intermediate integer: + cpp_int i; + import_bits(i, v.begin(), v.end()); + cpp_bin_float_100 g(i); + g.backend().exponent() = e; + BOOST_ASSERT(f == g); +} + +//] + diff --git a/src/boost/libs/multiprecision/example/cpp_bin_float_snips.cpp b/src/boost/libs/multiprecision/example/cpp_bin_float_snips.cpp new file mode 100644 index 00000000..ac378e05 --- /dev/null +++ b/src/boost/libs/multiprecision/example/cpp_bin_float_snips.cpp @@ -0,0 +1,32 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2013 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +//[cpp_bin_float_eg +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/math/special_functions/gamma.hpp> +#include <iostream> + +int main() +{ + using namespace boost::multiprecision; + + // Operations at fixed precision and full numeric_limits support: + cpp_bin_float_100 b = 2; + std::cout << std::numeric_limits<cpp_bin_float_100>::digits << std::endl; + std::cout << std::numeric_limits<cpp_bin_float_100>::digits10 << std::endl; + // We can use any C++ std lib function, lets print all the digits as well: + std::cout << std::setprecision(std::numeric_limits<cpp_bin_float_100>::max_digits10) + << log(b) << std::endl; // print log(2) + // We can also use any function from Boost.Math: + std::cout << boost::math::tgamma(b) << std::endl; + // These even work when the argument is an expression template: + std::cout << boost::math::tgamma(b * b) << std::endl; + // And since we have an extended exponent range we can generate some really large + // numbers here (4.0238726007709377354370243e+2564): + std::cout << boost::math::tgamma(cpp_bin_float_100(1000)) << std::endl; + return 0; +} + +//] diff --git a/src/boost/libs/multiprecision/example/cpp_complex_examples.cpp b/src/boost/libs/multiprecision/example/cpp_complex_examples.cpp new file mode 100644 index 00000000..7d00cc73 --- /dev/null +++ b/src/boost/libs/multiprecision/example/cpp_complex_examples.cpp @@ -0,0 +1,120 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2018 Nick Thompson. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +/*`This example demonstrates the usage of the MPC backend for multiprecision complex numbers. +In the following, we will show how using MPC backend allows for the same operations as the C++ standard library complex numbers. +*/ + +//[cpp_complex_eg +#include <iostream> +#include <complex> +#include <boost/multiprecision/cpp_complex.hpp> + +template<class Complex> +void complex_number_examples() +{ + Complex z1{0, 1}; + std::cout << std::setprecision(std::numeric_limits<typename Complex::value_type>::digits10); + std::cout << std::scientific << std::fixed; + std::cout << "Print a complex number: " << z1 << std::endl; + std::cout << "Square it : " << z1*z1 << std::endl; + std::cout << "Real part : " << z1.real() << " = " << real(z1) << std::endl; + std::cout << "Imaginary part : " << z1.imag() << " = " << imag(z1) << std::endl; + using std::abs; + std::cout << "Absolute value : " << abs(z1) << std::endl; + std::cout << "Argument : " << arg(z1) << std::endl; + std::cout << "Norm : " << norm(z1) << std::endl; + std::cout << "Complex conjugate : " << conj(z1) << std::endl; + std::cout << "Projection onto Riemann sphere: " << proj(z1) << std::endl; + typename Complex::value_type r = 1; + typename Complex::value_type theta = 0.8; + using std::polar; + std::cout << "Polar coordinates (phase = 0) : " << polar(r) << std::endl; + std::cout << "Polar coordinates (phase !=0) : " << polar(r, theta) << std::endl; + + std::cout << "\nElementary special functions:\n"; + using std::exp; + std::cout << "exp(z1) = " << exp(z1) << std::endl; + using std::log; + std::cout << "log(z1) = " << log(z1) << std::endl; + using std::log10; + std::cout << "log10(z1) = " << log10(z1) << std::endl; + using std::pow; + std::cout << "pow(z1, z1) = " << pow(z1, z1) << std::endl; + using std::sqrt; + std::cout << "Take its square root : " << sqrt(z1) << std::endl; + using std::sin; + std::cout << "sin(z1) = " << sin(z1) << std::endl; + using std::cos; + std::cout << "cos(z1) = " << cos(z1) << std::endl; + using std::tan; + std::cout << "tan(z1) = " << tan(z1) << std::endl; + using std::asin; + std::cout << "asin(z1) = " << asin(z1) << std::endl; + using std::acos; + std::cout << "acos(z1) = " << acos(z1) << std::endl; + using std::atan; + std::cout << "atan(z1) = " << atan(z1) << std::endl; + using std::sinh; + std::cout << "sinh(z1) = " << sinh(z1) << std::endl; + using std::cosh; + std::cout << "cosh(z1) = " << cosh(z1) << std::endl; + using std::tanh; + std::cout << "tanh(z1) = " << tanh(z1) << std::endl; + using std::asinh; + std::cout << "asinh(z1) = " << asinh(z1) << std::endl; + using std::acosh; + std::cout << "acosh(z1) = " << acosh(z1) << std::endl; + using std::atanh; + std::cout << "atanh(z1) = " << atanh(z1) << std::endl; +} + +int main() +{ + std::cout << "First, some operations we usually perform with std::complex:\n"; + complex_number_examples<std::complex<double>>(); + std::cout << "\nNow the same operations performed using quad precision complex numbers:\n"; + complex_number_examples<boost::multiprecision::cpp_complex_quad>(); + + return 0; +} +//] + +/* + +//[cpp_complex_out + +Print a complex number: (0.000000000000000000000000000000000,1.000000000000000000000000000000000) +Square it : -1.000000000000000000000000000000000 +Real part : 0.000000000000000000000000000000000 = 0.000000000000000000000000000000000 +Imaginary part : 1.000000000000000000000000000000000 = 1.000000000000000000000000000000000 +Absolute value : 1.000000000000000000000000000000000 +Argument : 1.570796326794896619231321691639751 +Norm : 1.000000000000000000000000000000000 +Complex conjugate : (0.000000000000000000000000000000000,-1.000000000000000000000000000000000) +Projection onto Riemann sphere: (0.000000000000000000000000000000000,1.000000000000000000000000000000000) +Polar coordinates (phase = 0) : 1.000000000000000000000000000000000 +Polar coordinates (phase !=0) : (0.696706709347165389063740022772448,0.717356090899522792567167815703377) + +Elementary special functions: +exp(z1) = (0.540302305868139717400936607442977,0.841470984807896506652502321630299) +log(z1) = (0.000000000000000000000000000000000,1.570796326794896619231321691639751) +log10(z1) = (0.000000000000000000000000000000000,0.682188176920920673742891812715678) +pow(z1, z1) = 0.207879576350761908546955619834979 +Take its square root : (0.707106781186547524400844362104849,0.707106781186547524400844362104849) +sin(z1) = (0.000000000000000000000000000000000,1.175201193643801456882381850595601) +cos(z1) = 1.543080634815243778477905620757062 +tan(z1) = (0.000000000000000000000000000000000,0.761594155955764888119458282604794) +asin(z1) = (0.000000000000000000000000000000000,0.881373587019543025232609324979793) +acos(z1) = (1.570796326794896619231321691639751,-0.881373587019543025232609324979793) +atan(z1) = (0.000000000000000000000000000000000,inf) +sinh(z1) = (0.000000000000000000000000000000000,0.841470984807896506652502321630299) +cosh(z1) = 0.540302305868139717400936607442977 +tanh(z1) = (0.000000000000000000000000000000000,1.557407724654902230506974807458360) +asinh(z1) = (0.000000000000000000000000000000000,1.570796326794896619231321691639751) +acosh(z1) = (0.881373587019543025232609324979792,1.570796326794896619231321691639751) +atanh(z1) = (0.000000000000000000000000000000000,0.785398163397448309615660845819876) +//] +*/ diff --git a/src/boost/libs/multiprecision/example/cpp_dec_float_snips.cpp b/src/boost/libs/multiprecision/example/cpp_dec_float_snips.cpp new file mode 100644 index 00000000..4bbd89f9 --- /dev/null +++ b/src/boost/libs/multiprecision/example/cpp_dec_float_snips.cpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + + //[cpp_dec_float_eg +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/math/special_functions/gamma.hpp> +#include <iostream> + +int main() +{ + using namespace boost::multiprecision; + + // Operations at fixed precision and full numeric_limits support: + cpp_dec_float_100 b = 2; + std::cout << std::numeric_limits<cpp_dec_float_100>::digits << std::endl; + // Note that digits10 is the same as digits, since we're base 10! : + std::cout << std::numeric_limits<cpp_dec_float_100>::digits10 << std::endl; + // We can use any C++ std lib function, lets print all the digits as well: + std::cout << std::setprecision(std::numeric_limits<cpp_dec_float_100>::max_digits10) + << log(b) << std::endl; // print log(2) + // We can also use any function from Boost.Math: + std::cout << boost::math::tgamma(b) << std::endl; + // These even work when the argument is an expression template: + std::cout << boost::math::tgamma(b * b) << std::endl; + // And since we have an extended exponent range we can generate some really large + // numbers here (4.0238726007709377354370243e+2564): + std::cout << boost::math::tgamma(cpp_dec_float_100(1000)) << std::endl; + return 0; +} +//] + diff --git a/src/boost/libs/multiprecision/example/cpp_int_import_export.cpp b/src/boost/libs/multiprecision/example/cpp_int_import_export.cpp new file mode 100644 index 00000000..0e907118 --- /dev/null +++ b/src/boost/libs/multiprecision/example/cpp_int_import_export.cpp @@ -0,0 +1,43 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> +#include <iostream> +#include <iomanip> +#include <vector> +#include <iterator> + +//[IE1 + +/*` +In this simple example, we'll import/export the bits of a cpp_int +to a vector of 8-bit unsigned values: +*/ +/*= +#include <boost/multiprecision/cpp_int.hpp> +#include <iostream> +#include <iomanip> +#include <vector> +#include <iterator> +*/ + +int main() +{ + using boost::multiprecision::cpp_int; + // Create a cpp_int with just a couple of bits set: + cpp_int i; + bit_set(i, 5000); // set the 5000'th bit + bit_set(i, 200); + bit_set(i, 50); + // export into 8-bit unsigned values, most significant bit first: + std::vector<unsigned char> v; + export_bits(i, std::back_inserter(v), 8); + // import back again, and check for equality: + cpp_int j; + import_bits(j, v.begin(), v.end()); + BOOST_ASSERT(i == j); +} + +//] diff --git a/src/boost/libs/multiprecision/example/cpp_int_snips.cpp b/src/boost/libs/multiprecision/example/cpp_int_snips.cpp new file mode 100644 index 00000000..4175db3f --- /dev/null +++ b/src/boost/libs/multiprecision/example/cpp_int_snips.cpp @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> +#include <iostream> + +void t1() +{ +//[cpp_int_eg +//=#include <boost/multiprecision/cpp_int.hpp> +//=#include <iostream> +//= +//=int main() +//={ + using namespace boost::multiprecision; + + int128_t v = 1; + + // Do some fixed precision arithmetic: + for(unsigned i = 1; i <= 20; ++i) + v *= i; + + std::cout << v << std::endl; // prints 2432902008176640000 (i.e. 20!) + + // Repeat at arbitrary precision: + cpp_int u = 1; + for(unsigned i = 1; i <= 100; ++i) + u *= i; + + // prints 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 (i.e. 100!) + std::cout << u << std::endl; + +//= return 0; +//=} +//] +} + +void t3() +{ +//[cpp_rational_eg +//=#include <boost/multiprecision/cpp_int.hpp> +//=#include <iostream> +//= +//=int main() +//={ + using namespace boost::multiprecision; + + cpp_rational v = 1; + + // Do some arithmetic: + for(unsigned i = 1; i <= 1000; ++i) + v *= i; + v /= 10; + + std::cout << v << std::endl; // prints 1000! / 10 + std::cout << numerator(v) << std::endl; + std::cout << denominator(v) << std::endl; + + cpp_rational w(2, 3); // component wise constructor + std::cout << w << std::endl; // prints 2/3 +//= return 0; +//=} +//] +} + + +int main() +{ + t1(); + t3(); + return 0; +} + diff --git a/src/boost/libs/multiprecision/example/debug_adaptor_snips.cpp b/src/boost/libs/multiprecision/example/debug_adaptor_snips.cpp new file mode 100644 index 00000000..2d0efe9a --- /dev/null +++ b/src/boost/libs/multiprecision/example/debug_adaptor_snips.cpp @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/multiprecision/debug_adaptor.hpp> +#include <iostream> + +void t1() +{ + //[debug_adaptor_eg + //=#include <boost/multiprecision/debug_adaptor.hpp> + //=#include <boost/multiprecision/cpp_dec_float.hpp> + + using namespace boost::multiprecision; + + typedef number<debug_adaptor<cpp_dec_float<50> > > fp_type; + + fp_type denom = 1; + fp_type sum = 1; + + for(unsigned i = 2; i < 50; ++i) + { + denom *= i; + sum += 1 / denom; + } + + std::cout << std::setprecision(std::numeric_limits<fp_type>::digits) << sum << std::endl; + //] +} + +int main() +{ + t1(); + return 0; +} + + + diff --git a/src/boost/libs/multiprecision/example/eigen_example.cpp b/src/boost/libs/multiprecision/example/eigen_example.cpp new file mode 100644 index 00000000..a70e3fbc --- /dev/null +++ b/src/boost/libs/multiprecision/example/eigen_example.cpp @@ -0,0 +1,52 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +//[eigen_eg +#include <iostream> +#include <boost/multiprecision/cpp_complex.hpp> +#include <boost/multiprecision/eigen.hpp> +#include <Eigen/Dense> + +int main() +{ + using namespace Eigen; + typedef boost::multiprecision::cpp_complex_quad complex_type; + // + // We want to solve Ax = b for x, + // define A and b first: + // + Matrix<complex_type, 2, 2> A, b; + A << complex_type(2, 3), complex_type(-1, -2), complex_type(-1, -4), complex_type(3, 6); + b << 1, 2, 3, 1; + std::cout << "Here is the matrix A:\n" << A << std::endl; + std::cout << "Here is the right hand side b:\n" << b << std::endl; + // + // Solve for x: + // + Matrix<complex_type, 2, 2> x = A.fullPivHouseholderQr().solve(b); + std::cout << "The solution is:\n" << x << std::endl; + // + // Compute the error in the solution by using the norms of Ax - b and b: + // + complex_type::value_type relative_error = (A*x - b).norm() / b.norm(); + std::cout << "The relative error is: " << relative_error << std::endl; + return 0; +} +//] + +/* +//[eigen_out +Here is the matrix A: +(2,3) (-1,-2) +(-1,-4) (3,6) +Here is the right hand side b: +1 2 +3 1 +The solution is: +(0.6,-0.6) (0.7,-0.7) +(0.64,-0.68) (0.58,-0.46) +The relative error is: 2.63132e-34 +//] +*/ diff --git a/src/boost/libs/multiprecision/example/float128_snips.cpp b/src/boost/libs/multiprecision/example/float128_snips.cpp new file mode 100644 index 00000000..5d059252 --- /dev/null +++ b/src/boost/libs/multiprecision/example/float128_snips.cpp @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2013 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +//[float128_eg +#include <boost/multiprecision/float128.hpp> +#include <boost/math/special_functions/gamma.hpp> +#include <iostream> + +int main() +{ + using namespace boost::multiprecision; + + // Operations at 128-bit precision and full numeric_limits support: + float128 b = 2; + // There are 113-bits of precision: + std::cout << std::numeric_limits<float128>::digits << std::endl; + // Or 34 decimal places: + std::cout << std::numeric_limits<float128>::digits10 << std::endl; + // We can use any C++ std lib function, lets print all the digits as well: + std::cout << std::setprecision(std::numeric_limits<float128>::max_digits10) + << log(b) << std::endl; // print log(2) = 0.693147180559945309417232121458176575 + // We can also use any function from Boost.Math: + std::cout << boost::math::tgamma(b) << std::endl; + // And since we have an extended exponent range we can generate some really large + // numbers here (4.02387260077093773543702433923004111e+2564): + std::cout << boost::math::tgamma(float128(1000)) << std::endl; + // + // We can declare constants using GCC or Intel's native types, and the Q suffix, + // these can be declared constexpr if required: + /*<-*/ +#ifndef BOOST_NO_CXX11_CONSTEXPR + /*->*/ + constexpr float128 pi = 3.1415926535897932384626433832795028841971693993751058Q; + /*<-*/ +#endif + /*->*/ + return 0; +} +//] + diff --git a/src/boost/libs/multiprecision/example/floating_point_examples.cpp b/src/boost/libs/multiprecision/example/floating_point_examples.cpp new file mode 100644 index 00000000..f34e278f --- /dev/null +++ b/src/boost/libs/multiprecision/example/floating_point_examples.cpp @@ -0,0 +1,697 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/math/constants/constants.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/math/special_functions/gamma.hpp> +#include <boost/math/special_functions/bessel.hpp> +#include <iostream> +#include <iomanip> + +#if !defined(BOOST_NO_CXX11_HDR_ARRAY) && !defined(BOOST_NO_CXX11_LAMBDAS) && !(defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && defined(_WIN32)) + +#include <array> + +//[AOS1 + +/*`Generic numeric programming employs templates to use the same code for different +floating-point types and functions. Consider the area of a circle a of radius r, given by + +[:['a = [pi] * r[super 2]]] + +The area of a circle can be computed in generic programming using Boost.Math +for the constant [pi] as shown below: + +*/ + +//=#include <boost/math/constants/constants.hpp> + +template<typename T> +inline T area_of_a_circle(T r) +{ + using boost::math::constants::pi; + return pi<T>() * r * r; +} + +/*` +It is possible to use `area_of_a_circle()` with built-in floating-point types as +well as floating-point types from Boost.Multiprecision. In particular, consider a +system with 4-byte single-precision float, 8-byte double-precision double and also the +`cpp_dec_float_50` data type from Boost.Multiprecision with 50 decimal digits +of precision. + +We can compute and print the approximate area of a circle with radius 123/100 for +`float`, `double` and `cpp_dec_float_50` with the program below. + +*/ + +//] + +//[AOS3 + +/*`In the next example we'll look at calling both standard library and Boost.Math functions from within generic code. +We'll also show how to cope with template arguments which are expression-templates rather than number types.*/ + +//] + +//[JEL + +/*` +In this example we'll show several implementations of the +[@http://mathworld.wolfram.com/LambdaFunction.html Jahnke and Emden Lambda function], +each implementation a little more sophisticated than the last. + +The Jahnke-Emden Lambda function is defined by the equation: + +[:['JahnkeEmden(v, z) = [Gamma](v+1) * J[sub v](z) / (z / 2)[super v]]] + +If we were to implement this at double precision using Boost.Math's facilities for the Gamma and Bessel +function calls it would look like this: + +*/ + +double JEL1(double v, double z) +{ + return boost::math::tgamma(v + 1) * boost::math::cyl_bessel_j(v, z) / std::pow(z / 2, v); +} + +/*` +Calling this function as: + + std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::digits10); + std::cout << JEL1(2.5, 0.5) << std::endl; + +Yields the output: + +[pre 9.822663964796047e-001] + +Now let's implement the function again, but this time using the multiprecision type +`cpp_dec_float_50` as the argument type: + +*/ + +boost::multiprecision::cpp_dec_float_50 + JEL2(boost::multiprecision::cpp_dec_float_50 v, boost::multiprecision::cpp_dec_float_50 z) +{ + return boost::math::tgamma(v + 1) * boost::math::cyl_bessel_j(v, z) / boost::multiprecision::pow(z / 2, v); +} + +/*` +The implementation is almost the same as before, but with one key difference - we can no longer call +`std::pow`, instead we must call the version inside the `boost::multiprecision` namespace. In point of +fact, we could have omitted the namespace prefix on the call to `pow` since the right overload would +have been found via [@http://en.wikipedia.org/wiki/Argument-dependent_name_lookup +argument dependent lookup] in any case. + +Note also that the first argument to `pow` along with the argument to `tgamma` in the above code +are actually expression templates. The `pow` and `tgamma` functions will handle these arguments +just fine. + +Here's an example of how the function may be called: + + std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10); + std::cout << JEL2(cpp_dec_float_50(2.5), cpp_dec_float_50(0.5)) << std::endl; + +Which outputs: + +[pre 9.82266396479604757017335009796882833995903762577173e-01] + +Now that we've seen some non-template examples, lets repeat the code again, but this time as a template +that can be called either with a builtin type (`float`, `double` etc), or with a multiprecision type: + +*/ + +template <class Float> +Float JEL3(Float v, Float z) +{ + using std::pow; + return boost::math::tgamma(v + 1) * boost::math::cyl_bessel_j(v, z) / pow(z / 2, v); +} + +/*` + +Once again the code is almost the same as before, but the call to `pow` has changed yet again. +We need the call to resolve to either `std::pow` (when the argument is a builtin type), or +to `boost::multiprecision::pow` (when the argument is a multiprecision type). We do that by +making the call unqualified so that versions of `pow` defined in the same namespace as type +`Float` are found via argument dependent lookup, while the `using std::pow` directive makes +the standard library versions visible for builtin floating point types. + +Let's call the function with both `double` and multiprecision arguments: + + std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::digits10); + std::cout << JEL3(2.5, 0.5) << std::endl; + std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10); + std::cout << JEL3(cpp_dec_float_50(2.5), cpp_dec_float_50(0.5)) << std::endl; + +Which outputs: + +[pre +9.822663964796047e-001 +9.82266396479604757017335009796882833995903762577173e-01 +] + +Unfortunately there is a problem with this version: if we were to call it like this: + + boost::multiprecision::cpp_dec_float_50 v(2), z(0.5); + JEL3(v + 0.5, z); + +Then we would get a long and inscrutable error message from the compiler: the problem here is that the first +argument to `JEL3` is not a number type, but an expression template. We could obviously add a typecast to +fix the issue: + + JEL(cpp_dec_float_50(v + 0.5), z); + +However, if we want the function JEL to be truly reusable, then a better solution might be preferred. +To achieve this we can borrow some code from Boost.Math which calculates the return type of mixed-argument +functions, here's how the new code looks now: + +*/ + +template <class Float1, class Float2> +typename boost::math::tools::promote_args<Float1, Float2>::type + JEL4(Float1 v, Float2 z) +{ + using std::pow; + return boost::math::tgamma(v + 1) * boost::math::cyl_bessel_j(v, z) / pow(z / 2, v); +} + +/*` + +As you can see the two arguments to the function are now separate template types, and +the return type is computed using the `promote_args` metafunction from Boost.Math. + +Now we can call: + + std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_100>::digits10); + std::cout << JEL4(cpp_dec_float_100(2) + 0.5, cpp_dec_float_100(0.5)) << std::endl; + +And get 100 digits of output: + +[pre 9.8226639647960475701733500979688283399590376257717309069410413822165082248153638454147004236848917775e-01] + +As a bonus, we can now call the function not just with expression templates, but with other mixed types as well: +for example `float` and `double` or `int` and `double`, and the correct return type will be computed in each case. + +Note that while in this case we didn't have to change the body of the function, in the general case +any function like this which creates local variables internally would have to use `promote_args` +to work out what type those variables should be, for example: + + template <class Float1, class Float2> + typename boost::math::tools::promote_args<Float1, Float2>::type + JEL5(Float1 v, Float2 z) + { + using std::pow; + typedef typename boost::math::tools::promote_args<Float1, Float2>::type variable_type; + variable_type t = pow(z / 2, v); + return boost::math::tgamma(v + 1) * boost::math::cyl_bessel_j(v, z) / t; + } + +*/ + +//] + +//[ND1 + +/*` +In this example we'll add even more power to generic numeric programming using not only different +floating-point types but also function objects as template parameters. Consider +some well-known central difference rules for numerically computing the first derivative +of a function ['f[prime](x)] with ['x [isin] [real]]: + +[equation floating_point_eg1] + +Where the difference terms ['m[sub n]] are given by: + +[equation floating_point_eg2] + +and ['dx] is the step-size of the derivative. + +The third formula in Equation 1 is a three-point central difference rule. It calculates +the first derivative of ['f[prime](x)] to ['O(dx[super 6])], where ['dx] is the given step-size. +For example, if +the step-size is 0.01 this derivative calculation has about 6 decimal digits of precision - +just about right for the 7 decimal digits of single-precision float. +Let's make a generic template subroutine using this three-point central difference +rule. In particular: +*/ + +template<typename value_type, typename function_type> + value_type derivative(const value_type x, const value_type dx, function_type func) +{ + // Compute d/dx[func(*first)] using a three-point + // central difference rule of O(dx^6). + + const value_type dx1 = dx; + const value_type dx2 = dx1 * 2; + const value_type dx3 = dx1 * 3; + + const value_type m1 = (func(x + dx1) - func(x - dx1)) / 2; + const value_type m2 = (func(x + dx2) - func(x - dx2)) / 4; + const value_type m3 = (func(x + dx3) - func(x - dx3)) / 6; + + const value_type fifteen_m1 = 15 * m1; + const value_type six_m2 = 6 * m2; + const value_type ten_dx1 = 10 * dx1; + + return ((fifteen_m1 - six_m2) + m3) / ten_dx1; +} + +/*`The `derivative()` template function can be used to compute the first derivative +of any function to ['O(dx[super 6])]. For example, consider the first derivative of ['sin(x)] evaluated +at ['x = [pi]/3]. In other words, + +[equation floating_point_eg3] + +The code below computes the derivative in Equation 3 for float, double and boost's +multiple-precision type cpp_dec_float_50. +*/ + +//] + +//[GI1 + +/*` +Similar to the generic derivative example, we can calculate integrals in a similar manner: +*/ + +template<typename value_type, typename function_type> +inline value_type integral(const value_type a, + const value_type b, + const value_type tol, + function_type func) +{ + unsigned n = 1U; + + value_type h = (b - a); + value_type I = (func(a) + func(b)) * (h / 2); + + for(unsigned k = 0U; k < 8U; k++) + { + h /= 2; + + value_type sum(0); + for(unsigned j = 1U; j <= n; j++) + { + sum += func(a + (value_type((j * 2) - 1) * h)); + } + + const value_type I0 = I; + I = (I / 2) + (h * sum); + + const value_type ratio = I0 / I; + const value_type delta = ratio - 1; + const value_type delta_abs = ((delta < 0) ? -delta : delta); + + if((k > 1U) && (delta_abs < tol)) + { + break; + } + + n *= 2U; + } + + return I; +} + +/*` +The following sample program shows how the function can be called, we begin +by defining a function object, which when integrated should yield the Bessel J +function: +*/ + +template<typename value_type> +class cyl_bessel_j_integral_rep +{ +public: + cyl_bessel_j_integral_rep(const unsigned N, + const value_type& X) : n(N), x(X) { } + + value_type operator()(const value_type& t) const + { + // pi * Jn(x) = Int_0^pi [cos(x * sin(t) - n*t) dt] + return cos(x * sin(t) - (n * t)); + } + +private: + const unsigned n; + const value_type x; +}; + + +//] + +//[POLY + +/*` +In this example we'll look at polynomial evaluation, this is not only an important +use case, but it's one that `number` performs particularly well at because the +expression templates ['completely eliminate all temporaries] from a +[@http://en.wikipedia.org/wiki/Horner%27s_method Horner polynomial +evaluation scheme]. + +The following code evaluates `sin(x)` as a polynomial, accurate to at least 64 decimal places: + +*/ + +using boost::multiprecision::cpp_dec_float; +typedef boost::multiprecision::number<cpp_dec_float<64> > mp_type; + +mp_type mysin(const mp_type& x) +{ + // Approximation of sin(x * pi/2) for -1 <= x <= 1, using an order 63 polynomial. + static const std::array<mp_type, 32U> coefs = + {{ + mp_type("+1.5707963267948966192313216916397514420985846996875529104874722961539082031431044993140174126711"), //"), + mp_type("-0.64596409750624625365575656389794573337969351178927307696134454382929989411386887578263960484"), // ^3 + mp_type("+0.07969262624616704512050554949047802252091164235106119545663865720995702920146198554317279"), // ^5 + mp_type("-0.0046817541353186881006854639339534378594950280185010575749538605102665157913157426229824"), // ^7 + mp_type("+0.00016044118478735982187266087016347332970280754062061156858775174056686380286868007443"), // ^9 + mp_type("-3.598843235212085340458540018208389404888495232432127661083907575106196374913134E-6"), // ^11 + mp_type("+5.692172921967926811775255303592184372902829756054598109818158853197797542565E-8"), // ^13 + mp_type("-6.688035109811467232478226335783138689956270985704278659373558497256423498E-10"), // ^15 + mp_type("+6.066935731106195667101445665327140070166203261129845646380005577490472E-12"), // ^17 + mp_type("-4.377065467313742277184271313776319094862897030084226361576452003432E-14"), // ^19 + mp_type("+2.571422892860473866153865950420487369167895373255729246889168337E-16"), // ^21 + mp_type("-1.253899540535457665340073300390626396596970180355253776711660E-18"), // ^23 + mp_type("+5.15645517658028233395375998562329055050964428219501277474E-21"), // ^25 + mp_type("-1.812399312848887477410034071087545686586497030654642705E-23"), // ^27 + mp_type("+5.50728578652238583570585513920522536675023562254864E-26"), // ^29 + mp_type("-1.461148710664467988723468673933026649943084902958E-28"), // ^31 + mp_type("+3.41405297003316172502972039913417222912445427E-31"), // ^33 + mp_type("-7.07885550810745570069916712806856538290251E-34"), // ^35 + mp_type("+1.31128947968267628970845439024155655665E-36"), // ^37 + mp_type("-2.18318293181145698535113946654065918E-39"), // ^39 + mp_type("+3.28462680978498856345937578502923E-42"), // ^41 + mp_type("-4.48753699028101089490067137298E-45"), // ^43 + mp_type("+5.59219884208696457859353716E-48"), // ^45 + mp_type("-6.38214503973500471720565E-51"), // ^47 + mp_type("+6.69528558381794452556E-54"), // ^49 + mp_type("-6.47841373182350206E-57"), // ^51 + mp_type("+5.800016389666445E-60"), // ^53 + mp_type("-4.818507347289E-63"), // ^55 + mp_type("+3.724683686E-66"), // ^57 + mp_type("-2.6856479E-69"), // ^59 + mp_type("+1.81046E-72"), // ^61 + mp_type("-1.133E-75"), // ^63 + }}; + + const mp_type v = x * 2 / boost::math::constants::pi<mp_type>(); + const mp_type x2 = (v * v); + // + // Polynomial evaluation follows, if mp_type allocates memory then + // just one such allocation occurs - to initialize the variable "sum" - + // and no temporaries are created at all. + // + const mp_type sum = ((((((((((((((((((((((((((((((( + coefs[31U] + * x2 + coefs[30U]) + * x2 + coefs[29U]) + * x2 + coefs[28U]) + * x2 + coefs[27U]) + * x2 + coefs[26U]) + * x2 + coefs[25U]) + * x2 + coefs[24U]) + * x2 + coefs[23U]) + * x2 + coefs[22U]) + * x2 + coefs[21U]) + * x2 + coefs[20U]) + * x2 + coefs[19U]) + * x2 + coefs[18U]) + * x2 + coefs[17U]) + * x2 + coefs[16U]) + * x2 + coefs[15U]) + * x2 + coefs[14U]) + * x2 + coefs[13U]) + * x2 + coefs[12U]) + * x2 + coefs[11U]) + * x2 + coefs[10U]) + * x2 + coefs[9U]) + * x2 + coefs[8U]) + * x2 + coefs[7U]) + * x2 + coefs[6U]) + * x2 + coefs[5U]) + * x2 + coefs[4U]) + * x2 + coefs[3U]) + * x2 + coefs[2U]) + * x2 + coefs[1U]) + * x2 + coefs[0U]) + * v; + + return sum; +} + +/*` +Calling the function like so: + + mp_type pid4 = boost::math::constants::pi<mp_type>() / 4; + std::cout << std::setprecision(std::numeric_limits< ::mp_type>::digits10) << std::scientific; + std::cout << mysin(pid4) << std::endl; + +Yields the expected output: + +[pre 7.0710678118654752440084436210484903928483593768847403658833986900e-01] + +*/ + +//] + + +int main() +{ + using namespace boost::multiprecision; + std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::digits10); + std::cout << JEL1(2.5, 0.5) << std::endl; + std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10); + std::cout << JEL2(cpp_dec_float_50(2.5), cpp_dec_float_50(0.5)) << std::endl; + std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::digits10); + std::cout << JEL3(2.5, 0.5) << std::endl; + std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10); + std::cout << JEL3(cpp_dec_float_50(2.5), cpp_dec_float_50(0.5)) << std::endl; + std::cout << std::scientific << std::setprecision(std::numeric_limits<cpp_dec_float_100>::digits10); + std::cout << JEL4(cpp_dec_float_100(2) + 0.5, cpp_dec_float_100(0.5)) << std::endl; + + //[AOS2 + +/*=#include <iostream> +#include <iomanip> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using boost::multiprecision::cpp_dec_float_50; + +int main(int, char**) +{*/ + const float r_f(float(123) / 100); + const float a_f = area_of_a_circle(r_f); + + const double r_d(double(123) / 100); + const double a_d = area_of_a_circle(r_d); + + const cpp_dec_float_50 r_mp(cpp_dec_float_50(123) / 100); + const cpp_dec_float_50 a_mp = area_of_a_circle(r_mp); + + // 4.75292 + std::cout + << std::setprecision(std::numeric_limits<float>::digits10) + << a_f + << std::endl; + + // 4.752915525616 + std::cout + << std::setprecision(std::numeric_limits<double>::digits10) + << a_d + << std::endl; + + // 4.7529155256159981904701331745635599135018975843146 + std::cout + << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10) + << a_mp + << std::endl; +/*=}*/ + + //] + + //[ND2 +/*= +#include <iostream> +#include <iomanip> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/math/constants/constants.hpp> + + +int main(int, char**) +{*/ + using boost::math::constants::pi; + using boost::multiprecision::cpp_dec_float_50; + // + // We'll pass a function pointer for the function object passed to derivative, + // the typecast is needed to select the correct overload of std::sin: + // + const float d_f = derivative( + pi<float>() / 3, + 0.01F, + static_cast<float(*)(float)>(std::sin) + ); + + const double d_d = derivative( + pi<double>() / 3, + 0.001, + static_cast<double(*)(double)>(std::sin) + ); + // + // In the cpp_dec_float_50 case, the sin function is multiply overloaded + // to handle expression templates etc. As a result it's hard to take its + // address without knowing about its implementation details. We'll use a + // C++11 lambda expression to capture the call. + // We also need a typecast on the first argument so we don't accidentally pass + // an expression template to a template function: + // + const cpp_dec_float_50 d_mp = derivative( + cpp_dec_float_50(pi<cpp_dec_float_50>() / 3), + cpp_dec_float_50(1.0E-9), + [](const cpp_dec_float_50& x) -> cpp_dec_float_50 + { + return sin(x); + } + ); + + // 5.000029e-001 + std::cout + << std::setprecision(std::numeric_limits<float>::digits10) + << d_f + << std::endl; + + // 4.999999999998876e-001 + std::cout + << std::setprecision(std::numeric_limits<double>::digits10) + << d_d + << std::endl; + + // 4.99999999999999999999999999999999999999999999999999e-01 + std::cout + << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10) + << d_mp + << std::endl; +//=} + + /*` + The expected value of the derivative is 0.5. This central difference rule in this + example is ill-conditioned, meaning it suffers from slight loss of precision. With that + in mind, the results agree with the expected value of 0.5.*/ + + //] + + //[ND3 + + /*` + We can take this a step further and use our derivative function to compute + a partial derivative. For example if we take the incomplete gamma function + ['P(a, z)], and take the derivative with respect to /z/ at /(2,2)/ then we + can calculate the result as shown below, for good measure we'll compare with + the "correct" result obtained from a call to ['gamma_p_derivative], the results + agree to approximately 44 digits: + */ + + cpp_dec_float_50 gd = derivative( + cpp_dec_float_50(2), + cpp_dec_float_50(1.0E-9), + [](const cpp_dec_float_50& x) ->cpp_dec_float_50 + { + return boost::math::gamma_p(2, x); + } + ); + // 2.70670566473225383787998989944968806815263091819151e-01 + std::cout + << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10) + << gd + << std::endl; + // 2.70670566473225383787998989944968806815253190143120e-01 + std::cout << boost::math::gamma_p_derivative(cpp_dec_float_50(2), cpp_dec_float_50(2)) << std::endl; + //] + + //[GI2 + + /* The function can now be called as follows: */ +/*=int main(int, char**) +{*/ + using boost::math::constants::pi; + typedef boost::multiprecision::cpp_dec_float_50 mp_type; + + const float j2_f = + integral(0.0F, + pi<float>(), + 0.01F, + cyl_bessel_j_integral_rep<float>(2U, 1.23F)) / pi<float>(); + + const double j2_d = + integral(0.0, + pi<double>(), + 0.0001, + cyl_bessel_j_integral_rep<double>(2U, 1.23)) / pi<double>(); + + const mp_type j2_mp = + integral(mp_type(0), + pi<mp_type>(), + mp_type(1.0E-20), + cyl_bessel_j_integral_rep<mp_type>(2U, mp_type(123) / 100)) / pi<mp_type>(); + + // 0.166369 + std::cout + << std::setprecision(std::numeric_limits<float>::digits10) + << j2_f + << std::endl; + + // 0.166369383786814 + std::cout + << std::setprecision(std::numeric_limits<double>::digits10) + << j2_d + << std::endl; + + // 0.16636938378681407351267852431513159437103348245333 + std::cout + << std::setprecision(std::numeric_limits<mp_type>::digits10) + << j2_mp + << std::endl; + + // + // Print true value for comparison: + // 0.166369383786814073512678524315131594371033482453329 + std::cout << boost::math::cyl_bessel_j(2, mp_type(123) / 100) << std::endl; +//=} + + //] + + std::cout << std::setprecision(std::numeric_limits< ::mp_type>::digits10) << std::scientific; + std::cout << mysin(boost::math::constants::pi< ::mp_type>() / 4) << std::endl; + std::cout << boost::multiprecision::sin(boost::math::constants::pi< ::mp_type>() / 4) << std::endl; + + return 0; +} + +/* + +Program output: + +9.822663964796047e-001 +9.82266396479604757017335009796882833995903762577173e-01 +9.822663964796047e-001 +9.82266396479604757017335009796882833995903762577173e-01 +9.8226639647960475701733500979688283399590376257717309069410413822165082248153638454147004236848917775e-01 +4.752916e+000 +4.752915525615998e+000 +4.75291552561599819047013317456355991350189758431460e+00 +5.000029e-001 +4.999999999998876e-001 +4.99999999999999999999999999999999999999999999999999e-01 +2.70670566473225383787998989944968806815263091819151e-01 +2.70670566473225383787998989944968806815253190143120e-01 +7.0710678118654752440084436210484903928483593768847403658833986900e-01 +7.0710678118654752440084436210484903928483593768847403658833986900e-01 +*/ + +#else + +int main() { return 0; } + +#endif diff --git a/src/boost/libs/multiprecision/example/gauss_laguerre_quadrature.cpp b/src/boost/libs/multiprecision/example/gauss_laguerre_quadrature.cpp new file mode 100644 index 00000000..1ac329a4 --- /dev/null +++ b/src/boost/libs/multiprecision/example/gauss_laguerre_quadrature.cpp @@ -0,0 +1,521 @@ +// Copyright Nick Thompson, 2017 +// Copyright John Maddock 2017 +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <cmath> +#include <cstdint> +#include <functional> +#include <iomanip> +#include <iostream> +#include <numeric> +#include <boost/math/constants/constants.hpp> +#include <boost/math/special_functions/cbrt.hpp> +#include <boost/math/special_functions/factorials.hpp> +#include <boost/math/special_functions/gamma.hpp> +#include <boost/math/tools/roots.hpp> +#include <boost/noncopyable.hpp> + +#define CPP_BIN_FLOAT 1 +#define CPP_DEC_FLOAT 2 +#define CPP_MPFR_FLOAT 3 + +//#define MP_TYPE CPP_BIN_FLOAT +#define MP_TYPE CPP_DEC_FLOAT +//#define MP_TYPE CPP_MPFR_FLOAT + +namespace +{ + struct digits_characteristics + { + static const int digits10 = 300; + static const int guard_digits = 6; + }; +} + +#if (MP_TYPE == CPP_BIN_FLOAT) + #include <boost/multiprecision/cpp_bin_float.hpp> + namespace mp = boost::multiprecision; + typedef mp::number<mp::cpp_bin_float<digits_characteristics::digits10 + digits_characteristics::guard_digits>, mp::et_off> mp_type; +#elif (MP_TYPE == CPP_DEC_FLOAT) + #include <boost/multiprecision/cpp_dec_float.hpp> + namespace mp = boost::multiprecision; + typedef mp::number<mp::cpp_dec_float<digits_characteristics::digits10 + digits_characteristics::guard_digits>, mp::et_off> mp_type; +#elif (MP_TYPE == CPP_MPFR_FLOAT) + #include <boost/multiprecision/mpfr.hpp> + namespace mp = boost::multiprecision; + typedef mp::number<mp::mpfr_float_backend<digits_characteristics::digits10 + digits_characteristics::guard_digits>, mp::et_off> mp_type; +#else +#error MP_TYPE is undefined +#endif + +template<typename T> +class laguerre_function_object +{ +public: + laguerre_function_object(const int n, const T a) : order(n), + alpha(a), + p1 (0), + d2 (0) { } + + laguerre_function_object(const laguerre_function_object& other) : order(other.order), + alpha(other.alpha), + p1 (other.p1), + d2 (other.d2) { } + + ~laguerre_function_object() { } + + T operator()(const T& x) const + { + // Calculate (via forward recursion): + // * the value of the Laguerre function L(n, alpha, x), called (p2), + // * the value of the derivative of the Laguerre function (d2), + // * and the value of the corresponding Laguerre function of + // previous order (p1). + + // Return the value of the function (p2) in order to be used as a + // function object with Boost.Math root-finding. Store the values + // of the Laguerre function derivative (d2) and the Laguerre function + // of previous order (p1) in class members for later use. + + p1 = T(0); + T p2 = T(1); + d2 = T(0); + + T j_plus_alpha(alpha); + T two_j_plus_one_plus_alpha_minus_x(1 + alpha - x); + + int j; + + const T my_two(2); + + for(j = 0; j < order; ++j) + { + const T p0(p1); + + // Set the value of the previous Laguerre function. + p1 = p2; + + // Use a recurrence relation to compute the value of the Laguerre function. + p2 = ((two_j_plus_one_plus_alpha_minus_x * p1) - (j_plus_alpha * p0)) / (j + 1); + + ++j_plus_alpha; + two_j_plus_one_plus_alpha_minus_x += my_two; + } + + // Set the value of the derivative of the Laguerre function. + d2 = ((p2 * j) - (j_plus_alpha * p1)) / x; + + // Return the value of the Laguerre function. + return p2; + } + + const T& previous () const { return p1; } + const T& derivative() const { return d2; } + + static bool root_tolerance(const T& a, const T& b) + { + using std::abs; + + // The relative tolerance here is: ((a - b) * 2) / (a + b). + return (abs((a - b) * 2) < ((a + b) * boost::math::tools::epsilon<T>())); + } + +private: + const int order; + const T alpha; + mutable T p1; + mutable T d2; + + laguerre_function_object(); + + const laguerre_function_object& operator=(const laguerre_function_object&); +}; + +template<typename T> +class guass_laguerre_abscissas_and_weights : private boost::noncopyable +{ +public: + guass_laguerre_abscissas_and_weights(const int n, const T a) : order(n), + alpha(a), + valid(true), + xi (), + wi () + { + if(alpha < -20.0F) + { + // TBD: If we ever boostify this, throw a range error here. + // If so, then also document it in the docs. + std::cout << "Range error: the order of the Laguerre function must exceed -20.0." << std::endl; + } + else + { + calculate(); + } + } + + virtual ~guass_laguerre_abscissas_and_weights() { } + + const std::vector<T>& abscissas() const { return xi; } + const std::vector<T>& weights () const { return wi; } + + bool get_valid() const { return valid; } + +private: + const int order; + const T alpha; + bool valid; + + std::vector<T> xi; + std::vector<T> wi; + + void calculate() + { + using std::abs; + + std::cout << "finding approximate roots..." << std::endl; + + std::vector<boost::math::tuple<T, T> > root_estimates; + + root_estimates.reserve(static_cast<typename std::vector<boost::math::tuple<T, T> >::size_type>(order)); + + const laguerre_function_object<T> laguerre_object(order, alpha); + + // Set the initial values of the step size and the running step + // to be used for finding the estimate of the first root. + T step_size = 0.01F; + T step = step_size; + + T first_laguerre_root = 0.0F; + + bool first_laguerre_root_has_been_found = true; + + if(alpha < -1.0F) + { + // Iteratively step through the Laguerre function using a + // small step-size in order to find a rough estimate of + // the first zero. + + bool this_laguerre_value_is_negative = (laguerre_object(mp_type(0)) < 0); + + static const int j_max = 10000; + + int j; + + for(j = 0; (j < j_max) && (this_laguerre_value_is_negative != (laguerre_object(step) < 0)); ++j) + { + // Increment the step size until the sign of the Laguerre function + // switches. This indicates a zero-crossing, signalling the next root. + step += step_size; + } + + if(j >= j_max) + { + first_laguerre_root_has_been_found = false; + } + else + { + // We have found the first zero-crossing. Put a loose bracket around + // the root using a window. Here, we know that the first root lies + // between (x - step_size) < root < x. + + // Before storing the approximate root, perform a couple of + // bisection steps in order to tighten up the root bracket. + boost::uintmax_t a_couple_of_iterations = 3U; + const std::pair<T, T> + first_laguerre_root = boost::math::tools::bisect(laguerre_object, + step - step_size, + step, + laguerre_function_object<T>::root_tolerance, + a_couple_of_iterations); + + static_cast<void>(a_couple_of_iterations); + } + } + else + { + // Calculate an estimate of the 1st root of a generalized Laguerre + // function using either a Taylor series or an expansion in Bessel + // function zeros. The Bessel function zeros expansion is from Tricomi. + + // Here, we obtain an estimate of the first zero of J_alpha(x). + + T j_alpha_m1; + + if(alpha < 1.4F) + { + // For small alpha, use a short series obtained from Mathematica(R). + // Series[BesselJZero[v, 1], {v, 0, 3}] + // N[%, 12] + j_alpha_m1 = ((( 0.09748661784476F + * alpha - 0.17549359276115F) + * alpha + 1.54288974259931F) + * alpha + 2.40482555769577F); + } + else + { + // For larger alpha, use the first line of Eqs. 10.21.40 in the NIST Handbook. + const T alpha_pow_third(boost::math::cbrt(alpha)); + const T alpha_pow_minus_two_thirds(T(1) / (alpha_pow_third * alpha_pow_third)); + + j_alpha_m1 = alpha * ((((( + 0.043F + * alpha_pow_minus_two_thirds - 0.0908F) + * alpha_pow_minus_two_thirds - 0.00397F) + * alpha_pow_minus_two_thirds + 1.033150F) + * alpha_pow_minus_two_thirds + 1.8557571F) + * alpha_pow_minus_two_thirds + 1.0F); + } + + const T vf = ((order * 4.0F) + (alpha * 2.0F) + 2.0F); + const T vf2 = vf * vf; + const T j_alpha_m1_sqr = j_alpha_m1 * j_alpha_m1; + + first_laguerre_root = (j_alpha_m1_sqr * (-0.6666666666667F + ((0.6666666666667F * alpha) * alpha) + (0.3333333333333F * j_alpha_m1_sqr) + vf2)) / (vf2 * vf); + } + + if(first_laguerre_root_has_been_found) + { + bool this_laguerre_value_is_negative = (laguerre_object(mp_type(0)) < 0); + + // Re-set the initial value of the step-size based on the + // estimate of the first root. + step_size = first_laguerre_root / 2; + step = step_size; + + // Step through the Laguerre function using a step-size + // of dynamic width in order to find the zero crossings + // of the Laguerre function, providing rough estimates + // of the roots. Refine the brackets with a few bisection + // steps, and store the results as bracketed root estimates. + + while(static_cast<int>(root_estimates.size()) < order) + { + // Increment the step size until the sign of the Laguerre function + // switches. This indicates a zero-crossing, signalling the next root. + step += step_size; + + if(this_laguerre_value_is_negative != (laguerre_object(step) < 0)) + { + // We have found the next zero-crossing. + + // Change the running sign of the Laguerre function. + this_laguerre_value_is_negative = (!this_laguerre_value_is_negative); + + // We have found the first zero-crossing. Put a loose bracket around + // the root using a window. Here, we know that the first root lies + // between (x - step_size) < root < x. + + // Before storing the approximate root, perform a couple of + // bisection steps in order to tighten up the root bracket. + boost::uintmax_t a_couple_of_iterations = 3U; + const std::pair<T, T> + root_estimate_bracket = boost::math::tools::bisect(laguerre_object, + step - step_size, + step, + laguerre_function_object<T>::root_tolerance, + a_couple_of_iterations); + + static_cast<void>(a_couple_of_iterations); + + // Store the refined root estimate as a bracketed range in a tuple. + root_estimates.push_back(boost::math::tuple<T, T>(root_estimate_bracket.first, + root_estimate_bracket.second)); + + if(root_estimates.size() >= static_cast<std::size_t>(2U)) + { + // Determine the next step size. This is based on the distance between + // the previous two roots, whereby the estimates of the previous roots + // are computed by taking the average of the lower and upper range of + // the root-estimate bracket. + + const T r0 = ( boost::math::get<0>(*(root_estimates.rbegin() + 1U)) + + boost::math::get<1>(*(root_estimates.rbegin() + 1U))) / 2; + + const T r1 = ( boost::math::get<0>(*root_estimates.rbegin()) + + boost::math::get<1>(*root_estimates.rbegin())) / 2; + + const T distance_between_previous_roots = r1 - r0; + + step_size = distance_between_previous_roots / 3; + } + } + } + + const T norm_g = + ((alpha == 0) ? T(-1) + : -boost::math::tgamma(alpha + order) / boost::math::factorial<T>(order - 1)); + + xi.reserve(root_estimates.size()); + wi.reserve(root_estimates.size()); + + // Calculate the abscissas and weights to full precision. + for(std::size_t i = static_cast<std::size_t>(0U); i < root_estimates.size(); ++i) + { + std::cout << "calculating abscissa and weight for index: " << i << std::endl; + + // Calculate the abscissas using iterative root-finding. + + // Select the maximum allowed iterations, being at least 20. + // The determination of the maximum allowed iterations is + // based on the number of decimal digits in the numerical + // type T. + const int my_digits10 = static_cast<int>(static_cast<float>(boost::math::tools::digits<T>()) * 0.301F); + const boost::uintmax_t number_of_iterations_allowed = (std::max)(20, my_digits10 / 2); + + boost::uintmax_t number_of_iterations_used = number_of_iterations_allowed; + + // Perform the root-finding using ACM TOMS 748 from Boost.Math. + const std::pair<T, T> + laguerre_root_bracket = boost::math::tools::toms748_solve(laguerre_object, + boost::math::get<0>(root_estimates[i]), + boost::math::get<1>(root_estimates[i]), + laguerre_function_object<T>::root_tolerance, + number_of_iterations_used); + + // Based on the result of *each* root-finding operation, re-assess + // the validity of the Guass-Laguerre abscissas and weights object. + valid &= (number_of_iterations_used < number_of_iterations_allowed); + + // Compute the Laguerre root as the average of the values from + // the solved root bracket. + const T laguerre_root = ( laguerre_root_bracket.first + + laguerre_root_bracket.second) / 2; + + // Calculate the weight for this Laguerre root. Here, we calculate + // the derivative of the Laguerre function and the value of the + // previous Laguerre function on the x-axis at the value of this + // Laguerre root. + static_cast<void>(laguerre_object(laguerre_root)); + + // Store the abscissa and weight for this index. + xi.push_back(laguerre_root); + wi.push_back(norm_g / ((laguerre_object.derivative() * order) * laguerre_object.previous())); + } + } + } +}; + +namespace +{ + template<typename T> + struct gauss_laguerre_ai + { + public: + gauss_laguerre_ai(const T X) : x(X) + { + using std::exp; + using std::sqrt; + + zeta = ((sqrt(x) * x) * 2) / 3; + + const T zeta_times_48_pow_sixth = sqrt(boost::math::cbrt(zeta * 48)); + + factor = 1 / ((sqrt(boost::math::constants::pi<T>()) * zeta_times_48_pow_sixth) * (exp(zeta) * gamma_of_five_sixths())); + } + + gauss_laguerre_ai(const gauss_laguerre_ai& other) : x (other.x), + zeta (other.zeta), + factor(other.factor) { } + + T operator()(const T& t) const + { + using std::sqrt; + + return factor / sqrt(boost::math::cbrt(2 + (t / zeta))); + } + + private: + const T x; + T zeta; + T factor; + + static const T& gamma_of_five_sixths() + { + static const T value = boost::math::tgamma(T(5) / 6); + + return value; + } + + const gauss_laguerre_ai& operator=(const gauss_laguerre_ai&); + }; + + template<typename T> + T gauss_laguerre_airy_ai(const T x) + { + static const float digits_factor = static_cast<float>(std::numeric_limits<mp_type>::digits10) / 300.0F; + static const int laguerre_order = static_cast<int>(600.0F * digits_factor); + + static const guass_laguerre_abscissas_and_weights<T> abscissas_and_weights(laguerre_order, -T(1) / 6); + + T airy_ai_result; + + if(abscissas_and_weights.get_valid()) + { + const gauss_laguerre_ai<T> this_gauss_laguerre_ai(x); + + airy_ai_result = + std::inner_product(abscissas_and_weights.abscissas().begin(), + abscissas_and_weights.abscissas().end(), + abscissas_and_weights.weights().begin(), + T(0), + std::plus<T>(), + [&this_gauss_laguerre_ai](const T& this_abscissa, const T& this_weight) -> T + { + return this_gauss_laguerre_ai(this_abscissa) * this_weight; + }); + } + else + { + // TBD: Consider an error message. + airy_ai_result = T(0); + } + + return airy_ai_result; + } +} + +int main() +{ + // Use Gauss-Laguerre integration to compute airy_ai(120 / 7). + + // 9 digits + // 3.89904210e-22 + + // 10 digits + // 3.899042098e-22 + + // 50 digits. + // 3.8990420982303275013276114626640705170145070824318e-22 + + // 100 digits. + // 3.899042098230327501327611462664070517014507082431797677146153303523108862015228 + // 864136051942933142648e-22 + + // 200 digits. + // 3.899042098230327501327611462664070517014507082431797677146153303523108862015228 + // 86413605194293314264788265460938200890998546786740097437064263800719644346113699 + // 77010905030516409847054404055843899790277e-22 + + // 300 digits. + // 3.899042098230327501327611462664070517014507082431797677146153303523108862015228 + // 86413605194293314264788265460938200890998546786740097437064263800719644346113699 + // 77010905030516409847054404055843899790277083960877617919088116211775232728792242 + // 9346416823281460245814808276654088201413901972239996130752528e-22 + + // 500 digits. + // 3.899042098230327501327611462664070517014507082431797677146153303523108862015228 + // 86413605194293314264788265460938200890998546786740097437064263800719644346113699 + // 77010905030516409847054404055843899790277083960877617919088116211775232728792242 + // 93464168232814602458148082766540882014139019722399961307525276722937464859521685 + // 42826483602153339361960948844649799257455597165900957281659632186012043089610827 + // 78871305322190941528281744734605934497977375094921646511687434038062987482900167 + // 45127557400365419545e-22 + + // Mathematica(R) or Wolfram's Alpha: + // N[AiryAi[120 / 7], 300] + std::cout << std::setprecision(digits_characteristics::digits10) + << gauss_laguerre_airy_ai(mp_type(120) / 7) + << std::endl; +} diff --git a/src/boost/libs/multiprecision/example/gmp_snips.cpp b/src/boost/libs/multiprecision/example/gmp_snips.cpp new file mode 100644 index 00000000..f41e77bf --- /dev/null +++ b/src/boost/libs/multiprecision/example/gmp_snips.cpp @@ -0,0 +1,117 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/gmp.hpp> +#include <boost/math/special_functions/gamma.hpp> +#include <iostream> + +void t1() +{ + //[mpz_eg +//=#include <boost/multiprecision/gmp.hpp> +//=#include <iostream> +//= +//=int main() +//={ + using namespace boost::multiprecision; + + mpz_int v = 1; + + // Do some arithmetic: + for(unsigned i = 1; i <= 1000; ++i) + v *= i; + + std::cout << v << std::endl; // prints 1000! + + // Access the underlying representation: + mpz_t z; + mpz_init(z); + mpz_set(z, v.backend().data()); + mpz_clear(z); +//= return 0; +//=} +//] +} + +void t2() +{ +//[mpf_eg +//=#include <boost/multiprecision/gmp.hpp> +//=#include <boost/math/special_functions/gamma.hpp> +//=#include <iostream> +//= +//=int main() +//={ + using namespace boost::multiprecision; + + // Operations at variable precision and limited standard library support: + mpf_float a = 2; + mpf_float::default_precision(1000); + std::cout << mpf_float::default_precision() << std::endl; + std::cout << sqrt(a) << std::endl; // print root-2 + + // Operations at fixed precision and full standard library support: + mpf_float_100 b = 2; + std::cout << std::numeric_limits<mpf_float_100>::digits << std::endl; + // We can use any C++ std lib function: + std::cout << log(b) << std::endl; // print log(2) + // We can also use any function from Boost.Math: + std::cout << boost::math::tgamma(b) << std::endl; + // These even work when the argument is an expression template: + std::cout << boost::math::tgamma(b * b) << std::endl; + + // Access the underlying representation: + mpf_t f; + mpf_init(f); + mpf_set(f, a.backend().data()); + mpf_clear(f); +//= return 0; +//=} +//] +} + +void t3() +{ +//[mpq_eg +//=#include <boost/multiprecision/gmp.hpp> +//=#include <boost/multiprecision/gmp.hpp> +//=#include <iostream> +//= +//=int main() +//={ + using namespace boost::multiprecision; + + mpq_rational v = 1; + + // Do some arithmetic: + for(unsigned i = 1; i <= 1000; ++i) + v *= i; + v /= 10; + + std::cout << v << std::endl; // prints 1000! / 10 + std::cout << numerator(v) << std::endl; + std::cout << denominator(v) << std::endl; + + mpq_rational w(2, 3); // component wise constructor + std::cout << w << std::endl; // prints 2/3 + + // Access the underlying data: + mpq_t q; + mpq_init(q); + mpq_set(q, v.backend().data()); + mpq_clear(q); +//= return 0; +//=} +//] +} + +int main() +{ + t1(); + t2(); + t3(); + return 0; +} + diff --git a/src/boost/libs/multiprecision/example/hashing_examples.cpp b/src/boost/libs/multiprecision/example/hashing_examples.cpp new file mode 100644 index 00000000..a0c3fb50 --- /dev/null +++ b/src/boost/libs/multiprecision/example/hashing_examples.cpp @@ -0,0 +1,77 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random.hpp> +#include <boost/functional/hash.hpp> +#include <unordered_set> +#include <city.h> + +//[hash1 + +/*` +All of the types in this library support hashing via boost::hash or std::hash. +That means we can use multiprecision types directly in hashed containers such as std::unordered_set: +*/ +//] + +void t1() +{ + //[hash2 + using namespace boost::multiprecision; + using namespace boost::random; + + mt19937 mt; + uniform_int_distribution<uint256_t> ui; + + std::unordered_set<uint256_t> set; + // Put 1000 random values into the container: + for(unsigned i = 0; i < 1000; ++i) + set.insert(ui(mt)); + + //] +} + +//[hash3 + +/*` +Or we can define our own hash function, for example in this case based on +Google's CityHash: +*/ + +struct cityhash +{ + std::size_t operator()(const boost::multiprecision::uint256_t& val)const + { + // create a hash from all the limbs of the argument, this function is probably x64 specific, + // and requires that we access the internals of the data type: + std::size_t result = CityHash64(reinterpret_cast<const char*>(val.backend().limbs()), val.backend().size() * sizeof(val.backend().limbs()[0])); + // modify the returned hash based on sign: + return val < 0 ? ~result : result; + } +}; + +//] + +void t2() +{ +//[hash4 + +/*`As before insert some values into a container, this time using our custom hasher:*/ + + std::unordered_set<uint256_t, cityhash> set2; + for(unsigned i = 0; i < 1000; ++i) + set2.insert(ui(mt)); + +//] +} + +int main() +{ + t1(); + t2(); + return 0; +} + diff --git a/src/boost/libs/multiprecision/example/hypergeometric_luke_algorithms.cpp b/src/boost/libs/multiprecision/example/hypergeometric_luke_algorithms.cpp new file mode 100644 index 00000000..4fb4e13b --- /dev/null +++ b/src/boost/libs/multiprecision/example/hypergeometric_luke_algorithms.cpp @@ -0,0 +1,801 @@ + +/////////////////////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2013 - 2014. +// Copyright John Maddock 2013. +// Distributed under the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 +// + +#include <algorithm> +#include <cstdint> +#include <deque> +#include <functional> +#include <iostream> +#include <limits> +#include <numeric> +#include <vector> +#include <boost/math/constants/constants.hpp> +#include <boost/noncopyable.hpp> + +//#define USE_CPP_BIN_FLOAT +#define USE_CPP_DEC_FLOAT +//#define USE_MPFR + +#if !defined(DIGIT_COUNT) +#define DIGIT_COUNT 100 +#endif + +#if !defined(BOOST_NO_CXX11_HDR_CHRONO) + #include <chrono> + #define STD_CHRONO std::chrono +#else + #include <boost/chrono.hpp> + #define STD_CHRONO boost::chrono +#endif + +#if defined(USE_CPP_BIN_FLOAT) + #include <boost/multiprecision/cpp_bin_float.hpp> + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<DIGIT_COUNT + 10> > mp_type; +#elif defined(USE_CPP_DEC_FLOAT) + #include <boost/multiprecision/cpp_dec_float.hpp> + typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<DIGIT_COUNT + 10> > mp_type; +#elif defined(USE_MPFR) + #include <boost/multiprecision/mpfr.hpp> + typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<DIGIT_COUNT + 10> > mp_type; +#else + #error no multiprecision floating type is defined +#endif + +template <class clock_type> +struct stopwatch +{ +public: + typedef typename clock_type::duration duration_type; + + stopwatch() : m_start(clock_type::now()) { } + + stopwatch(const stopwatch& other) : m_start(other.m_start) { } + + stopwatch& operator=(const stopwatch& other) + { + m_start = other.m_start; + return *this; + } + + ~stopwatch() { } + + duration_type elapsed() const + { + return (clock_type::now() - m_start); + } + + void reset() + { + m_start = clock_type::now(); + } + +private: + typename clock_type::time_point m_start; +}; + +namespace my_math +{ + template<class T> T chebyshev_t(const std::int32_t n, const T& x); + + template<class T> T chebyshev_t(const std::uint32_t n, const T& x, std::vector<T>* vp); + + template<class T> bool isneg(const T& x) { return (x < T(0)); } + + template<class T> const T& zero() { static const T value_zero(0); return value_zero; } + template<class T> const T& one () { static const T value_one (1); return value_one; } + template<class T> const T& two () { static const T value_two (2); return value_two; } +} + +namespace orthogonal_polynomial_series +{ + template<typename T> static inline T orthogonal_polynomial_template(const T& x, const std::uint32_t n, std::vector<T>* const vp = static_cast<std::vector<T>*>(0u)) + { + // Compute the value of an orthogonal chebyshev polinomial. + // Use stable upward recursion. + + if(vp != nullptr) + { + vp->clear(); + vp->reserve(static_cast<std::size_t>(n + 1u)); + } + + T y0 = my_math::one<T>(); + + if(vp != nullptr) { vp->push_back(y0); } + + if(n == static_cast<std::uint32_t>(0u)) + { + return y0; + } + + T y1 = x; + + if(vp != nullptr) { vp->push_back(y1); } + + if(n == static_cast<std::uint32_t>(1u)) + { + return y1; + } + + T a = my_math::two <T>(); + T b = my_math::zero<T>(); + T c = my_math::one <T>(); + + T yk; + + // Calculate higher orders using the recurrence relation. + // The direction of stability is upward recursion. + for(std::int32_t k = static_cast<std::int32_t>(2); k <= static_cast<std::int32_t>(n); ++k) + { + yk = (((a * x) + b) * y1) - (c * y0); + + y0 = y1; + y1 = yk; + + if(vp != nullptr) { vp->push_back(yk); } + } + + return yk; + } +} + +template<class T> T my_math::chebyshev_t(const std::int32_t n, const T& x) +{ + if(my_math::isneg(x)) + { + const bool b_negate = ((n % static_cast<std::int32_t>(2)) != static_cast<std::int32_t>(0)); + + const T y = chebyshev_t(n, -x); + + return (!b_negate ? y : -y); + } + + if(n < static_cast<std::int32_t>(0)) + { + const std::int32_t nn = static_cast<std::int32_t>(-n); + + return chebyshev_t(nn, x); + } + else + { + return orthogonal_polynomial_series::orthogonal_polynomial_template(x, static_cast<std::uint32_t>(n)); + } +} + +template<class T> T my_math::chebyshev_t(const std::uint32_t n, const T& x, std::vector<T>* const vp) { return orthogonal_polynomial_series::orthogonal_polynomial_template(x, static_cast<std::int32_t>(n), vp); } + +namespace util +{ + template <class T> float digit_scale() + { + const int d = ((std::max)(std::numeric_limits<T>::digits10, 15)); + return static_cast<float>(d) / 300.0F; + } +} + +namespace examples +{ + namespace nr_006 + { + template<typename T> class hypergeometric_pfq_base : private boost::noncopyable + { + public: + virtual ~hypergeometric_pfq_base() { } + + virtual void ccoef() const = 0; + + virtual T series() const + { + using my_math::chebyshev_t; + + // Compute the Chebyshev coefficients. + // Get the values of the shifted Chebyshev polynomials. + std::vector<T> chebyshev_t_shifted_values; + const T z_shifted = ((Z / W) * static_cast<std::int32_t>(2)) - static_cast<std::int32_t>(1); + + chebyshev_t(static_cast<std::uint32_t>(C.size()), + z_shifted, + &chebyshev_t_shifted_values); + + // Luke: C ---------- COMPUTE SCALE FACTOR ---------- + // Luke: C + // Luke: C ---------- SCALE THE COEFFICIENTS ---------- + // Luke: C + + // The coefficient scaling is preformed after the Chebyshev summation, + // and it is carried out with a single division operation. + bool b_neg = false; + + const T scale = std::accumulate(C.begin(), + C.end(), + T(0), + [&b_neg](T scale_sum, const T& ck) -> T + { + ((!b_neg) ? (scale_sum += ck) : (scale_sum -= ck)); + b_neg = (!b_neg); + return scale_sum; + }); + + // Compute the result of the series expansion using unscaled coefficients. + const T sum = std::inner_product(C.begin(), + C.end(), + chebyshev_t_shifted_values.begin(), + T(0)); + + // Return the properly scaled result. + return sum / scale; + } + + protected: + const T Z; + const T W; + mutable std::deque<T> C; + + hypergeometric_pfq_base(const T& z, + const T& w) : Z(z), + W(w), + C(0u) { } + + virtual std::int32_t N() const { return static_cast<std::int32_t>(util::digit_scale<T>() * 500.0F); } + }; + + template<typename T> class ccoef4_hypergeometric_0f1 : public hypergeometric_pfq_base<T> + { + public: + ccoef4_hypergeometric_0f1(const T& c, + const T& z, + const T& w) : hypergeometric_pfq_base<T>(z, w), + CP(c) { } + + virtual ~ccoef4_hypergeometric_0f1() { } + + virtual void ccoef() const + { + // See Luke 1977 page 80. + const std::int32_t N1 = static_cast<std::int32_t>(this->N() + static_cast<std::int32_t>(1)); + const std::int32_t N2 = static_cast<std::int32_t>(this->N() + static_cast<std::int32_t>(2)); + + // Luke: C ---------- START COMPUTING COEFFICIENTS USING ---------- + // Luke: C ---------- BACKWARD RECURRENCE SCHEME ---------- + // Luke: C + T A3(0); + T A2(0); + T A1(boost::math::tools::root_epsilon<T>()); + + hypergeometric_pfq_base<T>::C.resize(1u, A1); + + std::int32_t X1 = N2; + + T C1 = T(1) - CP; + + const T Z1 = T(4) / hypergeometric_pfq_base<T>::W; + + for(std::int32_t k = static_cast<std::int32_t>(0); k < N1; ++k) + { + const T DIVFAC = T(1) / X1; + + --X1; + + // The terms have been slightly re-arranged resulting in lower complexity. + // Parentheses have been added to avoid reliance on operator precedence. + const T term = (A2 - ((A3 * DIVFAC) * X1)) + + ((A2 * X1) * ((1 + (C1 + X1)) * Z1)) + + ((A1 * X1) * ((DIVFAC - (C1 * Z1)) + (X1 * Z1))); + + hypergeometric_pfq_base<T>::C.push_front(term); + + A3 = A2; + A2 = A1; + A1 = hypergeometric_pfq_base<T>::C.front(); + } + + hypergeometric_pfq_base<T>::C.front() /= static_cast<std::int32_t>(2); + } + + private: + const T CP; + }; + + template<typename T> class ccoef1_hypergeometric_1f0 : public hypergeometric_pfq_base<T> + { + public: + ccoef1_hypergeometric_1f0(const T& a, + const T& z, + const T& w) : hypergeometric_pfq_base<T>(z, w), + AP(a) { } + + virtual ~ccoef1_hypergeometric_1f0() { } + + virtual void ccoef() const + { + // See Luke 1977 page 67. + const std::int32_t N1 = static_cast<std::int32_t>(N() + static_cast<std::int32_t>(1)); + const std::int32_t N2 = static_cast<std::int32_t>(N() + static_cast<std::int32_t>(2)); + + // Luke: C ---------- START COMPUTING COEFFICIENTS USING ---------- + // Luke: C ---------- BACKWARD RECURRENCE SCHEME ---------- + // Luke: C + T A2(0); + T A1(boost::math::tools::root_epsilon<T>()); + + hypergeometric_pfq_base<T>::C.resize(1u, A1); + + std::int32_t X1 = N2; + + T V1 = T(1) - AP; + + // Here, we have corrected what appears to be an error in Luke's code. + + // Luke's original code listing has: + // AFAC = 2 + FOUR/W + // But it appears as though the correct form is: + // AFAC = 2 - FOUR/W. + + const T AFAC = 2 - (T(4) / hypergeometric_pfq_base<T>::W); + + for(std::int32_t k = static_cast<std::int32_t>(0); k < N1; ++k) + { + --X1; + + // The terms have been slightly re-arranged resulting in lower complexity. + // Parentheses have been added to avoid reliance on operator precedence. + const T term = -(((X1 * AFAC) * A1) + ((X1 + V1) * A2)) / (X1 - V1); + + hypergeometric_pfq_base<T>::C.push_front(term); + + A2 = A1; + A1 = hypergeometric_pfq_base<T>::C.front(); + } + + hypergeometric_pfq_base<T>::C.front() /= static_cast<std::int32_t>(2); + } + + private: + const T AP; + + virtual std::int32_t N() const { return static_cast<std::int32_t>(util::digit_scale<T>() * 1600.0F); } + }; + + template<typename T> class ccoef3_hypergeometric_1f1 : public hypergeometric_pfq_base<T> + { + public: + ccoef3_hypergeometric_1f1(const T& a, + const T& c, + const T& z, + const T& w) : hypergeometric_pfq_base<T>(z, w), + AP(a), + CP(c) { } + + virtual ~ccoef3_hypergeometric_1f1() { } + + virtual void ccoef() const + { + // See Luke 1977 page 74. + const std::int32_t N1 = static_cast<std::int32_t>(this->N() + static_cast<std::int32_t>(1)); + const std::int32_t N2 = static_cast<std::int32_t>(this->N() + static_cast<std::int32_t>(2)); + + // Luke: C ---------- START COMPUTING COEFFICIENTS USING ---------- + // Luke: C ---------- BACKWARD RECURRENCE SCHEME ---------- + // Luke: C + T A3(0); + T A2(0); + T A1(boost::math::tools::root_epsilon<T>()); + + hypergeometric_pfq_base<T>::C.resize(1u, A1); + + std::int32_t X = N1; + std::int32_t X1 = N2; + + T XA = X + AP; + T X3A = (X + 3) - AP; + + const T Z1 = T(4) / hypergeometric_pfq_base<T>::W; + + for(std::int32_t k = static_cast<std::int32_t>(0); k < N1; ++k) + { + --X; + --X1; + --XA; + --X3A; + + const T X3A_over_X2 = X3A / static_cast<std::int32_t>(X + 2); + + // The terms have been slightly re-arranged resulting in lower complexity. + // Parentheses have been added to avoid reliance on operator precedence. + const T PART1 = A1 * (((X + CP) * Z1) - X3A_over_X2); + const T PART2 = A2 * (Z1 * ((X + 3) - CP) + (XA / X1)); + const T PART3 = A3 * X3A_over_X2; + + const T term = (((PART1 + PART2) + PART3) * X1) / XA; + + hypergeometric_pfq_base<T>::C.push_front(term); + + A3 = A2; + A2 = A1; + A1 = hypergeometric_pfq_base<T>::C.front(); + } + + hypergeometric_pfq_base<T>::C.front() /= static_cast<std::int32_t>(2); + } + + private: + const T AP; + const T CP; + }; + + template<typename T> class ccoef6_hypergeometric_1f2 : public hypergeometric_pfq_base<T> + { + public: + ccoef6_hypergeometric_1f2(const T& a, + const T& b, + const T& c, + const T& z, + const T& w) : hypergeometric_pfq_base<T>(z, w), + AP(a), + BP(b), + CP(c) { } + + virtual ~ccoef6_hypergeometric_1f2() { } + + virtual void ccoef() const + { + // See Luke 1977 page 85. + const std::int32_t N1 = static_cast<std::int32_t>(this->N() + static_cast<std::int32_t>(1)); + + // Luke: C ---------- START COMPUTING COEFFICIENTS USING ---------- + // Luke: C ---------- BACKWARD RECURRENCE SCHEME ---------- + // Luke: C + T A4(0); + T A3(0); + T A2(0); + T A1(boost::math::tools::root_epsilon<T>()); + + hypergeometric_pfq_base<T>::C.resize(1u, A1); + + std::int32_t X = N1; + T PP = X + AP; + + const T Z1 = T(4) / hypergeometric_pfq_base<T>::W; + + for(std::int32_t k = static_cast<std::int32_t>(0); k < N1; ++k) + { + --X; + --PP; + + const std::int32_t TWO_X = static_cast<std::int32_t>(X * 2); + const std::int32_t X_PLUS_1 = static_cast<std::int32_t>(X + 1); + const std::int32_t X_PLUS_3 = static_cast<std::int32_t>(X + 3); + const std::int32_t X_PLUS_4 = static_cast<std::int32_t>(X + 4); + + const T QQ = T(TWO_X + 3) / static_cast<std::int32_t>(TWO_X + static_cast<std::int32_t>(5)); + const T SS = (X + BP) * (X + CP); + + // The terms have been slightly re-arranged resulting in lower complexity. + // Parentheses have been added to avoid reliance on operator precedence. + const T PART1 = A1 * (((PP - (QQ * (PP + 1))) * 2) + (SS * Z1)); + const T PART2 = (A2 * (X + 2)) * ((((TWO_X + 1) * PP) / X_PLUS_1) - ((QQ * 4) * (PP + 1)) + (((TWO_X + 3) * (PP + 2)) / X_PLUS_3) + ((Z1 * 2) * (SS - (QQ * (X_PLUS_1 + BP)) * (X_PLUS_1 + CP)))); + const T PART3 = A3 * ((((X_PLUS_3 - AP) - (QQ * (X_PLUS_4 - AP))) * 2) + (((QQ * Z1) * (X_PLUS_4 - BP)) * (X_PLUS_4 - CP))); + const T PART4 = ((A4 * QQ) * (X_PLUS_4 - AP)) / X_PLUS_3; + + const T term = (((PART1 - PART2) + (PART3 - PART4)) * X_PLUS_1) / PP; + + hypergeometric_pfq_base<T>::C.push_front(term); + + A4 = A3; + A3 = A2; + A2 = A1; + A1 = hypergeometric_pfq_base<T>::C.front(); + } + + hypergeometric_pfq_base<T>::C.front() /= static_cast<std::int32_t>(2); + } + + private: + const T AP; + const T BP; + const T CP; + }; + + template<typename T> class ccoef2_hypergeometric_2f1 : public hypergeometric_pfq_base<T> + { + public: + ccoef2_hypergeometric_2f1(const T& a, + const T& b, + const T& c, + const T& z, + const T& w) : hypergeometric_pfq_base<T>(z, w), + AP(a), + BP(b), + CP(c) { } + + virtual ~ccoef2_hypergeometric_2f1() { } + + virtual void ccoef() const + { + // See Luke 1977 page 59. + const std::int32_t N1 = static_cast<std::int32_t>(N() + static_cast<std::int32_t>(1)); + const std::int32_t N2 = static_cast<std::int32_t>(N() + static_cast<std::int32_t>(2)); + + // Luke: C ---------- START COMPUTING COEFFICIENTS USING ---------- + // Luke: C ---------- BACKWARD RECURRENCE SCHEME ---------- + // Luke: C + T A3(0); + T A2(0); + T A1(boost::math::tools::root_epsilon<T>()); + + hypergeometric_pfq_base<T>::C.resize(1u, A1); + + std::int32_t X = N1; + std::int32_t X1 = N2; + std::int32_t X3 = static_cast<std::int32_t>((X * 2) + 3); + + T X3A = (X + 3) - AP; + T X3B = (X + 3) - BP; + + const T Z1 = T(4) / hypergeometric_pfq_base<T>::W; + + for(std::int32_t k = static_cast<std::int32_t>(0); k < N1; ++k) + { + --X; + --X1; + --X3A; + --X3B; + X3 -= 2; + + const std::int32_t X_PLUS_2 = static_cast<std::int32_t>(X + 2); + + const T XAB = T(1) / ((X + AP) * (X + BP)); + + // The terms have been slightly re-arranged resulting in lower complexity. + // Parentheses have been added to avoid reliance on operator precedence. + const T PART1 = (A1 * X1) * (2 - (((AP + X1) * (BP + X1)) * ((T(X3) / X_PLUS_2) * XAB)) + ((CP + X) * (XAB * Z1))); + const T PART2 = (A2 * XAB) * ((X3A * X3B) - (X3 * ((X3A + X3B) - 1)) + (((3 - CP) + X) * (X1 * Z1))); + const T PART3 = (A3 * X1) * (X3A / X_PLUS_2) * (X3B * XAB); + + const T term = (PART1 + PART2) - PART3; + + hypergeometric_pfq_base<T>::C.push_front(term); + + A3 = A2; + A2 = A1; + A1 = hypergeometric_pfq_base<T>::C.front(); + } + + hypergeometric_pfq_base<T>::C.front() /= static_cast<std::int32_t>(2); + } + + private: + const T AP; + const T BP; + const T CP; + + virtual std::int32_t N() const { return static_cast<std::int32_t>(util::digit_scale<T>() * 1600.0F); } + }; + + template<class T> T luke_ccoef4_hypergeometric_0f1(const T& a, const T& x); + template<class T> T luke_ccoef1_hypergeometric_1f0(const T& a, const T& x); + template<class T> T luke_ccoef3_hypergeometric_1f1(const T& a, const T& b, const T& x); + template<class T> T luke_ccoef6_hypergeometric_1f2(const T& a, const T& b, const T& c, const T& x); + template<class T> T luke_ccoef2_hypergeometric_2f1(const T& a, const T& b, const T& c, const T& x); + } +} + +template<class T> +T examples::nr_006::luke_ccoef4_hypergeometric_0f1(const T& a, const T& x) +{ + const ccoef4_hypergeometric_0f1<T> hypergeometric_0f1_object(a, x, T(-20)); + + hypergeometric_0f1_object.ccoef(); + + return hypergeometric_0f1_object.series(); +} + +template<class T> +T examples::nr_006::luke_ccoef1_hypergeometric_1f0(const T& a, const T& x) +{ + const ccoef1_hypergeometric_1f0<T> hypergeometric_1f0_object(a, x, T(-20)); + + hypergeometric_1f0_object.ccoef(); + + return hypergeometric_1f0_object.series(); +} + +template<class T> +T examples::nr_006::luke_ccoef3_hypergeometric_1f1(const T& a, const T& b, const T& x) +{ + const ccoef3_hypergeometric_1f1<T> hypergeometric_1f1_object(a, b, x, T(-20)); + + hypergeometric_1f1_object.ccoef(); + + return hypergeometric_1f1_object.series(); +} + +template<class T> +T examples::nr_006::luke_ccoef6_hypergeometric_1f2(const T& a, const T& b, const T& c, const T& x) +{ + const ccoef6_hypergeometric_1f2<T> hypergeometric_1f2_object(a, b, c, x, T(-20)); + + hypergeometric_1f2_object.ccoef(); + + return hypergeometric_1f2_object.series(); +} + +template<class T> +T examples::nr_006::luke_ccoef2_hypergeometric_2f1(const T& a, const T& b, const T& c, const T& x) +{ + const ccoef2_hypergeometric_2f1<T> hypergeometric_2f1_object(a, b, c, x, T(-20)); + + hypergeometric_2f1_object.ccoef(); + + return hypergeometric_2f1_object.series(); +} + +int main() +{ + stopwatch<STD_CHRONO::high_resolution_clock> my_stopwatch; + float total_time = 0.0F; + + std::vector<mp_type> hypergeometric_0f1_results(20U); + std::vector<mp_type> hypergeometric_1f0_results(20U); + std::vector<mp_type> hypergeometric_1f1_results(20U); + std::vector<mp_type> hypergeometric_2f1_results(20U); + std::vector<mp_type> hypergeometric_1f2_results(20U); + + const mp_type a(mp_type(3) / 7); + const mp_type b(mp_type(2) / 3); + const mp_type c(mp_type(1) / 4); + + std::int_least16_t i; + + std::cout << "test hypergeometric_0f1." << std::endl; + i = 1U; + my_stopwatch.reset(); + + // Generate a table of values of Hypergeometric0F1. + // Compare with the Mathematica command: + // Table[N[HypergeometricPFQ[{}, {3/7}, -(i*EulerGamma)], 100], {i, 1, 20, 1}] + std::for_each(hypergeometric_0f1_results.begin(), + hypergeometric_0f1_results.end(), + [&i, &a](mp_type& new_value) + { + const mp_type x(-(boost::math::constants::euler<mp_type>() * i)); + + new_value = examples::nr_006::luke_ccoef4_hypergeometric_0f1(a, x); + + ++i; + }); + + total_time += STD_CHRONO::duration_cast<STD_CHRONO::duration<float> >(my_stopwatch.elapsed()).count(); + + // Print the values of Hypergeometric0F1. + std::for_each(hypergeometric_0f1_results.begin(), + hypergeometric_0f1_results.end(), + [](const mp_type& h) + { + std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl; + }); + + std::cout << "test hypergeometric_1f0." << std::endl; + i = 1U; + my_stopwatch.reset(); + + // Generate a table of values of Hypergeometric1F0. + // Compare with the Mathematica command: + // Table[N[HypergeometricPFQ[{3/7}, {}, -(i*EulerGamma)], 100], {i, 1, 20, 1}] + std::for_each(hypergeometric_1f0_results.begin(), + hypergeometric_1f0_results.end(), + [&i, &a](mp_type& new_value) + { + const mp_type x(-(boost::math::constants::euler<mp_type>() * i)); + + new_value = examples::nr_006::luke_ccoef1_hypergeometric_1f0(a, x); + + ++i; + }); + + total_time += STD_CHRONO::duration_cast<STD_CHRONO::duration<float> >(my_stopwatch.elapsed()).count(); + + // Print the values of Hypergeometric1F0. + std::for_each(hypergeometric_1f0_results.begin(), + hypergeometric_1f0_results.end(), + [](const mp_type& h) + { + std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl; + }); + + std::cout << "test hypergeometric_1f1." << std::endl; + i = 1U; + my_stopwatch.reset(); + + // Generate a table of values of Hypergeometric1F1. + // Compare with the Mathematica command: + // Table[N[HypergeometricPFQ[{3/7}, {2/3}, -(i*EulerGamma)], 100], {i, 1, 20, 1}] + std::for_each(hypergeometric_1f1_results.begin(), + hypergeometric_1f1_results.end(), + [&i, &a, &b](mp_type& new_value) + { + const mp_type x(-(boost::math::constants::euler<mp_type>() * i)); + + new_value = examples::nr_006::luke_ccoef3_hypergeometric_1f1(a, b, x); + + ++i; + }); + + total_time += STD_CHRONO::duration_cast<STD_CHRONO::duration<float> >(my_stopwatch.elapsed()).count(); + + // Print the values of Hypergeometric1F1. + std::for_each(hypergeometric_1f1_results.begin(), + hypergeometric_1f1_results.end(), + [](const mp_type& h) + { + std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl; + }); + + std::cout << "test hypergeometric_1f2." << std::endl; + i = 1U; + my_stopwatch.reset(); + + // Generate a table of values of Hypergeometric1F2. + // Compare with the Mathematica command: + // Table[N[HypergeometricPFQ[{3/7}, {2/3, 1/4}, -(i*EulerGamma)], 100], {i, 1, 20, 1}] + std::for_each(hypergeometric_1f2_results.begin(), + hypergeometric_1f2_results.end(), + [&i, &a, &b, &c](mp_type& new_value) + { + const mp_type x(-(boost::math::constants::euler<mp_type>() * i)); + + new_value = examples::nr_006::luke_ccoef6_hypergeometric_1f2(a, b, c, x); + + ++i; + }); + + total_time += STD_CHRONO::duration_cast<STD_CHRONO::duration<float> >(my_stopwatch.elapsed()).count(); + + // Print the values of Hypergeometric1F2. + std::for_each(hypergeometric_1f2_results.begin(), + hypergeometric_1f2_results.end(), + [](const mp_type& h) + { + std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl; + }); + + std::cout << "test hypergeometric_2f1." << std::endl; + i = 1U; + my_stopwatch.reset(); + + // Generate a table of values of Hypergeometric2F1. + // Compare with the Mathematica command: + // Table[N[HypergeometricPFQ[{3/7, 2/3}, {1/4}, -(i * EulerGamma)], 100], {i, 1, 20, 1}] + std::for_each(hypergeometric_2f1_results.begin(), + hypergeometric_2f1_results.end(), + [&i, &a, &b, &c](mp_type& new_value) + { + const mp_type x(-(boost::math::constants::euler<mp_type>() * i)); + + new_value = examples::nr_006::luke_ccoef2_hypergeometric_2f1(a, b, c, x); + + ++i; + }); + + total_time += STD_CHRONO::duration_cast<STD_CHRONO::duration<float> >(my_stopwatch.elapsed()).count(); + + // Print the values of Hypergeometric2F1. + std::for_each(hypergeometric_2f1_results.begin(), + hypergeometric_2f1_results.end(), + [](const mp_type& h) + { + std::cout << std::setprecision(DIGIT_COUNT) << h << std::endl; + }); + + std::cout << "Total execution time = " << std::setprecision(3) << total_time << "s" << std::endl; +} diff --git a/src/boost/libs/multiprecision/example/integer_examples.cpp b/src/boost/libs/multiprecision/example/integer_examples.cpp new file mode 100644 index 00000000..5c2f8147 --- /dev/null +++ b/src/boost/libs/multiprecision/example/integer_examples.cpp @@ -0,0 +1,232 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> +#include <iostream> +#include <iomanip> +#include <vector> + +// Includes Quickbook code snippets as comments. + +//[FAC1 + +/*` +In this simple example, we'll write a routine to print out all of the factorials +which will fit into a 128-bit integer. At the end of the routine we do some +fancy iostream formatting of the results: +*/ +/*= +#include <boost/multiprecision/cpp_int.hpp> +#include <iostream> +#include <iomanip> +#include <vector> +*/ + +void print_factorials() +{ + using boost::multiprecision::cpp_int; + // + // Print all the factorials that will fit inside a 128-bit integer. + // + // Begin by building a big table of factorials, once we know just how + // large the largest is, we'll be able to "pretty format" the results. + // + // Calculate the largest number that will fit inside 128 bits, we could + // also have used numeric_limits<int128_t>::max() for this value: + cpp_int limit = (cpp_int(1) << 128) - 1; + // + // Our table of values: + std::vector<cpp_int> results; + // + // Initial values: + unsigned i = 1; + cpp_int factorial = 1; + // + // Cycle through the factorials till we reach the limit: + while(factorial < limit) + { + results.push_back(factorial); + ++i; + factorial *= i; + } + // + // Lets see how many digits the largest factorial was: + unsigned digits = results.back().str().size(); + // + // Now print them out, using right justification, while we're at it + // we'll indicate the limit of each integer type, so begin by defining + // the limits for 16, 32, 64 etc bit integers: + cpp_int limits[] = { + (cpp_int(1) << 16) - 1, + (cpp_int(1) << 32) - 1, + (cpp_int(1) << 64) - 1, + (cpp_int(1) << 128) - 1, + }; + std::string bit_counts[] = { "16", "32", "64", "128" }; + unsigned current_limit = 0; + for(unsigned j = 0; j < results.size(); ++j) + { + if(limits[current_limit] < results[j]) + { + std::string message = "Limit of " + bit_counts[current_limit] + " bit integers"; + std::cout << std::setfill('.') << std::setw(digits+1) << std::right << message << std::setfill(' ') << std::endl; + ++current_limit; + } + std::cout << std::setw(digits + 1) << std::right << results[j] << std::endl; + } +} + +/*` +The output from this routine is: +[pre + 1 + 2 + 6 + 24 + 120 + 720 + 5040 + 40320 +................Limit of 16 bit integers + 362880 + 3628800 + 39916800 + 479001600 +................Limit of 32 bit integers + 6227020800 + 87178291200 + 1307674368000 + 20922789888000 + 355687428096000 + 6402373705728000 + 121645100408832000 + 2432902008176640000 +................Limit of 64 bit integers + 51090942171709440000 + 1124000727777607680000 + 25852016738884976640000 + 620448401733239439360000 + 15511210043330985984000000 + 403291461126605635584000000 + 10888869450418352160768000000 + 304888344611713860501504000000 + 8841761993739701954543616000000 + 265252859812191058636308480000000 + 8222838654177922817725562880000000 + 263130836933693530167218012160000000 + 8683317618811886495518194401280000000 + 295232799039604140847618609643520000000 +] +*/ + +//] + +//[BITOPS + +/*` +In this example we'll show how individual bits within an integer may be manipulated, +we'll start with an often needed calculation of ['2[super n] - 1], which we could obviously +implement like this: +*/ + +using boost::multiprecision::cpp_int; + +cpp_int b1(unsigned n) +{ + cpp_int r(1); + return (r << n) - 1; +} + +/*` +Calling: + + std::cout << std::hex << std::showbase << b1(200) << std::endl; + +Yields as expected: + +[pre 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF] + +However, we could equally just set the n'th bit in the result, like this: +*/ + +cpp_int b2(unsigned n) +{ + cpp_int r(0); + return --bit_set(r, n); +} + +/*` +Note how the `bit_set` function sets the specified bit in its argument and then returns a reference to the result - +which we can then simply decrement. The result from a call to `b2` is the same as that to `b1`. + +We can equally test bits, so for example the n'th bit of the result returned from `b2` shouldn't be set +unless we increment it first: + + BOOST_ASSERT(!bit_test(b1(200), 200)); // OK + BOOST_ASSERT(bit_test(++b1(200), 200)); // OK + +And of course if we flip the n'th bit after increment, then we should get back to zero: + + BOOST_ASSERT(!bit_flip(++b1(200), 200)); // OK +*/ + +//] + +int main() +{ + print_factorials(); + + std::cout << std::hex << std::showbase << b1(200) << std::endl; + std::cout << std::hex << std::showbase << b2(200) << std::endl; + BOOST_ASSERT(!bit_test(b1(200), 200)); // OK + BOOST_ASSERT(bit_test(++b1(200), 200)); // OK + BOOST_ASSERT(!bit_flip(++b1(200), 200)); // OK + return 0; +} + +/* + +Program output: + + 1 + 2 + 6 + 24 + 120 + 720 + 5040 + 40320 +................Limit of 16 bit integers + 362880 + 3628800 + 39916800 + 479001600 +................Limit of 32 bit integers + 6227020800 + 87178291200 + 1307674368000 + 20922789888000 + 355687428096000 + 6402373705728000 + 121645100408832000 + 2432902008176640000 +................Limit of 64 bit integers + 51090942171709440000 + 1124000727777607680000 + 25852016738884976640000 + 620448401733239439360000 + 15511210043330985984000000 + 403291461126605635584000000 + 10888869450418352160768000000 + 304888344611713860501504000000 + 8841761993739701954543616000000 + 265252859812191058636308480000000 + 8222838654177922817725562880000000 + 263130836933693530167218012160000000 + 8683317618811886495518194401280000000 + 295232799039604140847618609643520000000 + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + */ diff --git a/src/boost/libs/multiprecision/example/logged_adaptor.cpp b/src/boost/libs/multiprecision/example/logged_adaptor.cpp new file mode 100644 index 00000000..f204cf39 --- /dev/null +++ b/src/boost/libs/multiprecision/example/logged_adaptor.cpp @@ -0,0 +1,119 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2013 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +//[logged_adaptor + +#include <boost/multiprecision/mpfi.hpp> +#include <boost/multiprecision/logged_adaptor.hpp> +#include <iostream> +#include <iomanip> +// +// Begin by overloading log_postfix_event so we can capture each arithmetic event as it happens: +// +namespace boost{ namespace multiprecision{ + +template <unsigned D> +inline void log_postfix_event(const mpfi_float_backend<D>& val, const char* event_description) +{ + // Print out the (relative) diameter of the interval: + using namespace boost::multiprecision; + number<mpfr_float_backend<D> > diam; + mpfi_diam(diam.backend().data(), val.data()); + std::cout << "Diameter was " << diam << " after operation: " << event_description << std::endl; +} +template <unsigned D, class T> +inline void log_postfix_event(const mpfi_float_backend<D>&, const T&, const char* event_description) +{ + // This version is never called in this example. +} + +}} + + +int main() +{ + using namespace boost::multiprecision; + typedef number<logged_adaptor<mpfi_float_backend<17> > > logged_type; + // + // Test case deliberately introduces cancellation error, relative size of interval + // gradually gets larger after each operation: + // + logged_type a = 1; + a /= 10; + + for(unsigned i = 0; i < 13; ++i) + { + logged_type b = a * 9; + b /= 10; + a -= b; + } + std::cout << "Final value was: " << a << std::endl; + return 0; +} + +//] + +/* +//[logged_adaptor_output + +Diameter was nan after operation: Default construct +Diameter was 0 after operation: Assignment from arithmetic type +Diameter was 4.33681e-18 after operation: /= +Diameter was nan after operation: Default construct +Diameter was 7.70988e-18 after operation: * +Diameter was 9.63735e-18 after operation: /= +Diameter was 1.30104e-16 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 1.30104e-16 after operation: * +Diameter was 1.38537e-16 after operation: /= +Diameter was 2.54788e-15 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 2.54788e-15 after operation: * +Diameter was 2.54863e-15 after operation: /= +Diameter was 4.84164e-14 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 4.84164e-14 after operation: * +Diameter was 4.84221e-14 after operation: /= +Diameter was 9.19962e-13 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 9.19962e-13 after operation: * +Diameter was 9.19966e-13 after operation: /= +Diameter was 1.74793e-11 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 1.74793e-11 after operation: * +Diameter was 1.74793e-11 after operation: /= +Diameter was 3.32107e-10 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 3.32107e-10 after operation: * +Diameter was 3.32107e-10 after operation: /= +Diameter was 6.31003e-09 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 6.31003e-09 after operation: * +Diameter was 6.31003e-09 after operation: /= +Diameter was 1.19891e-07 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 1.19891e-07 after operation: * +Diameter was 1.19891e-07 after operation: /= +Diameter was 2.27792e-06 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 2.27792e-06 after operation: * +Diameter was 2.27792e-06 after operation: /= +Diameter was 4.32805e-05 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 4.32805e-05 after operation: * +Diameter was 4.32805e-05 after operation: /= +Diameter was 0.00082233 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 0.00082233 after operation: * +Diameter was 0.00082233 after operation: /= +Diameter was 0.0156243 after operation: -= +Diameter was nan after operation: Default construct +Diameter was 0.0156243 after operation: * +Diameter was 0.0156243 after operation: /= +Diameter was 0.296861 after operation: -= +Final value was: {8.51569e-15,1.14843e-14} + +//] +*/ diff --git a/src/boost/libs/multiprecision/example/mixed_integer_arithmetic.cpp b/src/boost/libs/multiprecision/example/mixed_integer_arithmetic.cpp new file mode 100644 index 00000000..c1ab5b5c --- /dev/null +++ b/src/boost/libs/multiprecision/example/mixed_integer_arithmetic.cpp @@ -0,0 +1,55 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +# define _SCL_SECURE_NO_WARNINGS +#endif + +//[mixed_eg +#include <boost/multiprecision/cpp_int.hpp> + +int main() +{ + using namespace boost::multiprecision; + + boost::uint64_t i = (std::numeric_limits<boost::uint64_t>::max)(); + boost::uint64_t j = 1; + + uint128_t ui128; + uint256_t ui256; + // + // Start by performing arithmetic on 64-bit integers to yield 128-bit results: + // + std::cout << std::hex << std::showbase << i << std::endl; + std::cout << std::hex << std::showbase << add(ui128, i, j) << std::endl; + std::cout << std::hex << std::showbase << multiply(ui128, i, i) << std::endl; + // + // The try squaring a 128-bit integer to yield a 256-bit result: + // + ui128 = (std::numeric_limits<uint128_t>::max)(); + std::cout << std::hex << std::showbase << multiply(ui256, ui128, ui128) << std::endl; + + return 0; +} +//] + +/* + +Program output: + +//[mixed_output + +0xffffffffffffffff +0x10000000000000000 +0xFFFFFFFFFFFFFFFE0000000000000001 +0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000001 + +//] +*/ + diff --git a/src/boost/libs/multiprecision/example/mpc_examples.cpp b/src/boost/libs/multiprecision/example/mpc_examples.cpp new file mode 100644 index 00000000..30f9a0bf --- /dev/null +++ b/src/boost/libs/multiprecision/example/mpc_examples.cpp @@ -0,0 +1,121 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2018 Nick Thompson. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +/*`This example demonstrates the usage of the MPC backend for multiprecision complex numbers. +In the following, we will show how using MPC backend allows for the same operations as the C++ standard library complex numbers. +*/ + +//[mpc_eg +#include <iostream> +#include <complex> +#include <boost/multiprecision/mpc.hpp> + +template<class Complex> +void complex_number_examples() +{ + Complex z1{0, 1}; + std::cout << std::setprecision(std::numeric_limits<typename Complex::value_type>::digits10); + std::cout << std::scientific << std::fixed; + std::cout << "Print a complex number: " << z1 << std::endl; + std::cout << "Square it : " << z1*z1 << std::endl; + std::cout << "Real part : " << z1.real() << " = " << real(z1) << std::endl; + std::cout << "Imaginary part : " << z1.imag() << " = " << imag(z1) << std::endl; + using std::abs; + std::cout << "Absolute value : " << abs(z1) << std::endl; + std::cout << "Argument : " << arg(z1) << std::endl; + std::cout << "Norm : " << norm(z1) << std::endl; + std::cout << "Complex conjugate : " << conj(z1) << std::endl; + std::cout << "Projection onto Riemann sphere: " << proj(z1) << std::endl; + typename Complex::value_type r = 1; + typename Complex::value_type theta = 0.8; + using std::polar; + std::cout << "Polar coordinates (phase = 0) : " << polar(r) << std::endl; + std::cout << "Polar coordinates (phase !=0) : " << polar(r, theta) << std::endl; + + std::cout << "\nElementary special functions:\n"; + using std::exp; + std::cout << "exp(z1) = " << exp(z1) << std::endl; + using std::log; + std::cout << "log(z1) = " << log(z1) << std::endl; + using std::log10; + std::cout << "log10(z1) = " << log10(z1) << std::endl; + using std::pow; + std::cout << "pow(z1, z1) = " << pow(z1, z1) << std::endl; + using std::sqrt; + std::cout << "Take its square root : " << sqrt(z1) << std::endl; + using std::sin; + std::cout << "sin(z1) = " << sin(z1) << std::endl; + using std::cos; + std::cout << "cos(z1) = " << cos(z1) << std::endl; + using std::tan; + std::cout << "tan(z1) = " << tan(z1) << std::endl; + using std::asin; + std::cout << "asin(z1) = " << asin(z1) << std::endl; + using std::acos; + std::cout << "acos(z1) = " << acos(z1) << std::endl; + using std::atan; + std::cout << "atan(z1) = " << atan(z1) << std::endl; + using std::sinh; + std::cout << "sinh(z1) = " << sinh(z1) << std::endl; + using std::cosh; + std::cout << "cosh(z1) = " << cosh(z1) << std::endl; + using std::tanh; + std::cout << "tanh(z1) = " << tanh(z1) << std::endl; + using std::asinh; + std::cout << "asinh(z1) = " << asinh(z1) << std::endl; + using std::acosh; + std::cout << "acosh(z1) = " << acosh(z1) << std::endl; + using std::atanh; + std::cout << "atanh(z1) = " << atanh(z1) << std::endl; +} + +int main() +{ + std::cout << "First, some operations we usually perform with std::complex:\n"; + complex_number_examples<std::complex<double>>(); + std::cout << "\nNow the same operations performed using the MPC backend:\n"; + complex_number_examples<boost::multiprecision::mpc_complex_50>(); + + return 0; +} +//] + +/* + +//[mpc_out + +Print a complex number: (0.00000000000000000000000000000000000000000000000000,1.00000000000000000000000000000000000000000000000000) +Square it : -1.00000000000000000000000000000000000000000000000000 +Real part : 0.00000000000000000000000000000000000000000000000000 = 0.00000000000000000000000000000000000000000000000000 +Imaginary part : 1.00000000000000000000000000000000000000000000000000 = 1.00000000000000000000000000000000000000000000000000 +Absolute value : 1.00000000000000000000000000000000000000000000000000 +Argument : 1.57079632679489661923132169163975144209858469968755 +Norm : 1.00000000000000000000000000000000000000000000000000 +Complex conjugate : (0.00000000000000000000000000000000000000000000000000,-1.00000000000000000000000000000000000000000000000000) +Projection onto Riemann sphere: (0.00000000000000000000000000000000000000000000000000,1.00000000000000000000000000000000000000000000000000) +Polar coordinates (phase = 0) : 1.00000000000000000000000000000000000000000000000000 +Polar coordinates (phase !=0) : (0.69670670934716538906374002277244853473117519431538,0.71735609089952279256716781570337728075604730751255) + +Elementary special functions: +exp(z1) = (0.54030230586813971740093660744297660373231042061792,0.84147098480789650665250232163029899962256306079837) +log(z1) = (0.00000000000000000000000000000000000000000000000000,1.57079632679489661923132169163975144209858469968755) +log10(z1) = (0.00000000000000000000000000000000000000000000000000,0.68218817692092067374289181271567788510506374186196) +pow(z1, z1) = 0.20787957635076190854695561983497877003387784163177 +Take its square root : (0.70710678118654752440084436210484903928483593768847,0.70710678118654752440084436210484903928483593768847) +sin(z1) = (0.00000000000000000000000000000000000000000000000000,1.17520119364380145688238185059560081515571798133410) +cos(z1) = 1.54308063481524377847790562075706168260152911236587 +tan(z1) = (0.00000000000000000000000000000000000000000000000000,0.76159415595576488811945828260479359041276859725794) +asin(z1) = (0.00000000000000000000000000000000000000000000000000,0.88137358701954302523260932497979230902816032826163) +acos(z1) = (1.57079632679489661923132169163975144209858469968755,-0.88137358701954302523260932497979230902816032826163) +atan(z1) = (0.00000000000000000000000000000000000000000000000000,inf) +sinh(z1) = (0.00000000000000000000000000000000000000000000000000,0.84147098480789650665250232163029899962256306079837) +cosh(z1) = 0.54030230586813971740093660744297660373231042061792 +tanh(z1) = (0.00000000000000000000000000000000000000000000000000,1.55740772465490223050697480745836017308725077238152) +asinh(z1) = (0.00000000000000000000000000000000000000000000000000,1.57079632679489661923132169163975144209858469968755) +acosh(z1) = (0.88137358701954302523260932497979230902816032826163,1.57079632679489661923132169163975144209858469968755) +atanh(z1) = (0.00000000000000000000000000000000000000000000000000,0.78539816339744830961566084581987572104929234984378) + +//] +*/ diff --git a/src/boost/libs/multiprecision/example/mpfi_snips.cpp b/src/boost/libs/multiprecision/example/mpfi_snips.cpp new file mode 100644 index 00000000..b36e22b5 --- /dev/null +++ b/src/boost/libs/multiprecision/example/mpfi_snips.cpp @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +//[mpfi_eg +#include <boost/multiprecision/mpfi.hpp> +#include <boost/math/special_functions/gamma.hpp> +#include <iostream> + +int main() +{ + using namespace boost::multiprecision; + + // Operations at variable precision and no numeric_limits support: + mpfi_float a = 2; + mpfi_float::default_precision(1000); + std::cout << mpfi_float::default_precision() << std::endl; + std::cout << sqrt(a) << std::endl; // print root-2 + + // Operations at fixed precision and full numeric_limits support: + mpfi_float_100 b = 2; + std::cout << std::numeric_limits<mpfi_float_100>::digits << std::endl; + // We can use any C++ std lib function: + std::cout << log(b) << std::endl; // print log(2) + + // Access the underlying data: + mpfi_t r; + mpfi_init(r); + mpfi_set(r, b.backend().data()); + + // Construct some explicit intervals and perform set operations: + mpfi_float_50 i1(1, 2), i2(1.5, 2.5); + std::cout << intersect(i1, i2) << std::endl; + std::cout << hull(i1, i2) << std::endl; + std::cout << overlap(i1, i2) << std::endl; + std::cout << subset(i1, i2) << std::endl; + mpfi_clear(r); + return 0; +} +//] + diff --git a/src/boost/libs/multiprecision/example/mpfr_precision.cpp b/src/boost/libs/multiprecision/example/mpfr_precision.cpp new file mode 100644 index 00000000..eb559cbe --- /dev/null +++ b/src/boost/libs/multiprecision/example/mpfr_precision.cpp @@ -0,0 +1,252 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +//[mpfr_variable + +/*` +This example illustrates the use of variable-precision arithmetic with +the `mpfr_float` number type. We'll calculate the median of the +beta distribution to an absurdly high precision and compare the +accuracy and times taken for various methods. That is, we want +to calculate the value of `x` for which ['I[sub x](a, b) = 0.5]. + +Ultimately we'll use Newtons method and set the precision of +mpfr_float to have just enough digits at each iteration. + +The full source of the this program is in [@../../example/mpfr_precision.cpp] + +We'll skip over the #includes and using declations, and go straight to +some support code, first off a simple stopwatch for performance measurement: + +*/ + +//=template <class clock_type> +//=struct stopwatch { /*details \*/ }; + +/*` +We'll use `stopwatch<std::chono::high_resolution_clock>` as our performance measuring device. + +We also have a small utility class for controlling the current precision of mpfr_float: + + struct scoped_precision + { + unsigned p; + scoped_precision(unsigned new_p) : p(mpfr_float::default_precision()) + { + mpfr_float::default_precision(new_p); + } + ~scoped_precision() + { + mpfr_float::default_precision(p); + } + }; + +*/ +//<- +#include <boost/multiprecision/mpfr.hpp> +#include <boost/math/special_functions/beta.hpp> +#include <boost/math/special_functions/relative_difference.hpp> +#include <iostream> +#include <chrono> + +using boost::multiprecision::mpfr_float; +using boost::math::ibeta_inv; +using namespace boost::math::policies; + +template <class clock_type> +struct stopwatch +{ +public: + typedef typename clock_type::duration duration_type; + + stopwatch() : m_start(clock_type::now()) { } + + stopwatch(const stopwatch& other) : m_start(other.m_start) { } + + stopwatch& operator=(const stopwatch& other) + { + m_start = other.m_start; + return *this; + } + + ~stopwatch() { } + + float elapsed() const + { + return float(std::chrono::nanoseconds((clock_type::now() - m_start)).count()) / 1e9f; + } + + void reset() + { + m_start = clock_type::now(); + } + +private: + typename clock_type::time_point m_start; +}; + +struct scoped_precision +{ + unsigned p; + scoped_precision(unsigned new_p) : p(mpfr_float::default_precision()) + { + mpfr_float::default_precision(new_p); + } + ~scoped_precision() + { + mpfr_float::default_precision(p); + } +}; +//-> + +/*` +We'll begin with a reference method that simply calls the Boost.Math function `ibeta_inv` and uses the +full working precision of the arguments throughout. Our reference function takes 3 arguments: + +* The 2 parameters `a` and `b` of the beta distribution, and +* The number of decimal digits precision to achieve in the result. + +We begin by setting the default working precision to that requested, and then, since we don't know where +our arguments `a` and `b` have been or what precision they have, we make a copy of them - note that since +copying also copies the precision as well as the value, we have to set the precision expicitly with a +second argument to the copy. Then we can simply return the result of `ibeta_inv`: +*/ +mpfr_float beta_distribution_median_method_1(mpfr_float const& a_, mpfr_float const& b_, unsigned digits10) +{ + scoped_precision sp(digits10); + mpfr_float half(0.5), a(a_, digits10), b(b_, digits10); + return ibeta_inv(a, b, half); +} +/*` +You be wondering why we needed to change the precision of our variables `a` and `b` as well as setting the default - +there are in fact two ways in which this can go wrong if we don't do that: + +* The variables have too much precision - this will cause all arithmetic operations involving those types to be +promoted to the higher precision wasting precious calculation time. +* The variables have too little precision - this will cause expressions involving only those variables to be +calculated at the lower precision - for example if we calculate `exp(a)` internally, this will be evaluated at +the precision of `a`, and not the current default. + +Since our reference method carries out all calculations at the full precision requested, an obvious refinement +would be to calculate a first approximation to `double` precision and then to use Newton steps to refine it further. + +Our function begins the same as before: set the new default precision and then make copies of our arguments +at the correct precision. We then call `ibeta_inv` with all double precision arguments, promote the result +to an `mpfr_float` and perform Newton steps to obtain the result. Note that our termination condition is somewhat +cude: we simply assume that we have approximately 14 digits correct from the double-precision approximation and +that the precision doubles with each step. We also cheat, and use an internal Boost.Math function that calculates +['I[sub x](a, b)] and it's derivative in one go: + +*/ +mpfr_float beta_distribution_median_method_2(mpfr_float const& a_, mpfr_float const& b_, unsigned digits10) +{ + scoped_precision sp(digits10); + mpfr_float half(0.5), a(a_, digits10), b(b_, digits10); + mpfr_float guess = ibeta_inv((double)a, (double)b, 0.5); + unsigned current_digits = 14; + mpfr_float f, f1; + while (current_digits < digits10) + { + f = boost::math::detail::ibeta_imp(a, b, guess, boost::math::policies::policy<>(), false, true, &f1) - half; + guess -= f / f1; + current_digits *= 2; + } + return guess; +} +/*` +Before we refine the method further, it might be wise to take stock and see how method's 1 and 2 compare. +We'll ask them both for 1500 digit precision, and compare against the value produced by `ibeta_inv` at 1700 digits. +Here's what the results look like: + +[pre +Method 1 time = 0.611647 +Relative error: 2.99991e-1501 +Method 2 time = 0.646746 +Relative error: 7.55843e-1501 +] + +Clearly they are both equally accurate, but Method 1 is actually faster and our plan for improved performance +hasn't actually worked. It turns out that we're not actually comparing like with like, because `ibeta_inv` uses +Halley iteration internally which churns out more digits of precision rather more rapidly than Newton iteration. +So the time we save by refining an initial `double` approximation, then loose it again by taking more iterations +to get to the result. + +Time for a more refined approach. It follows the same form as Method 2, but now we set the working precision +within the Newton iteration loop, to just enough digits to cover the expected precision at each step. That means +we also create new copies of our arguments at the correct precision within the loop, and likewise change the precision +of the current `guess` each time through: + +*/ + +mpfr_float beta_distribution_median_method_3(mpfr_float const& a_, mpfr_float const& b_, unsigned digits10) +{ + mpfr_float guess = ibeta_inv((double)a_, (double)b_, 0.5); + unsigned current_digits = 14; + mpfr_float f(0, current_digits), f1(0, current_digits), delta(1); + while (current_digits < digits10) + { + current_digits *= 2; + scoped_precision sp((std::min)(current_digits, digits10)); + mpfr_float a(a_, mpfr_float::default_precision()), b(b_, mpfr_float::default_precision()); + guess.precision(mpfr_float::default_precision()); + f = boost::math::detail::ibeta_imp(a, b, guess, boost::math::policies::policy<>(), false, true, &f1) - 0.5f; + guess -= f / f1; + } + return guess; +} + +/*` +The new performance results look much more promising: + +[pre +Method 1 time = 0.591244 +Relative error: 2.99991e-1501 +Method 2 time = 0.622679 +Relative error: 7.55843e-1501 +Method 3 time = 0.143393 +Relative error: 4.03898e-1501 +] + +This time we're 4x faster than `ibeta_inv`, and no doubt that could be improved a little more by carefully +optimising the number of iterations and the method (Halley vs Newton) taken. + +Finally, here's the driver code for the above methods: + +*/ + +int main() +{ + try { + mpfr_float a(10), b(20); + + mpfr_float true_value = beta_distribution_median_method_1(a, b, 1700); + + stopwatch<std::chrono::high_resolution_clock> my_stopwatch; + + mpfr_float v1 = beta_distribution_median_method_1(a, b, 1500); + float hp_time = my_stopwatch.elapsed(); + std::cout << "Method 1 time = " << hp_time << std::endl; + std::cout << "Relative error: " << boost::math::relative_difference(v1, true_value) << std::endl; + + my_stopwatch.reset(); + mpfr_float v2 = beta_distribution_median_method_2(a, b, 1500); + hp_time = my_stopwatch.elapsed(); + std::cout << "Method 2 time = " << hp_time << std::endl; + std::cout << "Relative error: " << boost::math::relative_difference(v2, true_value) << std::endl; + + my_stopwatch.reset(); + mpfr_float v3 = beta_distribution_median_method_3(a, b, 1500); + hp_time = my_stopwatch.elapsed(); + std::cout << "Method 3 time = " << hp_time << std::endl; + std::cout << "Relative error: " << boost::math::relative_difference(v3, true_value) << std::endl; + } + catch (const std::exception& e) + { + std::cout << "Found exception with message: " << e.what() << std::endl; + } + return 0; +} +//] + diff --git a/src/boost/libs/multiprecision/example/mpfr_snips.cpp b/src/boost/libs/multiprecision/example/mpfr_snips.cpp new file mode 100644 index 00000000..e0ac6aeb --- /dev/null +++ b/src/boost/libs/multiprecision/example/mpfr_snips.cpp @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +//[mpfr_eg +#include <boost/multiprecision/mpfr.hpp> +#include <boost/math/special_functions/gamma.hpp> +#include <iostream> + +int main() +{ + using namespace boost::multiprecision; + + // Operations at variable precision and no numeric_limits support: + mpfr_float a = 2; + mpfr_float::default_precision(1000); + std::cout << mpfr_float::default_precision() << std::endl; + std::cout << sqrt(a) << std::endl; // print root-2 + + // Operations at fixed precision and full numeric_limits support: + mpfr_float_100 b = 2; + std::cout << std::numeric_limits<mpfr_float_100>::digits << std::endl; + // We can use any C++ std lib function: + std::cout << log(b) << std::endl; // print log(2) + // We can also use any function from Boost.Math: + std::cout << boost::math::tgamma(b) << std::endl; + // These even work when the argument is an expression template: + std::cout << boost::math::tgamma(b * b) << std::endl; + + // Access the underlying data: + mpfr_t r; + mpfr_init(r); + mpfr_set(r, b.backend().data(), GMP_RNDN); + mpfr_clear(r); + return 0; +} +//] + + diff --git a/src/boost/libs/multiprecision/example/numeric_limits_snips.cpp b/src/boost/libs/multiprecision/example/numeric_limits_snips.cpp new file mode 100644 index 00000000..e114f0a2 --- /dev/null +++ b/src/boost/libs/multiprecision/example/numeric_limits_snips.cpp @@ -0,0 +1,470 @@ +// Copyright Paul A. Bristow 2013 +// Copyright John Maddock 2013 +// Copyright Christopher Kormanyos + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +// Examples of numeric_limits usage as snippets for multiprecision documentation. + +// Includes text as Quickbook comments. + +#include <iostream> +#include <iomanip> +#include <string> +#include <sstream> +#include <limits> // numeric_limits +#include <iomanip> +#include <locale> +#include <boost/assert.hpp> + +#include <boost/math/constants/constants.hpp> +#include <boost/math/special_functions/nonfinite_num_facets.hpp> + +#include <boost/math/special_functions/factorials.hpp> +#include <boost/math/special_functions/next.hpp> +#include <boost/math/tools/precision.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> // is decimal. +#include <boost/multiprecision/cpp_bin_float.hpp> // is binary. + +#define BOOST_TEST_MAIN +#include <boost/test/unit_test.hpp> // Boost.Test +#include <boost/test/floating_point_comparison.hpp> + +static long double const log10Two = 0.30102999566398119521373889472449L; // log10(2.) + +template <typename T> +int max_digits10() +{ + int significand_digits = std::numeric_limits<T>::digits; + // BOOST_CONSTEXPR_OR_CONST int significand_digits = std::numeric_limits<T>::digits; + return static_cast<int>(ceil(1 + significand_digits * log10Two)); +} // template <typename T> int max_digits10() + +// Used to test max_digits10<>() function below. +//#define BOOST_NO_CXX11_NUMERIC_LIMITS + +BOOST_AUTO_TEST_CASE(test_numeric_limits_snips) +{ +#if !(defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(BOOST_MSVC) && (BOOST_MSVC == 1600)) + try + { + +// Example of portable way to get `std::numeric_limits<T>::max_digits10`. +//[max_digits10_1 + +/*`For example, to be portable (including obselete platforms) for type `T` where `T` may be: + `float`, `double`, `long double`, `128-bit quad type`, `cpp_bin_float_50` ... +*/ + + typedef float T; + +#if defined BOOST_NO_CXX11_NUMERIC_LIMITS + // No max_digits10 implemented. + std::cout.precision(max_digits10<T>()); +#else + #if(_MSC_VER <= 1600) + // Wrong value for std::numeric_limits<float>::max_digits10. + std::cout.precision(max_digits10<T>()); + #else // Use the C++11 max_digits10. + std::cout.precision(std::numeric_limits<T>::max_digits10); + #endif +#endif + + std::cout << "std::cout.precision(max_digits10) = " << std::cout.precision() << std::endl; // 9 + + double x = 1.2345678901234567889; + + std::cout << "x = " << x << std::endl; // + +/*`which should output: + + std::cout.precision(max_digits10) = 9 + x = 1.23456789 +*/ + +//] [/max_digits10_1] + + { +//[max_digits10_2 + + double write = 2./3; // Any arbitrary value that cannot be represented exactly. + double read = 0; + std::stringstream s; + s.precision(std::numeric_limits<double>::digits10); // or `float64_t` for 64-bit IEE754 double. + s << write; + s >> read; + if(read != write) + { + std::cout << std::setprecision(std::numeric_limits<double>::digits10) + << read << " != " << write << std::endl; + } + +//] [/max_digits10_2] + // 0.666666666666667 != 0.666666666666667 + } + + { +//[max_digits10_3 + + double pi = boost::math::double_constants::pi; + std::cout.precision(std::numeric_limits<double>::max_digits10); + std::cout << pi << std::endl; // 3.1415926535897931 + +//] [/max_digits10_3] + } + { +//[max_digits10_4 +/*`and similarly for a much higher precision type: +*/ + + using namespace boost::multiprecision; + + typedef number<cpp_dec_float<50> > cpp_dec_float_50; // 50 decimal digits. + + using boost::multiprecision::cpp_dec_float_50; + + cpp_dec_float_50 pi = boost::math::constants::pi<cpp_dec_float_50>(); + std::cout.precision(std::numeric_limits<cpp_dec_float_50>::max_digits10); + std::cout << pi << std::endl; + // 3.141592653589793238462643383279502884197169399375105820974944592307816406 +//] [/max_digits10_4] + } + + { +//[max_digits10_5 + + for (int i = 2; i < 15; i++) + { + std::cout << std::setw(std::numeric_limits<int>::max_digits10) + << boost::math::factorial<double>(i) << std::endl; + } + +//] [/max_digits10_5] + } + + } + catch(std::exception ex) + { + std::cout << "Caught Exception " << ex.what() << std::endl; + } + + { +//[max_digits10_6 + + typedef double T; + + bool denorm = std::numeric_limits<T>::denorm_min() < (std::numeric_limits<T>::min)(); + BOOST_ASSERT(denorm); + +//] [/max_digits10_6] + } + + { + unsigned char c = 255; + std::cout << "char c = " << (int)c << std::endl; + } + + { +//[digits10_1 + std::cout + << std::setw(std::numeric_limits<short>::digits10 +1 +1) // digits10+1, and +1 for sign. + << std::showpos << (std::numeric_limits<short>::max)() // +32767 + << std::endl + << std::setw(std::numeric_limits<short>::digits10 +1 +1) + << (std::numeric_limits<short>::min)() << std::endl; // -32767 +//] [/digits10_1] + } + + { +//[digits10_2 + std::cout + << std::setw(std::numeric_limits<unsigned short>::digits10 +1 +1) // digits10+1, and +1 for sign. + << std::showpos << (std::numeric_limits<unsigned short>::max)() // 65535 + << std::endl + << std::setw(std::numeric_limits<unsigned short>::digits10 +1 +1) // digits10+1, and +1 for sign. + << (std::numeric_limits<unsigned short>::min)() << std::endl; // 0 +//] [/digits10_2] + } + + std::cout <<std::noshowpos << std::endl; + + { +//[digits10_3 + std::cout.precision(std::numeric_limits<double>::max_digits10); + double d = 1e15; + double dp1 = d+1; + std::cout << d << "\n" << dp1 << std::endl; + // 1000000000000000 + // 1000000000000001 + std::cout << dp1 - d << std::endl; // 1 +//] [/digits10_3] + } + + { +//[digits10_4 + std::cout.precision(std::numeric_limits<double>::max_digits10); + double d = 1e16; + double dp1 = d+1; + std::cout << d << "\n" << dp1 << std::endl; + // 10000000000000000 + // 10000000000000000 + std::cout << dp1 - d << std::endl; // 0 !!! +//] [/digits10_4] + } + + { +//[epsilon_1 + std::cout.precision(std::numeric_limits<double>::max_digits10); + double d = 1.; + double eps = std::numeric_limits<double>::epsilon(); + double dpeps = d+eps; + std::cout << std::showpoint // Ensure all trailing zeros are shown. + << d << "\n" // 1.0000000000000000 + << dpeps << std::endl; // 2.2204460492503131e-016 + std::cout << dpeps - d // 1.0000000000000002 + << std::endl; +//] [epsilon_1] + } + + { +//[epsilon_2 + double one = 1.; + double nad = boost::math::float_next(one); + std::cout << nad << "\n" // 1.0000000000000002 + << nad - one // 2.2204460492503131e-016 + << std::endl; +//] [epsilon_2] + } + { +//[epsilon_3 + std::cout.precision(std::numeric_limits<double>::max_digits10); + double d = 1.; + double eps = std::numeric_limits<double>::epsilon(); + double dpeps = d + eps/2; + + std::cout << std::showpoint // Ensure all trailing zeros are shown. + << dpeps << "\n" // 1.0000000000000000 + << eps/2 << std::endl; // 1.1102230246251565e-016 + std::cout << dpeps - d // 0.00000000000000000 + << std::endl; +//] [epsilon_3] + } + + { + typedef double RealType; +//[epsilon_4 +/*`A tolerance might be defined using this version of epsilon thus: +*/ + RealType tolerance = boost::math::tools::epsilon<RealType>() * 2; +//] [epsilon_4] + } + + { +//[digits10_5 + -(std::numeric_limits<double>::max)() == std::numeric_limits<double>::lowest(); +//] [/digits10_5] +// warning C4553: '==': result of expression not used; did you intend '='? is spurious. + } + + { +//[denorm_min_1 + std::cout.precision(std::numeric_limits<double>::max_digits10); + if (std::numeric_limits<double>::has_denorm == std::denorm_present) + { + double d = std::numeric_limits<double>::denorm_min(); + + std::cout << d << std::endl; // 4.9406564584124654e-324 + + int exponent; + + double significand = frexp(d, &exponent); + std::cout << "exponent = " << std::hex << exponent << std::endl; // fffffbcf + std::cout << "significand = " << std::hex << significand << std::endl; // 0.50000000000000000 + } + else + { + std::cout << "No denormalization. " << std::endl; + } +//] [denorm_min_1] + } + + { +//[round_error_1 + double round_err = std::numeric_limits<double>::epsilon() // 2.2204460492503131e-016 + * std::numeric_limits<double>::round_error(); // 1/2 + std::cout << round_err << std::endl; // 1.1102230246251565e-016 +//] [/round_error_1] + } + + { + typedef double T; +//[tolerance_1 +/*`For example, if we want a tolerance that might suit about 9 arithmetical operations, +say sqrt(9) = 3, we could define: +*/ + + T tolerance = 3 * std::numeric_limits<T>::epsilon(); + +/*`This is very widely used in Boost.Math testing +with Boost.Test's macro `BOOST_CHECK_CLOSE_FRACTION` +*/ + + T expected = 1.0; + T calculated = 1.0 + std::numeric_limits<T>::epsilon(); + + BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance); + +//] [/tolerance_1] + } + +#if !(defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && defined(_WIN32)) + { +//[tolerance_2 + + using boost::multiprecision::number; + using boost::multiprecision::cpp_dec_float; + using boost::multiprecision::et_off; + + typedef number<cpp_dec_float<50>, et_off > cpp_dec_float_50; // 50 decimal digits. +/*`[note that Boost.Test does not yet allow floating-point comparisons with expression templates on, +so the default expression template parameter has been replaced by `et_off`.] +*/ + + cpp_dec_float_50 tolerance = 3 * std::numeric_limits<cpp_dec_float_50>::epsilon(); + cpp_dec_float_50 expected = boost::math::constants::two_pi<cpp_dec_float_50>(); + cpp_dec_float_50 calculated = 2 * boost::math::constants::pi<cpp_dec_float_50>(); + + BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance); + +//] [/tolerance_2] + } + + { +//[tolerance_3 + + using boost::multiprecision::cpp_bin_float_quad; + + cpp_bin_float_quad tolerance = 3 * std::numeric_limits<cpp_bin_float_quad>::epsilon(); + cpp_bin_float_quad expected = boost::math::constants::two_pi<cpp_bin_float_quad>(); + cpp_bin_float_quad calculated = 2 * boost::math::constants::pi<cpp_bin_float_quad>(); + + BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance); + +//] [/tolerance_3] + } + + { +//[tolerance_4 + + using boost::multiprecision::cpp_bin_float_oct; + + cpp_bin_float_oct tolerance = 3 * std::numeric_limits<cpp_bin_float_oct>::epsilon(); + cpp_bin_float_oct expected = boost::math::constants::two_pi<cpp_bin_float_oct>(); + cpp_bin_float_oct calculated = 2 * boost::math::constants::pi<cpp_bin_float_oct>(); + + BOOST_CHECK_CLOSE_FRACTION(expected, calculated, tolerance); + +//] [/tolerance_4] + } + + { +//[nan_1] + +/*`NaN can be used with binary multiprecision types like `cpp_bin_float_quad`: +*/ + using boost::multiprecision::cpp_bin_float_quad; + + if (std::numeric_limits<cpp_bin_float_quad>::has_quiet_NaN == true) + { + cpp_bin_float_quad tolerance = 3 * std::numeric_limits<cpp_bin_float_quad>::epsilon(); + + cpp_bin_float_quad NaN = std::numeric_limits<cpp_bin_float_quad>::quiet_NaN(); + std::cout << "cpp_bin_float_quad NaN is " << NaN << std::endl; // cpp_bin_float_quad NaN is nan + + cpp_bin_float_quad expected = NaN; + cpp_bin_float_quad calculated = 2 * NaN; + // Comparisons of NaN's always fail: + bool b = expected == calculated; + std::cout << b << std::endl; + BOOST_CHECK_NE(expected, expected); + BOOST_CHECK_NE(expected, calculated); + } + else + { + std::cout << "Type " << typeid(cpp_bin_float_quad).name() << " does not have NaNs!" << std::endl; + } + +//] [/nan_1] + } + + { +//[facet_1] + +/*` +See [@boost:/libs/math/example/nonfinite_facet_sstream.cpp] +and we also need + + #include <boost/math/special_functions/nonfinite_num_facets.hpp> + +Then we can equally well use a multiprecision type cpp_bin_float_quad: + +*/ + using boost::multiprecision::cpp_bin_float_quad; + + typedef cpp_bin_float_quad T; + + using boost::math::nonfinite_num_put; + using boost::math::nonfinite_num_get; + { + std::locale old_locale; + std::locale tmp_locale(old_locale, new nonfinite_num_put<char>); + std::locale new_locale(tmp_locale, new nonfinite_num_get<char>); + std::stringstream ss; + ss.imbue(new_locale); + T inf = std::numeric_limits<T>::infinity(); + ss << inf; // Write out. + BOOST_ASSERT(ss.str() == "inf"); + T r; + ss >> r; // Read back in. + BOOST_ASSERT(inf == r); // Confirms that the floating-point values really are identical. + std::cout << "infinity output was " << ss.str() << std::endl; + std::cout << "infinity input was " << r << std::endl; + } + +/*` +`` + infinity output was inf + infinity input was inf +`` +Similarly we can do the same with NaN (except that we cannot use `assert` (because any comparisons with NaN always return false). +*/ + { + std::locale old_locale; + std::locale tmp_locale(old_locale, new nonfinite_num_put<char>); + std::locale new_locale(tmp_locale, new nonfinite_num_get<char>); + std::stringstream ss; + ss.imbue(new_locale); + T n; + T NaN = std::numeric_limits<T>::quiet_NaN(); + ss << NaN; // Write out. + BOOST_ASSERT(ss.str() == "nan"); + std::cout << "NaN output was " << ss.str() << std::endl; + ss >> n; // Read back in. + std::cout << "NaN input was " << n << std::endl; + } +/*` +`` + NaN output was nan + NaN input was nan +`` +*/ +//] [/facet_1] + } + +#endif +#endif +} // BOOST_AUTO_TEST_CASE(test_numeric_limits_snips) + diff --git a/src/boost/libs/multiprecision/example/random_snips.cpp b/src/boost/libs/multiprecision/example/random_snips.cpp new file mode 100644 index 00000000..e295564b --- /dev/null +++ b/src/boost/libs/multiprecision/example/random_snips.cpp @@ -0,0 +1,315 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/random.hpp> +#include <boost/scoped_ptr.hpp> +#include <iostream> +#include <iomanip> + +void t1() +{ +//[random_eg1 +//=#include <boost/multiprecision/cpp_int.hpp> +//=#include <boost/random.hpp> +//= +//=int main() +//={ + using namespace boost::multiprecision; + using namespace boost::random; + + // + // Declare our random number generator type, the underlying generator + // is the Mersenne twister mt19937 engine, and we'll generate 256 bit + // random values, independent_bits_engine will make multiple calls + // to the underlying engine until we have the requested number of bits: + // + typedef independent_bits_engine<mt19937, 256, cpp_int> generator_type; + generator_type gen; + // + // Generate some values: + // + std::cout << std::hex << std::showbase; + for(unsigned i = 0; i < 10; ++i) + std::cout << gen() << std::endl; + // + // Alternatively if we wish to generate random values in a fixed-precision + // type, then we must use an unsigned type in order to adhere to the + // conceptual requirements of the generator: + // + typedef independent_bits_engine<mt19937, 512, uint512_t> generator512_type; + generator512_type gen512; + // + // Generate some 1024-bit unsigned values: + // + std::cout << std::hex << std::showbase; + for(unsigned i = 0; i < 10; ++i) + std::cout << gen512() << std::endl; + //= return 0; +//=} +//] +} + +// +// Output from t1() is: +//[random_eg1_out +/*`[pre +0xD091BB5C22AE9EF6E7E1FAEED5C31F792082352CF807B7DFE9D300053895AFE1 +0xA1E24BBA4EE4092B18F868638C16A625474BA8C43039CD1A8C006D5FFE2D7810 +0xF51F2AE7FF1816E4F702EF59F7BADAFA285954A1B9D09511F878C4B3FB2A0137 +0xF508E4AA1C1FE6527C419418CC50AA59CCDF2E5C4C0A1F3B2452A9DC01397D8D +0x6BF88C311CCA797AEA6DA4AEA3C78807CACE1969E0E0D4ADF5A14BAB80F00988 +0xA7DE9F4CCC450CBA0924668F5C7DC380D96089C53640AC4CEF1A2E6DAE6D9426 +0xADC1965B6613BA46C1FB41C2BD9B0ECDBE3DEDFC7989C8EE6468FD6E6C0DF032 +0xA7CD66342C826D8B2BD2E4124D4A2DBEB4BF6FA7CC1A89590826328251097330 +0x46E46CB0DF577EC20BD1E364262C556418DDA0C9FE7B45D9D2CE21C9D268409A +0xB1E049E1200BFA47512D6E73C3851EEEF341C0817D973E4808D17554A9E20D28 +0xD091BB5C22AE9EF6E7E1FAEED5C31F792082352CF807B7DFE9D300053895AFE1A1E24BBA4EE4092B18F868638C16A625474BA8C43039CD1A8C006D5FFE2D7810 +0xF51F2AE7FF1816E4F702EF59F7BADAFA285954A1B9D09511F878C4B3FB2A0137F508E4AA1C1FE6527C419418CC50AA59CCDF2E5C4C0A1F3B2452A9DC01397D8D +0x6BF88C311CCA797AEA6DA4AEA3C78807CACE1969E0E0D4ADF5A14BAB80F00988A7DE9F4CCC450CBA0924668F5C7DC380D96089C53640AC4CEF1A2E6DAE6D9426 +0xADC1965B6613BA46C1FB41C2BD9B0ECDBE3DEDFC7989C8EE6468FD6E6C0DF032A7CD66342C826D8B2BD2E4124D4A2DBEB4BF6FA7CC1A89590826328251097330 +0x46E46CB0DF577EC20BD1E364262C556418DDA0C9FE7B45D9D2CE21C9D268409AB1E049E1200BFA47512D6E73C3851EEEF341C0817D973E4808D17554A9E20D28 +0x70518CE6203AC30361ADD0AB35D0430CC3F8E8920D1C8509CB92388E095436BF2FD6E20868A29AF97D61330B753EC6FC7211EFEA7CD15133A574C4FFCB41F198 +0xB598EEF6EBBE7347C1332568CEBA5A7046A99459B4AD9F11AE00FEAA00B8B573A7B480B6B5F0B06C29A0EC27A4DAA0101E76A1C574BE91337F94C950C61F6ED6 +0xF5B1C7A192E195F8572384D4E0732C8895D41B68CEE496C3394BBD52048CD47CC05309BED23D2D63414DE9C5D2229F23818666A3F0A8B109B2F6B12769A48341 +0xE4123C566C548C8FF5941F6194B993AA8C1651342876763C237CE42EC300D11B263821CA3AEB820241EC0F84CF4AC36DD7393EE6FD0FC06A4118A30A551B54A4 +0xD074F86F4CC1C54A3E57A70303774CDAEDE43895379CE62759988939E8490DDC325410E1D9352F6A4047080AF47C081D9DB51A85C765D71F79297527FCCA2773 +] +*/ +//] + + +void t2() +{ + std::cout << std::dec; +//[random_eg2 +//=#include <boost/multiprecision/cpp_int.hpp> +//=#include <boost/random.hpp> +//= +//=int main() +//={ + using namespace boost::multiprecision; + using namespace boost::random; + + // + // Generate integers in a given range using uniform_int, + // the underlying generator is invoked multiple times + // to generate enough bits: + // + mt19937 mt; + uniform_int_distribution<cpp_int> ui(-(cpp_int(1) << 256), cpp_int(1) << 256); + // + // Generate the numbers: + // + for(unsigned i = 0; i < 10; ++i) + std::cout << ui(mt) << std::endl; + +//= return 0; +//=} +//] +} +//[random_eg2_out +/*` +Program output is + +[pre +25593993629538149833210527544371584707508847463356155903670894544241785158492 +12721121657520147247744796431842326146296294180809160027132416389225539366745 +106034929479008809862776424170460808190085984129117168803272987114325199071833 +86048861429530654936263414134573980939351899046345384016090167510299251354700 +-23473382144925885755951447143660880642389842563343761080591177733698450031250 +76840269649240973945508128641415259490679375154523618053296924666747244530145 +21638369166612496703991271955994563624044383325105383029306009417224944272131 +18829152205014764576551421737727569993966577957447887116062495161081023584880 +101521572847669971701030312596819435590097618913255156117898217707115132658117 +-97490271301923067621481012355971422109456300816856752380346627103308328292057 +] +*/ +//] + +void t3() +{ +//[random_eg3 +//=#include <boost/multiprecision/cpp_bin_float.hpp> +//=#include <boost/random.hpp> +//= +//=int main() +//={ + using namespace boost::multiprecision; + using namespace boost::random; + + mt19937 gen; + // + // Generate the values: + // + std::cout << std::setprecision(50); + for(unsigned i = 0; i < 20; ++i) + std::cout << generate_canonical<cpp_bin_float_50, std::numeric_limits<cpp_bin_float_50>::digits>(gen) << std::endl; +//= return 0; +//=} +//] +} + +//[random_eg3_out +/*` +Which produces the following output: + +[pre +0.96886777112423135248554451482797431507115448261086 +0.54722059636785192454525760726084778627750790023546 +0.99646132554800874317788284808573062871409279729804 +0.98110969177693891782396443737643892769773768718591 +0.29702944955795083040856753579705872634075574515969 +0.63976335709815275010379796044374742646738557798647 +0.79792861516022605265555700991255998690336456180995 +0.68135953856026596523755400091345037778580909233387 +0.47475868061723477935404326837783394169122045199915 +0.30191312687731969398296589840622989141067852863748 +0.87242882006730022427155209451091472382531795659709 +0.82190326480741096300318873712966555706035846579562 +0.49058903962146072778707295967429263659897501512813 +0.2102090745190061764133345429475530760261103345204 +0.4087311609617603484960794513055502599728804206333 +0.79397497154919267900450180642484943996546102712187 +0.70577425166871982574205252142383800792823003687121 +0.64396095652194035523385641523010248768636064728226 +0.5737546665965914620678634509134819579811035412969 +0.017773895576552474810236796736785695789752666554273 +] +*/ +//] + +void t4() +{ + std::cout << std::endl; +//[random_eg4 +//=#include <boost/multiprecision/cpp_bin_float.hpp> +//=#include <boost/multiprecision/cpp_int.hpp> +//=#include <boost/random.hpp> +//= +//=int main() +//={ + using namespace boost::multiprecision; + using namespace boost::random; + // + // Generate some distruted values: + // + uniform_real_distribution<cpp_bin_float_50> ur(-20, 20); + gamma_distribution<cpp_bin_float_50> gd(20); + independent_bits_engine<mt19937, std::numeric_limits<cpp_bin_float_50>::digits, cpp_int> gen; + // + // Generate some values: + // + std::cout << std::setprecision(50); + for(unsigned i = 0; i < 20; ++i) + std::cout << ur(gen) << std::endl; + for(unsigned i = 0; i < 20; ++i) + std::cout << gd(gen) << std::endl; +//= return 0; +//=} +//] +} + +//[random_eg4_out +/*` +Which produces the following output: + +[pre +-18.576837157065858312137736538355805944098004018928 +4.5605477000094480453928920098152026546185388161216 +-1.7611402252150150370944527411235180945558276280598 +-2.471338289511354190492328039842914272146783953149 +-7.4131520453411321647183692139916357315276121488316 +-9.192739117661751364518299455475684051782402347659 +7.0126880787149555595443325648941661436898526919013 +2.8554749162054097111723076181877881960039268668423 +14.390501287552165467965587841551705310012046701036 +-8.9747073123748752412086051960748002945548570524149 +-8.1305063133718605220959174700954037986278348616362 +9.5496899464463627949564295930962040525540578754312 +-15.309681742947663333436391348699943078942921692008 +2.0454914298189175280771944784358385982869708951824 +-10.069253024538932382193363493367304983742246396276 +13.449212808583153116670057807764145176004060370818 +-6.0065092542772507561228141992257782449634820245355 +15.00971466974838379824678369267201922989930663822 +16.158514812070905438581736305533045434508525979205 +-2.1531361299576399413547008719541457739794964378093 +19.398278792113040046930806838893737245011219380822 +12.965216582396067073600685365545292876001524716225 +19.561779374349650983983836397553672788578622096947 +15.982213641588944604037715576313848977716540941271 +23.96044616946856385664151481695038833903083043492 +21.054716943622792848187523422423642819628010070375 +18.596078774135209530930707331338838805575875990091 +19.539530839287848627426769425090194390388333335812 +17.176133236359396942946640290935498641489373354297 +16.228802394876800099035133760539461530246286999827 +23.63807160907473465631049083277558060813997674519 +12.838499607321990428122225501321564153572478845401 +16.878362445712403300584931374939967549572637230102 +20.646246409377134464856282996941395597420615529803 +16.602429236226052406561338766554127142762673418695 +21.680007865714197450495711030406314524681744024329 +21.038948660115771777833205901845639760348321521616 +30.494499676527802078320016654058105593076348727966 +18.704734464995637480940828829962787676146589788572 +22.502216997171061548799304902323434654678156658236 +] +*/ +//] + +void t5() +{ +//[random_eg5 +//=#include <boost/multiprecision/cpp_bin_float.hpp> +//=#include <boost/random.hpp> +//=#include <boost/scoped_ptr.hpp> +//= +//=int main() +//={ + using namespace boost::multiprecision; + using namespace boost::random; + // + // Generate some multiprecision values, note that the generator is so large + // that we have to allocate it on the heap, otherwise we may run out of + // stack space! We could avoid this by using a floating point type which + // allocates it's internal storage on the heap - cpp_bin_float will do + // this with the correct template parameters, as will the GMP or MPFR + // based reals. + // + typedef lagged_fibonacci_01_engine<cpp_bin_float_50, 48, 44497, 21034 > big_fib_gen; + boost::scoped_ptr<big_fib_gen> pgen(new big_fib_gen); + // + // Generate some values: + // + std::cout << std::setprecision(50); + for(unsigned i = 0; i < 20; ++i) + std::cout << (*pgen)() << std::endl; + // + // try again with a ranlux generator, this is not quite so large + // so we can use the heap this time: + // + typedef subtract_with_carry_01_engine<cpp_bin_float_50, std::numeric_limits<cpp_bin_float_50>::digits - 5, 10, 24 > ranlux_big_base_01; + typedef discard_block_engine< ranlux_big_base_01, 389, 24 > big_ranlux; + big_ranlux rg; + for(unsigned i = 0; i < 20; ++i) + std::cout << rg() << std::endl; +//= return 0; +//=} +//] +} + +int main() +{ + t1(); + t2(); + t3(); + t4(); + t5(); + return 0; +} + diff --git a/src/boost/libs/multiprecision/example/safe_prime.cpp b/src/boost/libs/multiprecision/example/safe_prime.cpp new file mode 100644 index 00000000..dbe40ef2 --- /dev/null +++ b/src/boost/libs/multiprecision/example/safe_prime.cpp @@ -0,0 +1,45 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +//[safe_prime + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/miller_rabin.hpp> +#include <iostream> +#include <iomanip> + +int main() +{ + using namespace boost::random; + using namespace boost::multiprecision; + + typedef cpp_int int_type; + mt11213b base_gen(clock()); + independent_bits_engine<mt11213b, 256, int_type> gen(base_gen); + // + // We must use a different generator for the tests and number generation, otherwise + // we get false positives. + // + mt19937 gen2(clock()); + + for(unsigned i = 0; i < 100000; ++i) + { + int_type n = gen(); + if(miller_rabin_test(n, 25, gen2)) + { + // Value n is probably prime, see if (n-1)/2 is also prime: + std::cout << "We have a probable prime with value: " << std::hex << std::showbase << n << std::endl; + if(miller_rabin_test((n-1)/2, 25, gen2)) + { + std::cout << "We have a safe prime with value: " << std::hex << std::showbase << n << std::endl; + return 0; + } + } + } + std::cout << "Ooops, no safe primes were found - probably a bad choice of seed values!" << std::endl; + return 0; +} + +//] diff --git a/src/boost/libs/multiprecision/example/tommath_snips.cpp b/src/boost/libs/multiprecision/example/tommath_snips.cpp new file mode 100644 index 00000000..f3b817bd --- /dev/null +++ b/src/boost/libs/multiprecision/example/tommath_snips.cpp @@ -0,0 +1,84 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/tommath.hpp> +#include <iostream> + +void t1() +{ +//[tommath_eg +//=#include <boost/multiprecision/tommath.hpp> +//=#include <iostream> +//= +//=int main() +//={ + boost::multiprecision::tom_int v = 1; + + // Do some arithmetic: + for(unsigned i = 1; i <= 1000; ++i) + v *= i; + + std::cout << v << std::endl; // prints 1000! + std::cout << std::hex << v << std::endl; // prints 1000! in hex format + + try{ + std::cout << std::hex << -v << std::endl; // Ooops! can't print a negative value in hex format! + } + catch(const std::runtime_error& e) + { + std::cout << e.what() << std::endl; + } + + try{ + // v is not a 2's complement type, bitwise operations are only supported + // on positive values: + v = -v & 2; + } + catch(const std::runtime_error& e) + { + std::cout << e.what() << std::endl; + } + +//= return 0; +//=} +//] +} + +void t3() +{ +//[mp_rat_eg +//=#include <boost/multiprecision/tommath.hpp> +//=#include <iostream> +//= +//=int main() +//={ + using namespace boost::multiprecision; + + tom_rational v = 1; + + // Do some arithmetic: + for(unsigned i = 1; i <= 1000; ++i) + v *= i; + v /= 10; + + std::cout << v << std::endl; // prints 1000! / 10 + std::cout << numerator(v) << std::endl; + std::cout << denominator(v) << std::endl; + + tom_rational w(2, 3); // Component wise constructor + std::cout << w << std::endl; // prints 2/3 + +//= return 0; +//=} +//] +} + +int main() +{ + t1(); + t3(); + return 0; +} + diff --git a/src/boost/libs/multiprecision/index.html b/src/boost/libs/multiprecision/index.html new file mode 100644 index 00000000..df7430bd --- /dev/null +++ b/src/boost/libs/multiprecision/index.html @@ -0,0 +1,15 @@ +<html> + <head> + <meta http-equiv="refresh" content="0; URL=doc/html/index.html"> + </head> + <body> + <P> + Automatic redirection failed, please go to <a href="doc/html/index.html">doc/html/index.html</a>. + </P> + <P>Copyright John Maddock 2001</P> + <P>Distributed under the Boost Software License, Version 1.0. (See accompanying file <A href="../../LICENSE_1_0.txt"> + LICENSE_1_0.txt</A> or copy at <A href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</A>).</P> + </body> +</html> + + diff --git a/src/boost/libs/multiprecision/meta/libraries.json b/src/boost/libs/multiprecision/meta/libraries.json new file mode 100644 index 00000000..ce2f2eb1 --- /dev/null +++ b/src/boost/libs/multiprecision/meta/libraries.json @@ -0,0 +1,16 @@ +{ + "key": "multiprecision", + "name": "Multiprecision", + "authors": [ + "John Maddock", + "Christopher Kormanyos" + ], + "description": "Extended precision arithmetic types for floating point, integer andrational arithmetic.", + "category": [ + "Math" + ], + "maintainers": [ + "John Maddock <john -at- johnmaddock.co.uk>", + "christopher Kormanyos <e_float -at- yahoo.com>" + ] +} diff --git a/src/boost/libs/multiprecision/performance/Jamfile.v2 b/src/boost/libs/multiprecision/performance/Jamfile.v2 new file mode 100644 index 00000000..d0e8721d --- /dev/null +++ b/src/boost/libs/multiprecision/performance/Jamfile.v2 @@ -0,0 +1,169 @@ +# copyright John Maddock 2012 +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt. + +import modules ; +import path ; + +local ntl-path = [ modules.peek : NTL_PATH ] ; +local gmp_path = [ modules.peek : GMP_PATH ] ; +local mpfr_path = [ modules.peek : MPFR_PATH ] ; +local tommath_path = [ modules.peek : TOMMATH_PATH ] ; + +project : requirements + <target-os>freebsd:<linkflags>"-lrt" + <target-os>linux:<linkflags>"-lrt" + <toolset>pgi:<linkflags>"-lrt" + <include>$(gmp_path) + <include>$(gmp_path)/mpfr + <include>$(gmp_path)/gmpfrxx + <include>$(mpfr_path) + <include>$(tommath_path) + <include>../../.. + <search>$(gmp_path) + <search>$(mpfr_path) + <search>$(mpfr_path)/build.vc10/lib/Win32/Debug + <search>$(tommath_path) + <link>static + <define>BOOST_ALL_NO_LIB + <debug-symbols>off + ; + + +lib gmp ; +lib mpfr ; + +if $(tommath_path) +{ + TOMMATH = [ GLOB $(tommath_path) : *.c ] ; +} +else +{ + lib tommath ; + TOMMATH = tommath ; +} + +exe performance_test : performance_test.cpp /boost/system//boost_system + : release + [ check-target-builds ../config//has_gmp : <define>TEST_MPF <define>TEST_MPZ <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>mpfr : ] + [ check-target-builds ../config//has_tommath : <define>TEST_TOMMATH <source>$(TOMMATH) : ] + <define>TEST_CPP_DEC_FLOAT + <define>TEST_CPP_INT + ; + +exe miller_rabin_performance : miller_rabin_performance.cpp /boost/system//boost_system /boost/chrono//boost_chrono + : release + [ check-target-builds ../config//has_gmp : <define>TEST_MPF <define>TEST_MPZ <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>mpfr : ] + #[ check-target-builds ../config//has_tommath : <define>TEST_TOMMATH <source>$(TOMMATH) : ] + <define>TEST_CPP_DEC_FLOAT + <define>TEST_CPP_INT + ; + +exe sf_performance : sf_performance.cpp sf_performance_basic.cpp sf_performance_bessel.cpp + sf_performance_bessel1.cpp sf_performance_bessel2.cpp sf_performance_bessel3.cpp + sf_performance_bessel4.cpp sf_performance_bessel5.cpp sf_performance_bessel6.cpp + sf_performance_nct.cpp sf_performance_nct1.cpp + sf_performance_nct2.cpp sf_performance_nct3.cpp sf_performance_nct4.cpp + sf_performance_nct5.cpp sf_performance_nct6.cpp + sf_performance_poly.cpp + /boost/system//boost_system /boost/chrono//boost_chrono /boost/thread//boost_thread + : release + [ check-target-builds ../config//has_gmp : <define>TEST_MPF <define>TEST_MPZ <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>mpfr : ] + <define>TEST_CPP_DEC_FLOAT + <toolset>msvc:<cxxflags>-bigobj + ; + +exe delaunay_test : delaunay_test.cpp /boost/system//boost_system /boost/chrono//boost_chrono ; + +obj obj_linpack_benchmark_mpfr : linpack-benchmark.cpp + : release + [ check-target-builds ../config//has_mpfr : : <build>no ] + <define>TEST_MPFR_50 + ; + +obj obj_linpack_benchmark_mpf : linpack-benchmark.cpp + : release + [ check-target-builds ../config//has_gmp : : <build>no ] + <define>TEST_MPF_50 + ; + +obj obj_linpack_benchmark_cpp_float : linpack-benchmark.cpp + : release + <define>TEST_CPP_DEC_FLOAT + ; + +obj obj_linpack_benchmark_double : linpack-benchmark.cpp + : release + ; + +obj obj_linpack_benchmark_native_float128 : linpack-benchmark.cpp + : release + <define>NATIVE_FLOAT128 + ; + +obj obj_linpack_benchmark_float128 : linpack-benchmark.cpp + : release + <define>TEST_FLOAT128 + ; + +obj obj_linpack_benchmark_cpp_float_quad : linpack-benchmark.cpp + : release + <define>TEST_CPP_BIN_FLOAT_QUAD + ; + +obj obj_linpack_benchmark_cpp_float_oct : linpack-benchmark.cpp + : release + <define>TEST_CPP_BIN_FLOAT_OCT + ; + +lib f2c ; + +exe linpack_benchmark_mpfr : obj_linpack_benchmark_mpfr mpfr f2c gmp + : release + [ check-target-builds ../config//has_mpfr : : <build>no ] + <define>TEST_MPFR_50 + ; + +exe linpack_benchmark_mpf : obj_linpack_benchmark_mpf gmp f2c + : release + [ check-target-builds ../config//has_gmp : : <build>no ] + <define>TEST_MPF_50 + ; + +exe linpack_benchmark_cpp_float : obj_linpack_benchmark_cpp_float f2c + : release + <define>TEST_CPP_DEC_FLOAT + ; + +exe linpack_benchmark_double : obj_linpack_benchmark_double f2c + : release + ; + +exe linpack_benchmark_native_float128 : obj_linpack_benchmark_native_float128 f2c + : release + ; + +exe linpack_benchmark_float128 : obj_linpack_benchmark_float128 f2c + : release + ; + +exe linpack_benchmark_cpp_quad_float : obj_linpack_benchmark_cpp_quad_float f2c + : release + ; + +exe linpack_benchmark_cpp_oct_float : obj_linpack_benchmark_cpp_oct_float f2c + : release + ; + +install miller_rabin_install : miller_rabin_performance : <location>. ; +install performance_test_install : performance_test : <location>. ; +install sf_performance_install : sf_performance : <location>. ; +install . : linpack_benchmark_double linpack_benchmark_cpp_float linpack_benchmark_mpf linpack_benchmark_mpfr ; +install delaunay_install : delaunay_test : <location>. ; + + + diff --git a/src/boost/libs/multiprecision/performance/arithmetic_backend.hpp b/src/boost/libs/multiprecision/performance/arithmetic_backend.hpp new file mode 100644 index 00000000..32a79a62 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/arithmetic_backend.hpp @@ -0,0 +1,666 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifndef BOOST_MATH_FLOAT_BACKEND_HPP +#define BOOST_MATH_FLOAT_BACKEND_HPP + +#include <iostream> +#include <iomanip> +#include <sstream> +#include <boost/cstdint.hpp> +#include <boost/lexical_cast.hpp> +#include <boost/math/concepts/real_concept.hpp> +#include <boost/multiprecision/number.hpp> +#include <boost/integer/common_factor_rt.hpp> +#include <boost/type_traits/common_type.hpp> +#include <boost/container_hash/hash.hpp> + +namespace boost { +namespace multiprecision { +namespace backends { + +#ifdef BOOST_MSVC +#pragma warning(push) +#pragma warning(disable : 4389 4244 4018 4244 4127) +#endif + +template <class Arithmetic> +struct arithmetic_backend +{ + typedef mpl::list<short, int, long, long long> signed_types; + typedef mpl::list<unsigned short, unsigned, unsigned long, unsigned long long> unsigned_types; + typedef mpl::list<float, double, long double> float_types; + typedef int exponent_type; + + BOOST_MP_CXX14_CONSTEXPR arithmetic_backend() : m_value(0) {} + BOOST_MP_CXX14_CONSTEXPR arithmetic_backend(const arithmetic_backend& o) : m_value(o.m_value) {} + template <class A> + BOOST_MP_CXX14_CONSTEXPR arithmetic_backend(const A& o, const typename enable_if<is_arithmetic<A> >::type* = 0) : m_value(o) {} + template <class A> + BOOST_MP_CXX14_CONSTEXPR arithmetic_backend(const arithmetic_backend<A>& o) : m_value(o.data()) {} + BOOST_MP_CXX14_CONSTEXPR arithmetic_backend& operator=(const arithmetic_backend& o) + { + m_value = o.m_value; + return *this; + } + template <class A> + BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A>, arithmetic_backend&>::type operator=(A i) + { + m_value = i; + return *this; + } + template <class A> + BOOST_MP_CXX14_CONSTEXPR arithmetic_backend& operator=(const arithmetic_backend<A>& i) + { + m_value = i.data(); + return *this; + } + arithmetic_backend& operator=(const char* s) + { +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + m_value = boost::lexical_cast<Arithmetic>(s); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const bad_lexical_cast&) + { + throw std::runtime_error(std::string("Unable to interpret the string provided: \"") + s + std::string("\" as a compatible number type.")); + } +#endif + return *this; + } + BOOST_MP_CXX14_CONSTEXPR void swap(arithmetic_backend& o) + { + std::swap(m_value, o.m_value); + } + std::string str(std::streamsize digits, std::ios_base::fmtflags f) const + { + std::stringstream ss; + ss.flags(f); + ss << std::setprecision(digits ? digits : std::numeric_limits<Arithmetic>::digits10 + 4) << m_value; + return ss.str(); + } + BOOST_MP_CXX14_CONSTEXPR void do_negate(const mpl::true_&) + { + m_value = 1 + ~m_value; + } + BOOST_MP_CXX14_CONSTEXPR void do_negate(const mpl::false_&) + { + m_value = -m_value; + } + BOOST_MP_CXX14_CONSTEXPR void negate() + { + do_negate(mpl::bool_<is_unsigned<Arithmetic>::value>()); + } + BOOST_MP_CXX14_CONSTEXPR int compare(const arithmetic_backend& o) const + { + return m_value > o.m_value ? 1 : (m_value < o.m_value ? -1 : 0); + } + template <class A> + BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A>, int>::type compare(A i) const + { + return m_value > static_cast<Arithmetic>(i) ? 1 : (m_value < static_cast<Arithmetic>(i) ? -1 : 0); + } + BOOST_MP_CXX14_CONSTEXPR Arithmetic& data() { return m_value; } + BOOST_MP_CXX14_CONSTEXPR const Arithmetic& data() const { return m_value; } + + private: + Arithmetic m_value; +}; + +template <class R, class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<boost::is_integral<R>::value>::type eval_convert_to(R* result, const arithmetic_backend<Arithmetic>& backend) +{ + typedef typename boost::common_type<R, Arithmetic>::type c_type; + BOOST_CONSTEXPR const c_type max = static_cast<c_type>((std::numeric_limits<R>::max)()); + BOOST_CONSTEXPR const c_type min = static_cast<c_type>((std::numeric_limits<R>::min)()); + c_type ct = static_cast<c_type>(backend.data()); + if ((backend.data() < 0) && !std::numeric_limits<R>::is_signed) + BOOST_THROW_EXCEPTION(std::range_error("Attempt to convert negative number to unsigned type.")); + if (ct > max) + *result = boost::is_signed<R>::value ? (std::numeric_limits<R>::max)() : backend.data(); + else if (std::numeric_limits<Arithmetic>::is_signed && (ct < min)) + *result = (std::numeric_limits<R>::min)(); + else + *result = backend.data(); +} + +template <class R, class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c<boost::is_integral<R>::value>::type eval_convert_to(R* result, const arithmetic_backend<Arithmetic>& backend) +{ + *result = backend.data(); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR bool eval_eq(const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + return a.data() == b.data(); +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A2>, bool>::type eval_eq(const arithmetic_backend<Arithmetic>& a, const A2& b) +{ + return a.data() == static_cast<Arithmetic>(b); +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR bool eval_lt(const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + return a.data() < b.data(); +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A2>, bool>::type eval_lt(const arithmetic_backend<Arithmetic>& a, const A2& b) +{ + return a.data() < static_cast<Arithmetic>(b); +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR bool eval_gt(const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + return a.data() > b.data(); +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A2>, bool>::type eval_gt(const arithmetic_backend<Arithmetic>& a, const A2& b) +{ + return a.data() > static_cast<Arithmetic>(b); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_add(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + result.data() += o.data(); +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + result.data() -= o.data(); +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_multiply(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + result.data() *= o.data(); +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<std::numeric_limits<Arithmetic>::has_infinity>::type eval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + result.data() /= o.data(); +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c<std::numeric_limits<Arithmetic>::has_infinity>::type eval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + if (!o.data()) + BOOST_THROW_EXCEPTION(std::overflow_error("Divide by zero")); + result.data() /= o.data(); +} + +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A2> >::type eval_add(arithmetic_backend<Arithmetic>& result, const A2& o) +{ + result.data() += o; +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A2> >::type eval_subtract(arithmetic_backend<Arithmetic>& result, const A2& o) +{ + result.data() -= o; +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A2> >::type eval_multiply(arithmetic_backend<Arithmetic>& result, const A2& o) +{ + result.data() *= o; +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<(is_arithmetic<A2>::value && !std::numeric_limits<Arithmetic>::has_infinity)>::type +eval_divide(arithmetic_backend<Arithmetic>& result, const A2& o) +{ + if (!o) + BOOST_THROW_EXCEPTION(std::overflow_error("Divide by zero")); + result.data() /= o; +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<(is_arithmetic<A2>::value && std::numeric_limits<Arithmetic>::has_infinity)>::type +eval_divide(arithmetic_backend<Arithmetic>& result, const A2& o) +{ + result.data() /= o; +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_add(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + result.data() = a.data() + b.data(); +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_subtract(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + result.data() = a.data() - b.data(); +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_multiply(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + result.data() = a.data() * b.data(); +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<std::numeric_limits<Arithmetic>::has_infinity>::type eval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + result.data() = a.data() / b.data(); +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c<std::numeric_limits<Arithmetic>::has_infinity>::type eval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + if (!b.data()) + BOOST_THROW_EXCEPTION(std::overflow_error("Divide by zero")); + result.data() = a.data() / b.data(); +} + +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A2> >::type eval_add(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const A2& b) +{ + result.data() = a.data() + b; +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A2> >::type eval_subtract(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const A2& b) +{ + result.data() = a.data() - b; +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_arithmetic<A2> >::type eval_multiply(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const A2& b) +{ + result.data() = a.data() * b; +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<(is_arithmetic<A2>::value && !std::numeric_limits<Arithmetic>::has_infinity)>::type +eval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const A2& b) +{ + if (!b) + BOOST_THROW_EXCEPTION(std::overflow_error("Divide by zero")); + result.data() = a.data() / b; +} +template <class Arithmetic, class A2> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<(is_arithmetic<A2>::value && std::numeric_limits<Arithmetic>::has_infinity)>::type +eval_divide(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const A2& b) +{ + result.data() = a.data() / b; +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR bool eval_is_zero(const arithmetic_backend<Arithmetic>& val) +{ + return val.data() == 0; +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c< + (!std::numeric_limits<Arithmetic>::is_specialized || std::numeric_limits<Arithmetic>::is_signed), int>::type +eval_get_sign(const arithmetic_backend<Arithmetic>& val) +{ + return val.data() == 0 ? 0 : val.data() < 0 ? -1 : 1; +} +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR typename disable_if_c< + (std::numeric_limits<Arithmetic>::is_specialized || std::numeric_limits<Arithmetic>::is_signed), int>::type +eval_get_sign(const arithmetic_backend<Arithmetic>& val) +{ + return val.data() == 0 ? 0 : 1; +} + +template <class T> +inline BOOST_MP_CXX14_CONSTEXPR typename enable_if<is_unsigned<T>, T>::type abs(T v) { return v; } + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_abs(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + using boost::multiprecision::backends::abs; + using std::abs; + result.data() = abs(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_fabs(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + result.data() = std::abs(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_floor(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = floor(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_ceil(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = ceil(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_sqrt(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = sqrt(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR int eval_fpclassify(const arithmetic_backend<Arithmetic>& o) +{ + return (boost::math::fpclassify)(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_trunc(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = trunc(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_round(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = round(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_frexp(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, int* v) +{ + BOOST_MATH_STD_USING + result.data() = frexp(a.data(), v); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_ldexp(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, int v) +{ + BOOST_MATH_STD_USING + result.data() = ldexp(a.data(), v); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_exp(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = exp(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_log(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = log(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_log10(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = log10(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_sin(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = sin(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_cos(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = cos(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_tan(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = tan(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_acos(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = acos(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_asin(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = asin(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_atan(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = atan(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_sinh(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = sinh(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_cosh(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = cosh(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_tanh(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& o) +{ + BOOST_MATH_STD_USING + result.data() = tanh(o.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_fmod(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + BOOST_MATH_STD_USING + result.data() = fmod(a.data(), b.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_pow(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + BOOST_MATH_STD_USING + result.data() = pow(a.data(), b.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_atan2(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + BOOST_MATH_STD_USING + result.data() = atan2(a.data(), b.data()); +} + +template <class Arithmetic, class I> +inline BOOST_MP_CXX14_CONSTEXPR void eval_left_shift(arithmetic_backend<Arithmetic>& result, I val) +{ + result.data() <<= val; +} + +template <class Arithmetic, class I> +inline BOOST_MP_CXX14_CONSTEXPR void eval_right_shift(arithmetic_backend<Arithmetic>& result, I val) +{ + result.data() >>= val; +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_modulus(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a) +{ + result.data() %= a.data(); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_and(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a) +{ + result.data() &= a.data(); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_or(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a) +{ + result.data() |= a.data(); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_bitwise_xor(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a) +{ + result.data() ^= a.data(); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_complement(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a) +{ + result.data() = ~a.data(); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_gcd(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + result.data() = boost::integer::gcd(a.data(), b.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR void eval_lcm(arithmetic_backend<Arithmetic>& result, const arithmetic_backend<Arithmetic>& a, const arithmetic_backend<Arithmetic>& b) +{ + result.data() = boost::integer::lcm(a.data(), b.data()); +} + +template <class Arithmetic> +inline BOOST_MP_CXX14_CONSTEXPR std::size_t hash_value(const arithmetic_backend<Arithmetic>& a) +{ + boost::hash<Arithmetic> hasher; + return hasher(a.data()); +} + +#ifdef BOOST_MSVC +#pragma warning(pop) +#endif + +} // namespace backends + +using boost::multiprecision::backends::arithmetic_backend; + +template <class Arithmetic> +struct number_category<arithmetic_backend<Arithmetic> > : public mpl::int_<is_integral<Arithmetic>::value ? number_kind_integer : number_kind_floating_point> +{}; + +namespace detail { + +template <class Backend> +struct double_precision_type; + +template <class Arithmetic, boost::multiprecision::expression_template_option ET> +struct double_precision_type<number<arithmetic_backend<Arithmetic>, ET> > +{ + typedef number<arithmetic_backend<typename double_precision_type<Arithmetic>::type>, ET> type; +}; +template <> +struct double_precision_type<arithmetic_backend<boost::int32_t> > +{ + typedef arithmetic_backend<boost::int64_t> type; +}; + +} // namespace detail + +}} // namespace boost::multiprecision +#if !(defined(__SGI_STL_PORT) || defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS)) +// +// We shouldn't need these to get code to compile, however for the sake of +// "level playing field" performance comparisons they avoid the very slow +// lexical_cast's that would otherwise take place. Definition has to be guarded +// by the inverse of pp-logic in real_concept.hpp which defines these as a workaround +// for STLPort plus some other old/broken standartd libraries. +// +namespace boost { namespace math { namespace tools { + +template <> +inline unsigned int real_cast<unsigned int, concepts::real_concept>(concepts::real_concept r) +{ + return static_cast<unsigned int>(r.value()); +} + +template <> +inline int real_cast<int, concepts::real_concept>(concepts::real_concept r) +{ + return static_cast<int>(r.value()); +} + +template <> +inline long real_cast<long, concepts::real_concept>(concepts::real_concept r) +{ + return static_cast<long>(r.value()); +} + +// Converts from T to narrower floating-point types, float, double & long double. + +template <> +inline float real_cast<float, concepts::real_concept>(concepts::real_concept r) +{ + return static_cast<float>(r.value()); +} +template <> +inline double real_cast<double, concepts::real_concept>(concepts::real_concept r) +{ + return static_cast<double>(r.value()); +} +template <> +inline long double real_cast<long double, concepts::real_concept>(concepts::real_concept r) +{ + return r.value(); +} + +}}} // namespace boost::math::tools +#endif + +namespace std { + +template <class Arithmetic, boost::multiprecision::expression_template_option ExpressionTemplates> +class numeric_limits<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<Arithmetic>, ExpressionTemplates> > : public std::numeric_limits<Arithmetic> +{ + typedef std::numeric_limits<Arithmetic> base_type; + typedef boost::multiprecision::number<boost::multiprecision::arithmetic_backend<Arithmetic>, ExpressionTemplates> number_type; + + public: + BOOST_STATIC_CONSTEXPR number_type(min)() BOOST_NOEXCEPT { return (base_type::min)(); } + BOOST_STATIC_CONSTEXPR number_type(max)() BOOST_NOEXCEPT { return (base_type::max)(); } + BOOST_STATIC_CONSTEXPR number_type lowest() BOOST_NOEXCEPT { return -(max)(); } + BOOST_STATIC_CONSTEXPR number_type epsilon() BOOST_NOEXCEPT { return base_type::epsilon(); } + BOOST_STATIC_CONSTEXPR number_type round_error() BOOST_NOEXCEPT { return epsilon() / 2; } + BOOST_STATIC_CONSTEXPR number_type infinity() BOOST_NOEXCEPT { return base_type::infinity(); } + BOOST_STATIC_CONSTEXPR number_type quiet_NaN() BOOST_NOEXCEPT { return base_type::quiet_NaN(); } + BOOST_STATIC_CONSTEXPR number_type signaling_NaN() BOOST_NOEXCEPT { return base_type::signaling_NaN(); } + BOOST_STATIC_CONSTEXPR number_type denorm_min() BOOST_NOEXCEPT { return base_type::denorm_min(); } +}; + +template <> +class numeric_limits<boost::math::concepts::real_concept> : public std::numeric_limits<long double> +{ + typedef std::numeric_limits<long double> base_type; + typedef boost::math::concepts::real_concept number_type; + + public: + static const number_type(min)() BOOST_NOEXCEPT { return (base_type::min)(); } + static const number_type(max)() BOOST_NOEXCEPT { return (base_type::max)(); } + static const number_type lowest() BOOST_NOEXCEPT { return -(max)(); } + static const number_type epsilon() BOOST_NOEXCEPT { return base_type::epsilon(); } + static const number_type round_error() BOOST_NOEXCEPT { return epsilon() / 2; } + static const number_type infinity() BOOST_NOEXCEPT { return base_type::infinity(); } + static const number_type quiet_NaN() BOOST_NOEXCEPT { return base_type::quiet_NaN(); } + static const number_type signaling_NaN() BOOST_NOEXCEPT { return base_type::signaling_NaN(); } + static const number_type denorm_min() BOOST_NOEXCEPT { return base_type::denorm_min(); } +}; + +} // namespace std + +#include <boost/multiprecision/detail/integer_ops.hpp> + +#endif diff --git a/src/boost/libs/multiprecision/performance/cpp_bin_float_conversion_performance.cpp b/src/boost/libs/multiprecision/performance/cpp_bin_float_conversion_performance.cpp new file mode 100644 index 00000000..64692b72 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/cpp_bin_float_conversion_performance.cpp @@ -0,0 +1,159 @@ +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/math/special_functions.hpp> +#include <boost/chrono.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> + +template <class Clock> +struct stopwatch +{ + typedef typename Clock::duration duration; + stopwatch() + { + m_start = Clock::now(); + } + duration elapsed() + { + return Clock::now() - m_start; + } + void reset() + { + m_start = Clock::now(); + } + + private: + typename Clock::time_point m_start; +}; + +template <class T> +T generate_random() +{ + typedef int e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(-20, 20); + return ldexp(val, ui(gen)); +} + +template <typename T> +double my_convert_to_double(const T& x) +{ + double ret = 0; + if (isfinite(x)) + { + if (x.backend().exponent() >= -1023 - 52 && x != 0) + { + if (x.backend().exponent() <= 1023) + { + int e = x.backend().exponent(); + T y = ldexp(abs(x), 55 - e); + T t = trunc(y); + int64_t ti = t.template convert_to<int64_t>(); + if ((ti & 1) == 0) + { + if (t < y) + ti |= 1; + } + if (e >= -1023 + 1) + { + ret = ldexp(double(ti), e - 55); + } + else + { + // subnormal + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<128, boost::multiprecision::backends::digit_base_2> > cpp_bin_float128_t; + cpp_bin_float128_t sx = ldexp(cpp_bin_float128_t(ti), e - 55); + sx += DBL_MIN; + e = -1023 + 1; + cpp_bin_float128_t sy = ldexp(sx, 55 - e); + cpp_bin_float128_t st = trunc(sy); + ti = st.convert_to<int64_t>(); + if ((ti & 1) == 0) + { + if (st < sy) + ti |= 1; + } + ret = ldexp(double(ti), e - 55) - DBL_MIN; + } + } + else + { + // overflow + ret = HUGE_VAL; + } + } + } + else + { + if (isnan(x)) + return nan(""); + // inf + ret = HUGE_VAL; + } + return x.backend().sign() ? -ret : ret; +} + +template <class T> +void test_conversion_time(const char* name) +{ + std::cout << "Testing times for type: " << name << "\n"; + std::vector<T> values; + + for (unsigned i = 0; i < 10000000; ++i) + { + values.push_back(generate_random<T>()); + } + + boost::chrono::duration<double> time; + stopwatch<boost::chrono::high_resolution_clock> c; + + double total = 0; + + for (typename std::vector<T>::const_iterator i = values.begin(); i != values.end(); ++i) + { + total += my_convert_to_double(*i); + } + + time = c.elapsed(); + std::cout << std::setprecision(3) << std::fixed; + std::cout << "Reference time: " << std::setw(7) << std::right << time << " (total sum = " << total << ")" << std::endl; + + c.reset(); + + total = 0; + + for (typename std::vector<T>::const_iterator i = values.begin(); i != values.end(); ++i) + { + total += i->template convert_to<double>(); + } + + time = c.elapsed(); + std::cout << "Boost time: " << std::setw(7) << std::right << time << " (total sum = " << total << ")" << std::endl; +} + +int main() +{ + using namespace boost::multiprecision; + + test_conversion_time<cpp_bin_float_double>("cpp_bin_float_double"); + test_conversion_time<cpp_bin_float_quad>("cpp_bin_float_quad"); + test_conversion_time<cpp_bin_float_oct>("cpp_bin_float_oct"); + test_conversion_time<cpp_bin_float_50>("cpp_bin_float_50"); + test_conversion_time<cpp_bin_float_100>("cpp_bin_float_100"); + + return 0; +} diff --git a/src/boost/libs/multiprecision/performance/delaunay_test.cpp b/src/boost/libs/multiprecision/performance/delaunay_test.cpp new file mode 100644 index 00000000..1dcb4e6a --- /dev/null +++ b/src/boost/libs/multiprecision/performance/delaunay_test.cpp @@ -0,0 +1,308 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. +// Copyright 2012 Phil Endecott +// Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include "arithmetic_backend.hpp" +#include <boost/chrono.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int_distribution.hpp> + +#include <fstream> +#include <iomanip> + +template <class Clock> +struct stopwatch +{ + typedef typename Clock::duration duration; + stopwatch() + { + m_start = Clock::now(); + } + duration elapsed() + { + return Clock::now() - m_start; + } + void reset() + { + m_start = Clock::now(); + } + + private: + typename Clock::time_point m_start; +}; + +// Custom 128-bit maths used for exact calculation of the Delaunay test. +// Only the few operators actually needed here are implemented. + +struct int128_t +{ + int64_t high; + uint64_t low; + + int128_t() {} + int128_t(int32_t i) : high(i >> 31), low(static_cast<int64_t>(i)) {} + int128_t(uint32_t i) : high(0), low(i) {} + int128_t(int64_t i) : high(i >> 63), low(i) {} + int128_t(uint64_t i) : high(0), low(i) {} +}; + +inline int128_t operator<<(int128_t val, int amt) +{ + int128_t r; + r.low = val.low << amt; + r.high = val.low >> (64 - amt); + r.high |= val.high << amt; + return r; +} + +inline int128_t& operator+=(int128_t& l, int128_t r) +{ + l.low += r.low; + bool carry = l.low < r.low; + l.high += r.high; + if (carry) + ++l.high; + return l; +} + +inline int128_t operator-(int128_t val) +{ + val.low = ~val.low; + val.high = ~val.high; + val.low += 1; + if (val.low == 0) + val.high += 1; + return val; +} + +inline int128_t operator+(int128_t l, int128_t r) +{ + l += r; + return l; +} + +inline bool operator<(int128_t l, int128_t r) +{ + if (l.high != r.high) + return l.high < r.high; + return l.low < r.low; +} + +inline int128_t mult_64x64_to_128(int64_t a, int64_t b) +{ + // Make life simple by dealing only with positive numbers: + bool neg = false; + if (a < 0) + { + neg = !neg; + a = -a; + } + if (b < 0) + { + neg = !neg; + b = -b; + } + + // Divide input into 32-bit halves: + uint32_t ah = a >> 32; + uint32_t al = a & 0xffffffff; + uint32_t bh = b >> 32; + uint32_t bl = b & 0xffffffff; + + // Long multiplication, with 64-bit temporaries: + + // ah al + // * bh bl + // ---------------- + // al*bl (t1) + // + ah*bl (t2) + // + al*bh (t3) + // + ah*bh (t4) + // ---------------- + + uint64_t t1 = static_cast<uint64_t>(al) * bl; + uint64_t t2 = static_cast<uint64_t>(ah) * bl; + uint64_t t3 = static_cast<uint64_t>(al) * bh; + uint64_t t4 = static_cast<uint64_t>(ah) * bh; + + int128_t r(t1); + r.high = t4; + r += int128_t(t2) << 32; + r += int128_t(t3) << 32; + + if (neg) + r = -r; + + return r; +} + +template <class R, class T> +BOOST_FORCEINLINE void mul_2n(R& r, const T& a, const T& b) +{ + r = a; + r *= b; +} + +template <class B, boost::multiprecision::expression_template_option ET, class T> +BOOST_FORCEINLINE void mul_2n(boost::multiprecision::number<B, ET>& r, const T& a, const T& b) +{ + multiply(r, a, b); +} + +BOOST_FORCEINLINE void mul_2n(int128_t& r, const boost::int64_t& a, const boost::int64_t& b) +{ + r = mult_64x64_to_128(a, b); +} + +template <class Traits> +inline bool delaunay_test(int32_t ax, int32_t ay, int32_t bx, int32_t by, + int32_t cx, int32_t cy, int32_t dx, int32_t dy) +{ + // Test whether the quadrilateral ABCD's diagonal AC should be flipped to BD. + // This is the Cline & Renka method. + // Flip if the sum of the angles ABC and CDA is greater than 180 degrees. + // Equivalently, flip if sin(ABC + CDA) < 0. + // Trig identity: cos(ABC) * sin(CDA) + sin(ABC) * cos(CDA) < 0 + // We can use scalar and vector products to find sin and cos, and simplify + // to the following code. + // Numerical robustness is important. This code addresses it by performing + // exact calculations with large integer types. + // + // NOTE: This routine is limited to inputs with up to 30 BIT PRECISION, which + // is to say all inputs must be in the range [INT_MIN/2, INT_MAX/2]. + + typedef typename Traits::i64_t i64; + typedef typename Traits::i128_t i128; + + i64 cos_abc, t; + mul_2n(cos_abc, (ax - bx), (cx - bx)); // subtraction yields 31-bit values, multiplied to give 62-bit values + mul_2n(t, (ay - by), (cy - by)); + cos_abc += t; // addition yields 63 bit value, leaving one left for the sign + + i64 cos_cda; + mul_2n(cos_cda, (cx - dx), (ax - dx)); + mul_2n(t, (cy - dy), (ay - dy)); + cos_cda += t; + + if (cos_abc >= 0 && cos_cda >= 0) + return false; + if (cos_abc < 0 && cos_cda < 0) + return true; + + i64 sin_abc; + mul_2n(sin_abc, (ax - bx), (cy - by)); + mul_2n(t, (cx - bx), (ay - by)); + sin_abc -= t; + + i64 sin_cda; + mul_2n(sin_cda, (cx - dx), (ay - dy)); + mul_2n(t, (ax - dx), (cy - dy)); + sin_cda -= t; + + i128 sin_sum, t128; + mul_2n(sin_sum, sin_abc, cos_cda); // 63-bit inputs multiplied to 126-bit output + mul_2n(t128, cos_abc, sin_cda); + sin_sum += t128; // Addition yields 127 bit result, leaving one bit for the sign + + return sin_sum < 0; +} + +struct dt_dat +{ + int32_t ax, ay, bx, by, cx, cy, dx, dy; +}; + +typedef std::vector<dt_dat> data_t; +data_t data; + +template <class Traits> +void do_calc(const char* name) +{ + std::cout << "Running calculations for: " << name << std::endl; + + stopwatch<boost::chrono::high_resolution_clock> w; + + boost::uint64_t flips = 0; + boost::uint64_t calcs = 0; + + for (int j = 0; j < 1000; ++j) + { + for (data_t::const_iterator i = data.begin(); i != data.end(); ++i) + { + const dt_dat& d = *i; + bool flip = delaunay_test<Traits>(d.ax, d.ay, d.bx, d.by, d.cx, d.cy, d.dx, d.dy); + if (flip) + ++flips; + ++calcs; + } + } + double t = boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + + std::cout << "Number of calculations = " << calcs << std::endl; + std::cout << "Number of flips = " << flips << std::endl; + std::cout << "Total execution time = " << t << std::endl; + std::cout << "Time per calculation = " << t / calcs << std::endl + << std::endl; +} + +template <class I64, class I128> +struct test_traits +{ + typedef I64 i64_t; + typedef I128 i128_t; +}; + +dt_dat generate_quadrilateral() +{ + static boost::random::mt19937 gen; + static boost::random::uniform_int_distribution<> dist(INT_MIN / 2, INT_MAX / 2); + + dt_dat result; + + result.ax = dist(gen); + result.ay = dist(gen); + result.bx = boost::random::uniform_int_distribution<>(result.ax, INT_MAX / 2)(gen); // bx is to the right of ax. + result.by = dist(gen); + result.cx = dist(gen); + result.cy = boost::random::uniform_int_distribution<>(result.cx > result.bx ? result.by : result.ay, INT_MAX / 2)(gen); // cy is below at least one of ay and by. + result.dx = boost::random::uniform_int_distribution<>(result.cx, INT_MAX / 2)(gen); // dx is to the right of cx. + result.dy = boost::random::uniform_int_distribution<>(result.cx > result.bx ? result.by : result.ay, INT_MAX / 2)(gen); // cy is below at least one of ay and by. + + return result; +} + +static void load_data() +{ + for (unsigned i = 0; i < 100000; ++i) + data.push_back(generate_quadrilateral()); +} + +int main() +{ + using namespace boost::multiprecision; + std::cout << "loading data...\n"; + load_data(); + + std::cout << "calculating...\n"; + + do_calc<test_traits<boost::int64_t, boost::int64_t> >("int64_t, int64_t"); + do_calc<test_traits<number<arithmetic_backend<boost::int64_t>, et_off>, number<arithmetic_backend<boost::int64_t>, et_off> > >("arithmetic_backend<int64_t>, arithmetic_backend<int64_t>"); + do_calc<test_traits<boost::int64_t, number<arithmetic_backend<boost::int64_t>, et_off> > >("int64_t, arithmetic_backend<int64_t>"); + do_calc<test_traits<number<cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, et_off>, number<cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, et_off> > >("multiprecision::int64_t, multiprecision::int64_t"); + + do_calc<test_traits<boost::int64_t, ::int128_t> >("int64_t, int128_t"); + do_calc<test_traits<boost::int64_t, boost::multiprecision::int128_t> >("int64_t, boost::multiprecision::int128_t"); + do_calc<test_traits<boost::int64_t, number<cpp_int_backend<128, 128, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, et_on> > >("int64_t, int128_t (ET)"); + do_calc<test_traits<number<cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, et_off>, boost::multiprecision::int128_t> >("multiprecision::int64_t, multiprecision::int128_t"); + + do_calc<test_traits<boost::int64_t, cpp_int> >("int64_t, cpp_int"); + do_calc<test_traits<boost::int64_t, number<cpp_int_backend<>, et_off> > >("int64_t, cpp_int (no ET's)"); + do_calc<test_traits<boost::int64_t, number<cpp_int_backend<128> > > >("int64_t, cpp_int(128-bit cache)"); + do_calc<test_traits<boost::int64_t, number<cpp_int_backend<128>, et_off> > >("int64_t, cpp_int (128-bit Cache no ET's)"); + + return 0; +} diff --git a/src/boost/libs/multiprecision/performance/linpack-benchmark.cpp b/src/boost/libs/multiprecision/performance/linpack-benchmark.cpp new file mode 100644 index 00000000..7fc6a6ce --- /dev/null +++ b/src/boost/libs/multiprecision/performance/linpack-benchmark.cpp @@ -0,0 +1,1302 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +/* 1000d.f -- translated by f2c (version 20050501). +You must link the resulting object file with libf2c: +on Microsoft Windows system, link with libf2c.lib; +on Linux or Unix systems, link with .../path/to/libf2c.a -lm +or, if you install libf2c.a in a standard place, with -lf2c -lm +-- in that order, at the end of the command line, as in +cc *.o -lf2c -lm +Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + +http://www.netlib.org/f2c/libf2c.zip +*/ +#include <iostream> +#include <iomanip> +#include <cmath> + +#if defined(TEST_GMPXX) +#include <gmpxx.h> +typedef mpf_class real_type; +#elif defined(TEST_MPFRXX) +#include <gmpfrxx.h> +typedef mpfr_class real_type; +#elif defined(TEST_CPP_DEC_FLOAT) +#include <boost/multiprecision/cpp_dec_float.hpp> +typedef boost::multiprecision::cpp_dec_float_50 real_type; +#elif defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +typedef boost::multiprecision::mpfr_float_50 real_type; +#elif defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +typedef boost::multiprecision::mpf_float_50 real_type; +#elif defined(NATIVE_FLOAT128) +#include <boost/multiprecision/float128.hpp> +typedef __float128 real_type; + +std::ostream& operator<<(std::ostream& os, const __float128& f) +{ + return os << boost::multiprecision::float128(f); +} + +#include <boost/type_traits/has_left_shift.hpp> + +namespace boost { + +template <> +struct has_left_shift<std::basic_ostream<char>, __float128> : public mpl::true_ +{}; + +template <> +double lexical_cast<double, __float128>(const __float128& f) +{ + return f; +} + +} // namespace boost + +#elif defined(TEST_FLOAT128) +#include <boost/multiprecision/float128.hpp> +typedef boost::multiprecision::float128 real_type; +#elif defined(TEST_CPP_BIN_FLOAT_QUAD) +#include <boost/multiprecision/cpp_bin_float.hpp> +typedef boost::multiprecision::cpp_bin_float_quad real_type; +#elif defined(TEST_CPP_BIN_FLOAT_OCT) +#include <boost/multiprecision/cpp_bin_float.hpp> +typedef boost::multiprecision::cpp_bin_float_oct real_type; +#else +typedef double real_type; +#endif + +#include <boost/lexical_cast.hpp> + +#ifndef CAST_TO_RT +#define CAST_TO_RT(x) x +#endif + +extern "C" { +#include "f2c.h" +integer s_wsfe(cilist*), e_wsfe(void), do_fio(integer*, char*, ftnlen), + s_wsle(cilist*), do_lio(integer*, integer*, char*, ftnlen), + e_wsle(void); +/* Subroutine */ int s_stop(char*, ftnlen); + +#undef abs +#undef dabs +#define dabs abs +#undef dmin +#undef dmax +#define dmin min +#define dmax max +} +#include <time.h> + +using std::max; +using std::min; + +/* Table of constant values */ + +static integer c__0 = 0; +static real_type c_b7 = CAST_TO_RT(1); +static integer c__1 = 1; +static integer c__9 = 9; + +inline double second_(void) +{ + return ((double)(clock())) / CLOCKS_PER_SEC; +} + +int dgefa_(real_type*, integer*, integer*, integer*, integer*), dgesl_(real_type*, integer*, integer*, integer*, real_type*, integer*); +int dmxpy_(integer*, real_type*, integer*, integer*, real_type*, real_type*); +int matgen_(real_type*, integer*, integer*, real_type*, real_type*); +real_type epslon_(real_type*); +real_type ran_(integer*); +int dscal_(integer*, real_type*, real_type*, integer*); +int daxpy_(integer*, real_type*, real_type*, integer*, real_type*, integer*); +integer idamax_(integer*, real_type*, integer*); +real_type ddot_(integer*, real_type*, integer*, real_type*, integer*); +int daxpy_(integer*, real_type*, real_type*, integer*, real_type*, integer*); +int dmxpy_(integer*, real_type*, integer*, integer*, real_type*, real_type*); + +extern "C" int MAIN__() +{ +#ifdef TEST_MPF_50 + std::cout << "Testing number<mpf_float<50> >" << std::endl; +#elif defined(TEST_MPFR_50) + std::cout << "Testing number<mpf_float<50> >" << std::endl; +#elif defined(TEST_GMPXX) + std::cout << "Testing mpf_class at 50 decimal degits" << std::endl; + mpf_set_default_prec(((50 + 1) * 1000L) / 301L); +#elif defined(TEST_MPFRXX) + std::cout << "Testing mpfr_class at 50 decimal degits" << std::endl; + mpfr_set_default_prec(((50 + 1) * 1000L) / 301L); +#elif defined(TEST_CPP_DEC_FLOAT) + std::cout << "Testing number<cpp_dec_float<50> >" << std::endl; +#elif defined(NATIVE_FLOAT128) + std::cout << "Testing __float128" << std::endl; +#elif defined(TEST_FLOAT128) + std::cout << "Testing number<float128_backend, et_off>" << std::endl; +#else + std::cout << "Testing double" << std::endl; +#endif + + /* Format strings */ + static char fmt_1[] = "(\002 Please send the results of this run to:\002" + "//\002 Jack J. Dongarra\002/\002 Computer Science Department\002/" + "\002 University of Tennessee\002/\002 Knoxville, Tennessee 37996" + "-1300\002//\002 Fax: 615-974-8296\002//\002 Internet: dongarra@c" + "s.utk.edu\002/)"; + static char fmt_40[] = "(\002 norm. resid resid mac" + "hep\002,\002 x(1) x(n)\002)"; + static char fmt_50[] = "(1p5e16.8)"; + static char fmt_60[] = "(//\002 times are reported for matrices of or" + "der \002,i5)"; + static char fmt_70[] = "(6x,\002factor\002,5x,\002solve\002,6x,\002tota" + "l\002,5x,\002mflops\002,7x,\002unit\002,6x,\002ratio\002)"; + static char fmt_80[] = "(\002 times for array with leading dimension o" + "f\002,i4)"; + static char fmt_110[] = "(6(1pe11.3))"; + + /* System generated locals */ + integer i__1; + real_type d__1, d__2, d__3; + + /* Builtin functions */ + + /* Local variables */ + static real_type a[1001000] /* was [1001][1000] */, b[1000]; + static integer i__, n; + static real_type x[1000]; + static double t1; + static integer lda; + static double ops; + static real_type eps; + static integer info; + static double time[6], cray, total; + static integer ipvt[1000]; + static real_type resid, norma; + static real_type normx; + static real_type residn; + + /* Fortran I/O blocks */ + static cilist io___4 = {0, 6, 0, fmt_1, 0}; + static cilist io___20 = {0, 6, 0, fmt_40, 0}; + static cilist io___21 = {0, 6, 0, fmt_50, 0}; + static cilist io___22 = {0, 6, 0, fmt_60, 0}; + static cilist io___23 = {0, 6, 0, fmt_70, 0}; + static cilist io___24 = {0, 6, 0, fmt_80, 0}; + static cilist io___25 = {0, 6, 0, fmt_110, 0}; + static cilist io___26 = {0, 6, 0, 0, 0}; + + lda = 1001; + + /* this program was updated on 10/12/92 to correct a */ + /* problem with the random number generator. The previous */ + /* random number generator had a short period and produced */ + /* singular matrices occasionally. */ + + n = 1000; + cray = .056f; + s_wsfe(&io___4); + e_wsfe(); + /* Computing 3rd power */ + d__1 = (real_type)n; + /* Computing 2nd power */ + d__2 = (real_type)n; + ops = boost::lexical_cast<double>(real_type(d__1 * (d__1 * d__1) * 2. / 3. + d__2 * d__2 * 2.)); + + matgen_(a, &lda, &n, b, &norma); + + /* ****************************************************************** */ + /* ****************************************************************** */ + /* you should replace the call to dgefa and dgesl */ + /* by calls to your linear equation solver. */ + /* ****************************************************************** */ + /* ****************************************************************** */ + + t1 = second_(); + dgefa_(a, &lda, &n, ipvt, &info); + time[0] = second_() - t1; + t1 = second_(); + dgesl_(a, &lda, &n, ipvt, b, &c__0); + time[1] = second_() - t1; + total = time[0] + time[1]; + /* ****************************************************************** */ + /* ****************************************************************** */ + + /* compute a residual to verify results. */ + + i__1 = n; + for (i__ = 1; i__ <= i__1; ++i__) + { + x[i__ - 1] = b[i__ - 1]; + /* L10: */ + } + matgen_(a, &lda, &n, b, &norma); + i__1 = n; + for (i__ = 1; i__ <= i__1; ++i__) + { + b[i__ - 1] = -b[i__ - 1]; + /* L20: */ + } + dmxpy_(&n, b, &n, &lda, x, a); + resid = CAST_TO_RT(0); + normx = CAST_TO_RT(0); + i__1 = n; + for (i__ = 1; i__ <= i__1; ++i__) + { + /* Computing MAX */ + d__2 = resid, d__3 = (d__1 = b[i__ - 1], abs(d__1)); + resid = (max)(d__2, d__3); + /* Computing MAX */ + d__2 = normx, d__3 = (d__1 = x[i__ - 1], abs(d__1)); + normx = (max)(d__2, d__3); + /* L30: */ + } + eps = epslon_(&c_b7); + residn = resid / (n * norma * normx * eps); + s_wsfe(&io___20); + e_wsfe(); + s_wsfe(&io___21); + /* + do_fio(&c__1, (char *)&residn, (ftnlen)sizeof(real_type)); + do_fio(&c__1, (char *)&resid, (ftnlen)sizeof(real_type)); + do_fio(&c__1, (char *)&eps, (ftnlen)sizeof(real_type)); + do_fio(&c__1, (char *)&x[0], (ftnlen)sizeof(real_type)); + do_fio(&c__1, (char *)&x[n - 1], (ftnlen)sizeof(real_type)); + */ + std::cout << std::setw(12) << std::setprecision(5) << residn << " " << resid << " " << eps << " " << x[0] << " " << x[n - 1] << std::endl; + e_wsfe(); + + s_wsfe(&io___22); + do_fio(&c__1, (char*)&n, (ftnlen)sizeof(integer)); + e_wsfe(); + s_wsfe(&io___23); + e_wsfe(); + + time[2] = total; + time[3] = ops / (total * 1e6); + time[4] = 2. / time[3]; + time[5] = total / cray; + s_wsfe(&io___24); + do_fio(&c__1, (char*)&lda, (ftnlen)sizeof(integer)); + e_wsfe(); + s_wsfe(&io___25); + for (i__ = 1; i__ <= 6; ++i__) + { + // do_fio(&c__1, (char *)&time[i__ - 1], (ftnlen)sizeof(real_type)); + std::cout << std::setw(12) << std::setprecision(5) << time[i__ - 1]; + } + e_wsfe(); + s_wsle(&io___26); + do_lio(&c__9, &c__1, " end of tests -- this version dated 10/12/92", (ftnlen)44); + e_wsle(); + + s_stop("", (ftnlen)0); + return 0; +} /* MAIN__ */ + +/* Subroutine */ int matgen_(real_type* a, integer* lda, integer* n, + real_type* b, real_type* norma) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + real_type d__1, d__2; + + /* Local variables */ + static integer i__, j; + static integer init[4]; + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --b; + + /* Function Body */ + init[0] = 1; + init[1] = 2; + init[2] = 3; + init[3] = 1325; + *norma = CAST_TO_RT(0); + i__1 = *n; + for (j = 1; j <= i__1; ++j) + { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) + { + a[i__ + j * a_dim1] = ran_(init) - .5f; + /* Computing MAX */ + d__2 = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + *norma = (max)(d__2, *norma); + /* L20: */ + } + /* L30: */ + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) + { + b[i__] = CAST_TO_RT(0); + /* L35: */ + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) + { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) + { + b[i__] += a[i__ + j * a_dim1]; + /* L40: */ + } + /* L50: */ + } + return 0; +} /* matgen_ */ + +/* Subroutine */ int dgefa_(real_type* a, integer* lda, integer* n, integer* ipvt, integer* info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + static integer j, k, l; + static real_type t; + static integer kp1, nm1; + + /* dgefa factors a double precision matrix by gaussian elimination. */ + + /* dgefa is usually called by dgeco, but it can be called */ + /* directly with a saving in time if rcond is not needed. */ + /* (time for dgeco) = (1 + 9/n)*(time for dgefa) . */ + + /* on entry */ + + /* a double precision(lda, n) */ + /* the matrix to be factored. */ + + /* lda integer */ + /* the leading dimension of the array a . */ + + /* n integer */ + /* the order of the matrix a . */ + + /* on return */ + + /* a an upper triangular matrix and the multipliers */ + /* which were used to obtain it. */ + /* the factorization can be written a = l*u where */ + /* l is a product of permutation and unit lower */ + /* triangular matrices and u is upper triangular. */ + + /* ipvt integer(n) */ + /* an integer vector of pivot indices. */ + + /* info integer */ + /* = 0 normal value. */ + /* = k if u(k,k) .eq. 0.0 . this is not an error */ + /* condition for this subroutine, but it does */ + /* indicate that dgesl or dgedi will divide by zero */ + /* if called. use rcond in dgeco for a reliable */ + /* indication of singularity. */ + + /* linpack. this version dated 08/14/78 . */ + /* cleve moler, university of new mexico, argonne national lab. */ + + /* subroutines and functions */ + + /* blas daxpy,dscal,idamax */ + + /* internal variables */ + + /* gaussian elimination with partial pivoting */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipvt; + + /* Function Body */ + *info = 0; + nm1 = *n - 1; + if (nm1 < 1) + { + goto L70; + } + i__1 = nm1; + for (k = 1; k <= i__1; ++k) + { + kp1 = k + 1; + + /* find l = pivot index */ + + i__2 = *n - k + 1; + l = idamax_(&i__2, &a[k + k * a_dim1], &c__1) + k - 1; + ipvt[k] = l; + + /* zero pivot implies this column already triangularized */ + + if (a[l + k * a_dim1] == 0.) + { + goto L40; + } + + /* interchange if necessary */ + + if (l == k) + { + goto L10; + } + t = a[l + k * a_dim1]; + a[l + k * a_dim1] = a[k + k * a_dim1]; + a[k + k * a_dim1] = t; + L10: + + /* compute multipliers */ + + t = -1. / a[k + k * a_dim1]; + i__2 = *n - k; + dscal_(&i__2, &t, &a[k + 1 + k * a_dim1], &c__1); + + /* row elimination with column indexing */ + + i__2 = *n; + for (j = kp1; j <= i__2; ++j) + { + t = a[l + j * a_dim1]; + if (l == k) + { + goto L20; + } + a[l + j * a_dim1] = a[k + j * a_dim1]; + a[k + j * a_dim1] = t; + L20: + i__3 = *n - k; + daxpy_(&i__3, &t, &a[k + 1 + k * a_dim1], &c__1, &a[k + 1 + j * a_dim1], &c__1); + /* L30: */ + } + goto L50; + L40: + *info = k; + L50: + /* L60: */ + ; + } +L70: + ipvt[*n] = *n; + if (a[*n + *n * a_dim1] == 0.) + { + *info = *n; + } + return 0; +} /* dgefa_ */ + +/* Subroutine */ int dgesl_(real_type* a, integer* lda, integer* n, integer* ipvt, real_type* b, integer* job) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + static integer k, l; + static real_type t; + static integer kb, nm1; + + /* dgesl solves the double precision system */ + /* a * x = b or trans(a) * x = b */ + /* using the factors computed by dgeco or dgefa. */ + + /* on entry */ + + /* a double precision(lda, n) */ + /* the output from dgeco or dgefa. */ + + /* lda integer */ + /* the leading dimension of the array a . */ + + /* n integer */ + /* the order of the matrix a . */ + + /* ipvt integer(n) */ + /* the pivot vector from dgeco or dgefa. */ + + /* b double precision(n) */ + /* the right hand side vector. */ + + /* job integer */ + /* = 0 to solve a*x = b , */ + /* = nonzero to solve trans(a)*x = b where */ + /* trans(a) is the transpose. */ + + /* on return */ + + /* b the solution vector x . */ + + /* error condition */ + + /* a division by zero will occur if the input factor contains a */ + /* zero on the diagonal. technically this indicates singularity */ + /* but it is often caused by improper arguments or improper */ + /* setting of lda . it will not occur if the subroutines are */ + /* called correctly and if dgeco has set rcond .gt. 0.0 */ + /* or dgefa has set info .eq. 0 . */ + + /* to compute inverse(a) * c where c is a matrix */ + /* with p columns */ + /* call dgeco(a,lda,n,ipvt,rcond,z) */ + /* if (rcond is too small) go to ... */ + /* do 10 j = 1, p */ + /* call dgesl(a,lda,n,ipvt,c(1,j),0) */ + /* 10 continue */ + + /* linpack. this version dated 08/14/78 . */ + /* cleve moler, university of new mexico, argonne national lab. */ + + /* subroutines and functions */ + + /* blas daxpy,ddot */ + + /* internal variables */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipvt; + --b; + + /* Function Body */ + nm1 = *n - 1; + if (*job != 0) + { + goto L50; + } + + /* job = 0 , solve a * x = b */ + /* first solve l*y = b */ + + if (nm1 < 1) + { + goto L30; + } + i__1 = nm1; + for (k = 1; k <= i__1; ++k) + { + l = ipvt[k]; + t = b[l]; + if (l == k) + { + goto L10; + } + b[l] = b[k]; + b[k] = t; + L10: + i__2 = *n - k; + daxpy_(&i__2, &t, &a[k + 1 + k * a_dim1], &c__1, &b[k + 1], &c__1); + /* L20: */ + } +L30: + + /* now solve u*x = y */ + + i__1 = *n; + for (kb = 1; kb <= i__1; ++kb) + { + k = *n + 1 - kb; + b[k] /= a[k + k * a_dim1]; + t = -b[k]; + i__2 = k - 1; + daxpy_(&i__2, &t, &a[k * a_dim1 + 1], &c__1, &b[1], &c__1); + /* L40: */ + } + goto L100; +L50: + + /* job = nonzero, solve trans(a) * x = b */ + /* first solve trans(u)*y = b */ + + i__1 = *n; + for (k = 1; k <= i__1; ++k) + { + i__2 = k - 1; + t = ddot_(&i__2, &a[k * a_dim1 + 1], &c__1, &b[1], &c__1); + b[k] = (b[k] - t) / a[k + k * a_dim1]; + /* L60: */ + } + + /* now solve trans(l)*x = y */ + + if (nm1 < 1) + { + goto L90; + } + i__1 = nm1; + for (kb = 1; kb <= i__1; ++kb) + { + k = *n - kb; + i__2 = *n - k; + b[k] += ddot_(&i__2, &a[k + 1 + k * a_dim1], &c__1, &b[k + 1], &c__1); + l = ipvt[k]; + if (l == k) + { + goto L70; + } + t = b[l]; + b[l] = b[k]; + b[k] = t; + L70: + /* L80: */ + ; + } +L90: +L100: + return 0; +} /* dgesl_ */ + +/* Subroutine */ int daxpy_(integer* n, real_type* da, real_type* dx, + integer* incx, real_type* dy, integer* incy) +{ + /* System generated locals */ + integer i__1; + + /* Local variables */ + static integer i__, m, ix, iy, mp1; + + /* constant times a vector plus a vector. */ + /* uses unrolled loops for increments equal to one. */ + /* jack dongarra, linpack, 3/11/78. */ + + /* Parameter adjustments */ + --dy; + --dx; + + /* Function Body */ + if (*n <= 0) + { + return 0; + } + if (*da == 0.) + { + return 0; + } + if (*incx == 1 && *incy == 1) + { + goto L20; + } + + /* code for unequal increments or equal increments */ + /* not equal to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) + { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) + { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) + { + dy[iy] += *da * dx[ix]; + ix += *incx; + iy += *incy; + /* L10: */ + } + return 0; + + /* code for both increments equal to 1 */ + + /* clean-up loop */ + +L20: + m = *n % 4; + if (m == 0) + { + goto L40; + } + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) + { + dy[i__] += *da * dx[i__]; + /* L30: */ + } + if (*n < 4) + { + return 0; + } +L40: + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 4) + { + dy[i__] += *da * dx[i__]; + dy[i__ + 1] += *da * dx[i__ + 1]; + dy[i__ + 2] += *da * dx[i__ + 2]; + dy[i__ + 3] += *da * dx[i__ + 3]; + /* L50: */ + } + return 0; +} /* daxpy_ */ + +real_type ddot_(integer* n, real_type* dx, integer* incx, real_type* dy, + integer* incy) +{ + /* System generated locals */ + integer i__1; + real_type ret_val; + + /* Local variables */ + static integer i__, m, ix, iy, mp1; + static real_type dtemp; + + /* forms the dot product of two vectors. */ + /* uses unrolled loops for increments equal to one. */ + /* jack dongarra, linpack, 3/11/78. */ + + /* Parameter adjustments */ + --dy; + --dx; + + /* Function Body */ + ret_val = CAST_TO_RT(0); + dtemp = CAST_TO_RT(0); + if (*n <= 0) + { + return ret_val; + } + if (*incx == 1 && *incy == 1) + { + goto L20; + } + + /* code for unequal increments or equal increments */ + /* not equal to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) + { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) + { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) + { + dtemp += dx[ix] * dy[iy]; + ix += *incx; + iy += *incy; + /* L10: */ + } + ret_val = dtemp; + return ret_val; + + /* code for both increments equal to 1 */ + + /* clean-up loop */ + +L20: + m = *n % 5; + if (m == 0) + { + goto L40; + } + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) + { + dtemp += dx[i__] * dy[i__]; + /* L30: */ + } + if (*n < 5) + { + goto L60; + } +L40: + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 5) + { + dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + dx[i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] + dx[i__ + 4] * dy[i__ + 4]; + /* L50: */ + } +L60: + ret_val = dtemp; + return ret_val; +} /* ddot_ */ + +/* Subroutine */ int dscal_(integer* n, real_type* da, real_type* dx, + integer* incx) +{ + /* System generated locals */ + integer i__1, i__2; + + /* Local variables */ + static integer i__, m, mp1, nincx; + + /* scales a vector by a constant. */ + /* uses unrolled loops for increment equal to one. */ + /* jack dongarra, linpack, 3/11/78. */ + + /* Parameter adjustments */ + --dx; + + /* Function Body */ + if (*n <= 0) + { + return 0; + } + if (*incx == 1) + { + goto L20; + } + + /* code for increment not equal to 1 */ + + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) + { + dx[i__] = *da * dx[i__]; + /* L10: */ + } + return 0; + + /* code for increment equal to 1 */ + + /* clean-up loop */ + +L20: + m = *n % 5; + if (m == 0) + { + goto L40; + } + i__2 = m; + for (i__ = 1; i__ <= i__2; ++i__) + { + dx[i__] = *da * dx[i__]; + /* L30: */ + } + if (*n < 5) + { + return 0; + } +L40: + mp1 = m + 1; + i__2 = *n; + for (i__ = mp1; i__ <= i__2; i__ += 5) + { + dx[i__] = *da * dx[i__]; + dx[i__ + 1] = *da * dx[i__ + 1]; + dx[i__ + 2] = *da * dx[i__ + 2]; + dx[i__ + 3] = *da * dx[i__ + 3]; + dx[i__ + 4] = *da * dx[i__ + 4]; + /* L50: */ + } + return 0; +} /* dscal_ */ + +integer idamax_(integer* n, real_type* dx, integer* incx) +{ + /* System generated locals */ + integer ret_val, i__1; + real_type d__1; + + /* Local variables */ + static integer i__, ix; + static real_type dmax__; + + /* finds the index of element having max. dabsolute value. */ + /* jack dongarra, linpack, 3/11/78. */ + + /* Parameter adjustments */ + --dx; + + /* Function Body */ + ret_val = 0; + if (*n < 1) + { + return ret_val; + } + ret_val = 1; + if (*n == 1) + { + return ret_val; + } + if (*incx == 1) + { + goto L20; + } + + /* code for increment not equal to 1 */ + + ix = 1; + dmax__ = abs(dx[1]); + ix += *incx; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) + { + if ((d__1 = dx[ix], abs(d__1)) <= dmax__) + { + goto L5; + } + ret_val = i__; + dmax__ = (d__1 = dx[ix], abs(d__1)); + L5: + ix += *incx; + /* L10: */ + } + return ret_val; + + /* code for increment equal to 1 */ + +L20: + dmax__ = abs(dx[1]); + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) + { + if ((d__1 = dx[i__], abs(d__1)) <= dmax__) + { + goto L30; + } + ret_val = i__; + dmax__ = (d__1 = dx[i__], abs(d__1)); + L30:; + } + return ret_val; +} /* idamax_ */ + +real_type epslon_(real_type* x) +{ +#if defined(TEST_MPF_100) || defined(TEST_MPFR_100) || defined(TEST_GMPXX) || defined(TEST_MPFRXX) + return std::ldexp(1.0, 1 - ((100 + 1) * 1000L) / 301L); +#elif defined(TEST_CPP_DEC_FLOAT_BN) + return std::pow(10.0, 1 - std::numeric_limits<efx::cpp_dec_float_50>::digits10); +#elif defined(NATIVE_FLOAT128) + return FLT128_EPSILON; +#else + return CAST_TO_RT(std::numeric_limits<real_type>::epsilon()); +#endif +} /* epslon_ */ + +/* Subroutine */ int mm_(real_type* a, integer* lda, integer* n1, integer* n3, real_type* b, integer* ldb, integer* n2, real_type* c__, + integer* ldc) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2; + + /* Local variables */ + static integer i__, j; + + /* purpose: */ + /* multiply matrix b times matrix c and store the result in matrix a. */ + + /* parameters: */ + + /* a double precision(lda,n3), matrix of n1 rows and n3 columns */ + + /* lda integer, leading dimension of array a */ + + /* n1 integer, number of rows in matrices a and b */ + + /* n3 integer, number of columns in matrices a and c */ + + /* b double precision(ldb,n2), matrix of n1 rows and n2 columns */ + + /* ldb integer, leading dimension of array b */ + + /* n2 integer, number of columns in matrix b, and number of rows in */ + /* matrix c */ + + /* c double precision(ldc,n3), matrix of n2 rows and n3 columns */ + + /* ldc integer, leading dimension of array c */ + + /* ---------------------------------------------------------------------- */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + i__1 = *n3; + for (j = 1; j <= i__1; ++j) + { + i__2 = *n1; + for (i__ = 1; i__ <= i__2; ++i__) + { + a[i__ + j * a_dim1] = CAST_TO_RT(0); + /* L10: */ + } + dmxpy_(n2, &a[j * a_dim1 + 1], n1, ldb, &c__[j * c_dim1 + 1], &b[b_offset]); + /* L20: */ + } + + return 0; +} /* mm_ */ + +/* Subroutine */ int dmxpy_(integer* n1, real_type* y, integer* n2, integer* ldm, real_type* x, real_type* m) +{ + /* System generated locals */ + integer m_dim1, m_offset, i__1, i__2; + + /* Local variables */ + static integer i__, j, jmin; + + /* purpose: */ + /* multiply matrix m times vector x and add the result to vector y. */ + + /* parameters: */ + + /* n1 integer, number of elements in vector y, and number of rows in */ + /* matrix m */ + + /* y double precision(n1), vector of length n1 to which is added */ + /* the product m*x */ + + /* n2 integer, number of elements in vector x, and number of columns */ + /* in matrix m */ + + /* ldm integer, leading dimension of array m */ + + /* x double precision(n2), vector of length n2 */ + + /* m double precision(ldm,n2), matrix of n1 rows and n2 columns */ + + /* ---------------------------------------------------------------------- */ + + /* cleanup odd vector */ + + /* Parameter adjustments */ + --y; + m_dim1 = *ldm; + m_offset = 1 + m_dim1; + m -= m_offset; + --x; + + /* Function Body */ + j = *n2 % 2; + if (j >= 1) + { + i__1 = *n1; + for (i__ = 1; i__ <= i__1; ++i__) + { + y[i__] += x[j] * m[i__ + j * m_dim1]; + /* L10: */ + } + } + + /* cleanup odd group of two vectors */ + + j = *n2 % 4; + if (j >= 2) + { + i__1 = *n1; + for (i__ = 1; i__ <= i__1; ++i__) + { + y[i__] = y[i__] + x[j - 1] * m[i__ + (j - 1) * m_dim1] + x[j] * m[i__ + j * m_dim1]; + /* L20: */ + } + } + + /* cleanup odd group of four vectors */ + + j = *n2 % 8; + if (j >= 4) + { + i__1 = *n1; + for (i__ = 1; i__ <= i__1; ++i__) + { + y[i__] = y[i__] + x[j - 3] * m[i__ + (j - 3) * m_dim1] + x[j - 2] * m[i__ + (j - 2) * m_dim1] + x[j - 1] * m[i__ + (j - 1) * m_dim1] + x[j] * m[i__ + j * m_dim1]; + /* L30: */ + } + } + + /* cleanup odd group of eight vectors */ + + j = *n2 % 16; + if (j >= 8) + { + i__1 = *n1; + for (i__ = 1; i__ <= i__1; ++i__) + { + y[i__] = y[i__] + x[j - 7] * m[i__ + (j - 7) * m_dim1] + x[j - 6] * m[i__ + (j - 6) * m_dim1] + x[j - 5] * m[i__ + (j - 5) * m_dim1] + x[j - 4] * m[i__ + (j - 4) * m_dim1] + x[j - 3] * m[i__ + (j - 3) * m_dim1] + x[j - 2] * m[i__ + (j - 2) * m_dim1] + x[j - 1] * m[i__ + (j - 1) * m_dim1] + x[j] * m[i__ + j * m_dim1]; + /* L40: */ + } + } + + /* main loop - groups of sixteen vectors */ + + jmin = j + 16; + i__1 = *n2; + for (j = jmin; j <= i__1; j += 16) + { + i__2 = *n1; + for (i__ = 1; i__ <= i__2; ++i__) + { + y[i__] = y[i__] + x[j - 15] * m[i__ + (j - 15) * m_dim1] + x[j - 14] * m[i__ + (j - 14) * m_dim1] + x[j - 13] * m[i__ + (j - 13) * m_dim1] + x[j - 12] * m[i__ + (j - 12) * m_dim1] + x[j - 11] * m[i__ + (j - 11) * m_dim1] + x[j - 10] * m[i__ + (j - 10) * m_dim1] + x[j - 9] * m[i__ + (j - 9) * m_dim1] + x[j - 8] * m[i__ + (j - 8) * m_dim1] + x[j - 7] * m[i__ + (j - 7) * m_dim1] + x[j - 6] * m[i__ + (j - 6) * m_dim1] + x[j - 5] * m[i__ + (j - 5) * m_dim1] + x[j - 4] * m[i__ + (j - 4) * m_dim1] + x[j - 3] * m[i__ + (j - 3) * m_dim1] + x[j - 2] * m[i__ + (j - 2) * m_dim1] + x[j - 1] * m[i__ + (j - 1) * m_dim1] + x[j] * m[i__ + j * m_dim1]; + /* L50: */ + } + /* L60: */ + } + return 0; +} /* dmxpy_ */ + +real_type ran_(integer* iseed) +{ + /* System generated locals */ + real_type ret_val; + + /* Local variables */ + static integer it1, it2, it3, it4; + + /* modified from the LAPACK auxiliary routine 10/12/92 JD */ + /* -- LAPACK auxiliary routine (version 1.0) -- */ + /* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */ + /* Courant Institute, Argonne National Lab, and Rice University */ + /* February 29, 1992 */ + + /* .. Array Arguments .. */ + /* .. */ + + /* Purpose */ + /* ======= */ + + /* DLARAN returns a random double number from a uniform (0,1) */ + /* distribution. */ + + /* Arguments */ + /* ========= */ + + /* ISEED (input/output) INTEGER array, dimension (4) */ + /* On entry, the seed of the random number generator; the array */ + /* elements must be between 0 and 4095, and ISEED(4) must be */ + /* odd. */ + /* On exit, the seed is updated. */ + + /* Further Details */ + /* =============== */ + + /* This routine uses a multiplicative congruential method with modulus */ + /* 2**48 and multiplier 33952834046453 (see G.S.Fishman, */ + /* 'Multiplicative congruential random number generators with modulus */ + /* 2**b: an exhaustive analysis for b = 32 and a partial analysis for */ + /* b = 48', Math. Comp. 189, pp 331-344, 1990). */ + + /* 48-bit integers are stored in 4 integer array elements with 12 bits */ + /* per element. Hence the routine is portable across machines with */ + /* integers of 32 bits or more. */ + + /* .. Parameters .. */ + /* .. */ + /* .. Local Scalars .. */ + /* .. */ + /* .. Intrinsic Functions .. */ + /* .. */ + /* .. Executable Statements .. */ + + /* multiply the seed by the multiplier modulo 2**48 */ + + /* Parameter adjustments */ + --iseed; + + /* Function Body */ + it4 = iseed[4] * 2549; + it3 = it4 / 4096; + it4 -= it3 << 12; + it3 = it3 + iseed[3] * 2549 + iseed[4] * 2508; + it2 = it3 / 4096; + it3 -= it2 << 12; + it2 = it2 + iseed[2] * 2549 + iseed[3] * 2508 + iseed[4] * 322; + it1 = it2 / 4096; + it2 -= it1 << 12; + it1 = it1 + iseed[1] * 2549 + iseed[2] * 2508 + iseed[3] * 322 + iseed[4] * 494; + it1 %= 4096; + + /* return updated seed */ + + iseed[1] = it1; + iseed[2] = it2; + iseed[3] = it3; + iseed[4] = it4; + + /* convert 48-bit integer to a double number in the interval (0,1) */ + + ret_val = ((real_type)it1 + ((real_type)it2 + ((real_type)it3 + (real_type)it4 * 2.44140625e-4) * 2.44140625e-4) * 2.44140625e-4) * 2.44140625e-4; + return ret_val; + + /* End of RAN */ + +} /* ran_ */ + +/* + +Double results: +~~~~~~~~~~~~~~ + +norm. resid resid machep x(1) x(n) +6.4915 7.207e-013 2.2204e-016 1 1 + + + +times are reported for matrices of order 1000 +factor solve total mflops unit ratio +times for array with leading dimension of1001 +1.443 0.003 1.446 462.43 0.004325 25.821 + + +mpf_class results: +~~~~~~~~~~~~~~~~~~ + +norm. resid resid machep x(1) x(n) +3.6575e-05 5.2257e-103 2.8575e-101 1 1 + + + +times are reported for matrices of order 1000 +factor solve total mflops unit ratio +times for array with leading dimension of1001 +266.45 0.798 267.24 2.5021 0.79933 4772.2 + + +number<gmp_float<100> >: +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + norm. resid resid machep x(1) x(n) + 0.36575e-4 0.52257e-102 0.28575e-100 0.1e1 0.1e1 + + + + times are reported for matrices of order 1000 + factor solve total mflops unit ratio + times for array with leading dimension of1001 + 279.96 0.84 280.8 2.3813 0.83988 5014.3 + +boost::multiprecision::ef::cpp_dec_float_50: +~~~~~~~~~~~~~~~~~~~~~~~~~ + + norm. resid resid machep x(1) x(n) + 2.551330735e-16 1.275665107e-112 1e-99 1 1 + + + + times are reported for matrices of order 1000 + factor solve total mflops unit ratio + times for array with leading dimension of1001 + 363.89 1.074 364.97 1.8321 1.0916 6517.3 +*/ diff --git a/src/boost/libs/multiprecision/performance/miller_rabin_performance.cpp b/src/boost/libs/multiprecision/performance/miller_rabin_performance.cpp new file mode 100644 index 00000000..bb21160b --- /dev/null +++ b/src/boost/libs/multiprecision/performance/miller_rabin_performance.cpp @@ -0,0 +1,166 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define BOOST_CHRONO_HEADER_ONLY + +#if !defined(TEST_MPZ) && !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT) +#define TEST_MPZ +#define TEST_TOMMATH +#define TEST_CPP_INT +#endif + +#ifdef TEST_MPZ +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef TEST_CPP_INT +#include <boost/multiprecision/cpp_int.hpp> +#endif +#include <boost/multiprecision/miller_rabin.hpp> +#include <boost/chrono.hpp> +#include <map> + +template <class Clock> +struct stopwatch +{ + typedef typename Clock::duration duration; + stopwatch() + { + m_start = Clock::now(); + } + duration elapsed() + { + return Clock::now() - m_start; + } + void reset() + { + m_start = Clock::now(); + } + + private: + typename Clock::time_point m_start; +}; + +unsigned allocation_count = 0; + +void* (*alloc_func_ptr)(size_t); +void* (*realloc_func_ptr)(void*, size_t, size_t); +void (*free_func_ptr)(void*, size_t); + +void* alloc_func(size_t n) +{ + ++allocation_count; + return (*alloc_func_ptr)(n); +} + +void free_func(void* p, size_t n) +{ + (*free_func_ptr)(p, n); +} + +void* realloc_func(void* p, size_t old, size_t n) +{ + ++allocation_count; + return (*realloc_func_ptr)(p, old, n); +} + +#ifdef TEST_MPZ +boost::chrono::duration<double> test_miller_rabin_gmp() +{ + using namespace boost::random; + using namespace boost::multiprecision; + + stopwatch<boost::chrono::high_resolution_clock> c; + + independent_bits_engine<mt11213b, 256, mpz_int> gen; + + for (unsigned i = 0; i < 1000; ++i) + { + mpz_int n = gen(); + mpz_probab_prime_p(n.backend().data(), 25); + } + return c.elapsed(); +} +#endif + +std::map<std::string, double> results; +double min_time = (std::numeric_limits<double>::max)(); + +template <class IntType> +boost::chrono::duration<double> test_miller_rabin(const char* name) +{ + using namespace boost::random; + + stopwatch<boost::chrono::high_resolution_clock> c; + + independent_bits_engine<mt11213b, 256, IntType> gen; + // + // We must use a different generator for the tests and number generation, otherwise + // we get false positives. + // + mt19937 gen2; + unsigned result_count = 0; + + for (unsigned i = 0; i < 1000; ++i) + { + IntType n = gen(); + if (boost::multiprecision::miller_rabin_test(n, 25, gen2)) + ++result_count; + } + boost::chrono::duration<double> t = c.elapsed(); + double d = t.count(); + if (d < min_time) + min_time = d; + results[name] = d; + std::cout << "Time for " << std::setw(30) << std::left << name << " = " << d << std::endl; + std::cout << "Number of primes found = " << result_count << std::endl; + return t; +} + +void generate_quickbook() +{ + std::cout << "[table\n[[Integer Type][Relative Performance (Actual time in parenthesis)]]\n"; + + std::map<std::string, double>::const_iterator i(results.begin()), j(results.end()); + + while (i != j) + { + double rel = i->second / min_time; + std::cout << "[[" << i->first << "][" << rel << "(" << i->second << "s)]]\n"; + ++i; + } + + std::cout << "]\n"; +} + +int main() +{ + using namespace boost::multiprecision; +#ifdef TEST_CPP_INT + test_miller_rabin<number<cpp_int_backend<>, et_off> >("cpp_int (no Expression templates)"); + test_miller_rabin<cpp_int>("cpp_int"); + test_miller_rabin<number<cpp_int_backend<128> > >("cpp_int (128-bit cache)"); + test_miller_rabin<number<cpp_int_backend<256> > >("cpp_int (256-bit cache)"); + test_miller_rabin<number<cpp_int_backend<512> > >("cpp_int (512-bit cache)"); + test_miller_rabin<number<cpp_int_backend<1024> > >("cpp_int (1024-bit cache)"); + test_miller_rabin<int1024_t>("int1024_t"); + test_miller_rabin<checked_int1024_t>("checked_int1024_t"); +#endif +#ifdef TEST_MPZ + test_miller_rabin<number<gmp_int, et_off> >("mpz_int (no Expression templates)"); + test_miller_rabin<mpz_int>("mpz_int"); + std::cout << "Time for mpz_int (native Miller Rabin Test) = " << test_miller_rabin_gmp() << std::endl; +#endif +#ifdef TEST_TOMMATH + test_miller_rabin<number<boost::multiprecision::tommath_int, et_off> >("tom_int (no Expression templates)"); + test_miller_rabin<boost::multiprecision::tom_int>("tom_int"); +#endif + + generate_quickbook(); + + return 0; +} diff --git a/src/boost/libs/multiprecision/performance/performance_test-gcc-linux.log b/src/boost/libs/multiprecision/performance/performance_test-gcc-linux.log new file mode 100644 index 00000000..83b15004 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/performance_test-gcc-linux.log @@ -0,0 +1,718 @@ +gmp_float 50 + 0.0180885 +gmp_float 50 - 0.0227712 +gmp_float 50 * 0.0567584 +gmp_float 50 / 0.289062 +gmp_float 50 str 0.00354863 +gmp_float 50 +(int)0.0129337 +gmp_float 50 -(int)0.0256267 +gmp_float 50 *(int)0.0197258 +gmp_float 50 /(int)0.087785 +gmp_float 100 + 0.0196977 +gmp_float 100 - 0.024745 +gmp_float 100 * 0.0972 +gmp_float 100 / 0.393792 +gmp_float 100 str 0.00528245 +gmp_float 100 +(int)0.0154802 +gmp_float 100 -(int)0.0242376 +gmp_float 100 *(int)0.0251239 +gmp_float 100 /(int)0.100588 +gmp_float 500 + 0.034133 +gmp_float 500 - 0.0411447 +gmp_float 500 * 0.938779 +gmp_float 500 / 1.5973 +gmp_float 500 str 0.0406575 +gmp_float 500 +(int)0.0220839 +gmp_float 500 -(int)0.0310849 +gmp_float 500 *(int)0.046899 +gmp_float 500 /(int)0.240511 +gmp_int 128 + 0.0236625 +gmp_int 128 - 0.0255431 +gmp_int 128 * 0.0164612 +gmp_int 128 / 0.20205 +gmp_int 128 str 0.000397397 +gmp_int 128 +(int)0.00907029 +gmp_int 128 -(int)0.0120936 +gmp_int 128 *(int)0.0139764 +gmp_int 128 /(int)0.061181 +gmp_int 128 % 0.167724 +gmp_int 128 | 0.0126627 +gmp_int 128 & 0.0129377 +gmp_int 128 ^ 0.0136018 +gmp_int 128 << 0.0109566 +gmp_int 128 >> 0.0107283 +gmp_int 128 %(int)0.0408971 +gmp_int 128 |(int)0.0463637 +gmp_int 128 &(int)0.0502028 +gmp_int 128 ^(int)0.047593 +gmp_int 128 gcd 0.452707 +gmp_int 256 + 0.0257277 +gmp_int 256 - 0.0314085 +gmp_int 256 * 0.0495293 +gmp_int 256 / 0.242695 +gmp_int 256 str 0.000617745 +gmp_int 256 +(int)0.0129046 +gmp_int 256 -(int)0.0163165 +gmp_int 256 *(int)0.0153128 +gmp_int 256 /(int)0.0730963 +gmp_int 256 % 0.203102 +gmp_int 256 | 0.0149383 +gmp_int 256 & 0.0170717 +gmp_int 256 ^ 0.0160796 +gmp_int 256 << 0.0146023 +gmp_int 256 >> 0.010293 +gmp_int 256 %(int)0.0525884 +gmp_int 256 |(int)0.0501017 +gmp_int 256 &(int)0.0508389 +gmp_int 256 ^(int)0.0498771 +gmp_int 256 gcd 2.17179 +gmp_int 512 + 0.0283556 +gmp_int 512 - 0.0398509 +gmp_int 512 * 0.104633 +gmp_int 512 / 0.294206 +gmp_int 512 str 0.00125749 +gmp_int 512 +(int)0.0156938 +gmp_int 512 -(int)0.0204795 +gmp_int 512 *(int)0.0190714 +gmp_int 512 /(int)0.09638 +gmp_int 512 % 0.23687 +gmp_int 512 | 0.0244134 +gmp_int 512 & 0.0209509 +gmp_int 512 ^ 0.0266707 +gmp_int 512 << 0.0178981 +gmp_int 512 >> 0.0122496 +gmp_int 512 %(int)0.0655264 +gmp_int 512 |(int)0.0536497 +gmp_int 512 &(int)0.0532932 +gmp_int 512 ^(int)0.0540655 +gmp_int 512 gcd 4.86569 +gmp_int 1024 + 0.0417292 +gmp_int 1024 - 0.0504965 +gmp_int 1024 * 0.330741 +gmp_int 1024 / 0.376529 +gmp_int 1024 str 0.00295526 +gmp_int 1024 +(int)0.0258726 +gmp_int 1024 -(int)0.0235972 +gmp_int 1024 *(int)0.0326542 +gmp_int 1024 /(int)0.148103 +gmp_int 1024 % 0.301177 +gmp_int 1024 | 0.0262977 +gmp_int 1024 & 0.0235786 +gmp_int 1024 ^ 0.0254182 +gmp_int 1024 << 0.0206225 +gmp_int 1024 >> 0.012848 +gmp_int 1024 %(int)0.0765616 +gmp_int 1024 |(int)0.0495613 +gmp_int 1024 &(int)0.0512979 +gmp_int 1024 ^(int)0.0491785 +gmp_int 1024 gcd 10.2899 +cpp_int 128 + 0.0226262 +cpp_int 128 - 0.0256171 +cpp_int 128 * 0.0363846 +cpp_int 128 / 0.227187 +cpp_int 128 str 0.000703371 +cpp_int 128 +(int)0.0156956 +cpp_int 128 -(int)0.0122229 +cpp_int 128 *(int)0.0257193 +cpp_int 128 /(int)0.129609 +cpp_int 128 % 0.226534 +cpp_int 128 | 0.0242976 +cpp_int 128 & 0.0244482 +cpp_int 128 ^ 0.0243197 +cpp_int 128 << 0.0182175 +cpp_int 128 >> 0.0215535 +cpp_int 128 %(int)0.181554 +cpp_int 128 |(int)0.0454215 +cpp_int 128 &(int)0.0426893 +cpp_int 128 ^(int)0.0404509 +cpp_int 128 gcd 4.16823 +cpp_int 256 + 0.0275581 +cpp_int 256 - 0.0305114 +cpp_int 256 * 0.100083 +cpp_int 256 / 0.467116 +cpp_int 256 str 0.00181769 +cpp_int 256 +(int)0.017033 +cpp_int 256 -(int)0.0143035 +cpp_int 256 *(int)0.0294836 +cpp_int 256 /(int)0.303922 +cpp_int 256 % 0.435207 +cpp_int 256 | 0.0281237 +cpp_int 256 & 0.028049 +cpp_int 256 ^ 0.0280192 +cpp_int 256 << 0.0210768 +cpp_int 256 >> 0.0175781 +cpp_int 256 %(int)0.279274 +cpp_int 256 |(int)0.0323883 +cpp_int 256 &(int)0.0338674 +cpp_int 256 ^(int)0.0299941 +cpp_int 256 gcd 8.51244 +cpp_int 512 + 0.033691 +cpp_int 512 - 0.0422701 +cpp_int 512 * 0.343683 +cpp_int 512 / 0.755608 +cpp_int 512 str 0.00434022 +cpp_int 512 +(int)0.0196755 +cpp_int 512 -(int)0.0171212 +cpp_int 512 *(int)0.039305 +cpp_int 512 /(int)0.535727 +cpp_int 512 % 0.719958 +cpp_int 512 | 0.0339623 +cpp_int 512 & 0.0342017 +cpp_int 512 ^ 0.033929 +cpp_int 512 << 0.0269161 +cpp_int 512 >> 0.0216914 +cpp_int 512 %(int)0.53345 +cpp_int 512 |(int)0.0324562 +cpp_int 512 &(int)0.0424884 +cpp_int 512 ^(int)0.0323887 +cpp_int 512 gcd 19.489 +cpp_int 1024 + 0.0456764 +cpp_int 1024 - 0.0574919 +cpp_int 1024 * 1.28548 +cpp_int 1024 / 1.30086 +cpp_int 1024 str 0.0122363 +cpp_int 1024 +(int)0.0241476 +cpp_int 1024 -(int)0.0212992 +cpp_int 1024 *(int)0.0540818 +cpp_int 1024 /(int)1.00179 +cpp_int 1024 % 1.27181 +cpp_int 1024 | 0.0457886 +cpp_int 1024 & 0.0456006 +cpp_int 1024 ^ 0.0456494 +cpp_int 1024 << 0.0394128 +cpp_int 1024 >> 0.0294462 +cpp_int 1024 %(int)0.962651 +cpp_int 1024 |(int)0.0372077 +cpp_int 1024 &(int)0.0577198 +cpp_int 1024 ^(int)0.0372218 +cpp_int 1024 gcd 47.7651 +cpp_int(fixed) 128 + 0.0183948 +cpp_int(fixed) 128 - 0.0182905 +cpp_int(fixed) 128 * 0.0201727 +cpp_int(fixed) 128 / 0.206852 +cpp_int(fixed) 128 str 0.000630107 +cpp_int(fixed) 128 +(int)0.00967714 +cpp_int(fixed) 128 -(int)0.00810627 +cpp_int(fixed) 128 *(int)0.0183201 +cpp_int(fixed) 128 /(int)0.111309 +cpp_int(fixed) 128 % 0.204164 +cpp_int(fixed) 128 | 0.0136789 +cpp_int(fixed) 128 & 0.0143848 +cpp_int(fixed) 128 ^ 0.0137773 +cpp_int(fixed) 128 << 0.0131154 +cpp_int(fixed) 128 >> 0.00912176 +cpp_int(fixed) 128 %(int)0.115583 +cpp_int(fixed) 128 |(int)0.0164462 +cpp_int(fixed) 128 &(int)0.0169816 +cpp_int(fixed) 128 ^(int)0.014607 +cpp_int(fixed) 128 gcd 2.87326 +cpp_int(fixed) 256 + 0.0217614 +cpp_int(fixed) 256 - 0.0208437 +cpp_int(fixed) 256 * 0.0385279 +cpp_int(fixed) 256 / 0.321272 +cpp_int(fixed) 256 str 0.00149991 +cpp_int(fixed) 256 +(int)0.0102395 +cpp_int(fixed) 256 -(int)0.00923316 +cpp_int(fixed) 256 *(int)0.021549 +cpp_int(fixed) 256 /(int)0.219146 +cpp_int(fixed) 256 % 0.321039 +cpp_int(fixed) 256 | 0.0154596 +cpp_int(fixed) 256 & 0.0156443 +cpp_int(fixed) 256 ^ 0.015493 +cpp_int(fixed) 256 << 0.0169546 +cpp_int(fixed) 256 >> 0.0114138 +cpp_int(fixed) 256 %(int)0.238857 +cpp_int(fixed) 256 |(int)0.015725 +cpp_int(fixed) 256 &(int)0.021641 +cpp_int(fixed) 256 ^(int)0.0163443 +cpp_int(fixed) 256 gcd 6.68597 +cpp_int(fixed) 512 + 0.0284799 +cpp_int(fixed) 512 - 0.028304 +cpp_int(fixed) 512 * 0.119904 +cpp_int(fixed) 512 / 0.616699 +cpp_int(fixed) 512 str 0.00415653 +cpp_int(fixed) 512 +(int)0.0122821 +cpp_int(fixed) 512 -(int)0.0110103 +cpp_int(fixed) 512 *(int)0.0283635 +cpp_int(fixed) 512 /(int)0.451373 +cpp_int(fixed) 512 % 0.620217 +cpp_int(fixed) 512 | 0.0189862 +cpp_int(fixed) 512 & 0.0192657 +cpp_int(fixed) 512 ^ 0.018973 +cpp_int(fixed) 512 << 0.0188263 +cpp_int(fixed) 512 >> 0.0152103 +cpp_int(fixed) 512 %(int)0.491398 +cpp_int(fixed) 512 |(int)0.0182191 +cpp_int(fixed) 512 &(int)0.0277722 +cpp_int(fixed) 512 ^(int)0.0182565 +cpp_int(fixed) 512 gcd 16.1788 +cpp_int(fixed) 1024 + 0.0396571 +cpp_int(fixed) 1024 - 0.0413187 +cpp_int(fixed) 1024 * 0.371065 +cpp_int(fixed) 1024 / 1.09072 +cpp_int(fixed) 1024 str 0.011546 +cpp_int(fixed) 1024 +(int)0.0254102 +cpp_int(fixed) 1024 -(int)0.020939 +cpp_int(fixed) 1024 *(int)0.0494233 +cpp_int(fixed) 1024 /(int)0.870306 +cpp_int(fixed) 1024 % 1.09888 +cpp_int(fixed) 1024 | 0.0393824 +cpp_int(fixed) 1024 & 0.0397966 +cpp_int(fixed) 1024 ^ 0.0394082 +cpp_int(fixed) 1024 << 0.0392477 +cpp_int(fixed) 1024 >> 0.0214742 +cpp_int(fixed) 1024 %(int)0.941513 +cpp_int(fixed) 1024 |(int)0.0304613 +cpp_int(fixed) 1024 &(int)0.0497983 +cpp_int(fixed) 1024 ^(int)0.0333848 +cpp_int(fixed) 1024 gcd 41.9178 +cpp_rational 128 + 8.33358 +cpp_rational 128 - 8.3543 +cpp_rational 128 * 15.3196 +cpp_rational 128 / 31.794 +cpp_rational 128 str 0.00980984 +cpp_rational 128 +(int)1.14042 +cpp_rational 128 -(int)1.13947 +cpp_rational 128 *(int)1.3425 +cpp_rational 128 /(int)1.35276 +cpp_rational 256 + 24.5753 +cpp_rational 256 - 24.3831 +cpp_rational 256 * 45.9283 +cpp_rational 256 / 80.7871 +cpp_rational 256 str 0.0288878 +cpp_rational 256 +(int)1.54697 +cpp_rational 256 -(int)1.55711 +cpp_rational 256 *(int)2.05921 +cpp_rational 256 /(int)2.12933 +cpp_rational 512 + 58.1983 +cpp_rational 512 - 58.3044 +cpp_rational 512 * 111.528 +cpp_rational 512 / 184.73 +cpp_rational 512 str 0.067039 +cpp_rational 512 +(int)1.83113 +cpp_rational 512 -(int)1.82889 +cpp_rational 512 *(int)2.75206 +cpp_rational 512 /(int)2.75885 +cpp_rational 1024 + 139.884 +cpp_rational 1024 - 139.665 +cpp_rational 1024 * 270.253 +cpp_rational 1024 / 436.471 +cpp_rational 1024 str 0.165057 +cpp_rational 1024 +(int)2.65768 +cpp_rational 1024 -(int)2.68279 +cpp_rational 1024 *(int)4.26866 +cpp_rational 1024 /(int)4.27228 +mpq_rational 128 + 0.518878 +mpq_rational 128 - 0.520249 +mpq_rational 128 * 0.940549 +mpq_rational 128 / 2.63335 +mpq_rational 128 str 0.000732008 +mpq_rational 128 +(int)0.145745 +mpq_rational 128 -(int)0.142505 +mpq_rational 128 *(int)0.173305 +mpq_rational 128 /(int)0.178914 +mpq_rational 256 + 2.2747 +mpq_rational 256 - 2.27886 +mpq_rational 256 * 4.27402 +mpq_rational 256 / 8.07149 +mpq_rational 256 str 0.00123256 +mpq_rational 256 +(int)0.164417 +mpq_rational 256 -(int)0.161741 +mpq_rational 256 *(int)0.193095 +mpq_rational 256 /(int)0.202255 +mpq_rational 512 + 5.09463 +mpq_rational 512 - 5.09757 +mpq_rational 512 * 9.6481 +mpq_rational 512 / 16.9064 +mpq_rational 512 str 0.00244388 +mpq_rational 512 +(int)0.202901 +mpq_rational 512 -(int)0.200644 +mpq_rational 512 *(int)0.248942 +mpq_rational 512 /(int)0.251928 +mpq_rational 1024 + 11.2492 +mpq_rational 1024 - 11.2528 +mpq_rational 1024 * 21.0227 +mpq_rational 1024 / 35.7647 +mpq_rational 1024 str 0.00559869 +mpq_rational 1024 +(int)0.287349 +mpq_rational 1024 -(int)0.28136 +mpq_rational 1024 *(int)0.337805 +mpq_rational 1024 /(int)0.351164 +tommath_int 128 + 0.0169999 +tommath_int 128 - 0.025088 +tommath_int 128 * 0.0608098 +tommath_int 128 / 1.14807 +tommath_int 128 str 0.00864677 +tommath_int 128 +(int)0.170239 +tommath_int 128 -(int)0.169805 +tommath_int 128 *(int)0.18998 +tommath_int 128 /(int)0.936106 +tommath_int 128 % 1.10993 +tommath_int 128 | 0.0742258 +tommath_int 128 & 0.0747022 +tommath_int 128 ^ 0.0734074 +tommath_int 128 << 0.0316344 +tommath_int 128 >> 0.139155 +tommath_int 128 %(int)0.871093 +tommath_int 128 |(int)0.249135 +tommath_int 128 &(int)0.224394 +tommath_int 128 ^(int)0.248407 +tommath_int 128 gcd 7.6073 +tommath_int 256 + 0.0191462 +tommath_int 256 - 0.0267191 +tommath_int 256 * 0.0843842 +tommath_int 256 / 1.34052 +tommath_int 256 str 0.0212684 +tommath_int 256 +(int)0.173633 +tommath_int 256 -(int)0.173084 +tommath_int 256 *(int)0.20074 +tommath_int 256 /(int)1.17192 +tommath_int 256 % 1.33781 +tommath_int 256 | 0.0740269 +tommath_int 256 & 0.0747001 +tommath_int 256 ^ 0.0741847 +tommath_int 256 << 0.0379471 +tommath_int 256 >> 0.14164 +tommath_int 256 %(int)1.52193 +tommath_int 256 |(int)0.251418 +tommath_int 256 &(int)0.230435 +tommath_int 256 ^(int)0.249516 +tommath_int 256 gcd 15.8851 +tommath_int 512 + 0.0241933 +tommath_int 512 - 0.032154 +tommath_int 512 * 0.195855 +tommath_int 512 / 2.061 +tommath_int 512 str 0.0827649 +tommath_int 512 +(int)0.25223 +tommath_int 512 -(int)0.25482 +tommath_int 512 *(int)0.305608 +tommath_int 512 /(int)1.76155 +tommath_int 512 % 1.97453 +tommath_int 512 | 0.0795209 +tommath_int 512 & 0.0815029 +tommath_int 512 ^ 0.0793004 +tommath_int 512 << 0.0449753 +tommath_int 512 >> 0.149597 +tommath_int 512 %(int)1.74258 +tommath_int 512 |(int)0.253519 +tommath_int 512 &(int)0.235246 +tommath_int 512 ^(int)0.261762 +tommath_int 512 gcd 33.8904 +tommath_int 1024 + 0.0356467 +tommath_int 1024 - 0.0426379 +tommath_int 1024 * 0.563154 +tommath_int 1024 / 3.3106 +tommath_int 1024 str 0.200351 +tommath_int 1024 +(int)0.183982 +tommath_int 1024 -(int)0.182348 +tommath_int 1024 *(int)0.265242 +tommath_int 1024 /(int)2.99248 +tommath_int 1024 % 3.36442 +tommath_int 1024 | 0.0935681 +tommath_int 1024 & 0.0990244 +tommath_int 1024 ^ 0.0948247 +tommath_int 1024 << 0.0671463 +tommath_int 1024 >> 0.167341 +tommath_int 1024 %(int)2.8911 +tommath_int 1024 |(int)0.26358 +tommath_int 1024 &(int)0.244976 +tommath_int 1024 ^(int)0.261357 +tommath_int 1024 gcd 67.1657 +cpp_dec_float 50 + 0.0139248 +cpp_dec_float 50 - 0.0142418 +cpp_dec_float 50 * 0.118247 +cpp_dec_float 50 / 1.82747 +cpp_dec_float 50 str 0.00932849 +cpp_dec_float 50 +(int)0.0253923 +cpp_dec_float 50 -(int)0.0248418 +cpp_dec_float 50 *(int)0.0371704 +cpp_dec_float 50 /(int)0.199883 +cpp_dec_float 100 + 0.0171021 +cpp_dec_float 100 - 0.0176287 +cpp_dec_float 100 * 0.237033 +cpp_dec_float 100 / 3.63766 +cpp_dec_float 100 str 0.0201057 +cpp_dec_float 100 +(int)0.0330663 +cpp_dec_float 100 -(int)0.0332922 +cpp_dec_float 100 *(int)0.0606472 +cpp_dec_float 100 /(int)0.343778 +cpp_dec_float 500 + 0.043194 +cpp_dec_float 500 - 0.0443422 +cpp_dec_float 500 * 2.12299 +cpp_dec_float 500 / 25.7245 +cpp_dec_float 500 str 0.0655127 +cpp_dec_float 500 +(int)0.0706977 +cpp_dec_float 500 -(int)0.0727089 +cpp_dec_float 500 *(int)0.239796 +cpp_dec_float 500 /(int)1.39609 +mpfr_float 50 + 0.019179 +mpfr_float 50 - 0.0225632 +mpfr_float 50 * 0.0588765 +mpfr_float 50 / 0.317276 +mpfr_float 50 str 0.00725414 +mpfr_float 50 +(int)0.0286079 +mpfr_float 50 -(int)0.0465151 +mpfr_float 50 *(int)0.0362579 +mpfr_float 50 /(int)0.0888645 +mpfr_float 100 + 0.0210236 +mpfr_float 100 - 0.0250703 +mpfr_float 100 * 0.0946262 +mpfr_float 100 / 0.456375 +mpfr_float 100 str 0.00900848 +mpfr_float 100 +(int)0.0320443 +mpfr_float 100 -(int)0.0487733 +mpfr_float 100 *(int)0.0437034 +mpfr_float 100 /(int)0.154203 +mpfr_float 500 + 0.033691 +mpfr_float 500 - 0.0371954 +mpfr_float 500 * 0.851721 +mpfr_float 500 / 2.7946 +mpfr_float 500 str 0.0342011 +mpfr_float 500 +(int)0.0414774 +mpfr_float 500 -(int)0.0616173 +mpfr_float 500 *(int)0.0826485 +mpfr_float 500 /(int)0.254227 +[section:float_performance Float Type Perfomance] +[table Operator * +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][2.08334 (0.118247s)][2.50494 (0.237033s)][2.49259 (2.12299s)]] +[[gmp_float][[*1] (0.0567584s)][1.0272 (0.0972s)][1.10221 (0.938779s)]] +[[mpfr_float][1.03732 (0.0588765s)][[*1] (0.0946262s)][[*1] (0.851721s)]] +] +[table Operator *(int) +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][1.88436 (0.0371704s)][2.41392 (0.0606472s)][5.11303 (0.239796s)]] +[[gmp_float][[*1] (0.0197258s)][[*1] (0.0251239s)][[*1] (0.046899s)]] +[[mpfr_float][1.8381 (0.0362579s)][1.73951 (0.0437034s)][1.76227 (0.0826485s)]] +] +[table Operator + +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][[*1] (0.0139248s)][[*1] (0.0171021s)][1.28206 (0.043194s)]] +[[gmp_float][1.29901 (0.0180885s)][1.15177 (0.0196977s)][1.01312 (0.034133s)]] +[[mpfr_float][1.37732 (0.019179s)][1.2293 (0.0210236s)][[*1] (0.033691s)]] +] +[table Operator +(int) +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][1.96327 (0.0253923s)][2.13604 (0.0330663s)][3.20133 (0.0706977s)]] +[[gmp_float][[*1] (0.0129337s)][[*1] (0.0154802s)][[*1] (0.0220839s)]] +[[mpfr_float][2.21189 (0.0286079s)][2.07002 (0.0320443s)][1.87818 (0.0414774s)]] +] +[table Operator - +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][[*1] (0.0142418s)][[*1] (0.0176287s)][1.19214 (0.0443422s)]] +[[gmp_float][1.5989 (0.0227712s)][1.40368 (0.024745s)][1.10618 (0.0411447s)]] +[[mpfr_float][1.5843 (0.0225632s)][1.42213 (0.0250703s)][[*1] (0.0371954s)]] +] +[table Operator -(int) +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][[*1] (0.0248418s)][1.37357 (0.0332922s)][2.33904 (0.0727089s)]] +[[gmp_float][1.03159 (0.0256267s)][[*1] (0.0242376s)][[*1] (0.0310849s)]] +[[mpfr_float][1.87245 (0.0465151s)][2.0123 (0.0487733s)][1.98223 (0.0616173s)]] +] +[table Operator / +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][6.32206 (1.82747s)][9.23752 (3.63766s)][16.1049 (25.7245s)]] +[[gmp_float][[*1] (0.289062s)][[*1] (0.393792s)][[*1] (1.5973s)]] +[[mpfr_float][1.09761 (0.317276s)][1.15892 (0.456375s)][1.74957 (2.7946s)]] +] +[table Operator /(int) +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][2.27696 (0.199883s)][3.41769 (0.343778s)][5.8047 (1.39609s)]] +[[gmp_float][[*1] (0.087785s)][[*1] (0.100588s)][[*1] (0.240511s)]] +[[mpfr_float][1.0123 (0.0888645s)][1.53302 (0.154203s)][1.05703 (0.254227s)]] +] +[table Operator str +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][2.62876 (0.00932849s)][3.80613 (0.0201057s)][1.91552 (0.0655127s)]] +[[gmp_float][[*1] (0.00354863s)][[*1] (0.00528245s)][1.18878 (0.0406575s)]] +[[mpfr_float][2.04421 (0.00725414s)][1.70536 (0.00900848s)][[*1] (0.0342011s)]] +] +[endsect] +[section:integer_performance Integer Type Perfomance] +[table Operator % +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.35064 (0.226534s)][2.1428 (0.435207s)][3.03946 (0.719958s)][4.22281 (1.27181s)]] +[[cpp_int(fixed)][1.21726 (0.204164s)][1.58068 (0.321039s)][2.61838 (0.620217s)][3.6486 (1.09888s)]] +[[gmp_int][[*1] (0.167724s)][[*1] (0.203102s)][[*1] (0.23687s)][[*1] (0.301177s)]] +[[tommath_int][6.61759 (1.10993s)][6.58689 (1.33781s)][8.33593 (1.97453s)][11.1709 (3.36442s)]] +] +[table Operator %(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][4.43928 (0.181554s)][5.31056 (0.279274s)][8.141 (0.53345s)][12.5735 (0.962651s)]] +[[cpp_int(fixed)][2.82619 (0.115583s)][4.54202 (0.238857s)][7.49924 (0.491398s)][12.2974 (0.941513s)]] +[[gmp_int][[*1] (0.0408971s)][[*1] (0.0525884s)][[*1] (0.0655264s)][[*1] (0.0765616s)]] +[[tommath_int][21.2996 (0.871093s)][28.9405 (1.52193s)][26.5936 (1.74258s)][37.7618 (2.8911s)]] +] +[table Operator & +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.88968 (0.0244482s)][1.79292 (0.028049s)][1.77526 (0.0342017s)][1.93398 (0.0456006s)]] +[[cpp_int(fixed)][1.11185 (0.0143848s)][[*1] (0.0156443s)][[*1] (0.0192657s)][1.68783 (0.0397966s)]] +[[gmp_int][[*1] (0.0129377s)][1.09124 (0.0170717s)][1.08747 (0.0209509s)][[*1] (0.0235786s)]] +[[tommath_int][5.77397 (0.0747022s)][4.7749 (0.0747001s)][4.23046 (0.0815029s)][4.19976 (0.0990244s)]] +] +[table Operator &(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][2.51385 (0.0426893s)][1.56497 (0.0338674s)][1.52989 (0.0424884s)][1.15907 (0.0577198s)]] +[[cpp_int(fixed)][[*1] (0.0169816s)][[*1] (0.021641s)][[*1] (0.0277722s)][[*1] (0.0497983s)]] +[[gmp_int][2.9563 (0.0502028s)][2.3492 (0.0508389s)][1.91894 (0.0532932s)][1.03011 (0.0512979s)]] +[[tommath_int][13.2139 (0.224394s)][10.6481 (0.230435s)][8.47057 (0.235246s)][4.91936 (0.244976s)]] +] +[table Operator * +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][2.21032 (0.0363846s)][2.59769 (0.100083s)][3.28466 (0.343683s)][3.88666 (1.28548s)]] +[[cpp_int(fixed)][1.22547 (0.0201727s)][[*1] (0.0385279s)][1.14595 (0.119904s)][1.12192 (0.371065s)]] +[[gmp_int][[*1] (0.0164612s)][1.28554 (0.0495293s)][[*1] (0.104633s)][[*1] (0.330741s)]] +[[tommath_int][3.69412 (0.0608098s)][2.19021 (0.0843842s)][1.87184 (0.195855s)][1.70271 (0.563154s)]] +] +[table Operator *(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.8402 (0.0257193s)][1.92542 (0.0294836s)][2.06094 (0.039305s)][1.6562 (0.0540818s)]] +[[cpp_int(fixed)][1.3108 (0.0183201s)][1.40725 (0.021549s)][1.48723 (0.0283635s)][1.51354 (0.0494233s)]] +[[gmp_int][[*1] (0.0139764s)][[*1] (0.0153128s)][[*1] (0.0190714s)][[*1] (0.0326542s)]] +[[tommath_int][13.593 (0.18998s)][13.1093 (0.20074s)][16.0244 (0.305608s)][8.12274 (0.265242s)]] +] +[table Operator + +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.33096 (0.0226262s)][1.43935 (0.0275581s)][1.39258 (0.033691s)][1.28136 (0.0456764s)]] +[[cpp_int(fixed)][1.08205 (0.0183948s)][1.13659 (0.0217614s)][1.17718 (0.0284799s)][1.1125 (0.0396571s)]] +[[gmp_int][1.39192 (0.0236625s)][1.34375 (0.0257277s)][1.17204 (0.0283556s)][1.17063 (0.0417292s)]] +[[tommath_int][[*1] (0.0169999s)][[*1] (0.0191462s)][[*1] (0.0241933s)][[*1] (0.0356467s)]] +] +[table Operator +(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.73044 (0.0156956s)][1.66346 (0.017033s)][1.60196 (0.0196755s)][[*1] (0.0241476s)]] +[[cpp_int(fixed)][1.06691 (0.00967714s)][[*1] (0.0102395s)][[*1] (0.0122821s)][1.05229 (0.0254102s)]] +[[gmp_int][[*1] (0.00907029s)][1.26028 (0.0129046s)][1.27777 (0.0156938s)][1.07144 (0.0258726s)]] +[[tommath_int][18.7688 (0.170239s)][16.9572 (0.173633s)][20.5363 (0.25223s)][7.61905 (0.183982s)]] +] +[table Operator - +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.40057 (0.0256171s)][1.46382 (0.0305114s)][1.49343 (0.0422701s)][1.39142 (0.0574919s)]] +[[cpp_int(fixed)][[*1] (0.0182905s)][[*1] (0.0208437s)][[*1] (0.028304s)][[*1] (0.0413187s)]] +[[gmp_int][1.39653 (0.0255431s)][1.50686 (0.0314085s)][1.40796 (0.0398509s)][1.22212 (0.0504965s)]] +[[tommath_int][1.37164 (0.025088s)][1.28188 (0.0267191s)][1.13602 (0.032154s)][1.03193 (0.0426379s)]] +] +[table Operator -(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.50784 (0.0122229s)][1.54914 (0.0143035s)][1.55501 (0.0171212s)][1.0172 (0.0212992s)]] +[[cpp_int(fixed)][[*1] (0.00810627s)][[*1] (0.00923316s)][[*1] (0.0110103s)][[*1] (0.020939s)]] +[[gmp_int][1.49189 (0.0120936s)][1.76716 (0.0163165s)][1.86002 (0.0204795s)][1.12695 (0.0235972s)]] +[[tommath_int][20.9474 (0.169805s)][18.7459 (0.173084s)][23.1437 (0.25482s)][8.70855 (0.182348s)]] +] +[table Operator / +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.12441 (0.227187s)][1.92471 (0.467116s)][2.5683 (0.755608s)][3.45487 (1.30086s)]] +[[cpp_int(fixed)][1.02377 (0.206852s)][1.32377 (0.321272s)][2.09615 (0.616699s)][2.89679 (1.09072s)]] +[[gmp_int][[*1] (0.20205s)][[*1] (0.242695s)][[*1] (0.294206s)][[*1] (0.376529s)]] +[[tommath_int][5.68214 (1.14807s)][5.52349 (1.34052s)][7.00529 (2.061s)][8.79242 (3.3106s)]] +] +[table Operator /(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][2.11845 (0.129609s)][4.15783 (0.303922s)][5.55849 (0.535727s)][6.76415 (1.00179s)]] +[[cpp_int(fixed)][1.81934 (0.111309s)][2.99804 (0.219146s)][4.68327 (0.451373s)][5.87635 (0.870306s)]] +[[gmp_int][[*1] (0.061181s)][[*1] (0.0730963s)][[*1] (0.09638s)][[*1] (0.148103s)]] +[[tommath_int][15.3006 (0.936106s)][16.0325 (1.17192s)][18.2771 (1.76155s)][20.2054 (2.99248s)]] +] +[table Operator << +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.66271 (0.0182175s)][1.44338 (0.0210768s)][1.50386 (0.0269161s)][1.91115 (0.0394128s)]] +[[cpp_int(fixed)][1.19703 (0.0131154s)][1.16109 (0.0169546s)][1.05186 (0.0188263s)][1.90315 (0.0392477s)]] +[[gmp_int][[*1] (0.0109566s)][[*1] (0.0146023s)][[*1] (0.0178981s)][[*1] (0.0206225s)]] +[[tommath_int][2.88726 (0.0316344s)][2.5987 (0.0379471s)][2.51285 (0.0449753s)][3.25597 (0.0671463s)]] +] +[table Operator >> +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][2.36287 (0.0215535s)][1.70778 (0.0175781s)][1.77078 (0.0216914s)][2.29189 (0.0294462s)]] +[[cpp_int(fixed)][[*1] (0.00912176s)][1.10889 (0.0114138s)][1.2417 (0.0152103s)][1.6714 (0.0214742s)]] +[[gmp_int][1.17612 (0.0107283s)][[*1] (0.010293s)][[*1] (0.0122496s)][[*1] (0.012848s)]] +[[tommath_int][15.2553 (0.139155s)][13.7608 (0.14164s)][12.2124 (0.149597s)][13.0247 (0.167341s)]] +] +[table Operator ^ +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.78798 (0.0243197s)][1.8085 (0.0280192s)][1.78828 (0.033929s)][1.79594 (0.0456494s)]] +[[cpp_int(fixed)][1.0129 (0.0137773s)][[*1] (0.015493s)][[*1] (0.018973s)][1.5504 (0.0394082s)]] +[[gmp_int][[*1] (0.0136018s)][1.03786 (0.0160796s)][1.40572 (0.0266707s)][[*1] (0.0254182s)]] +[[tommath_int][5.39689 (0.0734074s)][4.78827 (0.0741847s)][4.17964 (0.0793004s)][3.73059 (0.0948247s)]] +] +[table Operator ^(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][2.76928 (0.0404509s)][1.83515 (0.0299941s)][1.77409 (0.0323887s)][1.11493 (0.0372218s)]] +[[cpp_int(fixed)][[*1] (0.014607s)][[*1] (0.0163443s)][[*1] (0.0182565s)][[*1] (0.0333848s)]] +[[gmp_int][3.25823 (0.047593s)][3.05166 (0.0498771s)][2.96144 (0.0540655s)][1.47308 (0.0491785s)]] +[[tommath_int][17.006 (0.248407s)][15.2663 (0.249516s)][14.338 (0.261762s)][7.82864 (0.261357s)]] +] +[table Operator gcd +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][9.20736 (4.16823s)][3.91955 (8.51244s)][4.00539 (19.489s)][4.64192 (47.7651s)]] +[[cpp_int(fixed)][6.34685 (2.87326s)][3.07855 (6.68597s)][3.32507 (16.1788s)][4.07366 (41.9178s)]] +[[gmp_int][[*1] (0.452707s)][[*1] (2.17179s)][[*1] (4.86569s)][[*1] (10.2899s)]] +[[tommath_int][16.804 (7.6073s)][7.31428 (15.8851s)][6.96518 (33.8904s)][6.52732 (67.1657s)]] +] +[table Operator str +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.76995 (0.000703371s)][2.94246 (0.00181769s)][3.45149 (0.00434022s)][4.14052 (0.0122363s)]] +[[cpp_int(fixed)][1.58559 (0.000630107s)][2.42804 (0.00149991s)][3.30542 (0.00415653s)][3.90693 (0.011546s)]] +[[gmp_int][[*1] (0.000397397s)][[*1] (0.000617745s)][[*1] (0.00125749s)][[*1] (0.00295526s)]] +[[tommath_int][21.7585 (0.00864677s)][34.4291 (0.0212684s)][65.8175 (0.0827649s)][67.7946 (0.200351s)]] +] +[table Operator | +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.91883 (0.0242976s)][1.88265 (0.0281237s)][1.78879 (0.0339623s)][1.74117 (0.0457886s)]] +[[cpp_int(fixed)][1.08025 (0.0136789s)][1.03489 (0.0154596s)][[*1] (0.0189862s)][1.49756 (0.0393824s)]] +[[gmp_int][[*1] (0.0126627s)][[*1] (0.0149383s)][1.28585 (0.0244134s)][[*1] (0.0262977s)]] +[[tommath_int][5.86177 (0.0742258s)][4.9555 (0.0740269s)][4.18835 (0.0795209s)][3.55804 (0.0935681s)]] +] +[table Operator |(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][2.76183 (0.0454215s)][2.05967 (0.0323883s)][1.78143 (0.0324562s)][1.22147 (0.0372077s)]] +[[cpp_int(fixed)][[*1] (0.0164462s)][[*1] (0.015725s)][[*1] (0.0182191s)][[*1] (0.0304613s)]] +[[gmp_int][2.81912 (0.0463637s)][3.18611 (0.0501017s)][2.94469 (0.0536497s)][1.62702 (0.0495613s)]] +[[tommath_int][15.1485 (0.249135s)][15.9884 (0.251418s)][13.915 (0.253519s)][8.65293 (0.26358s)]] +] +[endsect] +[section:rational_performance Rational Type Perfomance] +[table Operator * +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][16.2879 (15.3196s)][10.7459 (45.9283s)][11.5596 (111.528s)][12.8553 (270.253s)]] +[[mpq_rational][[*1] (0.940549s)][[*1] (4.27402s)][[*1] (9.6481s)][[*1] (21.0227s)]] +] +[table Operator *(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][7.7465 (1.3425s)][10.6643 (2.05921s)][11.055 (2.75206s)][12.6365 (4.26866s)]] +[[mpq_rational][[*1] (0.173305s)][[*1] (0.193095s)][[*1] (0.248942s)][[*1] (0.337805s)]] +] +[table Operator + +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][16.0608 (8.33358s)][10.8037 (24.5753s)][11.4235 (58.1983s)][12.435 (139.884s)]] +[[mpq_rational][[*1] (0.518878s)][[*1] (2.2747s)][[*1] (5.09463s)][[*1] (11.2492s)]] +] +[table Operator +(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][7.82472 (1.14042s)][9.40883 (1.54697s)][9.02478 (1.83113s)][9.24894 (2.65768s)]] +[[mpq_rational][[*1] (0.145745s)][[*1] (0.164417s)][[*1] (0.202901s)][[*1] (0.287349s)]] +] +[table Operator - +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][16.0583 (8.3543s)][10.6997 (24.3831s)][11.4377 (58.3044s)][12.4116 (139.665s)]] +[[mpq_rational][[*1] (0.520249s)][[*1] (2.27886s)][[*1] (5.09757s)][[*1] (11.2528s)]] +] +[table Operator -(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][7.99602 (1.13947s)][9.62717 (1.55711s)][9.1151 (1.82889s)][9.53508 (2.68279s)]] +[[mpq_rational][[*1] (0.142505s)][[*1] (0.161741s)][[*1] (0.200644s)][[*1] (0.28136s)]] +] +[table Operator / +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][12.0736 (31.794s)][10.0089 (80.7871s)][10.9267 (184.73s)][12.204 (436.471s)]] +[[mpq_rational][[*1] (2.63335s)][[*1] (8.07149s)][[*1] (16.9064s)][[*1] (35.7647s)]] +] +[table Operator /(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][7.56092 (1.35276s)][10.5279 (2.12933s)][10.9509 (2.75885s)][12.166 (4.27228s)]] +[[mpq_rational][[*1] (0.178914s)][[*1] (0.202255s)][[*1] (0.251928s)][[*1] (0.351164s)]] +] +[table Operator str +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][13.4013 (0.00980984s)][23.4372 (0.0288878s)][27.4314 (0.067039s)][29.4814 (0.165057s)]] +[[mpq_rational][[*1] (0.000732008s)][[*1] (0.00123256s)][[*1] (0.00244388s)][[*1] (0.00559869s)]] +] +[endsect] diff --git a/src/boost/libs/multiprecision/performance/performance_test-intel-linux.log b/src/boost/libs/multiprecision/performance/performance_test-intel-linux.log new file mode 100644 index 00000000..e721729e --- /dev/null +++ b/src/boost/libs/multiprecision/performance/performance_test-intel-linux.log @@ -0,0 +1,422 @@ +gmp_int 64 + 0.016582 +gmp_int 64 - 0.0174517 +gmp_int 64 * 0.0112253 +gmp_int 64 / 0.170951 +gmp_int 64 str 0.000343689 +gmp_int 64 +(int)0.00688382 +gmp_int 64 -(int)0.00734613 +gmp_int 64 *(int)0.00881438 +gmp_int 64 /(int)0.0465651 +gmp_int 64 % 0.164576 +gmp_int 64 | 0.0101555 +gmp_int 64 & 0.00955666 +gmp_int 64 ^ 0.00987346 +gmp_int 64 << 0.0106043 +gmp_int 64 >> 0.0093887 +gmp_int 64 %(int)0.0297463 +gmp_int 64 |(int)0.0403338 +gmp_int 64 &(int)0.0417288 +gmp_int 64 ^(int)0.0405779 +gmp_int 64 gcd 0.173816 +gmp_int 128 + 0.0183088 +gmp_int 128 - 0.0189266 +gmp_int 128 * 0.0161084 +gmp_int 128 / 0.191775 +gmp_int 128 str 0.000374699 +gmp_int 128 +(int)0.00866339 +gmp_int 128 -(int)0.0089443 +gmp_int 128 *(int)0.0114143 +gmp_int 128 /(int)0.0534638 +gmp_int 128 % 0.161212 +gmp_int 128 | 0.0107201 +gmp_int 128 & 0.0113559 +gmp_int 128 ^ 0.0112116 +gmp_int 128 << 0.0103295 +gmp_int 128 >> 0.00813413 +gmp_int 128 %(int)0.03692 +gmp_int 128 |(int)0.0412168 +gmp_int 128 &(int)0.0428359 +gmp_int 128 ^(int)0.0418522 +gmp_int 128 gcd 0.43131 +gmp_int 256 + 0.0224834 +gmp_int 256 - 0.025062 +gmp_int 256 * 0.0417471 +gmp_int 256 / 0.233656 +gmp_int 256 str 0.00059903 +gmp_int 256 +(int)0.0112071 +gmp_int 256 -(int)0.0116302 +gmp_int 256 *(int)0.0137181 +gmp_int 256 /(int)0.0667669 +gmp_int 256 % 0.191884 +gmp_int 256 | 0.0129489 +gmp_int 256 & 0.012778 +gmp_int 256 ^ 0.0134548 +gmp_int 256 << 0.0121471 +gmp_int 256 >> 0.00832878 +gmp_int 256 %(int)0.0474363 +gmp_int 256 |(int)0.0425591 +gmp_int 256 &(int)0.0436742 +gmp_int 256 ^(int)0.0425636 +gmp_int 256 gcd 2.06855 +gmp_int 512 + 0.0277439 +gmp_int 512 - 0.0318874 +gmp_int 512 * 0.0991032 +gmp_int 512 / 0.274993 +gmp_int 512 str 0.00129458 +gmp_int 512 +(int)0.014283 +gmp_int 512 -(int)0.0149874 +gmp_int 512 *(int)0.0180512 +gmp_int 512 /(int)0.0906691 +gmp_int 512 % 0.222477 +gmp_int 512 | 0.0217103 +gmp_int 512 & 0.0165285 +gmp_int 512 ^ 0.0208848 +gmp_int 512 << 0.014839 +gmp_int 512 >> 0.00988994 +gmp_int 512 %(int)0.0605682 +gmp_int 512 |(int)0.0462909 +gmp_int 512 &(int)0.046599 +gmp_int 512 ^(int)0.0456608 +gmp_int 512 gcd 4.68499 +gmp_int 1024 + 0.0397479 +gmp_int 1024 - 0.042232 +gmp_int 1024 * 0.31703 +gmp_int 1024 / 0.345984 +gmp_int 1024 str 0.00271592 +gmp_int 1024 +(int)0.0189969 +gmp_int 1024 -(int)0.0195046 +gmp_int 1024 *(int)0.0260306 +gmp_int 1024 /(int)0.140151 +gmp_int 1024 % 0.286399 +gmp_int 1024 | 0.0261953 +gmp_int 1024 & 0.023083 +gmp_int 1024 ^ 0.0248084 +gmp_int 1024 << 0.0202635 +gmp_int 1024 >> 0.0127909 +gmp_int 1024 %(int)0.0761102 +gmp_int 1024 |(int)0.049175 +gmp_int 1024 &(int)0.0499195 +gmp_int 1024 ^(int)0.0487102 +gmp_int 1024 gcd 10.1127 +cpp_int 64 + 0.0152915 +cpp_int 64 - 0.0191821 +cpp_int 64 * 0.0326218 +cpp_int 64 / 0.0951094 +cpp_int 64 str 0.000428547 +cpp_int 64 +(int)0.0132027 +cpp_int 64 -(int)0.0126144 +cpp_int 64 *(int)0.0151037 +cpp_int 64 /(int)0.0491116 +cpp_int 64 % 0.0951581 +cpp_int 64 | 0.0199629 +cpp_int 64 & 0.0196969 +cpp_int 64 ^ 0.0208608 +cpp_int 64 << 0.0179372 +cpp_int 64 >> 0.0146206 +cpp_int 64 %(int)0.0229261 +cpp_int 64 |(int)0.0185797 +cpp_int 64 &(int)0.0225055 +cpp_int 64 ^(int)0.0191337 +cpp_int 64 gcd 1.50205 +cpp_int 128 + 0.0170788 +cpp_int 128 - 0.0228373 +cpp_int 128 * 0.0375831 +cpp_int 128 / 0.163958 +cpp_int 128 str 0.000744647 +cpp_int 128 +(int)0.0144833 +cpp_int 128 -(int)0.013922 +cpp_int 128 *(int)0.0176402 +cpp_int 128 /(int)0.0972057 +cpp_int 128 % 0.169015 +cpp_int 128 | 0.0229631 +cpp_int 128 & 0.023126 +cpp_int 128 ^ 0.0229278 +cpp_int 128 << 0.0215749 +cpp_int 128 >> 0.0149198 +cpp_int 128 %(int)0.0476063 +cpp_int 128 |(int)0.0194697 +cpp_int 128 &(int)0.0270183 +cpp_int 128 ^(int)0.0194481 +cpp_int 128 gcd 3.36986 +cpp_int 256 + 0.0231877 +cpp_int 256 - 0.0293424 +cpp_int 256 * 0.113247 +cpp_int 256 / 0.336287 +cpp_int 256 str 0.00190436 +cpp_int 256 +(int)0.0161733 +cpp_int 256 -(int)0.0173225 +cpp_int 256 *(int)0.0199426 +cpp_int 256 /(int)0.229286 +cpp_int 256 % 0.306542 +cpp_int 256 | 0.0257191 +cpp_int 256 & 0.0254172 +cpp_int 256 ^ 0.0259082 +cpp_int 256 << 0.0253994 +cpp_int 256 >> 0.0172635 +cpp_int 256 %(int)0.116093 +cpp_int 256 |(int)0.0233559 +cpp_int 256 &(int)0.0367792 +cpp_int 256 ^(int)0.0232914 +cpp_int 256 gcd 7.88882 +cpp_int 512 + 0.0291058 +cpp_int 512 - 0.0380025 +cpp_int 512 * 0.337161 +cpp_int 512 / 0.487075 +cpp_int 512 str 0.00494162 +cpp_int 512 +(int)0.0201989 +cpp_int 512 -(int)0.0200688 +cpp_int 512 *(int)0.0311497 +cpp_int 512 /(int)0.375279 +cpp_int 512 % 0.459737 +cpp_int 512 | 0.0297101 +cpp_int 512 & 0.0297235 +cpp_int 512 ^ 0.0296913 +cpp_int 512 << 0.0328422 +cpp_int 512 >> 0.0234706 +cpp_int 512 %(int)0.194709 +cpp_int 512 |(int)0.0258992 +cpp_int 512 &(int)0.0529542 +cpp_int 512 ^(int)0.0258749 +cpp_int 512 gcd 19.7141 +cpp_int 1024 + 0.0410101 +cpp_int 1024 - 0.0576733 +cpp_int 1024 * 1.19319 +cpp_int 1024 / 0.850798 +cpp_int 1024 str 0.0149378 +cpp_int 1024 +(int)0.0222435 +cpp_int 1024 -(int)0.0219408 +cpp_int 1024 *(int)0.0435058 +cpp_int 1024 /(int)0.6795 +cpp_int 1024 % 0.800961 +cpp_int 1024 | 0.0369613 +cpp_int 1024 & 0.0368423 +cpp_int 1024 ^ 0.0371252 +cpp_int 1024 << 0.0474759 +cpp_int 1024 >> 0.0297527 +cpp_int 1024 %(int)0.360619 +cpp_int 1024 |(int)0.0326194 +cpp_int 1024 &(int)0.0801744 +cpp_int 1024 ^(int)0.0319848 +cpp_int 1024 gcd 53.3224 +fixed_int 64 + 0.00207275 +fixed_int 64 - 0.00214524 +fixed_int 64 * 0.00391097 +fixed_int 64 / 0.0608466 +fixed_int 64 str 0.000292286 +fixed_int 64 +(int)0.00357336 +fixed_int 64 -(int)0.00352796 +fixed_int 64 *(int)0.00292725 +fixed_int 64 /(int)0.0243018 +fixed_int 64 % 0.0603067 +fixed_int 64 | 0.00258063 +fixed_int 64 & 0.00257379 +fixed_int 64 ^ 0.00258525 +fixed_int 64 << 0.00134947 +fixed_int 64 >> 0.00560378 +fixed_int 64 %(int)0.0241499 +fixed_int 64 |(int)0.00201939 +fixed_int 64 &(int)0.00206716 +fixed_int 64 ^(int)0.00201848 +fixed_int 64 gcd 0.82127 +fixed_int 128 + 0.00325349 +fixed_int 128 - 0.00366953 +fixed_int 128 * 0.010445 +fixed_int 128 / 0.113697 +fixed_int 128 str 0.000564877 +fixed_int 128 +(int)0.00377625 +fixed_int 128 -(int)0.00360179 +fixed_int 128 *(int)0.00418426 +fixed_int 128 /(int)0.091141 +fixed_int 128 % 0.113804 +fixed_int 128 | 0.00360961 +fixed_int 128 & 0.00359913 +fixed_int 128 ^ 0.00361317 +fixed_int 128 << 0.0065905 +fixed_int 128 >> 0.00654308 +fixed_int 128 %(int)0.0809135 +fixed_int 128 |(int)0.00237125 +fixed_int 128 &(int)0.00231056 +fixed_int 128 ^(int)0.00190464 +fixed_int 128 gcd 2.05126 +fixed_int 256 + 0.00785776 +fixed_int 256 - 0.00635884 +fixed_int 256 * 0.0323875 +fixed_int 256 / 0.203194 +fixed_int 256 str 0.0013816 +fixed_int 256 +(int)0.00413397 +fixed_int 256 -(int)0.00379699 +fixed_int 256 *(int)0.00852456 +fixed_int 256 /(int)0.183053 +fixed_int 256 % 0.200368 +fixed_int 256 | 0.0105747 +fixed_int 256 & 0.0105856 +fixed_int 256 ^ 0.0105755 +fixed_int 256 << 0.00874545 +fixed_int 256 >> 0.00906624 +fixed_int 256 %(int)0.152826 +fixed_int 256 |(int)0.00261619 +fixed_int 256 &(int)0.00424202 +fixed_int 256 ^(int)0.00263274 +fixed_int 256 gcd 5.42715 +fixed_int 512 + 0.0131311 +fixed_int 512 - 0.0122513 +fixed_int 512 * 0.205979 +fixed_int 512 / 0.383601 +fixed_int 512 str 0.0043558 +fixed_int 512 +(int)0.00639746 +fixed_int 512 -(int)0.00641876 +fixed_int 512 *(int)0.0152369 +fixed_int 512 /(int)0.363289 +fixed_int 512 % 0.38201 +fixed_int 512 | 0.0131075 +fixed_int 512 & 0.0131292 +fixed_int 512 ^ 0.01314 +fixed_int 512 << 0.0130248 +fixed_int 512 >> 0.0131451 +fixed_int 512 %(int)0.304714 +fixed_int 512 |(int)0.00574368 +fixed_int 512 &(int)0.00810836 +fixed_int 512 ^(int)0.00576694 +fixed_int 512 gcd 16.6269 +fixed_int 1024 + 0.0322386 +fixed_int 1024 - 0.0312142 +fixed_int 1024 * 0.716002 +fixed_int 1024 / 0.728338 +fixed_int 1024 str 0.0135445 +fixed_int 1024 +(int)0.011986 +fixed_int 1024 -(int)0.0119838 +fixed_int 1024 *(int)0.0349878 +fixed_int 1024 /(int)0.708856 +fixed_int 1024 % 0.723622 +fixed_int 1024 | 0.0181468 +fixed_int 1024 & 0.0182648 +fixed_int 1024 ^ 0.018185 +fixed_int 1024 << 0.0252997 +fixed_int 1024 >> 0.0257832 +fixed_int 1024 %(int)0.597535 +fixed_int 1024 |(int)0.0116417 +fixed_int 1024 &(int)0.0172111 +fixed_int 1024 ^(int)0.011526 +fixed_int 1024 gcd 70.6396 +[section:integer_performance Integer Type Perfomance] +[table Operator % +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.5779 (0.0951581s)][1.48514 (0.169015s)][1.59753 (0.306542s)][2.06645 (0.459737s)][2.79666 (0.800961s)]] +[[fixed_int][[*1] (0.0603067s)][[*1] (0.113804s)][1.04421 (0.200368s)][1.71708 (0.38201s)][2.52662 (0.723622s)]] +[[gmp_int][2.72898 (0.164576s)][1.41658 (0.161212s)][[*1] (0.191884s)][[*1] (0.222477s)][[*1] (0.286399s)]] +] +[table Operator %(int) +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][[*1] (0.0229261s)][1.28944 (0.0476063s)][2.44735 (0.116093s)][3.21471 (0.194709s)][4.73812 (0.360619s)]] +[[fixed_int][1.05338 (0.0241499s)][2.19159 (0.0809135s)][3.22171 (0.152826s)][5.03092 (0.304714s)][7.85093 (0.597535s)]] +[[gmp_int][1.29749 (0.0297463s)][[*1] (0.03692s)][[*1] (0.0474363s)][[*1] (0.0605682s)][[*1] (0.0761102s)]] +] +[table Operator & +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][7.65289 (0.0196969s)][6.42545 (0.023126s)][2.4011 (0.0254172s)][2.26393 (0.0297235s)][2.01712 (0.0368423s)]] +[[fixed_int][[*1] (0.00257379s)][[*1] (0.00359913s)][[*1] (0.0105856s)][[*1] (0.0131292s)][[*1] (0.0182648s)]] +[[gmp_int][3.71307 (0.00955666s)][3.15518 (0.0113559s)][1.2071 (0.012778s)][1.25891 (0.0165285s)][1.2638 (0.023083s)]] +] +[table Operator &(int) +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][10.8871 (0.0225055s)][11.6934 (0.0270183s)][8.67021 (0.0367792s)][6.53082 (0.0529542s)][4.65829 (0.0801744s)]] +[[fixed_int][[*1] (0.00206716s)][[*1] (0.00231056s)][[*1] (0.00424202s)][[*1] (0.00810836s)][[*1] (0.0172111s)]] +[[gmp_int][20.1865 (0.0417288s)][18.5392 (0.0428359s)][10.2956 (0.0436742s)][5.74703 (0.046599s)][2.90042 (0.0499195s)]] +] +[table Operator * +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][8.34111 (0.0326218s)][3.59818 (0.0375831s)][3.49662 (0.113247s)][3.40211 (0.337161s)][3.76364 (1.19319s)]] +[[fixed_int][[*1] (0.00391097s)][[*1] (0.010445s)][[*1] (0.0323875s)][2.07843 (0.205979s)][2.25847 (0.716002s)]] +[[gmp_int][2.87022 (0.0112253s)][1.54221 (0.0161084s)][1.28899 (0.0417471s)][[*1] (0.0991032s)][[*1] (0.31703s)]] +] +[table Operator *(int) +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][5.15967 (0.0151037s)][4.21584 (0.0176402s)][2.33943 (0.0199426s)][2.04436 (0.0311497s)][1.67133 (0.0435058s)]] +[[fixed_int][[*1] (0.00292725s)][[*1] (0.00418426s)][[*1] (0.00852456s)][[*1] (0.0152369s)][1.3441 (0.0349878s)]] +[[gmp_int][3.01114 (0.00881438s)][2.72791 (0.0114143s)][1.60924 (0.0137181s)][1.1847 (0.0180512s)][[*1] (0.0260306s)]] +] +[table Operator + +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][7.37741 (0.0152915s)][5.2494 (0.0170788s)][2.95092 (0.0231877s)][2.21655 (0.0291058s)][1.27208 (0.0410101s)]] +[[fixed_int][[*1] (0.00207275s)][[*1] (0.00325349s)][[*1] (0.00785776s)][[*1] (0.0131311s)][[*1] (0.0322386s)]] +[[gmp_int][7.99998 (0.016582s)][5.62745 (0.0183088s)][2.86129 (0.0224834s)][2.11283 (0.0277439s)][1.23293 (0.0397479s)]] +] +[table Operator +(int) +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][3.69474 (0.0132027s)][3.83536 (0.0144833s)][3.91229 (0.0161733s)][3.15733 (0.0201989s)][1.85579 (0.0222435s)]] +[[fixed_int][[*1] (0.00357336s)][[*1] (0.00377625s)][[*1] (0.00413397s)][[*1] (0.00639746s)][[*1] (0.011986s)]] +[[gmp_int][1.92643 (0.00688382s)][2.29418 (0.00866339s)][2.71097 (0.0112071s)][2.23261 (0.014283s)][1.58492 (0.0189969s)]] +] +[table Operator - +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][8.94166 (0.0191821s)][6.22351 (0.0228373s)][4.61443 (0.0293424s)][3.10192 (0.0380025s)][1.84766 (0.0576733s)]] +[[fixed_int][[*1] (0.00214524s)][[*1] (0.00366953s)][[*1] (0.00635884s)][[*1] (0.0122513s)][[*1] (0.0312142s)]] +[[gmp_int][8.13505 (0.0174517s)][5.15777 (0.0189266s)][3.94128 (0.025062s)][2.60278 (0.0318874s)][1.35297 (0.042232s)]] +] +[table Operator -(int) +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][3.57555 (0.0126144s)][3.86529 (0.013922s)][4.56215 (0.0173225s)][3.12658 (0.0200688s)][1.83087 (0.0219408s)]] +[[fixed_int][[*1] (0.00352796s)][[*1] (0.00360179s)][[*1] (0.00379699s)][[*1] (0.00641876s)][[*1] (0.0119838s)]] +[[gmp_int][2.08226 (0.00734613s)][2.4833 (0.0089443s)][3.063 (0.0116302s)][2.33493 (0.0149874s)][1.62759 (0.0195046s)]] +] +[table Operator / +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.5631 (0.0951094s)][1.44205 (0.163958s)][1.655 (0.336287s)][1.77123 (0.487075s)][2.45907 (0.850798s)]] +[[fixed_int][[*1] (0.0608466s)][[*1] (0.113697s)][[*1] (0.203194s)][1.39495 (0.383601s)][2.10512 (0.728338s)]] +[[gmp_int][2.80954 (0.170951s)][1.68671 (0.191775s)][1.14992 (0.233656s)][[*1] (0.274993s)][[*1] (0.345984s)]] +] +[table Operator /(int) +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][2.0209 (0.0491116s)][1.81816 (0.0972057s)][3.43412 (0.229286s)][4.13899 (0.375279s)][4.84836 (0.6795s)]] +[[fixed_int][[*1] (0.0243018s)][1.70472 (0.091141s)][2.74167 (0.183053s)][4.00675 (0.363289s)][5.05782 (0.708856s)]] +[[gmp_int][1.91611 (0.0465651s)][[*1] (0.0534638s)][[*1] (0.0667669s)][[*1] (0.0906691s)][[*1] (0.140151s)]] +] +[table Operator << +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][13.292 (0.0179372s)][3.27363 (0.0215749s)][2.9043 (0.0253994s)][2.52151 (0.0328422s)][2.34293 (0.0474759s)]] +[[fixed_int][[*1] (0.00134947s)][[*1] (0.0065905s)][[*1] (0.00874545s)][[*1] (0.0130248s)][1.24854 (0.0252997s)]] +[[gmp_int][7.85814 (0.0106043s)][1.56732 (0.0103295s)][1.38897 (0.0121471s)][1.13928 (0.014839s)][[*1] (0.0202635s)]] +] +[table Operator >> +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][2.60907 (0.0146206s)][2.28025 (0.0149198s)][2.07275 (0.0172635s)][2.37318 (0.0234706s)][2.32609 (0.0297527s)]] +[[fixed_int][[*1] (0.00560378s)][[*1] (0.00654308s)][1.08854 (0.00906624s)][1.32914 (0.0131451s)][2.01575 (0.0257832s)]] +[[gmp_int][1.67542 (0.0093887s)][1.24317 (0.00813413s)][[*1] (0.00832878s)][[*1] (0.00988994s)][[*1] (0.0127909s)]] +] +[table Operator ^ +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][8.06918 (0.0208608s)][6.34562 (0.0229278s)][2.44983 (0.0259082s)][2.25961 (0.0296913s)][2.04153 (0.0371252s)]] +[[fixed_int][[*1] (0.00258525s)][[*1] (0.00361317s)][[*1] (0.0105755s)][[*1] (0.01314s)][[*1] (0.018185s)]] +[[gmp_int][3.81916 (0.00987346s)][3.10299 (0.0112116s)][1.27226 (0.0134548s)][1.5894 (0.0208848s)][1.36422 (0.0248084s)]] +] +[table Operator ^(int) +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][9.47925 (0.0191337s)][10.2109 (0.0194481s)][8.84686 (0.0232914s)][4.48677 (0.0258749s)][2.775 (0.0319848s)]] +[[fixed_int][[*1] (0.00201848s)][[*1] (0.00190464s)][[*1] (0.00263274s)][[*1] (0.00576694s)][[*1] (0.011526s)]] +[[gmp_int][20.1032 (0.0405779s)][21.9738 (0.0418522s)][16.1671 (0.0425636s)][7.91768 (0.0456608s)][4.2261 (0.0487102s)]] +] +[table Operator gcd +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][8.64165 (1.50205s)][7.81307 (3.36986s)][3.81369 (7.88882s)][4.20792 (19.7141s)][5.27284 (53.3224s)]] +[[fixed_int][4.72495 (0.82127s)][4.75589 (2.05126s)][2.62364 (5.42715s)][3.54898 (16.6269s)][6.98527 (70.6396s)]] +[[gmp_int][[*1] (0.173816s)][[*1] (0.43131s)][[*1] (2.06855s)][[*1] (4.68499s)][[*1] (10.1127s)]] +] +[table Operator str +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.46619 (0.000428547s)][1.98732 (0.000744647s)][3.17907 (0.00190436s)][3.81717 (0.00494162s)][5.50009 (0.0149378s)]] +[[fixed_int][[*1] (0.000292286s)][1.50755 (0.000564877s)][2.30639 (0.0013816s)][3.36465 (0.0043558s)][4.98706 (0.0135445s)]] +[[gmp_int][1.17587 (0.000343689s)][[*1] (0.000374699s)][[*1] (0.00059903s)][[*1] (0.00129458s)][[*1] (0.00271592s)]] +] +[table Operator | +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][7.73565 (0.0199629s)][6.36166 (0.0229631s)][2.43214 (0.0257191s)][2.26665 (0.0297101s)][2.0368 (0.0369613s)]] +[[fixed_int][[*1] (0.00258063s)][[*1] (0.00360961s)][[*1] (0.0105747s)][[*1] (0.0131075s)][[*1] (0.0181468s)]] +[[gmp_int][3.9353 (0.0101555s)][2.96987 (0.0107201s)][1.22452 (0.0129489s)][1.65632 (0.0217103s)][1.44352 (0.0261953s)]] +] +[table Operator |(int) +[[Backend][64 Bits][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][9.20066 (0.0185797s)][8.21071 (0.0194697s)][8.92746 (0.0233559s)][4.50916 (0.0258992s)][2.80194 (0.0326194s)]] +[[fixed_int][[*1] (0.00201939s)][[*1] (0.00237125s)][[*1] (0.00261619s)][[*1] (0.00574368s)][[*1] (0.0116417s)]] +[[gmp_int][19.9733 (0.0403338s)][17.3819 (0.0412168s)][16.2676 (0.0425591s)][8.05945 (0.0462909s)][4.22404 (0.049175s)]] +] +[endsect] diff --git a/src/boost/libs/multiprecision/performance/performance_test-msvc-10.log b/src/boost/libs/multiprecision/performance/performance_test-msvc-10.log new file mode 100644 index 00000000..3e271ff9 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/performance_test-msvc-10.log @@ -0,0 +1,1220 @@ +gmp_float 50 + 0.110988 +gmp_float 50 - 0.119898 +gmp_float 50 * 0.275044 +gmp_float 50 / 1.27708 +gmp_float 50 str 0.013276 +gmp_float 50 +(int)0.0330888 +gmp_float 50 -(int)0.134451 +gmp_float 50 *(int)0.0422135 +gmp_float 50 /(int)0.180393 +gmp_float 50 construct0.19737 +gmp_float 50 construct(unsigned)0.208078 +gmp_float 50 construct(unsigned long long)0.520025 +gmp_float 50 + 0.498089 +gmp_float 50 - 0.502235 +gmp_float 50 * 0.564768 +gmp_float 50 / 0.90324 +gmp_float 50 + 0.477999 +gmp_float 50 - 0.499682 +gmp_float 50 * 0.551747 +gmp_float 50 / 0.893752 +gmp_float 100 + 0.111217 +gmp_float 100 - 0.120498 +gmp_float 100 * 0.416175 +gmp_float 100 / 1.69515 +gmp_float 100 str 0.0202949 +gmp_float 100 +(int)0.0386882 +gmp_float 100 -(int)0.1351 +gmp_float 100 *(int)0.0493716 +gmp_float 100 /(int)0.23378 +gmp_float 100 construct0.196599 +gmp_float 100 construct(unsigned)0.207062 +gmp_float 100 construct(unsigned long long)0.51936 +gmp_float 100 + 0.517172 +gmp_float 100 - 0.509588 +gmp_float 100 * 0.575954 +gmp_float 100 / 1.04262 +gmp_float 100 + 0.476701 +gmp_float 100 - 0.503546 +gmp_float 100 * 0.564962 +gmp_float 100 / 1.03328 +gmp_float 500 + 0.15445 +gmp_float 500 - 0.164099 +gmp_float 500 * 3.32799 +gmp_float 500 / 8.12655 +gmp_float 500 str 0.141162 +gmp_float 500 +(int)0.0646201 +gmp_float 500 -(int)0.176876 +gmp_float 500 *(int)0.0857876 +gmp_float 500 /(int)0.710204 +gmp_float 500 construct0.206063 +gmp_float 500 construct(unsigned)0.217019 +gmp_float 500 construct(unsigned long long)0.538021 +gmp_float 500 + 0.552532 +gmp_float 500 - 0.555754 +gmp_float 500 * 0.717186 +gmp_float 500 / 2.24686 +gmp_float 500 + 0.490614 +gmp_float 500 - 0.547751 +gmp_float 500 * 0.700957 +gmp_float 500 / 2.24146 +gmp_int 128 + 0.0421662 +gmp_int 128 - 0.0411848 +gmp_int 128 * 0.0708996 +gmp_int 128 / 0.868916 +gmp_int 128 str 0.00185638 +gmp_int 128 +(int)0.0311237 +gmp_int 128 -(int)0.030585 +gmp_int 128 *(int)0.022756 +gmp_int 128 /(int)0.0560401 +gmp_int 128 construct0.196182 +gmp_int 128 construct(unsigned)0.206113 +gmp_int 128 construct(unsigned long long)0.719741 +gmp_int 128 % 0.64148 +gmp_int 128 | 0.0474678 +gmp_int 128 & 0.0538128 +gmp_int 128 ^ 0.0497194 +gmp_int 128 << 0.0273994 +gmp_int 128 >> 0.0288237 +gmp_int 128 %(int)0.0572117 +gmp_int 128 |(int)0.141119 +gmp_int 128 &(int)0.141306 +gmp_int 128 ^(int)0.143934 +gmp_int 128 gcd 2.45095 +gmp_int 128 + 0.71217 +gmp_int 128 - 0.687129 +gmp_int 128 * 0.716479 +gmp_int 128 / 1.04926 +gmp_int 128 + 0.68136 +gmp_int 128 - 0.681187 +gmp_int 128 * 3.1627 +gmp_int 128 / 0.685487 +gmp_int 256 + 0.0449584 +gmp_int 256 - 0.0461316 +gmp_int 256 * 0.134302 +gmp_int 256 / 0.951505 +gmp_int 256 str 0.00344576 +gmp_int 256 +(int)0.0428011 +gmp_int 256 -(int)0.0400434 +gmp_int 256 *(int)0.0282672 +gmp_int 256 /(int)0.0982823 +gmp_int 256 construct0.201199 +gmp_int 256 construct(unsigned)0.211295 +gmp_int 256 construct(unsigned long long)0.729487 +gmp_int 256 % 0.703592 +gmp_int 256 | 0.0618281 +gmp_int 256 & 0.0652169 +gmp_int 256 ^ 0.0630174 +gmp_int 256 << 0.031973 +gmp_int 256 >> 0.0310184 +gmp_int 256 %(int)0.10258 +gmp_int 256 |(int)0.142987 +gmp_int 256 &(int)0.139398 +gmp_int 256 ^(int)0.144825 +gmp_int 256 gcd 5.89505 +gmp_int 256 + 0.728978 +gmp_int 256 - 0.707806 +gmp_int 256 * 0.731454 +gmp_int 256 / 1.17203 +gmp_int 256 + 0.68929 +gmp_int 256 - 0.683532 +gmp_int 256 * 3.15114 +gmp_int 256 / 0.689516 +gmp_int 512 + 0.0522202 +gmp_int 512 - 0.0567637 +gmp_int 512 * 0.532277 +gmp_int 512 / 1.06442 +gmp_int 512 str 0.00618403 +gmp_int 512 +(int)0.0665539 +gmp_int 512 -(int)0.0578194 +gmp_int 512 *(int)0.0361075 +gmp_int 512 /(int)0.183564 +gmp_int 512 construct0.19783 +gmp_int 512 construct(unsigned)0.206944 +gmp_int 512 construct(unsigned long long)0.724649 +gmp_int 512 % 0.819828 +gmp_int 512 | 0.0856626 +gmp_int 512 & 0.092104 +gmp_int 512 ^ 0.0869819 +gmp_int 512 << 0.0471709 +gmp_int 512 >> 0.0337511 +gmp_int 512 %(int)0.188529 +gmp_int 512 |(int)0.155656 +gmp_int 512 &(int)0.142498 +gmp_int 512 ^(int)0.152773 +gmp_int 512 gcd 13.6993 +gmp_int 512 + 0.759532 +gmp_int 512 - 0.732529 +gmp_int 512 * 0.779921 +gmp_int 512 / 1.39149 +gmp_int 512 + 0.694235 +gmp_int 512 - 0.69246 +gmp_int 512 * 3.17094 +gmp_int 512 / 0.688995 +gmp_int 1024 + 0.0699873 +gmp_int 1024 - 0.0731244 +gmp_int 1024 * 1.57852 +gmp_int 1024 / 1.30215 +gmp_int 1024 str 0.0144523 +gmp_int 1024 +(int)0.108272 +gmp_int 1024 -(int)0.100541 +gmp_int 1024 *(int)0.0518882 +gmp_int 1024 /(int)0.352238 +gmp_int 1024 construct0.19744 +gmp_int 1024 construct(unsigned)0.216229 +gmp_int 1024 construct(unsigned long long)0.722262 +gmp_int 1024 % 1.01959 +gmp_int 1024 | 0.136082 +gmp_int 1024 & 0.144412 +gmp_int 1024 ^ 0.139109 +gmp_int 1024 << 0.0721984 +gmp_int 1024 >> 0.0388038 +gmp_int 1024 %(int)0.355222 +gmp_int 1024 |(int)0.163236 +gmp_int 1024 &(int)0.141249 +gmp_int 1024 ^(int)0.161662 +gmp_int 1024 gcd 33.2232 +gmp_int 1024 + 0.83035 +gmp_int 1024 - 0.78115 +gmp_int 1024 * 0.815503 +gmp_int 1024 / 1.84054 +gmp_int 1024 + 0.690013 +gmp_int 1024 - 0.690838 +gmp_int 1024 * 3.20893 +gmp_int 1024 / 0.707578 +cpp_int(unsigned, fixed)64 + 0.00232166 +cpp_int(unsigned, fixed)64 - 0.00234506 +cpp_int(unsigned, fixed)64 * 0.00470304 +cpp_int(unsigned, fixed)64 / 0.0714786 +cpp_int(unsigned, fixed)64 str 0.00256457 +cpp_int(unsigned, fixed)64 +(int)0.00162053 +cpp_int(unsigned, fixed)64 -(int)0.00163617 +cpp_int(unsigned, fixed)64 *(int)0.00236511 +cpp_int(unsigned, fixed)64 /(int)0.0299559 +cpp_int(unsigned, fixed)64 construct0.00111299 +cpp_int(unsigned, fixed)64 construct(unsigned)0.00110489 +cpp_int(unsigned, fixed)64 construct(unsigned long long)0.00240876 +cpp_int(unsigned, fixed)64 % 0.0702826 +cpp_int(unsigned, fixed)64 | 0.00265921 +cpp_int(unsigned, fixed)64 & 0.00261653 +cpp_int(unsigned, fixed)64 ^ 0.0040003 +cpp_int(unsigned, fixed)64 << 0.00161592 +cpp_int(unsigned, fixed)64 >> 0.00161599 +cpp_int(unsigned, fixed)64 %(int)0.0298064 +cpp_int(unsigned, fixed)64 |(int)0.00165538 +cpp_int(unsigned, fixed)64 &(int)0.00161431 +cpp_int(unsigned, fixed)64 ^(int)0.00184507 +cpp_int(unsigned, fixed)64 gcd 0.602722 +cpp_int(unsigned, fixed)64 + 0.00253726 +cpp_int(unsigned, fixed)64 - 0.00301519 +cpp_int(unsigned, fixed)64 * 0.00474872 +cpp_int(unsigned, fixed)64 / 0.0450108 +cpp_int(unsigned, fixed)64 + 0.0020173 +cpp_int(unsigned, fixed)64 - 0.00191079 +cpp_int(unsigned, fixed)64 * 0.00445077 +cpp_int(unsigned, fixed)64 / 0.0294528 +cpp_int(fixed) 64 + 0.00573474 +cpp_int(fixed) 64 - 0.0096272 +cpp_int(fixed) 64 * 0.00897607 +cpp_int(fixed) 64 / 0.0783882 +cpp_int(fixed) 64 str 0.00251659 +cpp_int(fixed) 64 +(int)0.00636247 +cpp_int(fixed) 64 -(int)0.00668367 +cpp_int(fixed) 64 *(int)0.00548722 +cpp_int(fixed) 64 /(int)0.0362985 +cpp_int(fixed) 64 construct0.00161745 +cpp_int(fixed) 64 construct(unsigned)0.00209147 +cpp_int(fixed) 64 construct(unsigned long long)0.00204998 +cpp_int(fixed) 64 % 0.0777437 +cpp_int(fixed) 64 | 0.0108982 +cpp_int(fixed) 64 & 0.0124165 +cpp_int(fixed) 64 ^ 0.0110313 +cpp_int(fixed) 64 << 0.00516511 +cpp_int(fixed) 64 >> 0.00399499 +cpp_int(fixed) 64 %(int)0.0341425 +cpp_int(fixed) 64 |(int)0.0111002 +cpp_int(fixed) 64 &(int)0.0104782 +cpp_int(fixed) 64 ^(int)0.0107199 +cpp_int(fixed) 64 gcd 0.604291 +cpp_int(fixed) 64 + 0.00605482 +cpp_int(fixed) 64 - 0.00714372 +cpp_int(fixed) 64 * 0.00873093 +cpp_int(fixed) 64 / 0.0510195 +cpp_int(fixed) 64 + 0.00430062 +cpp_int(fixed) 64 - 0.00387577 +cpp_int(fixed) 64 * 0.00567824 +cpp_int(fixed) 64 / 0.0320162 +cpp_int(fixed) 128 + 0.0358493 +cpp_int(fixed) 128 - 0.0397574 +cpp_int(fixed) 128 * 0.0672363 +cpp_int(fixed) 128 / 0.222933 +cpp_int(fixed) 128 str 0.0015613 +cpp_int(fixed) 128 +(int)0.0268311 +cpp_int(fixed) 128 -(int)0.0241848 +cpp_int(fixed) 128 *(int)0.0328109 +cpp_int(fixed) 128 /(int)0.137619 +cpp_int(fixed) 128 construct0.00164665 +cpp_int(fixed) 128 construct(unsigned)0.0015986 +cpp_int(fixed) 128 construct(unsigned long long)0.00312994 +cpp_int(fixed) 128 % 0.1971 +cpp_int(fixed) 128 | 0.0380136 +cpp_int(fixed) 128 & 0.0341411 +cpp_int(fixed) 128 ^ 0.0351059 +cpp_int(fixed) 128 << 0.0320915 +cpp_int(fixed) 128 >> 0.0293055 +cpp_int(fixed) 128 %(int)0.103684 +cpp_int(fixed) 128 |(int)0.0317854 +cpp_int(fixed) 128 &(int)0.0417383 +cpp_int(fixed) 128 ^(int)0.0312355 +cpp_int(fixed) 128 gcd 4.18006 +cpp_int(fixed) 128 + 0.0341301 +cpp_int(fixed) 128 - 0.0346952 +cpp_int(fixed) 128 * 0.0675308 +cpp_int(fixed) 128 / 0.466907 +cpp_int(fixed) 128 + 0.0168342 +cpp_int(fixed) 128 - 0.0169449 +cpp_int(fixed) 128 * 0.0673436 +cpp_int(fixed) 128 / 0.0327432 +cpp_int(fixed) 256 + 0.0552275 +cpp_int(fixed) 256 - 0.0560103 +cpp_int(fixed) 256 * 0.166666 +cpp_int(fixed) 256 / 0.349956 +cpp_int(fixed) 256 str 0.00297279 +cpp_int(fixed) 256 +(int)0.0410749 +cpp_int(fixed) 256 -(int)0.0368306 +cpp_int(fixed) 256 *(int)0.049867 +cpp_int(fixed) 256 /(int)0.253796 +cpp_int(fixed) 256 construct0.00363363 +cpp_int(fixed) 256 construct(unsigned)0.00370466 +cpp_int(fixed) 256 construct(unsigned long long)0.00388115 +cpp_int(fixed) 256 % 0.334027 +cpp_int(fixed) 256 | 0.0529581 +cpp_int(fixed) 256 & 0.0501131 +cpp_int(fixed) 256 ^ 0.0530521 +cpp_int(fixed) 256 << 0.0507053 +cpp_int(fixed) 256 >> 0.039006 +cpp_int(fixed) 256 %(int)0.200647 +cpp_int(fixed) 256 |(int)0.0466958 +cpp_int(fixed) 256 &(int)0.0539427 +cpp_int(fixed) 256 ^(int)0.0476923 +cpp_int(fixed) 256 gcd 10.2671 +cpp_int(fixed) 256 + 0.0452762 +cpp_int(fixed) 256 - 0.0444216 +cpp_int(fixed) 256 * 0.112885 +cpp_int(fixed) 256 / 1.36886 +cpp_int(fixed) 256 + 0.0170491 +cpp_int(fixed) 256 - 0.0176783 +cpp_int(fixed) 256 * 0.107306 +cpp_int(fixed) 256 / 0.0340708 +cpp_int(fixed) 512 + 0.0760722 +cpp_int(fixed) 512 - 0.0756027 +cpp_int(fixed) 512 * 0.500399 +cpp_int(fixed) 512 / 0.560837 +cpp_int(fixed) 512 str 0.00708386 +cpp_int(fixed) 512 +(int)0.0524416 +cpp_int(fixed) 512 -(int)0.0503396 +cpp_int(fixed) 512 *(int)0.0658566 +cpp_int(fixed) 512 /(int)0.446782 +cpp_int(fixed) 512 construct0.00576526 +cpp_int(fixed) 512 construct(unsigned)0.0058189 +cpp_int(fixed) 512 construct(unsigned long long)0.00556537 +cpp_int(fixed) 512 % 0.539708 +cpp_int(fixed) 512 | 0.0676884 +cpp_int(fixed) 512 & 0.0588367 +cpp_int(fixed) 512 ^ 0.0695132 +cpp_int(fixed) 512 << 0.0597514 +cpp_int(fixed) 512 >> 0.0515714 +cpp_int(fixed) 512 %(int)0.377704 +cpp_int(fixed) 512 |(int)0.0536974 +cpp_int(fixed) 512 &(int)0.070425 +cpp_int(fixed) 512 ^(int)0.0540962 +cpp_int(fixed) 512 gcd 26.2762 +cpp_int(fixed) 512 + 0.0571069 +cpp_int(fixed) 512 - 0.0563175 +cpp_int(fixed) 512 * 0.177444 +cpp_int(fixed) 512 / 3.1662 +cpp_int(fixed) 512 + 0.0172628 +cpp_int(fixed) 512 - 0.0180756 +cpp_int(fixed) 512 * 0.171821 +cpp_int(fixed) 512 / 0.0444905 +cpp_int(fixed) 1024 + 0.121124 +cpp_int(fixed) 1024 - 0.114246 +cpp_int(fixed) 1024 * 1.54633 +cpp_int(fixed) 1024 / 0.975643 +cpp_int(fixed) 1024 str 0.0172514 +cpp_int(fixed) 1024 +(int)0.0728817 +cpp_int(fixed) 1024 -(int)0.0621059 +cpp_int(fixed) 1024 *(int)0.0948565 +cpp_int(fixed) 1024 /(int)0.84764 +cpp_int(fixed) 1024 construct0.00535599 +cpp_int(fixed) 1024 construct(unsigned)0.00836042 +cpp_int(fixed) 1024 construct(unsigned long long)0.00577713 +cpp_int(fixed) 1024 % 0.94847 +cpp_int(fixed) 1024 | 0.100936 +cpp_int(fixed) 1024 & 0.0774574 +cpp_int(fixed) 1024 ^ 0.09783 +cpp_int(fixed) 1024 << 0.0677088 +cpp_int(fixed) 1024 >> 0.0626121 +cpp_int(fixed) 1024 %(int)0.743202 +cpp_int(fixed) 1024 |(int)0.0819107 +cpp_int(fixed) 1024 &(int)0.112823 +cpp_int(fixed) 1024 ^(int)0.0806317 +cpp_int(fixed) 1024 gcd 76.2849 +cpp_int(fixed) 1024 + 0.0636724 +cpp_int(fixed) 1024 - 0.06467 +cpp_int(fixed) 1024 * 0.303514 +cpp_int(fixed) 1024 / 8.04418 +cpp_int(fixed) 1024 + 0.0181245 +cpp_int(fixed) 1024 - 0.0190581 +cpp_int(fixed) 1024 * 0.299236 +cpp_int(fixed) 1024 / 0.106788 +cpp_int 128 + 0.0273725 +cpp_int 128 - 0.0303219 +cpp_int 128 * 0.0774619 +cpp_int 128 / 0.589941 +cpp_int 128 str 0.00189808 +cpp_int 128 +(int)0.0159069 +cpp_int 128 -(int)0.0151244 +cpp_int 128 *(int)0.0235876 +cpp_int 128 /(int)0.235955 +cpp_int 128 construct0.00293927 +cpp_int 128 construct(unsigned)0.00270684 +cpp_int 128 construct(unsigned long long)0.00719854 +cpp_int 128 % 0.37333 +cpp_int 128 | 0.030991 +cpp_int 128 & 0.031605 +cpp_int 128 ^ 0.0318172 +cpp_int 128 << 0.0256107 +cpp_int 128 >> 0.0237523 +cpp_int 128 %(int)0.104856 +cpp_int 128 |(int)0.0280516 +cpp_int 128 &(int)0.0377678 +cpp_int 128 ^(int)0.0283305 +cpp_int 128 gcd 4.98644 +cpp_int 128 + 0.0283071 +cpp_int 128 - 0.027289 +cpp_int 128 * 0.0584001 +cpp_int 128 / 0.733741 +cpp_int 128 + 0.0196594 +cpp_int 128 - 0.0210968 +cpp_int 128 * 7.6372 +cpp_int 128 / 0.0578293 +cpp_int 256 + 0.0384835 +cpp_int 256 - 0.0402028 +cpp_int 256 * 0.211395 +cpp_int 256 / 0.708882 +cpp_int 256 str 0.00391656 +cpp_int 256 +(int)0.0218386 +cpp_int 256 -(int)0.017199 +cpp_int 256 *(int)0.0318939 +cpp_int 256 /(int)0.35212 +cpp_int 256 construct0.00277479 +cpp_int 256 construct(unsigned)0.0030529 +cpp_int 256 construct(unsigned long long)0.00725455 +cpp_int 256 % 0.673748 +cpp_int 256 | 0.0429658 +cpp_int 256 & 0.0455929 +cpp_int 256 ^ 0.0425243 +cpp_int 256 << 0.0401135 +cpp_int 256 >> 0.0302534 +cpp_int 256 %(int)0.203012 +cpp_int 256 |(int)0.0363929 +cpp_int 256 &(int)0.0471524 +cpp_int 256 ^(int)0.0353555 +cpp_int 256 gcd 11.1816 +cpp_int 256 + 0.030223 +cpp_int 256 - 0.0319489 +cpp_int 256 * 0.0885733 +cpp_int 256 / 1.62706 +cpp_int 256 + 0.0215291 +cpp_int 256 - 0.0213343 +cpp_int 256 * 7.7121 +cpp_int 256 / 0.0615507 +cpp_int 512 + 0.0561351 +cpp_int 512 - 0.0543342 +cpp_int 512 * 0.703234 +cpp_int 512 / 0.924042 +cpp_int 512 str 0.00832019 +cpp_int 512 +(int)0.0316584 +cpp_int 512 -(int)0.0248084 +cpp_int 512 *(int)0.0427792 +cpp_int 512 /(int)0.568032 +cpp_int 512 construct0.0028102 +cpp_int 512 construct(unsigned)0.00288857 +cpp_int 512 construct(unsigned long long)0.00723891 +cpp_int 512 % 0.701584 +cpp_int 512 | 0.0537846 +cpp_int 512 & 0.0546439 +cpp_int 512 ^ 0.0542436 +cpp_int 512 << 0.0436188 +cpp_int 512 >> 0.0355247 +cpp_int 512 %(int)0.391566 +cpp_int 512 |(int)0.0418143 +cpp_int 512 &(int)0.0647085 +cpp_int 512 ^(int)0.041758 +cpp_int 512 gcd 27.2257 +cpp_int 512 + 0.0382495 +cpp_int 512 - 0.0386744 +cpp_int 512 * 0.14417 +cpp_int 512 / 3.61202 +cpp_int 512 + 0.0228565 +cpp_int 512 - 0.0222868 +cpp_int 512 * 7.72815 +cpp_int 512 / 0.0732298 +cpp_int 1024 + 0.0928746 +cpp_int 1024 - 0.0853837 +cpp_int 1024 * 2.6591 +cpp_int 1024 / 1.38142 +cpp_int 1024 str 0.0221599 +cpp_int 1024 +(int)0.0430289 +cpp_int 1024 -(int)0.0331224 +cpp_int 1024 *(int)0.0668616 +cpp_int 1024 /(int)0.989885 +cpp_int 1024 construct0.00277298 +cpp_int 1024 construct(unsigned)0.00265201 +cpp_int 1024 construct(unsigned long long)0.00732796 +cpp_int 1024 % 1.14369 +cpp_int 1024 | 0.0827684 +cpp_int 1024 & 0.0843863 +cpp_int 1024 ^ 0.08333 +cpp_int 1024 << 0.0628544 +cpp_int 1024 >> 0.044717 +cpp_int 1024 %(int)0.768511 +cpp_int 1024 |(int)0.0527075 +cpp_int 1024 &(int)0.10089 +cpp_int 1024 ^(int)0.0538323 +cpp_int 1024 gcd 73.3735 +cpp_int 1024 + 0.0463315 +cpp_int 1024 - 0.0468398 +cpp_int 1024 * 0.255279 +cpp_int 1024 / 8.42528 +cpp_int 1024 + 0.0227402 +cpp_int 1024 - 0.0234526 +cpp_int 1024 * 7.86395 +cpp_int 1024 / 0.123568 +cpp_rational 128 + 18.0021 +cpp_rational 128 - 18.0006 +cpp_rational 128 * 31.5924 +cpp_rational 128 / 65.714 +cpp_rational 128 str 0.020339 +cpp_rational 128 +(int)2.47739 +cpp_rational 128 -(int)2.47959 +cpp_rational 128 *(int)2.4377 +cpp_rational 128 /(int)2.50843 +cpp_rational 128 construct0.0102665 +cpp_rational 128 construct(unsigned)0.0624887 +cpp_rational 128 construct(unsigned long long)0.0658436 +cpp_rational 128 + 2.58812 +cpp_rational 128 - 2.60864 +cpp_rational 128 * 5.53837 +cpp_rational 128 / 5.63033 +cpp_rational 128 + 2.68363 +cpp_rational 128 - 2.72926 +cpp_rational 128 * 57.9393 +cpp_rational 128 / 58.0332 +cpp_rational 256 + 46.3981 +cpp_rational 256 - 46.4818 +cpp_rational 256 * 86.0189 +cpp_rational 256 / 172.8 +cpp_rational 256 str 0.0517328 +cpp_rational 256 +(int)2.92179 +cpp_rational 256 -(int)2.90579 +cpp_rational 256 *(int)2.91325 +cpp_rational 256 /(int)3.00689 +cpp_rational 256 construct0.0101737 +cpp_rational 256 construct(unsigned)0.0609531 +cpp_rational 256 construct(unsigned long long)0.0665504 +cpp_rational 256 + 3.0953 +cpp_rational 256 - 3.08277 +cpp_rational 256 * 6.78796 +cpp_rational 256 / 6.90941 +cpp_rational 256 + 3.15142 +cpp_rational 256 - 3.19882 +cpp_rational 256 * 59.3172 +cpp_rational 256 / 59.5431 +cpp_rational 512 + 108.57 +cpp_rational 512 - 108.81 +cpp_rational 512 * 202.007 +cpp_rational 512 / 348.46 +cpp_rational 512 str 0.119248 +cpp_rational 512 +(int)3.80252 +cpp_rational 512 -(int)3.80714 +cpp_rational 512 *(int)3.94768 +cpp_rational 512 /(int)4.00588 +cpp_rational 512 construct0.0101965 +cpp_rational 512 construct(unsigned)0.0613968 +cpp_rational 512 construct(unsigned long long)0.0659082 +cpp_rational 512 + 4.00751 +cpp_rational 512 - 4.0117 +cpp_rational 512 * 9.43852 +cpp_rational 512 / 9.39508 +cpp_rational 512 + 4.05684 +cpp_rational 512 - 4.08474 +cpp_rational 512 * 61.8998 +cpp_rational 512 / 61.9712 +cpp_rational 1024 + 252.723 +cpp_rational 1024 - 253.81 +cpp_rational 1024 * 484.128 +cpp_rational 1024 / 834.057 +cpp_rational 1024 str 0.286067 +cpp_rational 1024 +(int)5.51612 +cpp_rational 1024 -(int)5.51949 +cpp_rational 1024 *(int)5.87507 +cpp_rational 1024 /(int)5.92837 +cpp_rational 1024 construct0.0102909 +cpp_rational 1024 construct(unsigned)0.062674 +cpp_rational 1024 construct(unsigned long long)0.0659089 +cpp_rational 1024 + 5.7444 +cpp_rational 1024 - 5.73296 +cpp_rational 1024 * 15.1475 +cpp_rational 1024 / 14.9497 +cpp_rational 1024 + 5.80438 +cpp_rational 1024 - 5.86 +cpp_rational 1024 * 67.4139 +cpp_rational 1024 / 67.4254 +mpq_rational 128 + 3.16879 +mpq_rational 128 - 3.18835 +mpq_rational 128 * 5.96709 +mpq_rational 128 / 15.0571 +mpq_rational 128 str 0.0037011 +mpq_rational 128 +(int)0.669634 +mpq_rational 128 -(int)0.666993 +mpq_rational 128 *(int)1.18047 +mpq_rational 128 /(int)1.43177 +mpq_rational 128 construct0.383107 +mpq_rational 128 construct(unsigned)0.394551 +mpq_rational 128 construct(unsigned long long)2.13183 +mpq_rational 128 + 2.33701 +mpq_rational 128 - 2.33227 +mpq_rational 128 * 4.15268 +mpq_rational 128 / 4.26818 +mpq_rational 128 + 2.33097 +mpq_rational 128 - 2.31793 +mpq_rational 128 * 9.34086 +mpq_rational 128 / 9.74135 +mpq_rational 256 + 6.93507 +mpq_rational 256 - 6.90939 +mpq_rational 256 * 12.9674 +mpq_rational 256 / 27.1144 +mpq_rational 256 str 0.00573278 +mpq_rational 256 +(int)0.707818 +mpq_rational 256 -(int)0.719174 +mpq_rational 256 *(int)1.22229 +mpq_rational 256 /(int)1.46082 +mpq_rational 256 construct0.381537 +mpq_rational 256 construct(unsigned)0.390987 +mpq_rational 256 construct(unsigned long long)2.12727 +mpq_rational 256 + 2.4159 +mpq_rational 256 - 2.41594 +mpq_rational 256 * 4.3447 +mpq_rational 256 / 4.43342 +mpq_rational 256 + 2.40187 +mpq_rational 256 - 2.39792 +mpq_rational 256 * 9.51195 +mpq_rational 256 / 9.65697 +mpq_rational 512 + 16.0886 +mpq_rational 512 - 16.1169 +mpq_rational 512 * 29.597 +mpq_rational 512 / 54.8579 +mpq_rational 512 str 0.012222 +mpq_rational 512 +(int)0.812783 +mpq_rational 512 -(int)0.810939 +mpq_rational 512 *(int)1.37678 +mpq_rational 512 /(int)1.6328 +mpq_rational 512 construct0.381355 +mpq_rational 512 construct(unsigned)0.392309 +mpq_rational 512 construct(unsigned long long)2.1179 +mpq_rational 512 + 2.55999 +mpq_rational 512 - 2.52842 +mpq_rational 512 * 4.82251 +mpq_rational 512 / 4.88079 +mpq_rational 512 + 2.5091 +mpq_rational 512 - 2.50572 +mpq_rational 512 * 9.90285 +mpq_rational 512 / 10.0077 +mpq_rational 1024 + 38.8883 +mpq_rational 1024 - 38.9096 +mpq_rational 1024 * 71.0635 +mpq_rational 1024 / 123.985 +mpq_rational 1024 str 0.0291802 +mpq_rational 1024 +(int)0.906471 +mpq_rational 1024 -(int)0.908293 +mpq_rational 1024 *(int)1.52386 +mpq_rational 1024 /(int)1.78575 +mpq_rational 1024 construct0.383461 +mpq_rational 1024 construct(unsigned)0.393504 +mpq_rational 1024 construct(unsigned long long)2.12279 +mpq_rational 1024 + 2.67794 +mpq_rational 1024 - 2.65991 +mpq_rational 1024 * 5.4209 +mpq_rational 1024 / 5.47417 +mpq_rational 1024 + 2.66144 +mpq_rational 1024 - 2.64168 +mpq_rational 1024 * 10.4664 +mpq_rational 1024 / 10.6781 +tommath_int 128 + 0.0222815 +tommath_int 128 - 0.027712 +tommath_int 128 * 0.113094 +tommath_int 128 / 3.09636 +tommath_int 128 str 0.0175165 +tommath_int 128 +(int)0.205506 +tommath_int 128 -(int)0.203148 +tommath_int 128 *(int)0.245897 +tommath_int 128 /(int)2.08045 +tommath_int 128 construct0.207455 +tommath_int 128 construct(unsigned)0.477971 +tommath_int 128 construct(unsigned long long)0.709516 +tommath_int 128 % 3.15171 +tommath_int 128 | 0.153434 +tommath_int 128 & 0.153508 +tommath_int 128 ^ 0.153931 +tommath_int 128 << 0.0408165 +tommath_int 128 >> 0.324163 +tommath_int 128 %(int)2.11648 +tommath_int 128 |(int)0.376671 +tommath_int 128 &(int)0.389144 +tommath_int 128 ^(int)0.374303 +tommath_int 128 gcd 12.5322 +tommath_int 128 + 0.514965 +tommath_int 128 - 0.517555 +tommath_int 128 * 0.607102 +tommath_int 128 / 2.36098 +tommath_int 128 + 0.510608 +tommath_int 128 - 0.520979 +tommath_int 128 * 18.5642 +tommath_int 128 / 1.13357 +tommath_int 256 + 0.0322049 +tommath_int 256 - 0.0407704 +tommath_int 256 * 0.346903 +tommath_int 256 / 4.01311 +tommath_int 256 str 0.0409078 +tommath_int 256 +(int)0.211847 +tommath_int 256 -(int)0.206481 +tommath_int 256 *(int)0.26894 +tommath_int 256 /(int)2.7099 +tommath_int 256 construct0.208012 +tommath_int 256 construct(unsigned)0.470752 +tommath_int 256 construct(unsigned long long)0.709045 +tommath_int 256 % 4.08522 +tommath_int 256 | 0.170093 +tommath_int 256 & 0.176384 +tommath_int 256 ^ 0.172198 +tommath_int 256 << 0.0698155 +tommath_int 256 >> 0.383757 +tommath_int 256 %(int)2.74052 +tommath_int 256 |(int)0.375206 +tommath_int 256 &(int)0.389768 +tommath_int 256 ^(int)0.379255 +tommath_int 256 gcd 26.1755 +tommath_int 256 + 0.530504 +tommath_int 256 - 0.527832 +tommath_int 256 * 0.648438 +tommath_int 256 / 3.16803 +tommath_int 256 + 0.526199 +tommath_int 256 - 0.527479 +tommath_int 256 * 18.624 +tommath_int 256 / 1.1208 +tommath_int 512 + 0.0455267 +tommath_int 512 - 0.0515883 +tommath_int 512 * 0.999026 +tommath_int 512 / 5.95775 +tommath_int 512 str 0.111392 +tommath_int 512 +(int)0.227429 +tommath_int 512 -(int)0.219998 +tommath_int 512 *(int)0.31746 +tommath_int 512 /(int)4.1339 +tommath_int 512 construct0.205622 +tommath_int 512 construct(unsigned)0.473807 +tommath_int 512 construct(unsigned long long)0.703879 +tommath_int 512 % 5.70483 +tommath_int 512 | 0.179084 +tommath_int 512 & 0.182373 +tommath_int 512 ^ 0.183434 +tommath_int 512 << 0.0973643 +tommath_int 512 >> 0.398354 +tommath_int 512 %(int)3.96918 +tommath_int 512 |(int)0.381428 +tommath_int 512 &(int)0.40432 +tommath_int 512 ^(int)0.390434 +tommath_int 512 gcd 56.7747 +tommath_int 512 + 0.546222 +tommath_int 512 - 0.53408 +tommath_int 512 * 0.718764 +tommath_int 512 / 5.07545 +tommath_int 512 + 0.543084 +tommath_int 512 - 0.535411 +tommath_int 512 * 18.745 +tommath_int 512 / 1.15084 +tommath_int 1024 + 0.074223 +tommath_int 1024 - 0.0786205 +tommath_int 1024 * 3.20269 +tommath_int 1024 / 12.7383 +tommath_int 1024 str 0.345861 +tommath_int 1024 +(int)0.250477 +tommath_int 1024 -(int)0.2372 +tommath_int 1024 *(int)0.408933 +tommath_int 1024 /(int)9.04346 +tommath_int 1024 construct0.207377 +tommath_int 1024 construct(unsigned)0.475755 +tommath_int 1024 construct(unsigned long long)0.712949 +tommath_int 1024 % 12.6845 +tommath_int 1024 | 0.436588 +tommath_int 1024 & 0.429721 +tommath_int 1024 ^ 0.429478 +tommath_int 1024 << 0.167289 +tommath_int 1024 >> 0.570323 +tommath_int 1024 %(int)9.09202 +tommath_int 1024 |(int)0.622404 +tommath_int 1024 &(int)0.653128 +tommath_int 1024 ^(int)0.62285 +tommath_int 1024 gcd 132.299 +tommath_int 1024 + 0.578521 +tommath_int 1024 - 0.552649 +tommath_int 1024 * 0.871648 +tommath_int 1024 / 12.2672 +tommath_int 1024 + 0.568301 +tommath_int 1024 - 0.54931 +tommath_int 1024 * 19.0954 +tommath_int 1024 / 1.21165 +cpp_dec_float 50 + 0.0250949 +cpp_dec_float 50 - 0.0264782 +cpp_dec_float 50 * 0.163403 +cpp_dec_float 50 / 3.9502 +cpp_dec_float 50 str 0.0207318 +cpp_dec_float 50 +(int)0.0441266 +cpp_dec_float 50 -(int)0.0442578 +cpp_dec_float 50 *(int)0.234992 +cpp_dec_float 50 /(int)1.81469 +cpp_dec_float 50 construct0.00925753 +cpp_dec_float 50 construct(unsigned)0.0588752 +cpp_dec_float 50 construct(unsigned long long)0.0587691 +cpp_dec_float 50 + 0.0770875 +cpp_dec_float 50 - 0.0741921 +cpp_dec_float 50 * 0.329282 +cpp_dec_float 50 / 1.9701 +cpp_dec_float 50 + 0.0640148 +cpp_dec_float 50 - 0.0643402 +cpp_dec_float 50 * 0.321363 +cpp_dec_float 50 / 1.97464 +cpp_dec_float 100 + 0.0291508 +cpp_dec_float 100 - 0.0307447 +cpp_dec_float 100 * 0.284182 +cpp_dec_float 100 / 7.68823 +cpp_dec_float 100 str 0.0328218 +cpp_dec_float 100 +(int)0.0558389 +cpp_dec_float 100 -(int)0.0563278 +cpp_dec_float 100 *(int)0.460635 +cpp_dec_float 100 /(int)3.62471 +cpp_dec_float 100 construct0.0263234 +cpp_dec_float 100 construct(unsigned)0.0747853 +cpp_dec_float 100 construct(unsigned long long)0.076338 +cpp_dec_float 100 + 0.0845054 +cpp_dec_float 100 - 0.0844193 +cpp_dec_float 100 * 0.582119 +cpp_dec_float 100 / 3.8773 +cpp_dec_float 100 + 0.0708668 +cpp_dec_float 100 - 0.0730765 +cpp_dec_float 100 * 0.574512 +cpp_dec_float 100 / 3.83437 +cpp_dec_float 500 + 0.0630915 +cpp_dec_float 500 - 0.0651113 +cpp_dec_float 500 * 2.22501 +cpp_dec_float 500 / 50.6121 +cpp_dec_float 500 str 0.131293 +cpp_dec_float 500 +(int)0.0935946 +cpp_dec_float 500 -(int)0.0950432 +cpp_dec_float 500 *(int)4.36195 +cpp_dec_float 500 /(int)24.4855 +cpp_dec_float 500 construct0.0306104 +cpp_dec_float 500 construct(unsigned)0.114772 +cpp_dec_float 500 construct(unsigned long long)0.117075 +cpp_dec_float 500 + 0.12407 +cpp_dec_float 500 - 0.122646 +cpp_dec_float 500 * 4.75508 +cpp_dec_float 500 / 25.1602 +cpp_dec_float 500 + 0.0865073 +cpp_dec_float 500 - 0.0929075 +cpp_dec_float 500 * 4.74128 +cpp_dec_float 500 / 25.1175 +mpfr_float 50 + 0.0624318 +mpfr_float 50 - 0.0764497 +mpfr_float 50 * 0.342248 +mpfr_float 50 / 1.69721 +mpfr_float 50 str 0.0289013 +mpfr_float 50 +(int)0.121683 +mpfr_float 50 -(int)0.149605 +mpfr_float 50 *(int)0.1548 +mpfr_float 50 /(int)0.213367 +mpfr_float 50 construct0.214552 +mpfr_float 50 construct(unsigned)0.293892 +mpfr_float 50 construct(unsigned long long)0.638307 +mpfr_float 50 + 0.553442 +mpfr_float 50 - 0.565687 +mpfr_float 50 * 0.841214 +mpfr_float 50 / 1.26072 +mpfr_float 50 + 0.537349 +mpfr_float 50 - 0.561924 +mpfr_float 50 * 0.833423 +mpfr_float 50 / 1.25318 +mpfr_float 100 + 0.0669494 +mpfr_float 100 - 0.0820912 +mpfr_float 100 * 0.478422 +mpfr_float 100 / 2.33995 +mpfr_float 100 str 0.0390764 +mpfr_float 100 +(int)0.117387 +mpfr_float 100 -(int)0.150557 +mpfr_float 100 *(int)0.166496 +mpfr_float 100 /(int)0.267439 +mpfr_float 100 construct0.222594 +mpfr_float 100 construct(unsigned)0.297568 +mpfr_float 100 construct(unsigned long long)0.643108 +mpfr_float 100 + 0.573918 +mpfr_float 100 - 0.592139 +mpfr_float 100 * 0.978674 +mpfr_float 100 / 1.5879 +mpfr_float 100 + 0.561143 +mpfr_float 100 - 0.580528 +mpfr_float 100 * 0.97887 +mpfr_float 100 / 1.58378 +mpfr_float 500 + 0.0817812 +mpfr_float 500 - 0.0975533 +mpfr_float 500 * 3.8308 +mpfr_float 500 / 13.8283 +mpfr_float 500 str 0.156188 +mpfr_float 500 +(int)0.129266 +mpfr_float 500 -(int)0.16446 +mpfr_float 500 *(int)0.273431 +mpfr_float 500 /(int)0.731526 +mpfr_float 500 construct0.222587 +mpfr_float 500 construct(unsigned)0.311108 +mpfr_float 500 construct(unsigned long long)0.653074 +mpfr_float 500 + 0.667956 +mpfr_float 500 - 0.684152 +mpfr_float 500 * 1.2661 +mpfr_float 500 / 7.46167 +mpfr_float 500 + 0.642822 +mpfr_float 500 - 0.65164 +mpfr_float 500 * 1.25714 +mpfr_float 500 / 7.46171 +[section:float_performance Float Type Perfomance] +[table Operator * +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][[*1] (0.321363s)][1.0169 (0.574512s)][6.76401 (4.74128s)]] +[[gmp_float][1.7169 (0.551747s)][[*1] (0.564962s)][[*1] (0.700957s)]] +[[mpfr_float][2.5934 (0.833423s)][1.73263 (0.97887s)][1.79346 (1.25714s)]] +] +[table Operator *(int) +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][5.56675 (0.234992s)][9.32996 (0.460635s)][50.8459 (4.36195s)]] +[[gmp_float][[*1] (0.0422135s)][[*1] (0.0493716s)][[*1] (0.0857876s)]] +[[mpfr_float][3.66707 (0.1548s)][3.37231 (0.166496s)][3.1873 (0.273431s)]] +] +[table Operator + +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][[*1] (0.0640148s)][[*1] (0.0708668s)][[*1] (0.0865073s)]] +[[gmp_float][7.467 (0.477999s)][6.72671 (0.476701s)][5.67136 (0.490614s)]] +[[mpfr_float][8.39413 (0.537349s)][7.91828 (0.561143s)][7.43085 (0.642822s)]] +] +[table Operator +(int) +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][1.33358 (0.0441266s)][1.4433 (0.0558389s)][1.44838 (0.0935946s)]] +[[gmp_float][[*1] (0.0330888s)][[*1] (0.0386882s)][[*1] (0.0646201s)]] +[[mpfr_float][3.67747 (0.121683s)][3.03419 (0.117387s)][2.00041 (0.129266s)]] +] +[table Operator - +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][[*1] (0.0643402s)][[*1] (0.0730765s)][[*1] (0.0929075s)]] +[[gmp_float][7.76625 (0.499682s)][6.89067 (0.503546s)][5.89566 (0.547751s)]] +[[mpfr_float][8.73364 (0.561924s)][7.94411 (0.580528s)][7.01385 (0.65164s)]] +] +[table Operator -(int) +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][[*1] (0.0442578s)][[*1] (0.0563278s)][[*1] (0.0950432s)]] +[[gmp_float][3.0379 (0.134451s)][2.39847 (0.1351s)][1.86101 (0.176876s)]] +[[mpfr_float][3.38031 (0.149605s)][2.67288 (0.150557s)][1.73037 (0.16446s)]] +] +[table Operator / +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][2.20938 (1.97464s)][3.71086 (3.83437s)][11.2059 (25.1175s)]] +[[gmp_float][[*1] (0.893752s)][[*1] (1.03328s)][[*1] (2.24146s)]] +[[mpfr_float][1.40216 (1.25318s)][1.53276 (1.58378s)][3.32895 (7.46171s)]] +] +[table Operator /(int) +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][10.0596 (1.81469s)][15.5048 (3.62471s)][34.4767 (24.4855s)]] +[[gmp_float][[*1] (0.180393s)][[*1] (0.23378s)][[*1] (0.710204s)]] +[[mpfr_float][1.18279 (0.213367s)][1.14398 (0.267439s)][1.03002 (0.731526s)]] +] +[table Operator construct +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][[*1] (0.00925753s)][[*1] (0.0263234s)][[*1] (0.0306104s)]] +[[gmp_float][21.32 (0.19737s)][7.4686 (0.196599s)][6.73181 (0.206063s)]] +[[mpfr_float][23.176 (0.214552s)][8.45613 (0.222594s)][7.27162 (0.222587s)]] +] +[table Operator construct(unsigned long long) +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][[*1] (0.0587691s)][[*1] (0.076338s)][[*1] (0.117075s)]] +[[gmp_float][8.84863 (0.520025s)][6.80343 (0.51936s)][4.59554 (0.538021s)]] +[[mpfr_float][10.8613 (0.638307s)][8.42448 (0.643108s)][5.57826 (0.653074s)]] +] +[table Operator construct(unsigned) +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][[*1] (0.0588752s)][[*1] (0.0747853s)][[*1] (0.114772s)]] +[[gmp_float][3.53421 (0.208078s)][2.76875 (0.207062s)][1.89088 (0.217019s)]] +[[mpfr_float][4.99178 (0.293892s)][3.97896 (0.297568s)][2.71067 (0.311108s)]] +] +[table Operator str +[[Backend][50 Bits][100 Bits][500 Bits]] +[[cpp_dec_float][1.5616 (0.0207318s)][1.61725 (0.0328218s)][[*1] (0.131293s)]] +[[gmp_float][[*1] (0.013276s)][[*1] (0.0202949s)][1.07517 (0.141162s)]] +[[mpfr_float][2.17696 (0.0289013s)][1.92543 (0.0390764s)][1.18962 (0.156188s)]] +] +[endsect] +[section:integer_performance Integer Type Perfomance] +[table Operator % +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][5.31184 (0.37333s)][1.99944e+236 (0.673748s)][2.08204e+236 (0.701584s)][3.39405e+236 (1.14369s)]] +[[cpp_int(fixed)][1.10616 (0.0777437s)][5.8492e+235 (0.1971s)][9.91271e+235 (0.334027s)][1.60165e+236 (0.539708s)][-1.#INF (0.94847s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.0702826s)]] +[[gmp_int][9.12715 (0.64148s)][2.088e+236 (0.703592s)][2.43295e+236 (0.819828s)][3.02578e+236 (1.01959s)]] +[[tommath_int][44.8434 (3.15171s)][1.21234e+237 (4.08522s)][1.69298e+237 (5.70483s)][3.7643e+237 (12.6845s)]] +] +[table Operator %(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][3.51789 (0.104856s)][-1.#INF (0.203012s)][-1.#INF (0.391566s)][-1.#INF (0.768511s)]] +[[cpp_int(fixed)][1.14548 (0.0341425s)][-1.#INF (0.103684s)][-1.#INF (0.200647s)][-1.#INF (0.377704s)][-1.#INF (0.743202s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.0298064s)]] +[[gmp_int][1.91945 (0.0572117s)][-1.#INF (0.10258s)][-1.#INF (0.188529s)][-1.#INF (0.355222s)]] +[[tommath_int][71.0078 (2.11648s)][-1.#INF (2.74052s)][-1.#INF (3.96918s)][-1.#INF (9.09202s)]] +] +[table Operator & +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][12.079 (0.031605s)][-1.11772e+007 (0.0455929s)][-1.33961e+007 (0.0546439s)][-2.06875e+007 (0.0843863s)]] +[[cpp_int(fixed)][4.74538 (0.0124165s)][-8.36978e+006 (0.0341411s)][-1.22854e+007 (0.0501131s)][-1.4424e+007 (0.0588367s)][-1.#INF (0.0774574s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00261653s)]] +[[gmp_int][20.5664 (0.0538128s)][-1.59881e+007 (0.0652169s)][-2.25796e+007 (0.092104s)][-3.5403e+007 (0.144412s)]] +[[tommath_int][58.6685 (0.153508s)][-4.3241e+007 (0.176384s)][-4.47093e+007 (0.182373s)][-1.05347e+008 (0.429721s)]] +] +[table Operator &(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][23.3956 (0.0377678s)][-7.85844e+307 (0.0471524s)][-1.07843e+308 (0.0647085s)][-1.68143e+308 (0.10089s)]] +[[cpp_int(fixed)][6.49083 (0.0104782s)][-6.95612e+307 (0.0417383s)][-8.99012e+307 (0.0539427s)][-1.17371e+308 (0.070425s)][-1.#INF (0.112823s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00161431s)]] +[[gmp_int][87.5331 (0.141306s)][-1.#INF (0.139398s)][-1.#INF (0.142498s)][-1.#INF (0.141249s)]] +[[tommath_int][241.059 (0.389144s)][-1.#INF (0.389768s)][-1.#INF (0.40432s)][-1.#INF (0.653128s)]] +] +[table Operator * +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1715.93 (7.6372s)][-4.15607e+276 (7.7121s)][-4.16472e+276 (7.72815s)][-4.23791e+276 (7.86395s)]] +[[cpp_int(fixed)][1.27579 (0.00567824s)][-3.62916e+274 (0.0673436s)][-5.78275e+274 (0.107306s)][-9.2595e+274 (0.171821s)][-1.#INF (0.299236s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00445077s)]] +[[gmp_int][710.595 (3.1627s)][-1.69816e+276 (3.15114s)][-1.70883e+276 (3.17094s)][-1.7293e+276 (3.20893s)]] +[[tommath_int][4171.01 (18.5642s)][-1.00365e+277 (18.624s)][-1.01017e+277 (18.745s)][-1.02906e+277 (19.0954s)]] +] +[table Operator *(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][9.97316 (0.0235876s)][1.#INF (0.0318939s)][1.#INF (0.0427792s)][1.#INF (0.0668616s)]] +[[cpp_int(fixed)][2.32007 (0.00548722s)][1.#INF (0.0328109s)][1.#INF (0.049867s)][1.#INF (0.0658566s)][-1.#INF (0.0948565s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00236511s)]] +[[gmp_int][9.62157 (0.022756s)][1.#INF (0.0282672s)][1.#INF (0.0361075s)][1.#INF (0.0518882s)]] +[[tommath_int][103.969 (0.245897s)][1.#INF (0.26894s)][1.#INF (0.31746s)][1.#INF (0.408933s)]] +] +[table Operator + +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][9.74543 (0.0196594s)][3.98952e+276 (0.0215291s)][4.2355e+276 (0.0228565s)][4.21393e+276 (0.0227402s)]] +[[cpp_int(fixed)][2.13187 (0.00430062s)][3.11951e+276 (0.0168342s)][3.15933e+276 (0.0170491s)][3.19893e+276 (0.0172628s)][-1.#INF (0.0181245s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.0020173s)]] +[[gmp_int][337.759 (0.68136s)][1.27731e+278 (0.68929s)][1.28647e+278 (0.694235s)][1.27865e+278 (0.690013s)]] +[[tommath_int][253.115 (0.510608s)][9.75089e+277 (0.526199s)][1.00638e+278 (0.543084s)][1.05311e+278 (0.568301s)]] +] +[table Operator +(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][9.81588 (0.0159069s)][-5.71737e+244 (0.0218386s)][-8.2882e+244 (0.0316584s)][-1.1265e+245 (0.0430289s)]] +[[cpp_int(fixed)][3.92617 (0.00636247s)][-7.02443e+244 (0.0268311s)][-1.07535e+245 (0.0410749s)][-1.37293e+245 (0.0524416s)][-1.#INF (0.0728817s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00162053s)]] +[[gmp_int][19.2059 (0.0311237s)][-1.12054e+245 (0.0428011s)][-1.74239e+245 (0.0665539s)][-2.83458e+245 (0.108272s)]] +[[tommath_int][126.815 (0.205506s)][-5.54618e+245 (0.211847s)][-5.95413e+245 (0.227429s)][-6.55751e+245 (0.250477s)]] +] +[table Operator - +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][11.0409 (0.0210968s)][3.86227e+276 (0.0213343s)][4.03471e+276 (0.0222868s)][4.24576e+276 (0.0234526s)]] +[[cpp_int(fixed)][2.02836 (0.00387577s)][3.06763e+276 (0.0169449s)][3.2004e+276 (0.0176783s)][3.27232e+276 (0.0180756s)][-1.#INF (0.0190581s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00191079s)]] +[[gmp_int][356.496 (0.681187s)][1.23744e+278 (0.683532s)][1.2536e+278 (0.69246s)][1.25066e+278 (0.690838s)]] +[[tommath_int][272.651 (0.520979s)][9.54925e+277 (0.527479s)][9.69283e+277 (0.535411s)][9.94446e+277 (0.54931s)]] +] +[table Operator -(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][9.24378 (0.0151244s)][-1.01975e-199 (0.017199s)][-1.47092e-199 (0.0248084s)][-1.96387e-199 (0.0331224s)]] +[[cpp_int(fixed)][4.08494 (0.00668367s)][-1.43394e-199 (0.0241848s)][-2.18373e-199 (0.0368306s)][-2.98469e-199 (0.0503396s)][-1.#INF (0.0621059s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00163617s)]] +[[gmp_int][18.693 (0.030585s)][-2.37422e-199 (0.0400434s)][-3.42818e-199 (0.0578194s)][-5.96116e-199 (0.100541s)]] +[[tommath_int][124.161 (0.203148s)][-1.22425e-198 (0.206481s)][-1.30439e-198 (0.219998s)][-1.40639e-198 (0.2372s)]] +] +[table Operator / +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.96346 (0.0578293s)][-1.51814e+061 (0.0615507s)][-1.8062e+061 (0.0732298s)][-3.04778e+061 (0.123568s)]] +[[cpp_int(fixed)][1.08704 (0.0320162s)][-8.07606e+060 (0.0327432s)][-8.40351e+060 (0.0340708s)][-1.09735e+061 (0.0444905s)][-1.#INF (0.106788s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.0294528s)]] +[[gmp_int][23.2741 (0.685487s)][-1.70068e+062 (0.689516s)][-1.6994e+062 (0.688995s)][-1.74523e+062 (0.707578s)]] +[[tommath_int][38.4876 (1.13357s)][-2.76443e+062 (1.1208s)][-2.83854e+062 (1.15084s)][-2.98853e+062 (1.21165s)]] +] +[table Operator /(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][7.87676 (0.235955s)][1.#INF (0.35212s)][1.#INF (0.568032s)][1.#INF (0.989885s)]] +[[cpp_int(fixed)][1.21173 (0.0362985s)][1.#INF (0.137619s)][1.#INF (0.253796s)][1.#INF (0.446782s)][-1.#INF (0.84764s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.0299559s)]] +[[gmp_int][1.87075 (0.0560401s)][1.#INF (0.0982823s)][1.#INF (0.183564s)][1.#INF (0.352238s)]] +[[tommath_int][69.4504 (2.08045s)][1.#INF (2.7099s)][1.#INF (4.1339s)][1.#INF (9.04346s)]] +] +[table Operator << +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][15.849 (0.0256107s)][-5.85461e+126 (0.0401135s)][-6.36621e+126 (0.0436188s)][-9.17366e+126 (0.0628544s)]] +[[cpp_int(fixed)][3.19639 (0.00516511s)][-4.68379e+126 (0.0320915s)][-7.40049e+126 (0.0507053s)][-8.72078e+126 (0.0597514s)][-1.#INF (0.0677088s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00161592s)]] +[[gmp_int][16.956 (0.0273994s)][-4.66649e+126 (0.031973s)][-6.88464e+126 (0.0471709s)][-1.05374e+127 (0.0721984s)]] +[[tommath_int][25.259 (0.0408165s)][-1.01897e+127 (0.0698155s)][-1.42104e+127 (0.0973643s)][-2.4416e+127 (0.167289s)]] +] +[table Operator >> +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][14.6983 (0.0237523s)][-2.28921e+307 (0.0302534s)][-2.68808e+307 (0.0355247s)][-3.38364e+307 (0.044717s)]] +[[cpp_int(fixed)][2.47217 (0.00399499s)][-2.21749e+307 (0.0293055s)][-2.9515e+307 (0.039006s)][-3.9023e+307 (0.0515714s)][-1.#INF (0.0626121s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00161599s)]] +[[gmp_int][17.8366 (0.0288237s)][-2.3471e+307 (0.0310184s)][-2.55387e+307 (0.0337511s)][-2.9362e+307 (0.0388038s)]] +[[tommath_int][200.597 (0.324163s)][-1.#INF (0.383757s)][-1.#INF (0.398354s)][-1.#INF (0.570323s)]] +] +[table Operator ^ +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][7.95372 (0.0318172s)][1.21131 (0.0425243s)][1.02246 (0.0542436s)][1.19877 (0.08333s)]] +[[cpp_int(fixed)][2.75762 (0.0110313s)][[*1] (0.0351059s)][[*1] (0.0530521s)][[*1] (0.0695132s)][-1.#INF (0.09783s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.0040003s)]] +[[gmp_int][12.4289 (0.0497194s)][1.79507 (0.0630174s)][1.63955 (0.0869819s)][2.0012 (0.139109s)]] +[[tommath_int][38.4798 (0.153931s)][4.9051 (0.172198s)][3.45761 (0.183434s)][6.17837 (0.429478s)]] +] +[table Operator ^(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][15.3547 (0.0283305s)][-8.92021e+307 (0.0353555s)][-1.05356e+308 (0.041758s)][-1.35819e+308 (0.0538323s)]] +[[cpp_int(fixed)][5.81005 (0.0107199s)][-7.88073e+307 (0.0312355s)][-1.20328e+308 (0.0476923s)][-1.36485e+308 (0.0540962s)][-1.#INF (0.0806317s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00184507s)]] +[[gmp_int][78.0102 (0.143934s)][-1.#INF (0.144825s)][-1.#INF (0.152773s)][-1.#INF (0.161662s)]] +[[tommath_int][202.867 (0.374303s)][-1.#INF (0.379255s)][-1.#INF (0.390434s)][-1.#INF (0.62285s)]] +] +[table Operator construct +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][2.64088 (0.00293927s)][1.47161e+238 (0.00277479s)][1.49039e+238 (0.0028102s)][1.47064e+238 (0.00277298s)]] +[[cpp_int(fixed)][1.45325 (0.00161745s)][8.73297e+237 (0.00164665s)][1.92709e+238 (0.00363363s)][3.0576e+238 (0.00576526s)][-1.#INF (0.00535599s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00111299s)]] +[[gmp_int][176.266 (0.196182s)][1.06706e+240 (0.201199s)][1.04919e+240 (0.19783s)][1.04712e+240 (0.19744s)]] +[[tommath_int][186.394 (0.207455s)][1.10319e+240 (0.208012s)][1.09052e+240 (0.205622s)][1.09982e+240 (0.207377s)]] +] +[table Operator construct(unsigned long long) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][3.51152 (0.00719854s)][-2.80497e-148 (0.00725455s)][-2.79893e-148 (0.00723891s)][-2.83336e-148 (0.00732796s)]] +[[cpp_int(fixed)][[*1] (0.00204998s)][-1.21019e-148 (0.00312994s)][-1.50065e-148 (0.00388115s)][-2.15185e-148 (0.00556537s)][-1.#INF (0.00577713s)]] +[[cpp_int(unsigned, fixed)][1.17501 (0.00240876s)]] +[[gmp_int][351.097 (0.719741s)][-2.82056e-146 (0.729487s)][-2.80186e-146 (0.724649s)][-2.79263e-146 (0.722262s)]] +[[tommath_int][346.109 (0.709516s)][-2.74152e-146 (0.709045s)][-2.72155e-146 (0.703879s)][-2.75662e-146 (0.712949s)]] +] +[table Operator construct(unsigned) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][2.44987 (0.00270684s)][1.90974 (0.0030529s)][[*1] (0.00288857s)][[*1] (0.00265201s)]] +[[cpp_int(fixed)][1.89292 (0.00209147s)][[*1] (0.0015986s)][1.28253 (0.00370466s)][2.19414 (0.0058189s)][-1.#INF (0.00836042s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00110489s)]] +[[gmp_int][186.546 (0.206113s)][132.175 (0.211295s)][71.6424 (0.206944s)][81.5339 (0.216229s)]] +[[tommath_int][432.596 (0.477971s)][294.478 (0.470752s)][164.029 (0.473807s)][179.394 (0.475755s)]] +] +[table Operator gcd +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][8.27321 (4.98644s)][-1.#INF (11.1816s)][-1.#INF (27.2257s)][-1.#INF (73.3735s)]] +[[cpp_int(fixed)][1.0026 (0.604291s)][-1.#INF (4.18006s)][-1.#INF (10.2671s)][-1.#INF (26.2762s)][-1.#INF (76.2849s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.602722s)]] +[[gmp_int][4.06647 (2.45095s)][-1.#INF (5.89505s)][-1.#INF (13.6993s)][-1.#INF (33.2232s)]] +[[tommath_int][20.7927 (12.5322s)][-1.#INF (26.1755s)][-1.#INF (56.7747s)][-1.#INF (132.299s)]] +] +[table Operator str +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][1.02246 (0.00189808s)][-3.42215e+178 (0.00391656s)][-7.26989e+178 (0.00832019s)][-1.93625e+179 (0.0221599s)]] +[[cpp_int(fixed)][1.35564 (0.00251659s)][-1.36421e+178 (0.0015613s)][-2.59752e+178 (0.00297279s)][-6.18963e+178 (0.00708386s)][-1.#INF (0.0172514s)]] +[[cpp_int(unsigned, fixed)][1.38149 (0.00256457s)]] +[[gmp_int][[*1] (0.00185638s)][-3.01078e+178 (0.00344576s)][-5.40339e+178 (0.00618403s)][-1.26279e+179 (0.0144523s)]] +[[tommath_int][9.43586 (0.0175165s)][-3.57438e+179 (0.0409078s)][-9.73304e+179 (0.111392s)][-3.02201e+180 (0.345861s)]] +] +[table Operator | +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][11.6542 (0.030991s)][-6.48076e+046 (0.0429658s)][-8.11261e+046 (0.0537846s)][-1.24844e+047 (0.0827684s)]] +[[cpp_int(fixed)][4.09831 (0.0108982s)][-5.73378e+046 (0.0380136s)][-7.98794e+046 (0.0529581s)][-1.02098e+047 (0.0676884s)][-1.#INF (0.100936s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00265921s)]] +[[gmp_int][17.8503 (0.0474678s)][-9.32586e+046 (0.0618281s)][-1.29209e+047 (0.0856626s)][-2.0526e+047 (0.136082s)]] +[[tommath_int][57.6991 (0.153434s)][-2.5656e+047 (0.170093s)][-2.70121e+047 (0.179084s)][-6.58529e+047 (0.436588s)]] +] +[table Operator |(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_int][16.9457 (0.0280516s)][-4.17523e+307 (0.0363929s)][-4.79721e+307 (0.0418143s)][-6.04694e+307 (0.0527075s)]] +[[cpp_int(fixed)][6.70551 (0.0111002s)][-3.64663e+307 (0.0317854s)][-5.35725e+307 (0.0466958s)][-6.16052e+307 (0.0536974s)][-1.#INF (0.0819107s)]] +[[cpp_int(unsigned, fixed)][[*1] (0.00165538s)]] +[[gmp_int][85.2488 (0.141119s)][-1.64044e+308 (0.142987s)][-1.78579e+308 (0.155656s)][-1.#INF (0.163236s)]] +[[tommath_int][227.544 (0.376671s)][-1.#INF (0.375206s)][-1.#INF (0.381428s)][-1.#INF (0.622404s)]] +] +[endsect] +[section:rational_performance Rational Type Perfomance] +[table Operator * +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][6.20279 (57.9393s)][6.23608 (59.3172s)][6.25071 (61.8998s)][6.44097 (67.4139s)]] +[[mpq_rational][[*1] (9.34086s)][[*1] (9.51195s)][[*1] (9.90285s)][[*1] (10.4664s)]] +] +[table Operator *(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][2.06502 (2.4377s)][2.38344 (2.91325s)][2.86734 (3.94768s)][3.8554 (5.87507s)]] +[[mpq_rational][[*1] (1.18047s)][[*1] (1.22229s)][[*1] (1.37678s)][[*1] (1.52386s)]] +] +[table Operator + +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][1.1513 (2.68363s)][1.31207 (3.15142s)][1.61685 (4.05684s)][2.18092 (5.80438s)]] +[[mpq_rational][[*1] (2.33097s)][[*1] (2.40187s)][[*1] (2.5091s)][[*1] (2.66144s)]] +] +[table Operator +(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][3.69962 (2.47739s)][4.12788 (2.92179s)][4.67839 (3.80252s)][6.08526 (5.51612s)]] +[[mpq_rational][[*1] (0.669634s)][[*1] (0.707818s)][[*1] (0.812783s)][[*1] (0.906471s)]] +] +[table Operator - +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][1.17746 (2.72926s)][1.334 (3.19882s)][1.63017 (4.08474s)][2.21829 (5.86s)]] +[[mpq_rational][[*1] (2.31793s)][[*1] (2.39792s)][[*1] (2.50572s)][[*1] (2.64168s)]] +] +[table Operator -(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][3.71756 (2.47959s)][4.04045 (2.90579s)][4.69474 (3.80714s)][6.07677 (5.51949s)]] +[[mpq_rational][[*1] (0.666993s)][[*1] (0.719174s)][[*1] (0.810939s)][[*1] (0.908293s)]] +] +[table Operator / +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][5.95741 (58.0332s)][6.16582 (59.5431s)][6.19235 (61.9712s)][6.31439 (67.4254s)]] +[[mpq_rational][[*1] (9.74135s)][[*1] (9.65697s)][[*1] (10.0077s)][[*1] (10.6781s)]] +] +[table Operator /(int) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][1.75198 (2.50843s)][2.05836 (3.00689s)][2.45339 (4.00588s)][3.31983 (5.92837s)]] +[[mpq_rational][[*1] (1.43177s)][[*1] (1.46082s)][[*1] (1.6328s)][[*1] (1.78575s)]] +] +[table Operator construct +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][[*1] (0.0102665s)][[*1] (0.0101737s)][[*1] (0.0101965s)][[*1] (0.0102909s)]] +[[mpq_rational][37.3164 (0.383107s)][37.5023 (0.381537s)][37.4005 (0.381355s)][37.2621 (0.383461s)]] +] +[table Operator construct(unsigned long long) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][[*1] (0.0658436s)][[*1] (0.0665504s)][[*1] (0.0659082s)][[*1] (0.0659089s)]] +[[mpq_rational][32.3771 (2.13183s)][31.9648 (2.12727s)][32.1342 (2.1179s)][32.2079 (2.12279s)]] +] +[table Operator construct(unsigned) +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][[*1] (0.0624887s)][[*1] (0.0609531s)][[*1] (0.0613968s)][[*1] (0.062674s)]] +[[mpq_rational][6.31396 (0.394551s)][6.41455 (0.390987s)][6.38973 (0.392309s)][6.27858 (0.393504s)]] +] +[table Operator str +[[Backend][128 Bits][256 Bits][512 Bits][1024 Bits]] +[[cpp_rational][5.4954 (0.020339s)][9.02403 (0.0517328s)][9.75685 (0.119248s)][9.80346 (0.286067s)]] +[[mpq_rational][[*1] (0.0037011s)][[*1] (0.00573278s)][[*1] (0.012222s)][[*1] (0.0291802s)]] +] +[endsect] diff --git a/src/boost/libs/multiprecision/performance/performance_test.cpp b/src/boost/libs/multiprecision/performance/performance_test.cpp new file mode 100644 index 00000000..95a1efd6 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/performance_test.cpp @@ -0,0 +1,851 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define BOOST_CHRONO_HEADER_ONLY + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if !defined(TEST_MPF) && !defined(TEST_MPZ) && \ + !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPQ) && !defined(TEST_TOMMATH) && !defined(TEST_TOMMATH_BOOST_RATIONAL) && !defined(TEST_MPZ_BOOST_RATIONAL) && !defined(TEST_CPP_INT) && !defined(TEST_CPP_INT_RATIONAL) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF +#define TEST_MPZ +#define TEST_MPQ +#define TEST_MPFR +#define TEST_CPP_DEC_FLOAT +#define TEST_MPQ +#define TEST_TOMMATH +#define TEST_CPP_INT +#define TEST_CPP_INT_RATIONAL +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF) || defined(TEST_MPZ) || defined(TEST_MPQ) || defined(TEST_MPZ_BOOST_RATIONAL) +#include <boost/multiprecision/gmp.hpp> +#include <boost/multiprecision/rational_adaptor.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#if defined(TEST_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_TOMMATH) || defined(TEST_TOMMATH_BOOST_RATIONAL) +#include <boost/multiprecision/tommath.hpp> +#include <boost/multiprecision/rational_adaptor.hpp> +#endif +#if defined(TEST_CPP_INT) || defined(TEST_CPP_INT_RATIONAL) +#include <boost/multiprecision/cpp_int.hpp> +#endif + +#include <boost/chrono.hpp> +#include <vector> +#include <map> +#include <string> +#include <cstring> +#include <cctype> +#include <iostream> +#include <iomanip> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> + +template <class Clock> +struct stopwatch +{ + typedef typename Clock::duration duration; + stopwatch() + { + m_start = Clock::now(); + } + duration elapsed() + { + return Clock::now() - m_start; + } + void reset() + { + m_start = Clock::now(); + } + + private: + typename Clock::time_point m_start; +}; + +unsigned bits_wanted; // for integer types + +template <class T, int Type> +struct tester +{ + tester() + { + a.assign(500, 0); + for (int i = 0; i < 500; ++i) + { + b.push_back(generate_random()); + c.push_back(generate_random()); + small.push_back(gen()); + } + } + double test_add() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] + c[i]; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_subtract() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] - c[i]; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_add_int() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] + 1; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_subtract_int() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] - 1; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_multiply() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned k = 0; k < b.size(); ++k) + a[k] = b[k] * c[k]; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_multiply_int() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] * 3; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_divide() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] / c[i] + b[i] / small[i]; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_divide_int() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] / 3; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_str(const boost::mpl::false_&) + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < b.size(); ++i) + a[i] = boost::lexical_cast<T>(boost::lexical_cast<std::string>(b[i])); + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_str(const boost::mpl::true_&) + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < b.size(); ++i) + a[i].assign(b[i].str()); + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_str() + { + return test_str(boost::is_class<T>()); + } + // + // The following tests only work for integer types: + // + double test_mod() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] % c[i] + b[i] % small[i]; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_mod_int() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] % 254; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_or() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] | c[i]; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_or_int() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] | 234; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_and() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] & c[i]; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_and_int() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] & 234; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_xor() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] ^ c[i]; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_xor_int() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] ^ 234; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_complement() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = ~b[i]; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_left_shift() + { + int max_shift = std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits : bits_wanted; + int shift = 0; + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] << (shift++ % max_shift); + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_right_shift() + { + int max_shift = 2 + std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits : bits_wanted; + int shift = 0; + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] >> (shift++) % max_shift; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_gcd() + { + using boost::integer::gcd; + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = gcd(b[i], c[i]); + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_powm() + { + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 25; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = powm(b[i], b[i] / 2, c[i]); + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + double test_construct() + { + std::allocator<T> a; + T* pt = a.allocate(1000); + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < 1000; ++i) + new (pt + i) T(); + for (unsigned i = 0; i < 1000; ++i) + a.destroy(pt + i); + } + double result = boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + a.deallocate(pt, 1000); + return result; + } + double test_construct_unsigned() + { + std::allocator<T> a; + T* pt = a.allocate(1000); + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < 1000; ++i) + new (pt + i) T(i); + for (unsigned i = 0; i < 1000; ++i) + a.destroy(pt + i); + } + double result = boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + a.deallocate(pt, 1000); + return result; + } + double test_construct_unsigned_ll() + { + std::allocator<T> a; + T* pt = a.allocate(1000); + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned long long j = 0; j < 1000; ++j) + new (pt + j) T(j); + for (unsigned j = 0; j < 1000; ++j) + a.destroy(pt + j); + } + double result = boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + a.deallocate(pt, 1000); + return result; + } + + // + // Hetero operations: + // + template <class U> + static U get_hetero_test_value(boost::mpl::false_ const&) + { + return U(2) / 3; + } + template <class U> + static U get_hetero_test_value(boost::mpl::true_ const&) + { + return (std::numeric_limits<U>::max)() >> 4; + } + template <class U> + static U get_hetero_test_value() + { + return get_hetero_test_value<U>(boost::is_integral<U>()); + } + template <class U> + double test_multiply_hetero() + { + static const U val = get_hetero_test_value<U>(); + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] * val; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + template <class U> + double test_inplace_multiply_hetero() + { + static const U val = get_hetero_test_value<U>(); + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i]; + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] *= val; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + template <class U> + double test_add_hetero() + { + static const U val = get_hetero_test_value<U>(); + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] + val; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + template <class U> + double test_inplace_add_hetero() + { + static const U val = get_hetero_test_value<U>(); + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i]; + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] += val; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + template <class U> + double test_subtract_hetero() + { + static const U val = get_hetero_test_value<U>(); + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] - val; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + template <class U> + double test_inplace_subtract_hetero() + { + static const U val = get_hetero_test_value<U>(); + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i]; + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] -= val; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + template <class U> + double test_divide_hetero() + { + static const U val = get_hetero_test_value<U>(); + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i] / val; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + template <class U> + double test_inplace_divide_hetero() + { + static const U val = get_hetero_test_value<U>(); + for (unsigned i = 0; i < b.size(); ++i) + a[i] = b[i]; + stopwatch<boost::chrono::high_resolution_clock> w; + for (unsigned i = 0; i < 1000; ++i) + { + for (unsigned i = 0; i < b.size(); ++i) + a[i] /= val; + } + return boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + } + + private: + T generate_random() + { + return generate_random(boost::mpl::int_<Type>()); + } + T generate_random(const boost::mpl::int_<boost::multiprecision::number_kind_floating_point>&) + { + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + int e; + val = frexp(val, &e); + + typedef typename T::backend_type::exponent_type e_type; + static boost::random::uniform_int_distribution<e_type> ui(-30, 30); + return ldexp(val, static_cast<int>(ui(gen))); + } + T generate_random(const boost::mpl::int_<boost::multiprecision::number_kind_integer>&) + { + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; + } + T generate_random(const boost::mpl::int_<boost::multiprecision::number_kind_rational>&) + { + typedef boost::random::mt19937::result_type random_type; + typedef typename boost::multiprecision::component_type<T>::type IntType; + + IntType max_val; + unsigned digits; + if (std::numeric_limits<IntType>::is_bounded) + { + max_val = (std::numeric_limits<IntType>::max)(); + digits = std::numeric_limits<IntType>::digits; + } + else + { + max_val = IntType(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + IntType val = 0; + IntType denom = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + for (unsigned i = 0; i < terms_needed; ++i) + { + denom *= (gen.max)(); + denom += gen(); + } + if (denom == 0) + denom = 1; + val %= max_val; + denom %= max_val; + return T(val, denom); + } + std::vector<T> a, b, c, small; + static boost::random::mt19937 gen; +}; + +template <class N, int V> +boost::random::mt19937 tester<N, V>::gen; + +const char* category_name(const boost::mpl::int_<boost::multiprecision::number_kind_integer>&) +{ + return "integer"; +} +const char* category_name(const boost::mpl::int_<boost::multiprecision::number_kind_floating_point>&) +{ + return "float"; +} +const char* category_name(const boost::mpl::int_<boost::multiprecision::number_kind_rational>&) +{ + return "rational"; +} + +// +// Keys in order are: +// Category +// Operator +// Type +// Precision +// Time +// +std::map<std::string, std::map<std::string, std::map<std::string, std::map<int, double> > > > result_table; + +void report_result(const char* cat, const char* type, const char* op, unsigned precision, double time) +{ + std::cout << std::left << std::setw(15) << type << std::setw(10) << precision << std::setw(35) << op << time << std::endl; + result_table[cat][op][type][precision] = time; +} + +template <class Number, int N> +void test_int_ops(tester<Number, N>& t, const char* type, unsigned precision, const boost::mpl::int_<boost::multiprecision::number_kind_integer>&) +{ + const char* cat = "integer"; + report_result(cat, type, "%", precision, t.test_mod()); + report_result(cat, type, "|", precision, t.test_or()); + report_result(cat, type, "&", precision, t.test_and()); + report_result(cat, type, "^", precision, t.test_xor()); + //report_result(cat, type, "~", precision, t.test_complement()); + report_result(cat, type, "<<", precision, t.test_left_shift()); + report_result(cat, type, ">>", precision, t.test_right_shift()); + // integer ops: + report_result(cat, type, "%(int)", precision, t.test_mod_int()); + report_result(cat, type, "|(int)", precision, t.test_or_int()); + report_result(cat, type, "&(int)", precision, t.test_and_int()); + report_result(cat, type, "^(int)", precision, t.test_xor_int()); + report_result(cat, type, "gcd", precision, t.test_gcd()); + report_result(cat, type, "powm", precision, t.test_powm()); +} +template <class Number, int N, class U> +void test_int_ops(tester<Number, N>& t, const char* type, unsigned precision, const U&) +{ +} + +template <class Number> +void test(const char* type, unsigned precision) +{ + bits_wanted = precision; + tester<Number, boost::multiprecision::number_category<Number>::value> t; + const char* cat = category_name(typename boost::multiprecision::number_category<Number>::type()); + // + // call t.test_multiply() first so that the destination operands are + // forced to perform whatever memory allocation may be needed. That way + // we measure only algorithm performance, and not memory allocation effects. + // + t.test_multiply(); + // + // Now the actual tests: + // + report_result(cat, type, "+", precision, t.test_add()); + report_result(cat, type, "-", precision, t.test_subtract()); + report_result(cat, type, "*", precision, t.test_multiply()); + report_result(cat, type, "/", precision, t.test_divide()); + report_result(cat, type, "str", precision, t.test_str()); + // integer ops: + report_result(cat, type, "+(int)", precision, t.test_add_int()); + report_result(cat, type, "-(int)", precision, t.test_subtract_int()); + report_result(cat, type, "*(int)", precision, t.test_multiply_int()); + report_result(cat, type, "/(int)", precision, t.test_divide_int()); + // construction and destruction: + report_result(cat, type, "construct", precision, t.test_construct()); + report_result(cat, type, "construct(unsigned)", precision, t.test_construct_unsigned()); + report_result(cat, type, "construct(unsigned long long)", precision, t.test_construct_unsigned_ll()); + test_int_ops(t, type, precision, typename boost::multiprecision::number_category<Number>::type()); + // Hetero ops: + report_result(cat, type, "+(unsigned long long)", precision, t.template test_add_hetero<unsigned long long>()); + report_result(cat, type, "-(unsigned long long)", precision, t.template test_subtract_hetero<unsigned long long>()); + report_result(cat, type, "*(unsigned long long)", precision, t.template test_multiply_hetero<unsigned long long>()); + report_result(cat, type, "/(unsigned long long)", precision, t.template test_divide_hetero<unsigned long long>()); + report_result(cat, type, "+=(unsigned long long)", precision, t.template test_inplace_add_hetero<unsigned long long>()); + report_result(cat, type, "-=(unsigned long long)", precision, t.template test_inplace_subtract_hetero<unsigned long long>()); + report_result(cat, type, "*=(unsigned long long)", precision, t.template test_inplace_multiply_hetero<unsigned long long>()); + report_result(cat, type, "/=(unsigned long long)", precision, t.template test_inplace_divide_hetero<unsigned long long>()); +} + +void quickbook_results() +{ + // + // Keys in order are: + // Category + // Operator + // Type + // Precision + // Time + // + typedef std::map<std::string, std::map<std::string, std::map<std::string, std::map<int, double> > > >::const_iterator category_iterator; + typedef std::map<std::string, std::map<std::string, std::map<int, double> > >::const_iterator operator_iterator; + typedef std::map<std::string, std::map<int, double> >::const_iterator type_iterator; + typedef std::map<int, double>::const_iterator precision_iterator; + + for (category_iterator i = result_table.begin(); i != result_table.end(); ++i) + { + std::string cat = i->first; + cat[0] = std::toupper(cat[0]); + std::cout << "[section:" << i->first << "_performance " << cat << " Type Perfomance]" << std::endl; + + for (operator_iterator j = i->second.begin(); j != i->second.end(); ++j) + { + std::string op = j->first; + std::cout << "[table Operator " << op << std::endl; + std::cout << "[[Backend]"; + + for (precision_iterator k = j->second.begin()->second.begin(); k != j->second.begin()->second.end(); ++k) + { + std::cout << "[" << k->first << " Bits]"; + } + std::cout << "]\n"; + + std::vector<double> best_times(j->second.begin()->second.size(), (std::numeric_limits<double>::max)()); + for (unsigned m = 0; m < j->second.begin()->second.size(); ++m) + { + for (type_iterator k = j->second.begin(); k != j->second.end(); ++k) + { + precision_iterator l = k->second.begin(); + std::advance(l, m); + if (best_times[m] > l->second) + best_times[m] = l->second ? l->second : best_times[m]; + } + } + + for (type_iterator k = j->second.begin(); k != j->second.end(); ++k) + { + std::cout << "[[" << k->first << "]"; + + unsigned m = 0; + for (precision_iterator l = k->second.begin(); l != k->second.end(); ++l) + { + double rel_time = l->second / best_times[m]; + if (rel_time == 1) + std::cout << "[[*" << rel_time << "]"; + else + std::cout << "[" << rel_time; + std::cout << " (" << l->second << "s)]"; + ++m; + } + + std::cout << "]\n"; + } + + std::cout << "]\n"; + } + + std::cout << "[endsect]" << std::endl; + } +} + +int main() +{ +#ifdef TEST_INT64 + test<boost::uint64_t>("boost::uint64_t", 64); +#endif +#ifdef TEST_MPF + test<boost::multiprecision::mpf_float_50>("gmp_float", 50); + test<boost::multiprecision::mpf_float_100>("gmp_float", 100); + test<boost::multiprecision::mpf_float_500>("gmp_float", 500); +#endif +#ifdef TEST_MPZ + test<boost::multiprecision::mpz_int>("gmp_int", 128); + test<boost::multiprecision::mpz_int>("gmp_int", 256); + test<boost::multiprecision::mpz_int>("gmp_int", 512); + test<boost::multiprecision::mpz_int>("gmp_int", 1024); +#endif +#ifdef TEST_CPP_INT + //test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >("cpp_int(unsigned, fixed)", 64); + //test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >("cpp_int(fixed)", 64); + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<128, 128, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >("cpp_int(fixed)", 128); + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >("cpp_int(fixed)", 256); + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >("cpp_int(fixed)", 512); + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<1024, 1024, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>, boost::multiprecision::et_off> >("cpp_int(fixed)", 1024); + + test<boost::multiprecision::cpp_int>("cpp_int", 128); + test<boost::multiprecision::cpp_int>("cpp_int", 256); + test<boost::multiprecision::cpp_int>("cpp_int", 512); + test<boost::multiprecision::cpp_int>("cpp_int", 1024); +#endif +#ifdef TEST_CPP_INT_RATIONAL + test<boost::multiprecision::cpp_rational>("cpp_rational", 128); + test<boost::multiprecision::cpp_rational>("cpp_rational", 256); + test<boost::multiprecision::cpp_rational>("cpp_rational", 512); + test<boost::multiprecision::cpp_rational>("cpp_rational", 1024); +#endif +#ifdef TEST_MPQ + test<boost::multiprecision::mpq_rational>("mpq_rational", 128); + test<boost::multiprecision::mpq_rational>("mpq_rational", 256); + test<boost::multiprecision::mpq_rational>("mpq_rational", 512); + test<boost::multiprecision::mpq_rational>("mpq_rational", 1024); +#endif +#ifdef TEST_TOMMATH + test<boost::multiprecision::tom_int>("tommath_int", 128); + test<boost::multiprecision::tom_int>("tommath_int", 256); + test<boost::multiprecision::tom_int>("tommath_int", 512); + test<boost::multiprecision::tom_int>("tommath_int", 1024); + /* + // + // These are actually too slow to test!!! + // + test<boost::multiprecision::tom_rational>("tom_rational", 128); + test<boost::multiprecision::tom_rational>("tom_rational", 256); + test<boost::multiprecision::tom_rational>("tom_rational", 512); + test<boost::multiprecision::tom_rational>("tom_rational", 1024); + */ +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>("cpp_dec_float", 50); + test<boost::multiprecision::cpp_dec_float_100>("cpp_dec_float", 100); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<500> > >("cpp_dec_float", 500); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>("cpp_bin_float", 50); + test<boost::multiprecision::cpp_bin_float_100>("cpp_bin_float", 100); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<500> > >("cpp_bin_float", 500); +#endif +#ifdef TEST_MPFR + test<boost::multiprecision::mpfr_float_50>("mpfr_float", 50); + test<boost::multiprecision::mpfr_float_100>("mpfr_float", 100); + test<boost::multiprecision::mpfr_float_500>("mpfr_float", 500); +#endif + quickbook_results(); + return 0; +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance-msvc-10.log b/src/boost/libs/multiprecision/performance/sf_performance-msvc-10.log new file mode 100644 index 00000000..9dc8de7b --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance-msvc-10.log @@ -0,0 +1,69 @@ +0 +11 +24 +3 +13 +27 +Testing Bessel Functions..... +Time for mpfr_float_50 = 6.47208 seconds +Total allocations for mpfr_float_50 = 2684348 +Time for mpf_float_50 = 11.6627 seconds +Total allocations for mpf_float_50 = 2601366 +Time for cpp_float_50 = 20.2855 seconds +Total allocations for cpp_float_50 = 0 +Time for mpfr_class (50 digits) = 6.48063 seconds +Total allocations for mpfr_class (50 digits) = 3946031 +Time for mpreal (50 digits) = 9.98151 seconds +Total allocations for mpreal (50 digits) = 13223017 +Time for mpfr_float_100 = 10.154 seconds +Total allocations for mpfr_float_50 = 3671485 +Time for mpf_float_100 = 8.51179 seconds +Total allocations for mpf_float_100 = 3593669 +Time for cpp_float_100 = 21.0198 seconds +Total allocations for cpp_float_100 = 0 +Time for mpfr_class (100 digits) = 9.80571 seconds +Total allocations for mpfr_class (100 digits) = 5447348 +Time for mpreal (100 digits) = 13.7021 seconds +Total allocations for mpreal (100 digits) = 16671065 +Testing Polynomial Evaluation..... +Time for mpfr_float_50 = 0.00823841 seconds +Total allocations for mpfr_float_50 = 2996 +Time for mpf_float_50 = 0.00401608 seconds +Total allocations for mpf_float_50 = 2996 +Time for cpp_float_50 = 0.00492116 seconds +Total allocations for cpp_float_50 = 0 +Time for mpfr_class (50 digits) = 0.00935629 seconds +Total allocations for mpfr_class (50 digits) = 12976 +Time for mpreal (50 digits) = 0.0148374 seconds +Total allocations for mpreal (50 digits = 27947 +Time for mpfr_float_100 = 0.00948452 seconds +Total allocations for mpfr_float_100 = 2996 +Time for mpf_float_100 = 0.00390071 seconds +Total allocations for mpf_float_100 = 2996 +Time for cpp_float_100 = 0.00893563 seconds +Total allocations for cpp_float_100 = 0 +Time for mpfr_class (100 digits) = 0.0106166 seconds +Total allocations for mpfr_class (100 digits) = 12976 +Time for mpreal (100 digits) = 0.0162364 seconds +Total allocations for mpreal (100 digits) = 27947 +Testing Non-Central T..... +Time for mpfr_float_50 = 258.087 seconds +Total allocations for mpfr_float_50 = 139149049 +Time for mpf_float_50 = 197.303 seconds +Total allocations for mpf_float_50 = 134600354 +Time for cpp_float_50 = 334.503 seconds +Total allocations for cpp_float_50 = 0 +Time for mpfr_class (50 digits) = 266.389 seconds +Total allocations for mpfr_class (50 digits) = 252401115 +Time for mpreal (50 digits) = 346.641 seconds +Total allocations for mpreal (50 digits) = 447009420 +Time for mpfr_float_100 = 516.741 seconds +Total allocations for mpfr_float_100 = 220400854 +Time for mpf_float_100 = 397.302 seconds +Total allocations for mpf_float_100 = 212307349 +Time for cpp_float_100 = 1064.53 seconds +Total allocations for cpp_float_100 = 0 +Time for mpfr_class (100 digits) = 525.74 seconds +Total allocations for mpfr_class (100 digits) = 407154781 +Time for mpreal (100 digits) = 649.941 seconds +Total allocations for mpreal (100 digits) = 724581024 diff --git a/src/boost/libs/multiprecision/performance/sf_performance.cpp b/src/boost/libs/multiprecision/performance/sf_performance.cpp new file mode 100644 index 00000000..cfd2360c --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance.cpp @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +unsigned allocation_count = 0; + +void* (*alloc_func_ptr)(size_t); +void* (*realloc_func_ptr)(void*, size_t, size_t); +void (*free_func_ptr)(void*, size_t); + +void* alloc_func(size_t n) +{ + ++allocation_count; + return (*alloc_func_ptr)(n); +} + +void free_func(void* p, size_t n) +{ + (*free_func_ptr)(p, n); +} + +void* realloc_func(void* p, size_t old, size_t n) +{ + ++allocation_count; + return (*realloc_func_ptr)(p, old, n); +} + +int main() +{ + using namespace boost::multiprecision; + +#if defined(TEST_MPFR) || defined(TEST_MPFR_CLASS) || defined(TEST_MPREAL) || defined(TEST_MPF) + mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr); + mp_set_memory_functions(&alloc_func, &realloc_func, &free_func); +#endif + + basic_tests(); + bessel_tests(); + poly_tests(); + nct_tests(); +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance.hpp b/src/boost/libs/multiprecision/performance/sf_performance.hpp new file mode 100644 index 00000000..ce34f1b6 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance.hpp @@ -0,0 +1,216 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define BOOST_MATH_MAX_ROOT_ITERATION_POLICY 750 +#define BOOST_MATH_PROMOTE_DOUBLE_POLICY false + +#if !defined(TEST_MPFR) && !defined(TEST_MPREAL) && !defined(TEST_MPF) && !defined(TEST_MPREAL) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_CLASS) && !defined(TEST_FLOAT) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPFR +#define TEST_MPF +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_BIN_FLOAT +//# define TEST_MPFR_CLASS +//# define TEST_MPREAL +#define TEST_FLOAT +#endif + +#ifdef TEST_FLOAT +#include "arithmetic_backend.hpp" +#endif +#ifdef TEST_MPFR_CLASS +#include <boost/math/bindings/mpfr.hpp> +#endif +#ifdef TEST_MPFR +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_MPREAL +#include <boost/math/bindings/mpreal.hpp> +#endif +#ifdef TEST_MPF +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/mpfr.hpp> +#endif +#include <boost/math/special_functions/bessel.hpp> +#include <boost/math/tools/rational.hpp> +#include <boost/math/distributions/non_central_t.hpp> +#include <libs/math/test/table_type.hpp> +#include <boost/chrono.hpp> +#include <boost/array.hpp> +#include <boost/thread.hpp> + +template <class Real> +Real test_bessel(); + +template <class Clock> +struct stopwatch +{ + typedef typename Clock::duration duration; + stopwatch() + { + m_start = Clock::now(); + } + duration elapsed() + { + return Clock::now() - m_start; + } + void reset() + { + m_start = Clock::now(); + } + + private: + typename Clock::time_point m_start; +}; + +template <class Real> +Real test_bessel() +{ + try + { +#define T double +#define SC_(x) x +#include "libs/math/test/bessel_i_int_data.ipp" +#include "libs/math/test/bessel_i_data.ipp" + + Real r; + + for (unsigned i = 0; i < bessel_i_int_data.size(); ++i) + { + r += boost::math::cyl_bessel_i(Real(bessel_i_int_data[i][0]), Real(bessel_i_int_data[i][1])); + } + for (unsigned i = 0; i < bessel_i_data.size(); ++i) + { + r += boost::math::cyl_bessel_i(Real(bessel_i_data[i][0]), Real(bessel_i_data[i][1])); + } + +#include "libs/math/test/bessel_j_int_data.ipp" + for (unsigned i = 0; i < bessel_j_int_data.size(); ++i) + { + r += boost::math::cyl_bessel_j(Real(bessel_j_int_data[i][0]), Real(bessel_j_int_data[i][1])); + } + +#include "libs/math/test/bessel_j_data.ipp" + for (unsigned i = 0; i < bessel_j_data.size(); ++i) + { + r += boost::math::cyl_bessel_j(Real(bessel_j_data[i][0]), Real(bessel_j_data[i][1])); + } + +#include "libs/math/test/bessel_j_large_data.ipp" + for (unsigned i = 0; i < bessel_j_large_data.size(); ++i) + { + r += boost::math::cyl_bessel_j(Real(bessel_j_large_data[i][0]), Real(bessel_j_large_data[i][1])); + } + +#include "libs/math/test/sph_bessel_data.ipp" + for (unsigned i = 0; i < sph_bessel_data.size(); ++i) + { + r += boost::math::sph_bessel(static_cast<unsigned>(sph_bessel_data[i][0]), Real(sph_bessel_data[i][1])); + } + + return r; + } + catch (const std::exception& e) + { + std::cout << e.what() << std::endl; + } + return 0; +} + +template <class Real> +Real test_polynomial() +{ + static const unsigned t[] = { + 2, 3, 4, 5, 6, 7, 8}; + Real result = 0; + for (Real k = 2; k < 1000; ++k) + result += boost::math::tools::evaluate_polynomial(t, k); + + return result; +} + +template <class Real> +Real test_nct() +{ +#define T double +#include "libs/math/test/nct.ipp" + + Real result = 0; + for (unsigned i = 0; i < nct.size(); ++i) + { + try + { + result += quantile(boost::math::non_central_t_distribution<Real>(nct[i][0], nct[i][1]), nct[i][3]); + result += cdf(boost::math::non_central_t_distribution<Real>(nct[i][0], nct[i][1]), nct[i][2]); + } + catch (const std::exception&) + {} + } + return result; +} + +extern unsigned allocation_count; + +template <class Real> +void basic_allocation_test(const char* name, Real x) +{ + static const unsigned a[] = {2, 3, 4, 5, 6, 7, 8}; + allocation_count = 0; + Real result = (((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]; + std::cout << "Allocation count for type " << name << " = " << allocation_count << std::endl; +} + +template <class Real> +void poly_allocation_test(const char* name, Real x) +{ + static const unsigned a[] = {2, 3, 4, 5, 6, 7, 8}; + allocation_count = 0; + Real result = boost::math::tools::evaluate_polynomial(a, x); + std::cout << "Allocation count for type " << name << " = " << allocation_count << std::endl; +} + +template <class Real> +void time_proc(const char* name, Real (*proc)(), unsigned threads = 1) +{ + try + { + static Real total = 0; + allocation_count = 0; + boost::chrono::duration<double> time; + stopwatch<boost::chrono::high_resolution_clock> c; + total += proc(); + time = c.elapsed(); + std::cout << "Time for " << name << " = " << time << std::endl; + std::cout << "Total allocations for " << name << " = " << allocation_count << std::endl; + + for (unsigned thread_count = 1; thread_count < threads; ++thread_count) + { + c.reset(); + boost::thread_group g; + for (unsigned i = 0; i <= thread_count; ++i) + g.create_thread(proc); + g.join_all(); + time = c.elapsed(); + std::cout << "Time for " << name << " (" << (thread_count + 1) << " threads) = " << time << std::endl; + std::cout << "Total allocations for " << name << " = " << allocation_count << std::endl; + } + } + catch (const std::exception& e) + { + std::cout << e.what() << std::endl; + } +} + +using namespace boost::multiprecision; + +void basic_tests(); +void bessel_tests(); +void poly_tests(); +void nct_tests(); diff --git a/src/boost/libs/multiprecision/performance/sf_performance_basic.cpp b/src/boost/libs/multiprecision/performance/sf_performance_basic.cpp new file mode 100644 index 00000000..51436d98 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_basic.cpp @@ -0,0 +1,49 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void basic_tests() +{ + + std::cout << "Allocation Counts for Horner Evaluation:\n"; +#ifdef TEST_MPFR + basic_allocation_test("mpfr_float_50", mpfr_float_50(2)); + basic_allocation_test("mpfr_float_50 - no expression templates", number<mpfr_float_backend<50>, et_off>(2)); +#endif +#ifdef TEST_MPFR_CLASS + basic_allocation_test("mpfr_class", mpfr_class(2)); +#endif +#ifdef TEST_MPREAL + basic_allocation_test("mpfr::mpreal", mpfr::mpreal(2)); +#endif + + std::cout << "Allocation Counts for boost::math::tools::evaluate_polynomial:\n"; +#ifdef TEST_MPFR + poly_allocation_test("mpfr_float_50", mpfr_float_50(2)); + poly_allocation_test("mpfr_float_50 - no expression templates", number<mpfr_float_backend<50>, et_off>(2)); +#endif +#ifdef TEST_MPFR_CLASS + poly_allocation_test("mpfr_class", mpfr_class(2)); +#endif +#ifdef TEST_MPREAL + poly_allocation_test("mpfr::mpreal", mpfr::mpreal(2)); +#endif + + // + // Comparison for builtin floats: + // +#ifdef TEST_FLOAT + time_proc("Bessel Functions - double", test_bessel<double>); + time_proc("Bessel Functions - real_concept", test_bessel<boost::math::concepts::real_concept>); + time_proc("Bessel Functions - arithmetic_backend<double>", test_bessel<number<arithmetic_backend<double>, et_on> >); + time_proc("Bessel Functions - arithmetic_backend<double> - no expression templates", test_bessel<number<arithmetic_backend<double>, et_off> >); + + time_proc("Non-central T - double", test_nct<double>); + time_proc("Non-central T - real_concept", test_nct<boost::math::concepts::real_concept>); + time_proc("Non-central T - arithmetic_backend<double>", test_nct<number<arithmetic_backend<double>, et_on> >); + time_proc("Non-central T - arithmetic_backend<double> - no expression templates", test_nct<number<arithmetic_backend<double>, et_off> >); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_bessel.cpp b/src/boost/libs/multiprecision/performance/sf_performance_bessel.cpp new file mode 100644 index 00000000..97a9b476 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_bessel.cpp @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void bessel_tests_1(); +void bessel_tests_2(); +void bessel_tests_3(); +void bessel_tests_4(); +void bessel_tests_5(); +void bessel_tests_6(); + +void bessel_tests() +{ + // + // 50 digits first: + // + std::cout << "Testing Bessel Functions at 50 digits....." << std::endl; +#if defined(TEST_MPFR) || defined(TEST_MPFR_CLASS) + mpfr_set_default_prec(50 * 1000L / 301L); +#endif +#ifdef TEST_MPREAL + mpfr::mpreal::set_default_prec(50 * 1000L / 301L); +#endif + + bessel_tests_1(); + bessel_tests_2(); + bessel_tests_3(); + + // + // Then 100 digits: + // + std::cout << "Testing Bessel Functions at 100 digits....." << std::endl; +#if defined(TEST_MPFR) || defined(TEST_MPFR_CLASS) + mpfr_set_default_prec(100 * 1000L / 301L); +#endif + bessel_tests_4(); + bessel_tests_5(); + bessel_tests_6(); +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_bessel1.cpp b/src/boost/libs/multiprecision/performance/sf_performance_bessel1.cpp new file mode 100644 index 00000000..476d8f38 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_bessel1.cpp @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void bessel_tests_1() +{ +#ifdef TEST_MPFR +#if MPFR_VERSION < MPFR_VERSION_NUM(3, 0, 0) + time_proc("mpfr_float_50", test_bessel<boost::multiprecision::mpfr_float_50>, 1); + time_proc("mpfr_float_50 (no expression templates)", test_bessel<number<mpfr_float_backend<50>, et_off> >, 1); + time_proc("static_mpfr_float_50", test_bessel<number<mpfr_float_backend<50, allocate_stack>, et_on> >, 1); + time_proc("static_mpfr_float_50 (no expression templates)", test_bessel<number<mpfr_float_backend<50, allocate_stack>, et_off> >, 1); +#else + time_proc("mpfr_float_50", test_bessel<boost::multiprecision::mpfr_float_50>, mpfr_buildopt_tls_p() ? 3 : 1); + time_proc("mpfr_float_50 (no expression templates", test_bessel<number<mpfr_float_backend<50>, et_off> >, mpfr_buildopt_tls_p() ? 3 : 1); + time_proc("static_mpfr_float_50", test_bessel<number<mpfr_float_backend<50, allocate_stack>, et_on> >, mpfr_buildopt_tls_p() ? 3 : 1); + time_proc("static_mpfr_float_50 (no expression templates)", test_bessel<number<mpfr_float_backend<50, allocate_stack>, et_off> >, mpfr_buildopt_tls_p() ? 3 : 1); +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_bessel2.cpp b/src/boost/libs/multiprecision/performance/sf_performance_bessel2.cpp new file mode 100644 index 00000000..19f76b5f --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_bessel2.cpp @@ -0,0 +1,20 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void bessel_tests_2() +{ +#ifdef TEST_MPF + time_proc("mpf_float_50", test_bessel<mpf_float_50>, 3); + time_proc("mpf_float_50 (no expression templates", test_bessel<number<gmp_float<50>, et_off> >, 3); +#endif +#ifdef TEST_CPP_DEC_FLOAT + time_proc("cpp_dec_float_50", test_bessel<cpp_dec_float_50>, 3); +#endif +#ifdef TEST_CPP_BIN_FLOAT + time_proc("cpp_bin_float_50", test_bessel<cpp_bin_float_50>, 3); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_bessel3.cpp b/src/boost/libs/multiprecision/performance/sf_performance_bessel3.cpp new file mode 100644 index 00000000..04d918d0 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_bessel3.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void bessel_tests_3() +{ +#ifdef TEST_MPFR_CLASS + time_proc("mpfr_class", test_bessel<mpfr_class>, mpfr_buildopt_tls_p() ? 3 : 1); +#endif +#ifdef TEST_MPREAL + time_proc("mpfr::mpreal", test_bessel<mpfr::mpreal>, mpfr_buildopt_tls_p() ? 3 : 1); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_bessel4.cpp b/src/boost/libs/multiprecision/performance/sf_performance_bessel4.cpp new file mode 100644 index 00000000..cbb9ec95 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_bessel4.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void bessel_tests_4() +{ +#ifdef TEST_MPFR + time_proc("mpfr_float_100", test_bessel<mpfr_float_100>); + time_proc("mpfr_float_100 (no expression templates", test_bessel<number<mpfr_float_backend<100>, et_off> >); + time_proc("static_mpfr_float_100", test_bessel<static_mpfr_float_100>); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_bessel5.cpp b/src/boost/libs/multiprecision/performance/sf_performance_bessel5.cpp new file mode 100644 index 00000000..b22c2408 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_bessel5.cpp @@ -0,0 +1,17 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void bessel_tests_5() +{ +#ifdef TEST_MPREAL + mpfr::mpreal::set_default_prec(100 * 1000L / 301L); +#endif +#ifdef TEST_MPF + time_proc("mpf_float_100", test_bessel<mpf_float_100>); + time_proc("mpf_float_100 (no expression templates", test_bessel<number<gmp_float<100>, et_off> >); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_bessel6.cpp b/src/boost/libs/multiprecision/performance/sf_performance_bessel6.cpp new file mode 100644 index 00000000..f3605c7c --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_bessel6.cpp @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void bessel_tests_6() +{ +#ifdef TEST_CPP_DEC_FLOAT + time_proc("cpp_dec_float_100", test_bessel<cpp_dec_float_100>); +#endif +#ifdef TEST_CPP_BIN_FLOAT + time_proc("cpp_bin_float_100", test_bessel<cpp_bin_float_100>); +#endif +#ifdef TEST_MPFR_CLASS + time_proc("mpfr_class", test_bessel<mpfr_class>); +#endif +#ifdef TEST_MPREAL + time_proc("mpfr::mpreal", test_bessel<mpfr::mpreal>); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_nct.cpp b/src/boost/libs/multiprecision/performance/sf_performance_nct.cpp new file mode 100644 index 00000000..4c5a00db --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_nct.cpp @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void nct_tests_1(); +void nct_tests_2(); +void nct_tests_3(); +void nct_tests_4(); +void nct_tests_5(); +void nct_tests_6(); + +void nct_tests() +{ + // + // 50 digits first: + // + std::cout << "Testing Non-Central T at 50 digits....." << std::endl; +#ifdef TEST_MPFR_CLASS + mpfr_set_default_prec(50 * 1000L / 301L); +#endif + + nct_tests_1(); + nct_tests_2(); + nct_tests_3(); + + // + // Then 100 digits: + // + std::cout << "Testing Non-Central T at 100 digits....." << std::endl; +#ifdef TEST_MPFR_CLASS + mpfr_set_default_prec(100 * 1000L / 301L); +#endif + nct_tests_4(); + nct_tests_5(); + nct_tests_6(); +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_nct1.cpp b/src/boost/libs/multiprecision/performance/sf_performance_nct1.cpp new file mode 100644 index 00000000..4d12c8b2 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_nct1.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void nct_tests_1() +{ +#ifdef TEST_MPFR + time_proc("mpfr_float_50", test_nct<mpfr_float_50>); + time_proc("mpfr_float_50 (no expression templates", test_nct<number<mpfr_float_backend<50>, et_off> >); + time_proc("static_mpfr_float_50", test_nct<static_mpfr_float_50>); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_nct2.cpp b/src/boost/libs/multiprecision/performance/sf_performance_nct2.cpp new file mode 100644 index 00000000..a52a029c --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_nct2.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void nct_tests_2() +{ +#ifdef TEST_MPF + time_proc("mpf_float_50", test_nct<mpf_float_50>); + time_proc("mpf_float_50 (no expression templates", test_nct<number<gmp_float<50>, et_off> >); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_nct3.cpp b/src/boost/libs/multiprecision/performance/sf_performance_nct3.cpp new file mode 100644 index 00000000..cc84ab1b --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_nct3.cpp @@ -0,0 +1,25 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void nct_tests_3() +{ +#ifdef TEST_MPREAL + mpfr::mpreal::set_default_prec(50 * 1000L / 301L); +#endif +#ifdef TEST_CPP_DEC_FLOAT + time_proc("cpp_dec_float_50", test_nct<cpp_dec_float_50>); +#endif +#ifdef TEST_CPP_BIN_FLOAT + time_proc("cpp_bin_float_50", test_nct<cpp_bin_float_50>, 3); +#endif +#ifdef TEST_MPFR_CLASS + time_proc("mpfr_class", test_nct<mpfr_class>); +#endif +#ifdef TEST_MPREAL + time_proc("mpfr::mpreal", test_nct<mpfr::mpreal>); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_nct4.cpp b/src/boost/libs/multiprecision/performance/sf_performance_nct4.cpp new file mode 100644 index 00000000..c23b0fd5 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_nct4.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void nct_tests_4() +{ +#ifdef TEST_MPFR + time_proc("mpfr_float_100", test_nct<mpfr_float_100>); + time_proc("mpfr_float_100 (no expression templates", test_nct<number<mpfr_float_backend<100>, et_off> >); + time_proc("static_mpfr_float_100", test_nct<static_mpfr_float_100>); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_nct5.cpp b/src/boost/libs/multiprecision/performance/sf_performance_nct5.cpp new file mode 100644 index 00000000..676005a1 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_nct5.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void nct_tests_5() +{ +#ifdef TEST_MPF + time_proc("mpf_float_100", test_nct<mpf_float_100>); + time_proc("mpf_float_100 (no expression templates", test_nct<number<gmp_float<100>, et_off> >); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_nct6.cpp b/src/boost/libs/multiprecision/performance/sf_performance_nct6.cpp new file mode 100644 index 00000000..cf3af1cf --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_nct6.cpp @@ -0,0 +1,25 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void nct_tests_6() +{ +#ifdef TEST_MPREAL + mpfr::mpreal::set_default_prec(100 * 1000L / 301L); +#endif +#ifdef TEST_CPP_DEC_FLOAT + time_proc("cpp_dec_float_100", test_nct<cpp_dec_float_100>); +#endif +#ifdef TEST_CPP_BIN_FLOAT + time_proc("cpp_bin_float_100", test_nct<cpp_bin_float_100>); +#endif +#ifdef TEST_MPFR_CLASS + time_proc("mpfr_class", test_nct<mpfr_class>); +#endif +#ifdef TEST_MPREAL + time_proc("mpfr::mpreal", test_nct<mpfr::mpreal>); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/sf_performance_poly.cpp b/src/boost/libs/multiprecision/performance/sf_performance_poly.cpp new file mode 100644 index 00000000..4c84c835 --- /dev/null +++ b/src/boost/libs/multiprecision/performance/sf_performance_poly.cpp @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "sf_performance.hpp" + +void poly_tests() +{ + // + // 50 digits first: + // + std::cout << "Testing Polynomial Evaluation at 50 digits....." << std::endl; +#if defined(TEST_MPFR) || defined(TEST_MPFR_CLASS) + mpfr_set_default_prec(50 * 1000L / 301L); +#endif +#ifdef TEST_MPREAL + mpfr::mpreal::set_default_prec(50 * 1000L / 301L); +#endif +#ifdef TEST_MPFR + time_proc("mpfr_float_50", test_polynomial<mpfr_float_50>); + time_proc("mpfr_float_50 (no expression templates", test_polynomial<number<mpfr_float_backend<50>, et_off> >); + time_proc("static_mpfr_float_50", test_polynomial<static_mpfr_float_50>); +#endif +#ifdef TEST_MPF + time_proc("mpf_float_50", test_polynomial<mpf_float_50>); + time_proc("mpf_float_50 (no expression templates", test_polynomial<number<gmp_float<50>, et_off> >); +#endif +#ifdef TEST_CPP_DEC_FLOAT + time_proc("cpp_dec_float_50", test_polynomial<cpp_dec_float_50>); +#endif +#ifdef TEST_CPP_BIN_FLOAT + time_proc("cpp_bin_float_50", test_polynomial<cpp_bin_float_50>); +#endif +#ifdef TEST_MPFR_CLASS + time_proc("mpfr_class", test_polynomial<mpfr_class>); +#endif +#ifdef TEST_MPREAL + time_proc("mpfr::mpreal", test_polynomial<mpfr::mpreal>); +#endif + // + // Then 100 digits: + // + std::cout << "Testing Polynomial Evaluation at 100 digits....." << std::endl; +#ifdef TEST_MPFR_CLASS + mpfr_set_default_prec(100 * 1000L / 301L); +#endif +#ifdef TEST_MPREAL + mpfr::mpreal::set_default_prec(100 * 1000L / 301L); +#endif +#ifdef TEST_MPFR + time_proc("mpfr_float_100", test_polynomial<mpfr_float_100>); + time_proc("mpfr_float_100 (no expression templates", test_polynomial<number<mpfr_float_backend<100>, et_off> >); + time_proc("static_mpfr_float_100", test_polynomial<static_mpfr_float_100>); +#endif +#ifdef TEST_MPF + time_proc("mpf_float_100", test_polynomial<mpf_float_100>); + time_proc("mpf_float_100 (no expression templates", test_polynomial<number<gmp_float<100>, et_off> >); +#endif +#ifdef TEST_CPP_DEC_FLOAT + time_proc("cpp_dec_float_100", test_polynomial<cpp_dec_float_100>); +#endif +#ifdef TEST_CPP_BIN_FLOAT + time_proc("cpp_bin_float_100", test_polynomial<cpp_bin_float_100>); +#endif +#ifdef TEST_MPFR_CLASS + time_proc("mpfr_class", test_polynomial<mpfr_class>); +#endif +#ifdef TEST_MPREAL + time_proc("mpfr::mpreal", test_polynomial<mpfr::mpreal>); +#endif +} diff --git a/src/boost/libs/multiprecision/performance/voronoi_performance.cpp b/src/boost/libs/multiprecision/performance/voronoi_performance.cpp new file mode 100644 index 00000000..898ca37d --- /dev/null +++ b/src/boost/libs/multiprecision/performance/voronoi_performance.cpp @@ -0,0 +1,227 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#pragma warning(disable : 4244) +#endif + +#include <boost/polygon/detail/voronoi_predicates.hpp> +#include <boost/polygon/detail/voronoi_structures.hpp> +#include <boost/polygon/detail/skeleton_predicates.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int_distribution.hpp> +#include <vector> +#include <map> +#include <boost/chrono.hpp> +#include <boost/multiprecision/cpp_int.hpp> + +#ifdef TEST_GMP +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif + +#include "arithmetic_backend.hpp" + +typedef boost::polygon::detail::point_2d<boost::int32_t> i_point; + +template <class Clock> +struct stopwatch +{ + typedef typename Clock::duration duration; + stopwatch() + { + m_start = Clock::now(); + } + duration elapsed() + { + return Clock::now() - m_start; + } + void reset() + { + m_start = Clock::now(); + } + + private: + typename Clock::time_point m_start; +}; + +std::vector<i_point> points; +boost::random::mt19937 gen; + +template <class Big> +struct cpp_int_voronoi_traits +{ + typedef boost::int32_t int_type; + typedef boost::int64_t int_x2_type; + typedef boost::uint64_t uint_x2_type; + typedef Big big_int_type; + typedef double fpt_type; + typedef boost::polygon::detail::extended_exponent_fpt<fpt_type> efpt_type; + typedef boost::polygon::detail::ulp_comparison<fpt_type> ulp_cmp_type; + struct to_fpt_converter_type + { + template <class B, boost::multiprecision::expression_template_option ET> + double operator()(const boost::multiprecision::number<B, ET>& val) + { + return val.template convert_to<double>(); + } + double operator()(double val) + { + return val; + } + double operator()(const efpt_type& that) const + { + return that.d(); + } + template <class tag, class Arg1, class Arg2, class Arg3, class Arg4> + double operator()(const boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e) + { + typedef typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type r_t; + r_t r(e); + return r.template convert_to<double>(); + } + }; + struct to_efpt_converter_type + { + template <class B, boost::multiprecision::expression_template_option ET> + efpt_type operator()(const boost::multiprecision::number<B, ET>& val) + { + return efpt_type(val.template convert_to<double>(), 0); + } + efpt_type operator()(double val) + { + return efpt_type(val, 0); + } + template <class tag, class Arg1, class Arg2, class Arg3, class Arg4> + double operator()(const boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e) + { + typedef typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type r_t; + r_t r(e); + return efpt_type(r.template convert_to<double>(), 0); + } + }; +}; + +template <class Big> +struct native_int_voronoi_traits +{ + typedef boost::int32_t int_type; + typedef boost::int64_t int_x2_type; + typedef boost::uint64_t uint_x2_type; + typedef Big big_int_type; + typedef double fpt_type; + typedef boost::polygon::detail::extended_exponent_fpt<fpt_type> efpt_type; + typedef boost::polygon::detail::ulp_comparison<fpt_type> ulp_cmp_type; + struct to_fpt_converter_type + { + template <class T> + double operator()(const T& val) const + { + return val; + } + double operator()(const efpt_type& that) const + { + return that.d(); + } + }; + struct to_efpt_converter_type + { + template <class T> + efpt_type operator()(const T& val) const + { + return efpt_type(val, 0); + } + }; +}; + +std::map<std::string, double> results; +double min_time = (std::numeric_limits<double>::max)(); + +template <class Traits> +double test(const char* name) +{ + typedef boost::polygon::detail::voronoi_predicates<Traits> preds; + typedef boost::polygon::detail::circle_event<boost::int32_t> circle_event; + typedef boost::polygon::detail::site_event<boost::int32_t> site_event; + typedef typename preds::template mp_circle_formation_functor<site_event, circle_event> circle_pred; + + boost::random::uniform_int_distribution<> dist(0, points.size() - 1); + circle_pred pc; + circle_event event; + + stopwatch<boost::chrono::high_resolution_clock> w; + + for (unsigned i = 0; i < 10000; ++i) + { + site_event s1(points[dist(gen)]); + site_event s2(points[dist(gen)]); + site_event s3(points[dist(gen)]); + pc.ppp(s1, s2, s3, event); + pc.pps(s1, s2, s3, 0, event); + pc.pss(s1, s2, s3, 0, event); + pc.sss(s1, s2, s3, event); + } + double d = boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count(); + if (d < min_time) + min_time = d; + results[name] = d; + std::cout << "Time for " << std::setw(30) << std::left << name << " = " << d << std::endl; + return d; +} + +void generate_quickbook() +{ + std::cout << "[table\n[[Integer Type][Relative Performance (Actual time in parenthesis)]]\n"; + + std::map<std::string, double>::const_iterator i(results.begin()), j(results.end()); + + while (i != j) + { + double rel = i->second / min_time; + std::cout << "[[" << i->first << "][" << rel << "(" << i->second << "s)]]\n"; + ++i; + } + + std::cout << "]\n"; +} + +int main() +{ + boost::random::uniform_int_distribution<> dist((std::numeric_limits<boost::int32_t>::min)() / 2, (std::numeric_limits<boost::int32_t>::max)() / 2); + + for (unsigned i = 0; i < 100; ++i) + { + points.push_back(i_point(dist(gen), dist(gen))); + } + + test<boost::polygon::detail::voronoi_ctype_traits<boost::int32_t> >("extended_int"); + + test<cpp_int_voronoi_traits<boost::multiprecision::int256_t> >("int256_t"); + test<cpp_int_voronoi_traits<boost::multiprecision::int512_t> >("int512_t"); + test<cpp_int_voronoi_traits<boost::multiprecision::int1024_t> >("int1024_t"); + + test<cpp_int_voronoi_traits<boost::multiprecision::checked_int256_t> >("checked_int256_t"); + test<cpp_int_voronoi_traits<boost::multiprecision::checked_int512_t> >("checked_int512_t"); + test<cpp_int_voronoi_traits<boost::multiprecision::checked_int1024_t> >("checked_int1024_t"); + + test<cpp_int_voronoi_traits<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<>, boost::multiprecision::et_off> > >("cpp_int"); + +#ifdef TEST_GMP + test<cpp_int_voronoi_traits<boost::multiprecision::number<boost::multiprecision::gmp_int, boost::multiprecision::et_off> > >("mpz_int"); +#endif +#ifdef TEST_TOMMATH + test<cpp_int_voronoi_traits<boost::multiprecision::number<boost::multiprecision::tommath_int, boost::multiprecision::et_off> > >("tom_int"); +#endif + + generate_quickbook(); + + test<native_int_voronoi_traits<boost::int64_t> >("int64_t"); + test<cpp_int_voronoi_traits<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<boost::int64_t>, boost::multiprecision::et_off> > >("number<arithmetic_backend<boost::int64_t>, et_off>"); + //test<cpp_int_voronoi_traits<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<boost::int64_t>, boost::multiprecision::et_on> > >("number<arithmetic_backend<boost::int64_t>, et_on>"); + + return 0; +} diff --git a/src/boost/libs/multiprecision/test/Jamfile.v2 b/src/boost/libs/multiprecision/test/Jamfile.v2 new file mode 100644 index 00000000..ac4d4845 --- /dev/null +++ b/src/boost/libs/multiprecision/test/Jamfile.v2 @@ -0,0 +1,1240 @@ +# copyright John Maddock 2011 +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt. + +import testing ; +import modules ; +import path ; +import ../../config/checks/config : requires ; + +local ntl-path = [ modules.peek : NTL_PATH ] ; +local gmp_path = [ modules.peek : GMP_PATH ] ; +local mpfr_path = [ modules.peek : MPFR_PATH ] ; +local mpfi_path = [ modules.peek : MPFI_PATH ] ; +local tommath_path = [ modules.peek : TOMMATH_PATH ] ; + + +####################################################################################### +# +# NOTE: Because these tests take a fair while to build and run, they are split up into +# multiple smaller test suites which are: +# +# arithmetic_tests +# functions_and_limits +# conversions +# cpp_int_tests +# misc +# specfun +# compile_fail +# concepts +# examples +# +# You can run an individual suite by passing it's name to b2 on the command line. +# Or you can run all except the "specfun" tests (which are very slow) by not specifying anything. +# +# Please make sure that any new tests are added to one of the test suites, and that the +# build times for the various suites are reasonably balanced: otherwise the CI builds +# will time out if one suite contains too many. +# +####################################################################################################### + +path-constant here : . ; + +project : requirements + <include>$(gmp_path) + <include>$(gmp_path)/mpfr + <include>$(gmp_path)/gmpfrxx + <include>$(mpfr_path) + <include>$(mpfi_path) + <include>$(mpfi_path)/src + <include>$(tommath_path) + <include>../include + <include>../../.. + # We set these to make it easier to set up and test GMP and MPFR under Win32: + <toolset>msvc:<runtime-link>static + <toolset>msvc:<link>static + <toolset>msvc:<warnings>all + <toolset>msvc:<cxxflags>/fp\:precise + <toolset>intel-win:<runtime-link>static + <toolset>intel-win:<link>static + <toolset>clang-win:<link>static + + # Assembler error "File too big" caused by lots of C++ templates, for example, math/floating_point_examples.cpp. + # Some projects on some toolsets may require + # <toolset>gcc-mingw:<cxxflags>\"-Wa,-mbig-obj\" + # See https://digitalkarabela.com/mingw-w64-how-to-fix-file-too-big-too-many-sections/ + # <toolset>gcc-mingw:<cxxflags>-Wa,-mbig-obj # Some projects may overflow assembler and require equivalent of MSVC /bigobj. + # Requires version 2.30 of GNU binutils. + # Best applied only to projects that require this, see multiprecision/example run math/floating_point_examples.cpp. + + # Speed up compiles: + <toolset>msvc:<debug-symbols>off + <toolset>intel:<debug-symbols>off + <toolset>gcc:<cxxflags>-Wall + <toolset>gcc:<cxxflags>-Wextra + <toolset>intel:<define>SLOW_COMPILER + <toolset>msvc,<optimization>off:<cxxflags>-RTC1 + # We can't yet enable this - it breaks the STL in some tests... + #<toolset>msvc,<optimization>off:<cxxflags>-RTCc + #<toolset>msvc,<optimization>off:<define>_ALLOW_RTCc_IN_STL + ; + +local enable-specfun = [ MATCH (--enable-specfun) : [ modules.peek : ARGV ] ] ; +local disable-concepts = [ MATCH (--disable-concepts) : [ modules.peek : ARGV ] ] ; + +lib gmp : : <search>$(gmp_path) ; +lib mpfr : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug ; +lib mpfi : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug <search>$(mpfi_path) <search>$(mpfi_path)/src ; +lib quadmath ; +lib mpc ; + +if $(tommath_path) +{ + lib tommath : [ GLOB $(tommath_path) : *.c ] ; + TOMMATH = tommath ; +} +else +{ + lib tommath : : <search>$(tommath_path) ; + TOMMATH = tommath ; +} + +lib no_eh_support : no_eh_test_support.cpp ; + +test-suite arithmetic_tests : + + [ run test_arithmetic_backend_concept.cpp no_eh_support ] + + [ run test_arithmetic_cpp_dec_float_1.cpp no_eh_support ] + [ run test_arithmetic_cpp_dec_float_2.cpp no_eh_support ] + [ run test_arithmetic_cpp_dec_float_3.cpp no_eh_support ] + [ run test_arithmetic_cpp_dec_float_3m.cpp no_eh_support ] + + [ run test_arithmetic_cpp_bin_float_1.cpp no_eh_support ] + [ run test_arithmetic_cpp_bin_float_2.cpp no_eh_support ] + [ run test_arithmetic_cpp_bin_float_2m.cpp no_eh_support ] + [ run test_arithmetic_cpp_bin_float_3.cpp no_eh_support ] + + [ run test_arithmetic_mpf_50.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ run test_arithmetic_mpf.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ run test_arithmetic_mpz.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ run test_arithmetic_mpz_rat.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ run test_arithmetic_mpz_br.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ run test_arithmetic_mpq.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] ] + + [ run test_arithmetic_mpfr.cpp mpfr gmp no_eh_support : : : [ check-target-builds ../config//has_mpfr : : <build>no ] ] + [ run test_arithmetic_mpfr_50.cpp mpfr gmp no_eh_support : : : [ check-target-builds ../config//has_mpfr : : <build>no ] ] + [ run test_arithmetic_mpfr_50_static.cpp mpfr gmp no_eh_support : : : [ check-target-builds ../config//has_mpfr : : <build>no ] ] + + [ run test_arithmetic_tommath.cpp $(TOMMATH) no_eh_support : : : [ check-target-builds ../config//has_tommath : : <build>no ] ] + [ run test_arithmetic_tommath_rat.cpp $(TOMMATH) no_eh_support : : : [ check-target-builds ../config//has_tommath : : <build>no ] ] + [ run test_arithmetic_tommath_br.cpp $(TOMMATH) no_eh_support : : : [ check-target-builds ../config//has_tommath : : <build>no ] ] + + [ run test_arithmetic_cpp_int_1.cpp no_eh_support : : : <toolset>msvc:<cxxflags>-bigobj ] + [ run test_arithmetic_cpp_int_2.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_3.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_4.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_5.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_6.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_7.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_8.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_9.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_10.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_11.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_12.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_13.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_14.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_15.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_16.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_17.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_18.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_19.cpp no_eh_support ] + [ run test_arithmetic_cpp_int_br.cpp no_eh_support ] + + [ run test_arithmetic_ab_1.cpp no_eh_support ] + [ run test_arithmetic_ab_2.cpp no_eh_support ] + [ run test_arithmetic_ab_3.cpp no_eh_support ] + + [ run test_cpp_dec_float_round.cpp no_eh_support ] + + [ run test_arithmetic_logged_1.cpp no_eh_support ] + [ run test_arithmetic_logged_2.cpp no_eh_support ] + + [ run test_arithmetic_dbg_adptr1.cpp no_eh_support ] + [ run test_arithmetic_dbg_adptr1m.cpp no_eh_support ] + [ run test_arithmetic_dbg_adptr2.cpp no_eh_support ] + + [ run test_arithmetic_mpfi_50.cpp mpfi mpfr gmp no_eh_support : : : [ check-target-builds ../config//has_mpfi : : <build>no ] ] + + [ run test_arithmetic_float_128.cpp quadmath no_eh_support : : : [ check-target-builds ../config//has_float128 : : <build>no ] ] + [ run test_arithmetic_float_128.cpp no_eh_support : : : [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] : test_arithmetic_intel_quad ] + + [ run test_arithmetic_mpc.cpp mpc mpfr gmp : : : [ check-target-builds ../config//has_mpc : : <build>no ] ] + [ run test_mpfr_mpc_precisions.cpp mpc mpfr gmp : : : [ check-target-builds ../config//has_mpc : : <build>no ] ] + [ run test_mpfi_precisions.cpp mpfi mpfr gmp : : : [ check-target-builds ../config//has_mpfi : : <build>no ] ] + [ run test_mpf_precisions.cpp gmp : : : [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ run test_complex.cpp : : : [ check-target-builds ../config//has_mpc : <define>TEST_MPC <source>mpc <source>mpfr <source>gmp ] [ check-target-builds ../config//has_float128 : <source>quadmath ] ] + [ run test_arithmetic_complex_adaptor.cpp ] + [ run test_arithmetic_complex_adaptor_2.cpp ] + [ run test_arithmetic_complex128.cpp : : : [ check-target-builds ../config//has_float128 : <source>quadmath ] ] + +; + +rule get_function_tests +{ + local result ; + for local source in test_exp.cpp test_log.cpp test_pow.cpp test_sinh.cpp test_sqrt.cpp test_cosh.cpp test_tanh.cpp test_sin.cpp test_cos.cpp test_tan.cpp test_asin.cpp test_acos.cpp test_atan.cpp test_round.cpp test_fpclassify.cpp test_sf_import_c99.cpp + { + result += [ run $(source) gmp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] + <define>TEST_MPF_50 + : $(source:B)_mpf50 ] ; + result += [ run $(source) mpfr gmp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_mpfr : : <build>no ] + <define>TEST_MPFR_50 + : $(source:B)_mpfr50 ] ; + result += [ run $(source) mpfi mpfr gmp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_mpfi : : <build>no ] + <define>TEST_MPFI_50 + : $(source:B)_mpfi50 ] ; + result += [ run $(source) no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_CPP_DEC_FLOAT + : $(source:B)_cpp_dec_float ] ; + result += [ run $(source) no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_CPP_BIN_FLOAT + : $(source:B)_cpp_bin_float ] ; + result += [ run $(source) quadmath no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_float128 : : <build>no ] + <define>TEST_FLOAT128 + : $(source:B)_float128 ] ; + result += [ run $(source) no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] + <define>TEST_FLOAT128 + : $(source:B)_intel_quad ] ; + } + return $(result) ; +} + +test-suite functions_and_limits : + + [ run test_numeric_limits.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_BACKEND + : test_numeric_limits_backend_concept ] + + [ run test_numeric_limits.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPF_50 + [ check-target-builds ../config//has_gmp : : <build>no ] + : test_numeric_limits_mpf50 ] + + [ run test_numeric_limits.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPF + [ check-target-builds ../config//has_gmp : : <build>no ] + : test_numeric_limits_mpf ] + + [ run test_numeric_limits.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPZ + [ check-target-builds ../config//has_gmp : : <build>no ] + : test_numeric_limits_mpz ] + + [ run test_numeric_limits.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPQ + [ check-target-builds ../config//has_gmp : : <build>no ] + : test_numeric_limits_mpq ] + + [ run test_numeric_limits.cpp mpfr gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPFR + [ check-target-builds ../config//has_mpfr : : <build>no ] + : test_numeric_limits_mpfr ] + + [ run test_numeric_limits.cpp mpfr gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPFR_50 + [ check-target-builds ../config//has_mpfr : : <build>no ] + : test_numeric_limits_mpfr_50 ] + + [ run test_numeric_limits.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_CPP_DEC_FLOAT + : test_numeric_limits_cpp_dec_float ] + + [ run test_numeric_limits.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_CPP_BIN_FLOAT + : test_numeric_limits_cpp_bin_float ] + + [ run test_numeric_limits.cpp $(TOMMATH) no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_TOMMATH + [ check-target-builds ../config//has_tommath : : <build>no ] + : test_numeric_limits_tommath ] + + [ run test_numeric_limits.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_CPP_INT + : test_numeric_limits_cpp_int ] + + [ run test_numeric_limits.cpp mpfi mpfr gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPFI_50 + [ check-target-builds ../config//has_mpfi : : <build>no ] + : test_numeric_limits_mpfi_50 ] + + + [ run test_numeric_limits.cpp quadmath no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_FLOAT128 + [ check-target-builds ../config//has_float128 : : <build>no ] + : test_numeric_limits_float128 ] + [ run test_numeric_limits.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_FLOAT128 + [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] + : test_numeric_limits_intel_quad ] + + [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_DEC_FLOAT_2 : test_sf_import_c99_cpp_dec_float_2 ] + [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_DEC_FLOAT_3 : test_sf_import_c99_cpp_dec_float_3 ] + [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_DEC_FLOAT_4 : test_sf_import_c99_cpp_dec_float_4 ] + [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_DEC_FLOAT_5 : test_sf_import_c99_cpp_dec_float_5 ] + [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_DEC_FLOAT_6 : test_sf_import_c99_cpp_dec_float_6 ] + + [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_BIN_FLOAT_2 : test_sf_import_c99_cpp_bin_float_2 ] + [ run test_sf_import_c99.cpp : : : <define>TEST_CPP_BIN_FLOAT_2 : test_sf_import_c99_cpp_bin_float_3 ] + + [ run test_move.cpp mpfr gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPFR + [ check-target-builds ../config//has_mpfr : : <build>no ] + : test_move_mpfr ] + + [ run test_move.cpp mpc mpfr gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPC + [ check-target-builds ../config//has_mpc : : <build>no ] + : test_move_mpc ] + + [ run test_move.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_GMP + [ check-target-builds ../config//has_gmp : : <build>no ] + : test_move_gmp ] + + [ run test_move.cpp $(TOMMATH) no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_TOMMATH + [ check-target-builds ../config//has_tommath : : <build>no ] + : test_move_tommath ] + + [ run test_move.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_CPP_INT + : test_move_cpp_int ] + + [ get_function_tests ] +; + +test-suite conversions : + + [ run test_gmp_conversions.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] ] + + [ run test_mpfr_conversions.cpp gmp mpfr no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_mpfr : : <build>no ] ] + + [ run test_mpc_conversions.cpp gmp mpfr mpc no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_mpc : : <build>no ] ] + + [ run test_constants.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPF_50 + [ check-target-builds ../config//has_gmp : : <build>no ] + : test_constants_mpf50 ] + + [ run test_constants.cpp mpfr gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPFR_50 + [ check-target-builds ../config//has_mpfr : : <build>no ] + : test_constants_mpfr_50 ] + + [ run test_constants.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_CPP_DEC_FLOAT + : test_constants_cpp_dec_float ] + + + [ run test_test.cpp ] + [ run test_cpp_int_lit.cpp no_eh_support ] + + # + # Interconversion tests: + # + [ run test_convert_from_cpp_int.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_mpz_int.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_tom_int.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_cpp_rational.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_gmp_rational.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_tom_rational.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_cpp_bin_float.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_cpp_dec_float.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_mpf_float.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_mpfr_float.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_mpfi_float.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + [ run test_convert_from_float128.cpp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>HAS_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>HAS_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>HAS_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>HAS_TOMMATH <source>tommath : ] + [ check-target-builds ../config//has_float128 : <define>HAS_FLOAT128 <source>quadmath : ] + ] + + [ run test_cpp_bin_float_conv.cpp ] + + [ run test_cpp_bin_float_io.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono + : # command line + : # input files + : # requirements + <define>TEST_CPP_BIN_FLOAT + <define>TEST1 + release # Otherwise [ runtime is slow + : test_cpp_bin_float_io_1 + ] + + [ run test_cpp_bin_float_io.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono + : # command line + : # input files + : # requirements + <define>TEST_CPP_BIN_FLOAT + <define>TEST2 + release # Otherwise [ runtime is slow + : test_cpp_bin_float_io_2 + ] + + [ run test_cpp_bin_float.cpp no_eh_support mpfr gmp /boost/system//boost_system /boost/chrono//boost_chrono + : # command line + : # input files + : # requirements + <define>TEST_MPFR + [ check-target-builds ../config//has_mpfr : : <build>no ] + release # Otherwise [ runtime is slow + ] + + [ run test_float_io.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_CPP_DEC_FLOAT + release # Otherwise [ runtime is slow + : test_float_io_cpp_dec_float ] + + [ run test_float_io.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPF_50 + release # Otherwise [ runtime is slow + [ check-target-builds ../config//has_gmp : : <build>no ] + : test_float_io_mpf ] + + [ run test_float_io.cpp mpfr gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPFR_50 + release # Otherwise [ runtime is slow + [ check-target-builds ../config//has_mpfr : : <build>no ] + : test_float_io_mpfr ] + + [ run test_float_io.cpp mpfi mpfr gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPFI_50 + release # Otherwise [ runtime is slow + [ check-target-builds ../config//has_mpfi : : <build>no ] + : test_float_io_mpfi ] + + [ run test_float_io.cpp quadmath no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_FLOAT128 + release # Otherwise [ runtime is slow + [ check-target-builds ../config//has_float128 : : <build>no ] + : test_float_io_float128 ] + [ run test_float_io.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_FLOAT128 + release # Otherwise [ runtime is slow + [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] + : test_float_io_intel_quad ] + + [ run test_int_io.cpp no_eh_support $(TOMMATH) + : # command line + : # input files + : # requirements + <define>TEST_TOMMATH + release # Otherwise [ runtime is slow + [ check-target-builds ../config//has_tommath : : <build>no ] + : test_int_io_tommath ] + + [ run test_int_io.cpp no_eh_support gmp + : # command line + : # input files + : # requirements + <define>TEST_MPZ + release # Otherwise [ runtime is slow + [ check-target-builds ../config//has_gmp : : <build>no ] + : test_int_io_mpz ] + +; + + +test-suite cpp_int_tests : + + [ run test_int_io.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_CPP_INT + release # Otherwise [ runtime is slow + : test_int_io_cpp_int ] + + [ run test_cpp_int_left_shift.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] + release # otherwise [ runtime is too slow!! + ] + + [ run test_cpp_int.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] + release # otherwise [ runtime is too slow!! + <define>TEST1 + : test_cpp_int_1 + ] + + [ run test_cpp_int.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] + release # otherwise [ runtime is too slow!! + <define>TEST2 + : test_cpp_int_2 + ] + + [ run test_cpp_int.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] + release # otherwise [ runtime is too slow!! + <define>TEST3 + : test_cpp_int_3 + ] + + [ run test_cpp_int.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] + release # otherwise [ runtime is too slow!! + <define>TEST4 + : test_cpp_int_4 + ] + + [ run test_cpp_int.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] + release # otherwise [ runtime is too slow!! + <define>TEST5 + : test_cpp_int_5 + ] + + [ run test_checked_cpp_int.cpp no_eh_support ] + [ run test_unchecked_cpp_int.cpp no_eh_support : : : release ] + + [ run test_cpp_int_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST1 <toolset>gcc-mingw:<link>static : test_cpp_int_serial_1 ] + [ run test_cpp_int_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST2 <toolset>gcc-mingw:<link>static : test_cpp_int_serial_2 ] + [ run test_cpp_int_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST3 <toolset>gcc-mingw:<link>static : test_cpp_int_serial_3 ] + [ run test_cpp_int_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST4 <toolset>gcc-mingw:<link>static : test_cpp_int_serial_4 ] + [ run test_cpp_int_deserial.cpp ../../serialization/build//boost_serialization ../../filesystem/build//boost_filesystem : $(here)/serial_txts : : release <toolset>gcc-mingw:<link>static ] + [ run test_cpp_rat_serial.cpp ../../serialization/build//boost_serialization : : : release <toolset>gcc-mingw:<link>static ] + +; + +test-suite misc : + + [ compile test_constexpr.cpp : + [ check-target-builds ../config//has_float128 : <define>HAVE_FLOAT128 : ] + [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type <define>HAVE_FLOAT128 : ] + [ requires cxx11_constexpr cxx11_user_defined_literals ] ] + + [ compile constexpr_test_arithmetic_backend.cpp : + [ requires cxx14_constexpr cxx17_if_constexpr ] ] + [ compile constexpr_test_float128.cpp : + [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_float128 : <source>quadmath : <build>no ] ] + + [ run constexpr_test_cpp_int.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ] + [ run constexpr_test_cpp_int_2.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ] + [ run constexpr_test_cpp_int_3.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ] + [ run constexpr_test_cpp_int_4.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ] + [ run constexpr_test_cpp_int_5.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : : <build>no ] ] + [ run constexpr_test_cpp_int_6.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : <toolset>clang:<cxxflags>-fconstexpr-steps=268435456 : <build>no ] [ check-target-builds ../config//has_constexpr_limits : <cxxflags>-fconstexpr-ops-limit=268435456 ] ] + [ run constexpr_test_cpp_int_7.cpp : : : [ requires cxx14_constexpr cxx17_if_constexpr ] [ check-target-builds ../config//has_is_constant_evaluated : <toolset>clang:<cxxflags>-fconstexpr-steps=268435456 : <build>no ] ] + + [ compile test_nothrow_cpp_int.cpp ] + [ compile test_nothrow_cpp_rational.cpp ] + [ compile test_nothrow_cpp_bin_float.cpp ] + [ compile test_nothrow_cpp_dec_float.cpp ] + [ compile test_nothrow_float128.cpp : [ check-target-builds ../config//has_float128 : : <build>no ] ] + [ compile test_nothrow_gmp.cpp : [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ compile test_nothrow_mpfr.cpp : [ check-target-builds ../config//has_mpfr : : <build>no ] ] + + [ run test_miller_rabin.cpp no_eh_support gmp + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] + release # otherwise [ runtime is too slow!! + ] + + [ run test_rational_io.cpp $(TOMMATH) no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_TOMMATH + [ check-target-builds ../config//has_tommath : : <build>no ] + release # Otherwise [ runtime is slow + : test_rational_io_tommath ] + + [ run test_rational_io.cpp gmp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_MPQ + [ check-target-builds ../config//has_gmp : : <build>no ] + release # Otherwise [ runtime is slow + : test_rational_io_mpz ] + + [ run test_rational_io.cpp no_eh_support + : # command line + : # input files + : # requirements + <define>TEST_CPP_INT + release # Otherwise [ runtime is slow + : test_rational_io_cpp_int ] + + [ run test_generic_conv.cpp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>TEST_GMP <source>gmp : ] + [ check-target-builds ../config//has_tommath : <define>TEST_TOMMATH <source>$(TOMMATH) : ] + [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>mpfr : ] + release # Otherwise [ runtime is slow + ] + + [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono + : # command line + : # input files + : # requirements + <define>TEST1 + release + : test_rat_float_interconv_1 ] + + [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono + : # command line + : # input files + : # requirements + <define>TEST2 + release + : test_rat_float_interconv_2 ] + + [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono + : # command line + : # input files + : # requirements + <define>TEST3 + release + : test_rat_float_interconv_3 ] + + [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono + : # command line + : # input files + : # requirements + <define>TEST4 + release + : test_rat_float_interconv_4 ] + + [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono mpfr gmp + : # command line + : # input files + : # requirements + <define>TEST5 + [ check-target-builds ../config//has_mpfr : : <build>no ] + release + : test_rat_float_interconv_5 ] + + [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono mpfr gmp + : # command line + : # input files + : # requirements + <define>TEST6 + [ check-target-builds ../config//has_mpfr : : <build>no ] + release + : test_rat_float_interconv_6 ] + + [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono mpfr gmp + : # command line + : # input files + : # requirements + <define>TEST7 + [ check-target-builds ../config//has_mpfr : : <build>no ] + release + : test_rat_float_interconv_7 ] + + [ run test_rat_float_interconv.cpp no_eh_support /boost/system//boost_system /boost/chrono//boost_chrono mpfr gmp + : # command line + : # input files + : # requirements + <define>TEST8 + [ check-target-builds ../config//has_mpfr : : <build>no ] + release + : test_rat_float_interconv_8 ] + + [ run test_cpp_int_conv.cpp no_eh_support ] + [ run test_cpp_int_import_export.cpp no_eh_support ] + [ run test_native_integer.cpp no_eh_support ] + + [ run test_mixed_cpp_int.cpp no_eh_support ] + [ run test_mixed_float.cpp no_eh_support + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : <define>TEST_GMP <library>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <library>mpfr <library>gmp : ] ] + [ compile include_test/mpfr_include_test.cpp + : # requirements + [ check-target-builds ../config//has_mpfr : : <build>no ] ] + [ compile include_test/gmp_include_test.cpp + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ compile include_test/tommath_include_test.cpp + : # requirements + [ check-target-builds ../config//has_tommath : : <build>no ] ] + [ compile include_test/cpp_int_include_test.cpp ] + [ compile include_test/cpp_dec_float_include_test.cpp ] + [ compile include_test/cpp_bin_float_include_test.cpp ] + + [ run ublas_interop/test1.cpp ublas_interop/test11.cpp ublas_interop/test12.cpp ublas_interop/test13.cpp no_eh_support ] + [ run ublas_interop/test2.cpp ublas_interop/test21.cpp ublas_interop/test22.cpp ublas_interop/test23.cpp no_eh_support ] + #[ run ublas_interop/test3.cpp ublas_interop/test31.cpp ublas_interop/test32.cpp ublas_interop/test33.cpp ] + [ run ublas_interop/test4.cpp ublas_interop/test42.cpp ublas_interop/test43.cpp no_eh_support ] + [ run ublas_interop/test5.cpp ublas_interop/test52.cpp ublas_interop/test53.cpp no_eh_support ] + [ run ublas_interop/test6.cpp ublas_interop/test62.cpp ublas_interop/test63.cpp no_eh_support ] + #[ run ublas_interop/test7.cpp ublas_interop/test71.cpp ublas_interop/test72.cpp ublas_interop/test73.cpp ] + + [ run ublas_interop/test1.cpp ublas_interop/test11.cpp ublas_interop/test12.cpp ublas_interop/test13.cpp no_eh_support : : : <define>TEST_ET=1 : ublas1_et ] + [ run ublas_interop/test2.cpp ublas_interop/test21.cpp ublas_interop/test22.cpp ublas_interop/test23.cpp no_eh_support : : : <define>TEST_ET=1 : ublas2_et ] + #[ run ublas_interop/test3.cpp ublas_interop/test31.cpp ublas_interop/test32.cpp ublas_interop/test33.cpp : : : <define>TEST_ET=1 : ublas3_et ] + [ run ublas_interop/test4.cpp ublas_interop/test42.cpp ublas_interop/test43.cpp no_eh_support : : : <define>TEST_ET=1 : ublas3_et ] + [ run ublas_interop/test5.cpp ublas_interop/test52.cpp ublas_interop/test53.cpp no_eh_support : : : <define>TEST_ET=1 : ublas4_et ] + [ run ublas_interop/test6.cpp ublas_interop/test62.cpp ublas_interop/test63.cpp no_eh_support : : : <define>TEST_ET=1 : ublas5_et ] + #[ run ublas_interop/test7.cpp ublas_interop/test71.cpp ublas_interop/test72.cpp ublas_interop/test73.cpp : : : <define>TEST_ET=1 : ublas6_et ] + + # + # Serialization tests, run in release mode so we cycle through more values: + # + [ run test_adapt_serial.cpp ../../serialization/build//boost_serialization : : : release <toolset>gcc-mingw:<link>static ] + [ run test_cpp_dec_float_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST1 <toolset>gcc-mingw:<link>static : test_cpp_dec_float_serial_1 ] + [ run test_cpp_dec_float_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST2 <toolset>gcc-mingw:<link>static : test_cpp_dec_float_serial_2 ] + [ run test_float128_serial.cpp ../../serialization/build//boost_serialization quadmath : : : release <toolset>gcc-mingw:<link>static [ check-target-builds ../config//has_float128 : : <build>no ] ] + [ run test_cpp_bin_float_serial.cpp ../../serialization/build//boost_serialization : : : release <toolset>gcc-mingw:<link>static <define>TEST1 : test_bin_dec_float_serial_1 ] + [ run test_cpp_bin_float_serial.cpp ../../serialization/build//boost_serialization : : : release <define>TEST2 <toolset>gcc-mingw:<link>static : test_bin_dec_float_serial_2 ] + + # + # Mixed mode comparison tests, see: https://svn.boost.org/trac/boost/ticket/11328 + # + [ run test_checked_mixed_cpp_int.cpp no_eh_support ] + [ run test_mixed_cpp_bin_float.cpp no_eh_support ] + [ run test_mixed_cpp_dec_float.cpp no_eh_support ] + [ run test_mixed_mpf_float.cpp gmp no_eh_support : : : [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ run test_mixed_mpfr_float.cpp mpfr gmp no_eh_support : : : [ check-target-builds ../config//has_mpfr : : <build>no ] ] + # + # Check for narrowing conversions: + # + [ run test_float_conversions.cpp no_eh_support ] + # + # specific bug cases: + # + [ compile bug11922.cpp ] + [ run bug12039.cpp no_eh_support ] + [ compile git_issue_30.cpp ] + [ compile git_issue_98.cpp : + [ check-target-builds ../config//has_float128 : <define>TEST_FLOAT128 <source>quadmath : ] + [ check-target-builds ../config//has_gmp : <define>TEST_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpc : <define>TEST_MPC <source>gmp <source>mpfr <source>mpc : ] ] + [ run issue_13301.cpp ] + [ run issue_13148.cpp ] + [ run test_hash.cpp : : : + [ check-target-builds ../config//has_float128 : <define>TEST_FLOAT128 <source>quadmath : ] + [ check-target-builds ../config//has_gmp : <define>TEST_GMP <source>gmp : ] + [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>gmp <source>mpfr : ] + [ check-target-builds ../config//has_mpfi : <define>TEST_MPFI <source>gmp <source>mpfr <source>mpfi : ] + [ check-target-builds ../config//has_tommath : <define>TEST_TOMMATH <source>tommath : ] + ] + [ run test_optional_compat.cpp ] + # + # Eigen interoperability: + # + [ run test_eigen_interop_cpp_int.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ] + [ run test_eigen_interop_cpp_dec_float.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ] + [ run test_eigen_interop_cpp_dec_float_2.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ] + [ run test_eigen_interop_cpp_dec_float_3.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ] + [ run test_eigen_interop_cpp_bin_float_1.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ] + [ run test_eigen_interop_cpp_bin_float_2.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ] + [ run test_eigen_interop_cpp_bin_float_3.cpp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] ] + [ run test_eigen_interop_mpfr_1.cpp mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpfr : : <build>no ] ] + [ run test_eigen_interop_mpfr_2.cpp mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpfr : : <build>no ] ] + [ run test_eigen_interop_mpfr_3.cpp mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpfr : : <build>no ] ] + [ run test_eigen_interop_gmp.cpp gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_gmp : : <build>no ] ] + [ run test_eigen_interop_mpc.cpp mpc mpfr gmp : : : release [ check-target-builds ../config//has_eigen : : <build>no ] [ check-target-builds ../config//has_mpc : : <build>no ] ] +; + + +# +# This take too long to run as a regular part of the tests: +# +run test_cpp_bin_float_round.cpp mpfr gmp ; +explicit test_cpp_bin_float_round ; + +rule get_specfun_tests +{ + local result ; + for local source in [ glob math/*.cpp ] + { + result += [ run $(source) mpfr gmp + /boost/test//boost_unit_test_framework/<link>static + /boost/regex//boost_regex/<link>static + math/instances//test_instances_mpfr/<link>static + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_mpfr : : <build>no ] + <define>TEST_MPFR_50 + <optimization>speed + <define>BOOST_ALL_NO_LIB + <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE + <toolset>msvc:<cxxflags>-bigobj + <include>../../math/include_private + release + : $(source:B)_mpfr ] ; + result += [ run $(source) gmp + /boost/test//boost_unit_test_framework/<link>static + /boost/regex//boost_regex/<link>static + math/instances//test_instances_mpf/<link>static + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_gmp : : <build>no ] + <optimization>speed + <define>TEST_MPF_50 + <define>BOOST_ALL_NO_LIB + <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE + <toolset>msvc:<cxxflags>-bigobj + <include>../../math/include_private + release + : $(source:B)_mpf ] ; + result += [ run $(source) /boost/test//boost_unit_test_framework/<link>static + /boost/regex//boost_regex/<link>static + math/instances//test_instances_cpp_dec_float/<link>static + : # command line + : # input files + : # requirements + <define>TEST_CPP_DEC_FLOAT + <define>BOOST_ALL_NO_LIB + <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE + <optimization>speed + <toolset>msvc:<cxxflags>-bigobj + <include>../../math/include_private + release + : $(source:B)_cpp_dec_float ] ; + result += [ run $(source) /boost/test//boost_unit_test_framework/<link>static + /boost/regex//boost_regex/<link>static + math/instances//test_instances_cpp_bin_float/<link>static + : # command line + : # input files + : # requirements + <define>TEST_CPP_BIN_FLOAT + <define>BOOST_ALL_NO_LIB + <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE + <optimization>speed + <toolset>msvc:<cxxflags>-bigobj + <include>../../math/include_private + release + : $(source:B)_cpp_bin_float ] ; + result += [ run $(source) quadmath + /boost/test//boost_unit_test_framework/<link>static + /boost/regex//boost_regex/<link>static + math/instances//test_instances_float128/<link>static + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_float128 : : <build>no ] + <optimization>speed + <define>TEST_FLOAT128 + <define>BOOST_ALL_NO_LIB + <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE + <toolset>msvc:<cxxflags>-bigobj + <include>../../math/include_private + release + : $(source:B)_float128 ] ; + result += [ run $(source) + /boost/test//boost_unit_test_framework/<link>static + /boost/regex//boost_regex/<link>static + math/instances//test_instances_intel_quad/<link>static + : # command line + : # input files + : # requirements + [ check-target-builds ../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] [ check-target-builds ../config//has_float128 : <source>quadmath ] + <optimization>speed + <define>TEST_FLOAT128 + <define>BOOST_ALL_NO_LIB + <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE + <toolset>msvc:<cxxflags>-bigobj + <include>../../math/include_private + release + : $(source:B)_intel_quad ] ; + } + # + # High precision tests are rather different, as they test only one + # multiprecision type and are more a test of Boost.Math: + # + for local source in [ glob math/high_prec/*.cpp ] + { + result += [ run $(source) + /boost/test//boost_unit_test_framework/<link>static + /boost/regex//boost_regex/<link>static + : # command line + : # input files + : # requirements + <optimization>speed + <define>BOOST_ALL_NO_LIB + <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE + <toolset>msvc:<cxxflags>-bigobj + [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <source>gmp <source>mpfr : ] + <include>../../math/include_private + release ] ; + } + return $(result) ; +} + +test-suite specfun : [ get_specfun_tests ] ; +explicit specfun ; + +rule get_compile_fail_tests +{ + + local compile_fail_tests ; + + for local source in [ glob compile_fail/*.cpp ] + { + compile_fail_tests += $(source:B) ; + compile-fail $(source) + : + [ check-target-builds ../config//has_gmp : <define>TEST_GMP <debug-symbols>off : ] + [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR <debug-symbols>off : ] + ; + } + return $(compile_fail_tests) ; +} + +test-suite compile_fail : [ get_compile_fail_tests ] ; + +rule get_concept_checks +{ + local result ; + for local source in [ glob concepts/*.cpp ] + { + + result += [ compile $(source) mpfr + : # requirements + <define>TEST_MPFR_50 + [ check-target-builds ../config//has_mpfr : : <build>no ] + <debug-symbols>off + <optimization>space + : $(source:B)_mpfr_50 ] ; + + result += [ compile $(source) mpfr + : # requirements + <define>TEST_MPFR_6 + [ check-target-builds ../config//has_mpfr : : <build>no ] + <debug-symbols>off + <optimization>space + : $(source:B)_mpfr_6 ] ; + + result += [ compile $(source) mpfr + : # requirements + <define>TEST_MPFR_15 + [ check-target-builds ../config//has_mpfr : : <build>no ] + <debug-symbols>off + <optimization>space + : $(source:B)_mpfr_15 ] ; + + result += [ compile $(source) mpfr + : # requirements + <define>TEST_MPFR_17 + [ check-target-builds ../config//has_mpfr : : <build>no ] + <debug-symbols>off + <optimization>space + : $(source:B)_mpfr_17 ] ; + + result += [ compile $(source) mpfr + : # requirements + <define>TEST_MPFR_30 + [ check-target-builds ../config//has_mpfr : : <build>no ] + <debug-symbols>off + <optimization>space + : $(source:B)_mpfr_30 ] ; + + result += [ compile $(source) gmp + : # requirements + <define>TEST_MPF_50 + [ check-target-builds ../config//has_gmp : : <build>no ] + <debug-symbols>off + <optimization>space + : $(source:B)_mpf50 ] ; + + result += [ compile $(source) + : # requirements + <define>TEST_CPP_DEC_FLOAT + <debug-symbols>off + <optimization>space + : $(source:B)_cpp_dec_float ] ; + + result += [ compile $(source) + : # requirements + <define>TEST_CPP_BIN_FLOAT + <debug-symbols>off + <optimization>space + : $(source:B)_cpp_bin_float ] ; + + result += [ compile $(source) + : # requirements + <define>TEST_CPP_DEC_FLOAT_NO_ET + <debug-symbols>off + <optimization>space + : $(source:B)_cpp_dec_float_no_et ] ; + + result += [ compile $(source) + : # requirements + <define>TEST_BACKEND + <debug-symbols>off + <optimization>space + : $(source:B)_backend_concept ] ; + + result += [ compile $(source) + : # requirements + <define>TEST_LOGGED_ADAPTER + <debug-symbols>off + <optimization>space + : $(source:B)_logged_adaptor ] ; + } + return $(result) ; +} + +test-suite concepts : [ get_concept_checks ] ; + +test-suite examples : ../example//examples ; diff --git a/src/boost/libs/multiprecision/test/bug11922.cpp b/src/boost/libs/multiprecision/test/bug11922.cpp new file mode 100644 index 00000000..c615ba52 --- /dev/null +++ b/src/boost/libs/multiprecision/test/bug11922.cpp @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <memory> + +#if defined(__apple_build_version__) && (__clang_major__ < 9) +// +// Apples clang fails with: +// error: no matching function for call to '__implicit_conversion_to' +// Which is nothing to do with us really... +// +#define DISABLE_TEST +#endif + +typedef boost::multiprecision::cpp_int mp_int; + +#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) && !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(DISABLE_TEST) + +class Int1 +{ + public: + Int1(const mp_int& i) {} + Int1(const Int1& i) {} +}; + +class Int2 +{ + public: + Int2(const mp_int& i) {} + Int2(const Int2& i) = delete; +}; + +int main() +{ + using namespace boost::multiprecision; + + mp_int i(10); + Int1 a(i + 10); + Int2 b(i + 20); + +#ifndef BOOST_NO_CXX11_SMART_PTR + + std::shared_ptr<Int1> p1 = std::make_shared<Int1>(i + 10); + std::shared_ptr<Int2> p2 = std::make_shared<Int2>(i + 10); + +#endif + + return 0; +} + +#else + +int main() +{ + return 0; +} + +#endif diff --git a/src/boost/libs/multiprecision/test/bug12039.cpp b/src/boost/libs/multiprecision/test/bug12039.cpp new file mode 100644 index 00000000..173570df --- /dev/null +++ b/src/boost/libs/multiprecision/test/bug12039.cpp @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_bin_float.hpp> + +int main() +{ + typedef boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<256> > ext_float_t; + typedef boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<2046> > long_ext_float_t; + + ext_float_t x = 5e15; + x += 0.5; + ext_float_t x1 = x + 255.0 / (1 << 20); // + 2^-12 - eps + ext_float_t x2 = x + 257.0 / (1 << 20); // + 2^-12 + eps + double d1 = x1.convert_to<double>(); + double d2 = x2.convert_to<double>(); + + std::cout << std::setprecision(18) << d1 << std::endl; + std::cout << std::setprecision(18) << d2 << std::endl; + + x = 1e7 + 0.5; + x1 = x + ldexp(255.0, -38); // + 2^-30 - eps + x2 = x + ldexp(257.0, -38); // + 2^-30 + eps + float f1 = x1.convert_to<float>(); + float f2 = x2.convert_to<float>(); + + std::cout << std::setprecision(9) << f1 << std::endl; + std::cout << std::setprecision(9) << f2 << std::endl; + + long_ext_float_t lf(1); + lf += std::numeric_limits<long_ext_float_t>::epsilon(); + lf += std::numeric_limits<float>::epsilon() / 2; + BOOST_ASSERT(lf != 1); + float f3 = lf.convert_to<float>(); + std::cout << std::setprecision(9) << f3 << std::endl; + + return (d1 == d2) && (f1 == f2) && (f3 != 1) ? 0 : 1; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_01.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_01.cpp new file mode 100644 index 00000000..c5edc3b0 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_01.cpp @@ -0,0 +1,17 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +void foo(cpp_int i) +{ +} + +int main() +{ + foo(2.3); // conversion from float is explicit +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_02.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_02.cpp new file mode 100644 index 00000000..79ffff2f --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_02.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i == 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_03.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_03.cpp new file mode 100644 index 00000000..0fe89320 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_03.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i != 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_04.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_04.cpp new file mode 100644 index 00000000..6bd72119 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_04.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i <= 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_05.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_05.cpp new file mode 100644 index 00000000..23f49022 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_05.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i >= 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_06.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_06.cpp new file mode 100644 index 00000000..78fea0f7 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_06.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i > 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_07.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_07.cpp new file mode 100644 index 00000000..af4286f4 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_07.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i < 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_08.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_08.cpp new file mode 100644 index 00000000..aa2baa64 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_08.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i = 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_09.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_09.cpp new file mode 100644 index 00000000..29ce8b7b --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_09.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i += 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_10.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_10.cpp new file mode 100644 index 00000000..d4376a2b --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_10.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i -= 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_11.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_11.cpp new file mode 100644 index 00000000..b07a8b89 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_11.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i *= 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_12.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_12.cpp new file mode 100644 index 00000000..fbaf8fae --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_12.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i /= 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_13.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_13.cpp new file mode 100644 index 00000000..1d705e7f --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_13.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i %= 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_14.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_14.cpp new file mode 100644 index 00000000..54b86232 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_14.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i |= 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_15.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_15.cpp new file mode 100644 index 00000000..e225a870 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_15.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i ^= 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_16.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_16.cpp new file mode 100644 index 00000000..0ba8c25b --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_16.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 2; + i &= 2.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_18.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_18.cpp new file mode 100644 index 00000000..451d702f --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_18.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + cpp_int i(2); + i = a; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_20.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_20.cpp new file mode 100644 index 00000000..f75ecff9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_20.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + cpp_int i(3); + i = a * b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_21.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_21.cpp new file mode 100644 index 00000000..b8de1e2f --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_21.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + cpp_int i(3); + i += a * b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_22.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_22.cpp new file mode 100644 index 00000000..b16bda19 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_22.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + cpp_int i(3); + i -= a * b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_23.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_23.cpp new file mode 100644 index 00000000..35a5288e --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_23.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + cpp_int i(3); + i *= a * b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_24.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_24.cpp new file mode 100644 index 00000000..5b7daa2c --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_24.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + cpp_int i(3); + i /= a * b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_25.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_25.cpp new file mode 100644 index 00000000..80de61c9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_25.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + cpp_int i(3); + i %= a * b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_26.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_26.cpp new file mode 100644 index 00000000..5b27aa53 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_26.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + cpp_int i(3); + i &= a * b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_27.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_27.cpp new file mode 100644 index 00000000..43bddb93 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_27.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + cpp_int i(3); + i |= a * b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_28.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_28.cpp new file mode 100644 index 00000000..773569eb --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_28.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + cpp_int i(3); + i ^= a * b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_29.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_29.cpp new file mode 100644 index 00000000..854118fb --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_29.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = i + 3.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_30.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_30.cpp new file mode 100644 index 00000000..4ba78fe5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_30.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = 3.3 + i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_31.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_31.cpp new file mode 100644 index 00000000..56a14828 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_31.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = 3.3 - i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_32.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_32.cpp new file mode 100644 index 00000000..1769185f --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_32.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = i - 3.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_33.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_33.cpp new file mode 100644 index 00000000..36758318 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_33.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = i * 3.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_34.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_34.cpp new file mode 100644 index 00000000..7d178c48 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_34.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = 3.3 * i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_35.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_35.cpp new file mode 100644 index 00000000..67f6bdc8 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_35.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = 3.3 / i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_36.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_36.cpp new file mode 100644 index 00000000..3b175be8 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_36.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = i / 3.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_37.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_37.cpp new file mode 100644 index 00000000..164db0b9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_37.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = i % 3.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_38.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_38.cpp new file mode 100644 index 00000000..a905e20e --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_38.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = 3.3 % i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_39.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_39.cpp new file mode 100644 index 00000000..fa495d70 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_39.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = 3.3 & i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_40.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_40.cpp new file mode 100644 index 00000000..f3ccf05b --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_40.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = i & 3.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_41.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_41.cpp new file mode 100644 index 00000000..67c30945 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_41.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = i | 3.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_42.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_42.cpp new file mode 100644 index 00000000..6ebe5f5b --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_42.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = 3.3 | i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_43.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_43.cpp new file mode 100644 index 00000000..cac2c020 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_43.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = 3.3 ^ i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_44.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_44.cpp new file mode 100644 index 00000000..32a27593 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_44.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(3), j; + j = i ^ 3.3; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_45.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_45.cpp new file mode 100644 index 00000000..64d05679 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_45.cpp @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef TEST_GMP + +#include <boost/multiprecision/gmp.hpp> + +using namespace boost::multiprecision; + +void foo(mpz_int i); + +int main() +{ + mpf_t f + foo(f); +} + +#else + +#error "Nothing to test without GMP!" + +#endif diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_46.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_46.cpp new file mode 100644 index 00000000..acf305ed --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_46.cpp @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef TEST_GMP + +#include <boost/multiprecision/gmp.hpp> + +using namespace boost::multiprecision; + +int main() +{ + mpf_t f; + mpz_int i; + i = f; +} + +#else + +#error "Nothing to test without GMP!" + +#endif diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_47.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_47.cpp new file mode 100644 index 00000000..b385e988 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_47.cpp @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef TEST_GMP + +#include <boost/multiprecision/gmp.hpp> + +using namespace boost::multiprecision; + +void foo(mpf_float_50); + +int main() +{ + mpf_float_100 f(2); + foo(f); +} + +#else + +#error "Nothing to test without GMP!" + +#endif diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_48.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_48.cpp new file mode 100644 index 00000000..d43fa028 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_48.cpp @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef TEST_GMP + +#include <boost/multiprecision/gmp.hpp> + +using namespace boost::multiprecision; + +int main() +{ + mpf_float_100 f(2); + mpf_float_50 f2; + f2 = f; +} + +#else + +#error "Nothing to test without GMP!" + +#endif diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_49.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_49.cpp new file mode 100644 index 00000000..47fe90e3 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_49.cpp @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef TEST_MPFR + +#include <boost/multiprecision/mpfr.hpp> + +using namespace boost::multiprecision; + +int main() +{ + mpfr_float_100 f(2); + mpfr_float_50 f2; + f2 = f; +} + +#else + +#error "Nothing to test without GMP!" + +#endif diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_50.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_50.cpp new file mode 100644 index 00000000..428ee49e --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_50.cpp @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef TEST_MPFR + +#include <boost/multiprecision/mpfr.hpp> + +using namespace boost::multiprecision; + +int main() +{ + mpfr_float_100 f(2); + mpfr_float_50 f2 = f; +} + +#else + +#error "Nothing to test without GMP!" + +#endif diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_51.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_51.cpp new file mode 100644 index 00000000..b247852d --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_51.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_100 f(2); + cpp_dec_float_50 f2 = f; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_52.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_52.cpp new file mode 100644 index 00000000..2044f588 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_52.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_100 f(2); + cpp_dec_float_50 f2; + f2 = f; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_53.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_53.cpp new file mode 100644 index 00000000..1f7739b4 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_53.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + int256_t i = 3; + int128_t j = i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_54.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_54.cpp new file mode 100644 index 00000000..31c5057b --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_54.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + int256_t i = 3; + int128_t j; + j = i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_55.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_55.cpp new file mode 100644 index 00000000..cf36c9d2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_55.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + int256_t i = 3; + uint256_t j; + j = i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_56.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_56.cpp new file mode 100644 index 00000000..f252447f --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_56.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + int256_t i = 3; + uint256_t j = i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_57.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_57.cpp new file mode 100644 index 00000000..18ce27ed --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_57.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 3; + int256_t j = i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_58.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_58.cpp new file mode 100644 index 00000000..9ecdc388 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_58.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i = 3; + int256_t j; + j = i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/conv_fail_59.cpp b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_59.cpp new file mode 100644 index 00000000..2b911e91 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/conv_fail_59.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_int i(1), j(3); + void* p = i * j; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/cpp_int_complement.cpp b/src/boost/libs/multiprecision/test/compile_fail/cpp_int_complement.cpp new file mode 100644 index 00000000..195d94e7 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/cpp_int_complement.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + checked_int256_t i; + i = ~i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/cpp_int_negate_1.cpp b/src/boost/libs/multiprecision/test/compile_fail/cpp_int_negate_1.cpp new file mode 100644 index 00000000..35fa0abc --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/cpp_int_negate_1.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + checked_uint256_t i; + i = -i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/cpp_int_negate_2.cpp b/src/boost/libs/multiprecision/test/compile_fail/cpp_int_negate_2.cpp new file mode 100644 index 00000000..5b75cf09 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/cpp_int_negate_2.cpp @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + number<cpp_int_backend<32, 32, unsigned_magnitude>, et_on> i; + i = -i; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_01.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_01.cpp new file mode 100644 index 00000000..809c4cc6 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_01.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + number<cpp_dec_float<50>, et_on> a(2); + number<cpp_dec_float<50>, et_off> b(2); + + a = a + b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_02.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_02.cpp new file mode 100644 index 00000000..09d5f39e --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_02.cpp @@ -0,0 +1,17 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2); + cpp_int b(2); + + a = a + b; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_03.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_03.cpp new file mode 100644 index 00000000..c776c0d3 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_03.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + ++x; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_04.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_04.cpp new file mode 100644 index 00000000..098f8281 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_04.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x++; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_05.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_05.cpp new file mode 100644 index 00000000..b708cd61 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_05.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x--; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_06.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_06.cpp new file mode 100644 index 00000000..b6c1cb8c --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_06.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + --x; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_07.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_07.cpp new file mode 100644 index 00000000..b72732e6 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_07.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x += a; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_08.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_08.cpp new file mode 100644 index 00000000..9c8b3566 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_08.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x -= a; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_09.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_09.cpp new file mode 100644 index 00000000..88952b97 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_09.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x *= a; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_10.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_10.cpp new file mode 100644 index 00000000..731054b9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_10.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x /= a; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_11.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_11.cpp new file mode 100644 index 00000000..54406bf2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_11.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x %= a; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_12.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_12.cpp new file mode 100644 index 00000000..c01fc680 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_12.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x |= a; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_13.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_13.cpp new file mode 100644 index 00000000..0eacd3be --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_13.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x &= a; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_14.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_14.cpp new file mode 100644 index 00000000..6b8d3176 --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_14.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x ^= a; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_15.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_15.cpp new file mode 100644 index 00000000..cab669db --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_15.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x >>= 2; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_16.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_16.cpp new file mode 100644 index 00000000..458eab9e --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_16.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x <<= 2; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_17.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_17.cpp new file mode 100644 index 00000000..97ebdd7e --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_17.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x = 2; +} diff --git a/src/boost/libs/multiprecision/test/compile_fail/operator_fail_18.cpp b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_18.cpp new file mode 100644 index 00000000..e5adb31f --- /dev/null +++ b/src/boost/libs/multiprecision/test/compile_fail/operator_fail_18.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float_50 a(2), b(3); + auto x = a + b; + x = a; +} diff --git a/src/boost/libs/multiprecision/test/concepts/number_concept_check.cpp b/src/boost/libs/multiprecision/test/concepts/number_concept_check.cpp new file mode 100644 index 00000000..dc1e0239 --- /dev/null +++ b/src/boost/libs/multiprecision/test/concepts/number_concept_check.cpp @@ -0,0 +1,251 @@ +// Copyright John Maddock 2011. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// +// This tests that cpp_dec_float_50 meets our +// conceptual requirements. +// +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#pragma warning(disable : 4800) +#pragma warning(disable : 4512) +#pragma warning(disable : 4127) +#pragma warning(disable : 4512) +#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated +#endif + +#include <boost/container_hash/hash.hpp> +#include <libs/math/test/compile_test/poison.hpp> + +#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_BACKEND +#define TEST_MPZ +#define TEST_MPFR_50 +#define TEST_MPFR_6 +#define TEST_MPFR_15 +#define TEST_MPFR_17 +#define TEST_MPFR_30 +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_DEC_FLOAT_NO_ET +#define TEST_LOGGED_ADAPTER +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) || defined(TEST_MPZ) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER) +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_CPP_BIN_FLOAT) +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30) +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_LOGGED_ADAPTER +#include <boost/multiprecision/logged_adaptor.hpp> +#endif + +#include <boost/math/concepts/real_type_concept.hpp> + +template <class T> +void test_extra(T) +{ + T t = 1; + t = abs(t); + t = abs(t * t); + + t = fabs(t); + t = fabs(t * t); + + t = sqrt(t); + t = sqrt(t * t); + + t = floor(t); + t = floor(t * t); + + t = ceil(t); + t = ceil(t * t); + + t = trunc(t); + t = trunc(t * t); + + t = round(t); + t = round(t * t); + + t = exp(t); + t = exp(t * t); + + t = log(t); + t = log(t * t); + + t = log10(t); + t = log10(t * t); + + t = cos(t); + t = cos(t * t); + + t = sin(t); + t = sin(t * t); + + t = tan(t); + t = tan(t * t); + + t = asin(t); + t = asin(t * t); + + t = atan(t); + t = atan(t * t); + + t = acos(t); + t = acos(t * t); + + t = cosh(t); + t = cosh(t * t); + + t = sinh(t); + t = sinh(t * t); + + t = tanh(t); + t = tanh(t * t); + + double dval = 2; + t = pow(t, t); + t = pow(t, t * t); + t = pow(t, dval); + t = pow(t * t, t); + t = pow(t * t, t * t); + t = pow(t * t, dval); + t = pow(dval, t); + t = pow(dval, t * t); + + t = atan2(t, t); + t = atan2(t, t * t); + t = atan2(t, dval); + t = atan2(t * t, t); + t = atan2(t * t, t * t); + t = atan2(t * t, dval); + t = atan2(dval, t); + t = atan2(dval, t * t); + + t = fmod(t, t); + t = fmod(t, t * t); + t = fmod(t, dval); + t = fmod(t * t, t); + t = fmod(t * t, t * t); + t = fmod(t * t, dval); + t = fmod(dval, t); + t = fmod(dval, t * t); + + typedef typename T::backend_type backend_type; + typedef typename backend_type::exponent_type exp_type; + exp_type e = 0; + int i = 0; + + t = ldexp(t, i); + t = ldexp(t * t, i); + t = ldexp(t, e); + t = ldexp(t * t, e); + + t = frexp(t, &i); + t = frexp(t * t, &i); + t = frexp(t, &e); + t = frexp(t * t, &e); + + t = scalbn(t, i); + t = scalbn(t * t, i); + t = scalbn(t, e); + t = scalbn(t * t, e); + + t = logb(t); + t = logb(t * t); + e = ilogb(t); + e = ilogb(t * t); +} + +void foo() +{ +#ifdef TEST_BACKEND + test_extra(boost::multiprecision::concepts::mp_number_float_architype()); +#endif +#ifdef TEST_MPF_50 + test_extra(boost::multiprecision::mpf_float_50()); +#endif +#ifdef TEST_MPFR_50 + test_extra(boost::multiprecision::mpfr_float_50()); +#endif +#ifdef TEST_MPFR_6 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >()); +#endif +#ifdef TEST_MPFR_15 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >()); +#endif +#ifdef TEST_MPFR_17 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >()); +#endif +#ifdef TEST_MPFR_30 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >()); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test_extra(boost::multiprecision::cpp_dec_float_50()); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test_extra(boost::multiprecision::cpp_bin_float_50()); +#endif +#ifdef TEST_CPP_DEC_FLOAT_NO_ET + test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>()); +#endif +} + +int main() +{ +#ifdef TEST_BACKEND + BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::concepts::mp_number_float_architype>)); +#endif +#ifdef TEST_MPF_50 + BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpf_float_50>)); +#endif +#ifdef TEST_MPFR_50 + BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpfr_float_50>)); +#endif +#ifdef TEST_MPFR_6 + BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> > >)); +#endif +#ifdef TEST_MPFR_15 + BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> > >)); +#endif +#ifdef TEST_MPFR_17 + BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> > >)); +#endif +#ifdef TEST_MPFR_30 + BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> > >)); +#endif +#ifdef TEST_MPFR_50 + BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::mpfr_float_50>)); +#endif +#ifdef TEST_CPP_DEC_FLOAT + BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::cpp_dec_float_50>)); +#endif +#ifdef TEST_CPP_BIN_FLOAT + BOOST_CONCEPT_ASSERT((boost::math::concepts::RealTypeConcept<boost::multiprecision::cpp_bin_float_50>)); +#endif +#ifdef TEST_LOGGED_ADAPTER + typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t; + test_extra(num_t()); +#endif +} diff --git a/src/boost/libs/multiprecision/test/concepts/sf_concept_check_basic.cpp b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_basic.cpp new file mode 100644 index 00000000..1defde71 --- /dev/null +++ b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_basic.cpp @@ -0,0 +1,165 @@ +// Copyright John Maddock 2012. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// +// This tests that cpp_dec_float_50 meets our +// conceptual requirements when used with Boost.Math. +// +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#pragma warning(disable : 4800) +#pragma warning(disable : 4512) +#pragma warning(disable : 4127) +#pragma warning(disable : 4512) +#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated +#endif + +#include <boost/container_hash/hash.hpp> +#include <libs/math/test/compile_test/poison.hpp> + +#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_BACKEND +#define TEST_MPZ +#define TEST_MPFR_50 +#define TEST_MPFR_6 +#define TEST_MPFR_15 +#define TEST_MPFR_17 +#define TEST_MPFR_30 +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_DEC_FLOAT_NO_ET +#define TEST_LOGGED_ADAPTER +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) || defined(TEST_MPZ) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER) +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_CPP_BIN_FLOAT) +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30) +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_LOGGED_ADAPTER +#include <boost/multiprecision/logged_adaptor.hpp> +#endif + +#include <boost/math/special_functions.hpp> + +template <class T> +void test_extra(T) +{ + T v1, v2, v3; + int i; + (boost::math::fpclassify)(v1); + (boost::math::isfinite)(v1); + (boost::math::isnormal)(v1); + (boost::math::isnan)(v1); + (boost::math::isinf)(v1); + (boost::math::signbit)(v1); + (boost::math::copysign)(v1, v2); + (boost::math::changesign)(v1); + (boost::math::sign)(v1); + boost::math::log1p(v1); + boost::math::expm1(v1); + boost::math::cbrt(v1); + boost::math::sqrt1pm1(v1); + boost::math::powm1(v1, v2); + boost::math::hypot(v1, v2); + boost::math::sinc_pi(v1); + boost::math::sinhc_pi(v1); + boost::math::asinh(v1); + boost::math::acosh(v1); + boost::math::atanh(v1); + boost::math::sin_pi(v1); + boost::math::cos_pi(v1); + boost::math::trunc(v1); + boost::math::itrunc(v1); + boost::math::ltrunc(v1); + boost::math::round(v1); + boost::math::iround(v1); + boost::math::lround(v1); + boost::math::modf(v1, &v1); + boost::math::modf(v1, &i); + long l; + boost::math::modf(v1, &l); +#ifdef BOOST_HAS_LONG_LONG + boost::math::lltrunc(v1); + boost::math::llround(v1); + boost::long_long_type ll; + boost::math::modf(v1, &ll); +#endif + boost::math::pow<2>(v1); + boost::math::nextafter(v1, v1); + boost::math::float_next(v1); + boost::math::float_prior(v1); + boost::math::float_distance(v1, v1); + // Misc functions that don't fit elsewhere: + boost::math::expint(v1); + boost::math::expint(i); + boost::math::expint(i, v2); + boost::math::expint(i, i); + boost::math::zeta(v1); + boost::math::zeta(i); + boost::math::owens_t(v1, v2); +} + +void foo() +{ +#ifdef TEST_BACKEND + test_extra(boost::multiprecision::concepts::mp_number_float_architype()); +#endif +#ifdef TEST_MPF_50 + test_extra(boost::multiprecision::mpf_float_50()); +#endif +#ifdef TEST_MPFR_50 + test_extra(boost::multiprecision::mpfr_float_50()); +#endif +#ifdef TEST_MPFR_6 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >()); +#endif +#ifdef TEST_MPFR_15 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >()); +#endif +#ifdef TEST_MPFR_17 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >()); +#endif +#ifdef TEST_MPFR_30 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >()); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test_extra(boost::multiprecision::cpp_dec_float_50()); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test_extra(boost::multiprecision::cpp_bin_float_50()); +#endif +#ifdef TEST_CPP_DEC_FLOAT_NO_ET + test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>()); +#endif +#ifdef TEST_LOGGED_ADAPTER + typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t; + test_extra(num_t()); +#endif +} + +int main() +{ + foo(); +} diff --git a/src/boost/libs/multiprecision/test/concepts/sf_concept_check_bessel.cpp b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_bessel.cpp new file mode 100644 index 00000000..0a5002b2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_bessel.cpp @@ -0,0 +1,132 @@ +// Copyright John Maddock 2012. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// +// This tests that cpp_dec_float_50 meets our +// conceptual requirements when used with Boost.Math. +// +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#pragma warning(disable : 4800) +#pragma warning(disable : 4512) +#pragma warning(disable : 4127) +#pragma warning(disable : 4512) +#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated +#endif + +#include <boost/container_hash/hash.hpp> +#include <libs/math/test/compile_test/poison.hpp> + +#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_BACKEND +#define TEST_MPZ +#define TEST_MPFR_50 +#define TEST_MPFR_6 +#define TEST_MPFR_15 +#define TEST_MPFR_17 +#define TEST_MPFR_30 +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_DEC_FLOAT_NO_ET +#define TEST_LOGGED_ADAPTER +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) || defined(TEST_MPZ) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER) +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_CPP_BIN_FLOAT) +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30) +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_LOGGED_ADAPTER +#include <boost/multiprecision/logged_adaptor.hpp> +#endif + +#include <boost/math/special_functions.hpp> + +template <class T> +void test_extra(T) +{ + T v1, v2, v3; + int i(0); + boost::math::cyl_neumann(v1, v2); + boost::math::cyl_neumann(i, v2); +#ifndef SLOW_COMPILER + boost::math::cyl_bessel_j(v1, v2); + boost::math::cyl_bessel_j(i, v2); + boost::math::cyl_bessel_i(v1, v2); + boost::math::cyl_bessel_i(i, v2); + boost::math::cyl_bessel_k(v1, v2); + boost::math::cyl_bessel_k(i, v2); + boost::math::sph_bessel(i, v2); + boost::math::sph_bessel(i, 1); + boost::math::sph_neumann(i, v2); + boost::math::sph_neumann(i, i); + boost::math::airy_ai(v1); + boost::math::airy_bi(v1); + boost::math::airy_ai_prime(v1); + boost::math::airy_bi_prime(v1); +#endif +} + +void foo() +{ +#ifdef TEST_BACKEND + test_extra(boost::multiprecision::concepts::mp_number_float_architype()); +#endif +#ifdef TEST_MPF_50 + test_extra(boost::multiprecision::mpf_float_50()); +#endif +#ifdef TEST_MPFR_50 + test_extra(boost::multiprecision::mpfr_float_50()); +#endif +#ifdef TEST_MPFR_6 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >()); +#endif +#ifdef TEST_MPFR_15 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >()); +#endif +#ifdef TEST_MPFR_17 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >()); +#endif +#ifdef TEST_MPFR_30 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >()); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test_extra(boost::multiprecision::cpp_dec_float_50()); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test_extra(boost::multiprecision::cpp_bin_float_50()); +#endif +#ifdef TEST_CPP_DEC_FLOAT_NO_ET + test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>()); +#endif +#ifdef TEST_LOGGED_ADAPTER + typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t; + test_extra(num_t()); +#endif +} + +int main() +{ + foo(); +} diff --git a/src/boost/libs/multiprecision/test/concepts/sf_concept_check_beta.cpp b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_beta.cpp new file mode 100644 index 00000000..61cbdf1b --- /dev/null +++ b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_beta.cpp @@ -0,0 +1,120 @@ +// Copyright John Maddock 2012. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// +// This tests that cpp_dec_float_50 meets our +// conceptual requirements when used with Boost.Math. +// +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#pragma warning(disable : 4800) +#pragma warning(disable : 4512) +#pragma warning(disable : 4127) +#pragma warning(disable : 4512) +#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated +#endif + +#include <boost/container_hash/hash.hpp> +#include <libs/math/test/compile_test/poison.hpp> + +#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_BACKEND +#define TEST_MPZ +#define TEST_MPFR_50 +#define TEST_MPFR_6 +#define TEST_MPFR_15 +#define TEST_MPFR_17 +#define TEST_MPFR_30 +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_DEC_FLOAT_NO_ET +#define TEST_LOGGED_ADAPTER +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) || defined(TEST_MPZ) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER) +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_CPP_BIN_FLOAT) +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#ifdef TEST_LOGGED_ADAPTER +#include <boost/multiprecision/logged_adaptor.hpp> +#endif + +#include <boost/math/special_functions.hpp> + +template <class T> +void test_extra(T) +{ + T v1, v2, v3; + int i; + boost::math::beta(v1, v2); + boost::math::beta(v1, v2, v3); + boost::math::betac(v1, v2, v3); + boost::math::ibeta(v1, v2, v3); + boost::math::ibetac(v1, v2, v3); + boost::math::ibeta_derivative(v1, v2, v3); +} + +void foo() +{ +#ifdef TEST_BACKEND + test_extra(boost::multiprecision::concepts::mp_number_float_architype()); +#endif +#ifdef TEST_MPF_50 + test_extra(boost::multiprecision::mpf_float_50()); +#endif +#ifdef TEST_MPFR_50 + test_extra(boost::multiprecision::mpfr_float_50()); +#endif +#ifdef TEST_MPFR_6 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >()); +#endif +#ifdef TEST_MPFR_15 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >()); +#endif +#ifdef TEST_MPFR_17 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >()); +#endif +#ifdef TEST_MPFR_30 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >()); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test_extra(boost::multiprecision::cpp_dec_float_50()); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test_extra(boost::multiprecision::cpp_bin_float_50()); +#endif +#ifdef TEST_CPP_DEC_FLOAT_NO_ET + test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>()); +#endif +#ifdef TEST_LOGGED_ADAPTER + typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t; + test_extra(num_t()); +#endif +} + +int main() +{ + foo(); +} diff --git a/src/boost/libs/multiprecision/test/concepts/sf_concept_check_beta_2.cpp b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_beta_2.cpp new file mode 100644 index 00000000..aff7e5c8 --- /dev/null +++ b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_beta_2.cpp @@ -0,0 +1,116 @@ +// Copyright John Maddock 2012. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// +// This tests that cpp_dec_float_50 meets our +// conceptual requirements when used with Boost.Math. +// +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#pragma warning(disable : 4800) +#pragma warning(disable : 4512) +#pragma warning(disable : 4127) +#pragma warning(disable : 4512) +#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated +#endif + +#include <boost/container_hash/hash.hpp> +#include <libs/math/test/compile_test/poison.hpp> + +#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_BACKEND +#define TEST_MPZ +#define TEST_MPFR_50 +#define TEST_MPFR_6 +#define TEST_MPFR_15 +#define TEST_MPFR_17 +#define TEST_MPFR_30 +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_DEC_FLOAT_NO_ET +#define TEST_LOGGED_ADAPTER +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) || defined(TEST_MPZ) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER) +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_CPP_BIN_FLOAT) +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#ifdef TEST_LOGGED_ADAPTER +#include <boost/multiprecision/logged_adaptor.hpp> +#endif + +#include <boost/math/special_functions.hpp> + +template <class T> +void test_extra(T) +{ + T v1, v2, v3; + int i; + boost::math::ibeta_inv(v1, v2, v3); + boost::math::ibetac_inv(v1, v2, v3); +} + +void foo() +{ +#ifdef TEST_BACKEND + test_extra(boost::multiprecision::concepts::mp_number_float_architype()); +#endif +#ifdef TEST_MPF_50 + test_extra(boost::multiprecision::mpf_float_50()); +#endif +#ifdef TEST_MPFR_50 + test_extra(boost::multiprecision::mpfr_float_50()); +#endif +#ifdef TEST_MPFR_6 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >()); +#endif +#ifdef TEST_MPFR_15 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >()); +#endif +#ifdef TEST_MPFR_17 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >()); +#endif +#ifdef TEST_MPFR_30 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >()); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test_extra(boost::multiprecision::cpp_dec_float_50()); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test_extra(boost::multiprecision::cpp_bin_float_50()); +#endif +#ifdef TEST_CPP_DEC_FLOAT_NO_ET + test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>()); +#endif +#ifdef TEST_LOGGED_ADAPTER + typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t; + test_extra(num_t()); +#endif +} + +int main() +{ + foo(); +} diff --git a/src/boost/libs/multiprecision/test/concepts/sf_concept_check_beta_3.cpp b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_beta_3.cpp new file mode 100644 index 00000000..fcae4078 --- /dev/null +++ b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_beta_3.cpp @@ -0,0 +1,118 @@ +// Copyright John Maddock 2012. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// +// This tests that cpp_dec_float_50 meets our +// conceptual requirements when used with Boost.Math. +// +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#pragma warning(disable : 4800) +#pragma warning(disable : 4512) +#pragma warning(disable : 4127) +#pragma warning(disable : 4512) +#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated +#endif + +#include <boost/container_hash/hash.hpp> +#include <libs/math/test/compile_test/poison.hpp> + +#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_BACKEND +#define TEST_MPZ +#define TEST_MPFR_50 +#define TEST_MPFR_6 +#define TEST_MPFR_15 +#define TEST_MPFR_17 +#define TEST_MPFR_30 +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_DEC_FLOAT_NO_ET +#define TEST_LOGGED_ADAPTER +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) || defined(TEST_MPZ) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER) +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_CPP_BIN_FLOAT) +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#ifdef TEST_LOGGED_ADAPTER +#include <boost/multiprecision/logged_adaptor.hpp> +#endif + +#include <boost/math/special_functions.hpp> + +template <class T> +void test_extra(T) +{ + T v1, v2, v3; + int i; + boost::math::ibeta_inva(v1, v2, v3); + boost::math::ibetac_inva(v1, v2, v3); + boost::math::ibeta_invb(v1, v2, v3); + boost::math::ibetac_invb(v1, v2, v3); +} + +void foo() +{ +#ifdef TEST_BACKEND + test_extra(boost::multiprecision::concepts::mp_number_float_architype()); +#endif +#ifdef TEST_MPF_50 + test_extra(boost::multiprecision::mpf_float_50()); +#endif +#ifdef TEST_MPFR_50 + test_extra(boost::multiprecision::mpfr_float_50()); +#endif +#ifdef TEST_MPFR_6 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >()); +#endif +#ifdef TEST_MPFR_15 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >()); +#endif +#ifdef TEST_MPFR_17 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >()); +#endif +#ifdef TEST_MPFR_30 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >()); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test_extra(boost::multiprecision::cpp_dec_float_50()); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test_extra(boost::multiprecision::cpp_bin_float_50()); +#endif +#ifdef TEST_CPP_DEC_FLOAT_NO_ET + test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>()); +#endif +#ifdef TEST_LOGGED_ADAPTER + typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t; + test_extra(num_t()); +#endif +} + +int main() +{ + foo(); +} diff --git a/src/boost/libs/multiprecision/test/concepts/sf_concept_check_elliptic.cpp b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_elliptic.cpp new file mode 100644 index 00000000..4d3d24b9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_elliptic.cpp @@ -0,0 +1,136 @@ +// Copyright John Maddock 2012. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// +// This tests that cpp_dec_float_50 meets our +// conceptual requirements when used with Boost.Math. +// +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#pragma warning(disable : 4800) +#pragma warning(disable : 4512) +#pragma warning(disable : 4127) +#pragma warning(disable : 4512) +#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated +#endif + +#include <boost/container_hash/hash.hpp> +#include <libs/math/test/compile_test/poison.hpp> + +#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_BACKEND +#define TEST_MPZ +#define TEST_MPFR_50 +#define TEST_MPFR_6 +#define TEST_MPFR_15 +#define TEST_MPFR_17 +#define TEST_MPFR_30 +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_DEC_FLOAT_NO_ET +#define TEST_LOGGED_ADAPTER +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) || defined(TEST_MPZ) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER) +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_CPP_BIN_FLOAT) +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30) +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_LOGGED_ADAPTER +#include <boost/multiprecision/logged_adaptor.hpp> +#endif + +#include <boost/math/special_functions.hpp> + +template <class T> +void test_extra(T) +{ + T v1, v2, v3; + boost::math::ellint_1(v1); + boost::math::ellint_1(v1, v2); + boost::math::ellint_2(v1); + boost::math::ellint_2(v1, v2); + boost::math::ellint_3(v1, v2); + boost::math::ellint_3(v1, v2, v3); + boost::math::ellint_rc(v1, v2); + boost::math::ellint_rd(v1, v2, v3); + boost::math::ellint_rf(v1, v2, v3); + boost::math::ellint_rj(v1, v2, v3, v1); + boost::math::jacobi_elliptic(v1, v2, &v1, &v2); + boost::math::jacobi_cd(v1, v2); + boost::math::jacobi_cn(v1, v2); + boost::math::jacobi_cs(v1, v2); + boost::math::jacobi_dc(v1, v2); + boost::math::jacobi_dn(v1, v2); + boost::math::jacobi_ds(v1, v2); + boost::math::jacobi_nc(v1, v2); + boost::math::jacobi_nd(v1, v2); + boost::math::jacobi_ns(v1, v2); + boost::math::jacobi_sc(v1, v2); + boost::math::jacobi_sd(v1, v2); + boost::math::jacobi_sn(v1, v2); +} + +void foo() +{ +#ifdef TEST_BACKEND + test_extra(boost::multiprecision::concepts::mp_number_float_architype()); +#endif +#ifdef TEST_MPF_50 + test_extra(boost::multiprecision::mpf_float_50()); +#endif +#ifdef TEST_MPFR_50 + test_extra(boost::multiprecision::mpfr_float_50()); +#endif +#ifdef TEST_MPFR_6 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >()); +#endif +#ifdef TEST_MPFR_15 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >()); +#endif +#ifdef TEST_MPFR_17 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >()); +#endif +#ifdef TEST_MPFR_30 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >()); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test_extra(boost::multiprecision::cpp_dec_float_50()); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test_extra(boost::multiprecision::cpp_bin_float_50()); +#endif +#ifdef TEST_CPP_DEC_FLOAT_NO_ET + test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>()); +#endif +#ifdef TEST_LOGGED_ADAPTER + typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t; + test_extra(num_t()); +#endif +} + +int main() +{ + foo(); +} diff --git a/src/boost/libs/multiprecision/test/concepts/sf_concept_check_gamma.cpp b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_gamma.cpp new file mode 100644 index 00000000..4d879abc --- /dev/null +++ b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_gamma.cpp @@ -0,0 +1,140 @@ +// Copyright John Maddock 2012. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// +// This tests that cpp_dec_float_50 meets our +// conceptual requirements when used with Boost.Math. +// +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#pragma warning(disable : 4800) +#pragma warning(disable : 4512) +#pragma warning(disable : 4127) +#pragma warning(disable : 4512) +#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated +#endif + +#include <boost/container_hash/hash.hpp> +#include <libs/math/test/compile_test/poison.hpp> + +#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_BACKEND +#define TEST_MPZ +#define TEST_MPFR_50 +#define TEST_MPFR_6 +#define TEST_MPFR_15 +#define TEST_MPFR_17 +#define TEST_MPFR_30 +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_DEC_FLOAT_NO_ET +#define TEST_LOGGED_ADAPTER +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) || defined(TEST_MPZ) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER) +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_CPP_BIN_FLOAT) +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#ifdef TEST_LOGGED_ADAPTER +#include <boost/multiprecision/logged_adaptor.hpp> +#endif + +#include <boost/math/special_functions.hpp> + +template <class T> +void test_extra(T) +{ + T v1, v2, v3; + int i; + boost::math::tgamma(v1); + boost::math::tgamma1pm1(v1); + boost::math::lgamma(v1); + boost::math::lgamma(v1, &i); + boost::math::digamma(v1); + boost::math::tgamma_ratio(v1, v2); + boost::math::tgamma_delta_ratio(v1, v2); + boost::math::factorial<T>(i); + boost::math::unchecked_factorial<T>(i); + i = boost::math::max_factorial<T>::value; + boost::math::double_factorial<T>(i); + boost::math::rising_factorial(v1, i); + boost::math::falling_factorial(v1, i); + boost::math::gamma_p_derivative(v2, v3); + boost::math::tgamma(v1, v2); + boost::math::tgamma_lower(v1, v2); + boost::math::gamma_p(v1, v2); + boost::math::gamma_q(v1, v2); + boost::math::gamma_p_inv(v1, v2); + boost::math::gamma_q_inv(v1, v2); + boost::math::gamma_p_inva(v1, v2); + boost::math::gamma_q_inva(v1, v2); + boost::math::erf(v1); + boost::math::erfc(v1); + boost::math::erf_inv(v1); + boost::math::erfc_inv(v1); +} + +void foo() +{ +#ifdef TEST_BACKEND + test_extra(boost::multiprecision::concepts::mp_number_float_architype()); +#endif +#ifdef TEST_MPF_50 + test_extra(boost::multiprecision::mpf_float_50()); +#endif +#ifdef TEST_MPFR_50 + test_extra(boost::multiprecision::mpfr_float_50()); +#endif +#ifdef TEST_MPFR_6 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >()); +#endif +#ifdef TEST_MPFR_15 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >()); +#endif +#ifdef TEST_MPFR_17 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >()); +#endif +#ifdef TEST_MPFR_30 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >()); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test_extra(boost::multiprecision::cpp_dec_float_50()); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test_extra(boost::multiprecision::cpp_bin_float_50()); +#endif +#ifdef TEST_CPP_DEC_FLOAT_NO_ET + test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>()); +#endif +#ifdef TEST_LOGGED_ADAPTER + typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t; + test_extra(num_t()); +#endif +} + +int main() +{ + foo(); +} diff --git a/src/boost/libs/multiprecision/test/concepts/sf_concept_check_poly.cpp b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_poly.cpp new file mode 100644 index 00000000..a67f1d98 --- /dev/null +++ b/src/boost/libs/multiprecision/test/concepts/sf_concept_check_poly.cpp @@ -0,0 +1,127 @@ +// Copyright John Maddock 2012. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// +// This tests that cpp_dec_float_50 meets our +// conceptual requirements when used with Boost.Math. +// +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#pragma warning(disable : 4800) +#pragma warning(disable : 4512) +#pragma warning(disable : 4127) +#pragma warning(disable : 4512) +#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated +#endif + +#include <boost/container_hash/hash.hpp> +#include <libs/math/test/compile_test/poison.hpp> + +#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFR_6) && !defined(TEST_MPFR_15) && !defined(TEST_MPFR_17) && !defined(TEST_MPFR_30) && !defined(TEST_CPP_DEC_FLOAT_NO_ET) && !defined(TEST_LOGGED_ADAPTER) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_BACKEND +#define TEST_MPZ +#define TEST_MPFR_50 +#define TEST_MPFR_6 +#define TEST_MPFR_15 +#define TEST_MPFR_17 +#define TEST_MPFR_30 +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_DEC_FLOAT_NO_ET +#define TEST_LOGGED_ADAPTER +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) || defined(TEST_MPZ) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_NO_ET) || defined(TEST_LOGGED_ADAPTER) +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_CPP_BIN_FLOAT) +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#if defined(TEST_MPFR_50) || defined(TEST_MPFR_6) || defined(TEST_MPFR_15) || defined(TEST_MPFR_17) || defined(TEST_MPFR_30) +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_LOGGED_ADAPTER +#include <boost/multiprecision/logged_adaptor.hpp> +#endif + +#include <boost/math/special_functions.hpp> + +template <class T> +void test_extra(T) +{ + T v1, v2, v3; + boost::math::legendre_p(1, v1); + boost::math::legendre_p(1, 0, v1); + boost::math::legendre_q(1, v1); + boost::math::legendre_next(2, v1, v2, v3); + boost::math::legendre_next(2, 2, v1, v2, v3); + boost::math::laguerre(1, v1); + boost::math::laguerre(2, 1, v1); + boost::math::laguerre(2u, 1u, v1); + boost::math::laguerre_next(2, v1, v2, v3); + boost::math::laguerre_next(2, 1, v1, v2, v3); + boost::math::hermite(1, v1); + boost::math::hermite_next(2, v1, v2, v3); + boost::math::spherical_harmonic_r(2, 1, v1, v2); + boost::math::spherical_harmonic_i(2, 1, v1, v2); +} + +void foo() +{ +#ifdef TEST_BACKEND + test_extra(boost::multiprecision::concepts::mp_number_float_architype()); +#endif +#ifdef TEST_MPF_50 + test_extra(boost::multiprecision::mpf_float_50()); +#endif +#ifdef TEST_MPFR_50 + test_extra(boost::multiprecision::mpfr_float_50()); +#endif +#ifdef TEST_MPFR_6 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<6> >()); +#endif +#ifdef TEST_MPFR_15 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<15> >()); +#endif +#ifdef TEST_MPFR_17 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<17> >()); +#endif +#ifdef TEST_MPFR_30 + test_extra(boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> >()); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test_extra(boost::multiprecision::cpp_dec_float_50()); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test_extra(boost::multiprecision::cpp_bin_float_50()); +#endif +#ifdef TEST_CPP_DEC_FLOAT_NO_ET + test_extra(boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off>()); +#endif +#ifdef TEST_LOGGED_ADAPTER + typedef boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > num_t; + test_extra(num_t()); +#endif +} + +int main() +{ + foo(); +} diff --git a/src/boost/libs/multiprecision/test/constexpr_arithmetric_test.hpp b/src/boost/libs/multiprecision/test/constexpr_arithmetric_test.hpp new file mode 100644 index 00000000..04e2a8a5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/constexpr_arithmetric_test.hpp @@ -0,0 +1,297 @@ +// (C) Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/config.hpp> +#include <boost/multiprecision/number.hpp> +#include <limits> + +// clang-format off + +template <class T, class U> +BOOST_CXX14_CONSTEXPR T do_test_constexpr_add_subtract(T a, U b) +{ + a = +b; + if constexpr(std::numeric_limits<U>::is_signed && std::numeric_limits<T>::is_signed) + b = -b; + a += b; + a += a; + a -= b; + a -= a; + ++a; + --a; + T bb(b); + a += bb++; + a += bb--; + a = a + b; + a += a - b; + if constexpr(std::numeric_limits<U>::is_signed && std::numeric_limits<T>::is_signed) + a -= b - -a; + a += b + a; + if constexpr(std::numeric_limits<T>::is_signed) + { + a = -a; + if constexpr(std::numeric_limits<U>::is_signed) + a -= b; + } + return a; +} + +template <class T> +BOOST_CXX14_CONSTEXPR T test_constexpr_add_subtract(T a) +{ + a += do_test_constexpr_add_subtract(a, a); + a += do_test_constexpr_add_subtract(a, static_cast<unsigned char>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<signed char>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<char>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<short>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<unsigned short>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<int>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<unsigned int>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<long>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<unsigned long>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<long long>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<unsigned long long>(2)); +#ifdef BOOST_HAS_INT128 + a += do_test_constexpr_add_subtract(a, static_cast<__int128>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<unsigned __int128>(2)); + a -= do_test_constexpr_add_subtract(a, static_cast<__int128>(2)); + a -= do_test_constexpr_add_subtract(a, static_cast<unsigned __int128>(2)); +#endif + + if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_floating_point) + { + a += do_test_constexpr_add_subtract(a, static_cast<float>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<double>(2)); + a += do_test_constexpr_add_subtract(a, static_cast<long double>(2)); +#ifdef BOOST_HAS_FLOAT128 + a += do_test_constexpr_add_subtract(a, static_cast<__float128>(2)); +#endif + } + + return a; +} + +template <class T, class U> +BOOST_CXX14_CONSTEXPR T do_test_constexpr_mul_divide(T a, U b) +{ + a *= b; + a = a * b; + if constexpr(std::numeric_limits<T>::is_signed && std::numeric_limits<U>::is_signed) + { + a *= -b; + a = a * -b; + } + a /= b; + a = a / b; + if constexpr(std::numeric_limits<T>::is_signed && std::numeric_limits<U>::is_signed) + { + a /= -b; + a = a / -b; + } + if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_integer && boost::multiprecision::number_category<U>::value == boost::multiprecision::number_kind_integer) + { + a %= b; + a = a % b; + } + return a; +} + +template <class T> +BOOST_CXX14_CONSTEXPR T test_constexpr_mul_divide(T a) +{ + a += do_test_constexpr_mul_divide(a, a); + a += do_test_constexpr_mul_divide(a, static_cast<unsigned char>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<signed char>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<char>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<short>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<unsigned short>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<int>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<unsigned int>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<long>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<unsigned long>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<long long>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<unsigned long long>(2)); +#ifdef BOOST_HAS_INT128 + a += do_test_constexpr_mul_divide(a, static_cast<__int128>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<unsigned __int128>(2)); + a -= do_test_constexpr_mul_divide(a, static_cast<__int128>(2)); + a -= do_test_constexpr_mul_divide(a, static_cast<unsigned __int128>(2)); +#endif + + if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_floating_point) + { + a += do_test_constexpr_mul_divide(a, static_cast<float>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<double>(2)); + a += do_test_constexpr_mul_divide(a, static_cast<long double>(2)); +#ifdef BOOST_HAS_FLOAT128 + a += do_test_constexpr_mul_divide(a, static_cast<__float128>(2)); +#endif + } + return a; +} + +template <class T, class U> +BOOST_CXX14_CONSTEXPR T do_test_constexpr_bitwise(T a, U b) +{ + a |= b; + a &= b; + a <<= 2; + a ^= b; + a = a | b; + a = a & b; + a <<= 2; + a = a ^ b; + if constexpr (std::numeric_limits<T>::is_signed == false) + { + a = ~a; + a >>= std::numeric_limits<T>::digits - 3; + } + + a <<= 5; + a = a << 2; + a >>= 5; + a = a >> 2; + + return a; +} + +template <class T> +BOOST_CXX14_CONSTEXPR T test_constexpr_bitwise(T a) +{ + a += do_test_constexpr_bitwise(a, a); + a += do_test_constexpr_bitwise(a, static_cast<unsigned char>(2)); + a += do_test_constexpr_bitwise(a, static_cast<signed char>(2)); + a += do_test_constexpr_bitwise(a, static_cast<char>(2)); + a += do_test_constexpr_bitwise(a, static_cast<short>(2)); + a += do_test_constexpr_bitwise(a, static_cast<unsigned short>(2)); + a += do_test_constexpr_bitwise(a, static_cast<int>(2)); + a += do_test_constexpr_bitwise(a, static_cast<unsigned int>(2)); + a += do_test_constexpr_bitwise(a, static_cast<long>(2)); + a += do_test_constexpr_bitwise(a, static_cast<unsigned long>(2)); + a += do_test_constexpr_bitwise(a, static_cast<long long>(2)); + a += do_test_constexpr_bitwise(a, static_cast<unsigned long long>(2)); +#ifdef BOOST_HAS_INT128 + a += do_test_constexpr_bitwise(a, static_cast<__int128>(2)); + a += do_test_constexpr_bitwise(a, static_cast<unsigned __int128>(2)); +#endif + + return a; +} + +template <class T, class U> +BOOST_CXX14_CONSTEXPR T do_test_constexpr_logical(T a, U b) +{ + T result(0); + if(a || b) + ++result; + if(b || a) + ++result; + if(a && b) + ++result; + if(b && a) + ++result; + if(a) + ++result; + if(!a) + ++result; + return result; +} + +template <class T> +BOOST_CXX14_CONSTEXPR T test_constexpr_logical(T a) +{ + a += do_test_constexpr_logical(a, a); + a += do_test_constexpr_logical(a, static_cast<unsigned char>(2)); + a += do_test_constexpr_logical(a, static_cast<signed char>(2)); + a += do_test_constexpr_logical(a, static_cast<char>(2)); + a += do_test_constexpr_logical(a, static_cast<short>(2)); + a += do_test_constexpr_logical(a, static_cast<unsigned short>(2)); + a += do_test_constexpr_logical(a, static_cast<int>(2)); + a += do_test_constexpr_logical(a, static_cast<unsigned int>(2)); + a += do_test_constexpr_logical(a, static_cast<long>(2)); + a += do_test_constexpr_logical(a, static_cast<unsigned long>(2)); + a += do_test_constexpr_logical(a, static_cast<long long>(2)); + a += do_test_constexpr_logical(a, static_cast<unsigned long long>(2)); +#ifdef BOOST_HAS_INT128 + a += do_test_constexpr_logical(a, static_cast<__int128>(2)); + a += do_test_constexpr_logical(a, static_cast<unsigned __int128>(2)); + a -= do_test_constexpr_logical(a, static_cast<__int128>(2)); + a -= do_test_constexpr_logical(a, static_cast<unsigned __int128>(2)); +#endif + + return a; +} + +template <class T, class U> +BOOST_CXX14_CONSTEXPR T do_test_constexpr_compare(T a, U b) +{ + T result(0); + if(a == b) + ++result; + if(b == a) + ++result; + if(a != b) + ++result; + if(b != a) + ++result; + if(a < b) + ++result; + if(b < a) + ++result; + if(a <= b) + ++result; + if(b <= a) + ++result; + if(a > b) + ++result; + if(b > a) + ++result; + if(a >= b) + ++result; + if(b >= a) + ++result; + + T u(b); + if(u == a) + ++result; + + return result; +} + +template <class T> +BOOST_CXX14_CONSTEXPR T test_constexpr_compare(T a) +{ + a += do_test_constexpr_compare(a, a); + a += do_test_constexpr_compare(a, static_cast<unsigned char>(2)); + a += do_test_constexpr_compare(a, static_cast<signed char>(2)); + a += do_test_constexpr_compare(a, static_cast<char>(2)); + a += do_test_constexpr_compare(a, static_cast<short>(2)); + a += do_test_constexpr_compare(a, static_cast<unsigned short>(2)); + a += do_test_constexpr_compare(a, static_cast<int>(2)); + a += do_test_constexpr_compare(a, static_cast<unsigned int>(2)); + a += do_test_constexpr_compare(a, static_cast<long>(2)); + a += do_test_constexpr_compare(a, static_cast<unsigned long>(2)); + a += do_test_constexpr_compare(a, static_cast<long long>(2)); + a += do_test_constexpr_compare(a, static_cast<unsigned long long>(2)); +#ifdef BOOST_HAS_INT128 + a += do_test_constexpr_compare(a, static_cast<__int128>(2)); + a += do_test_constexpr_compare(a, static_cast<unsigned __int128>(2)); + a -= do_test_constexpr_compare(a, static_cast<__int128>(2)); + a -= do_test_constexpr_compare(a, static_cast<unsigned __int128>(2)); +#endif + + if constexpr (boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_floating_point) + { + a += do_test_constexpr_compare(a, static_cast<float>(2)); + a += do_test_constexpr_compare(a, static_cast<double>(2)); + a += do_test_constexpr_compare(a, static_cast<long double>(2)); +#ifdef BOOST_HAS_FLOAT128 + a += do_test_constexpr_compare(a, static_cast<__float128>(2)); +#endif + } + return a; +} + +// clang-format on diff --git a/src/boost/libs/multiprecision/test/constexpr_test_arithmetic_backend.cpp b/src/boost/libs/multiprecision/test/constexpr_test_arithmetic_backend.cpp new file mode 100644 index 00000000..67ba0970 --- /dev/null +++ b/src/boost/libs/multiprecision/test/constexpr_test_arithmetic_backend.cpp @@ -0,0 +1,115 @@ +// (C) Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include "constexpr_arithmetric_test.hpp" +#include "../performance/arithmetic_backend.hpp" + +int main() +{ + typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<long long>, boost::multiprecision::et_off> int_backend; + typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<unsigned long long>, boost::multiprecision::et_off> unsigned_backend; + + typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<long long>, boost::multiprecision::et_on> int_backend_et; + typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<unsigned long long>, boost::multiprecision::et_on> unsigned_backend_et; + + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_add_subtract(a); + constexpr unsigned_backend d = test_constexpr_add_subtract(c); + + constexpr long long llv = (long long)b; + + static_assert(b == -108); + static_assert(d == 554); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_mul_divide(a); + constexpr unsigned_backend d = test_constexpr_mul_divide(c); + static_assert(b == 22); + static_assert(d == 22); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_bitwise(a); + constexpr unsigned_backend d = test_constexpr_bitwise(c); +#ifdef BOOST_HAS_INT128 + static_assert(b == 230); + static_assert(d == 120); +#else + static_assert(b == 210); + static_assert(d == 106); +#endif + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_logical(a); + constexpr unsigned_backend d = test_constexpr_logical(c); + static_assert(b == 82); + static_assert(d == 82); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_compare(a); + constexpr unsigned_backend d = test_constexpr_compare(c); + static_assert(b == 95); + static_assert(d == 95); + } + // + // Over again with expression templates turned on: + // + { + constexpr int_backend_et a(22); + constexpr unsigned_backend_et c(22); + constexpr int_backend_et b = test_constexpr_add_subtract(a); + constexpr unsigned_backend_et d = test_constexpr_add_subtract(c); + + static_assert(b == -108); + static_assert(d == 554); + } + { + constexpr int_backend_et a(22); + constexpr unsigned_backend_et c(22); + constexpr int_backend_et b = test_constexpr_mul_divide(a); + constexpr unsigned_backend_et d = test_constexpr_mul_divide(c); + static_assert(b == 22); + static_assert(d == 22); + } + { + constexpr int_backend_et a(22); + constexpr unsigned_backend_et c(22); + constexpr int_backend_et b = test_constexpr_bitwise(a); + constexpr unsigned_backend_et d = test_constexpr_bitwise(c); +#ifdef BOOST_HAS_INT128 + static_assert(b == 230); + static_assert(d == 120); +#else + static_assert(b == 210); + static_assert(d == 106); +#endif + } + { + constexpr int_backend_et a(22); + constexpr unsigned_backend_et c(22); + constexpr int_backend_et b = test_constexpr_logical(a); + constexpr unsigned_backend_et d = test_constexpr_logical(c); + static_assert(b == 82); + static_assert(d == 82); + } + { + constexpr int_backend_et a(22); + constexpr unsigned_backend_et c(22); + constexpr int_backend_et b = test_constexpr_compare(a); + constexpr unsigned_backend_et d = test_constexpr_compare(c); + static_assert(b == 95); + static_assert(d == 95); + } + std::cout << "Done!" << std::endl; +} diff --git a/src/boost/libs/multiprecision/test/constexpr_test_cpp_int.cpp b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int.cpp new file mode 100644 index 00000000..e5b86fac --- /dev/null +++ b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int.cpp @@ -0,0 +1,99 @@ +// (C) Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include "constexpr_arithmetric_test.hpp" +#include "boost/multiprecision/cpp_int.hpp" +#include "test.hpp" + +#if !defined(BOOST_MP_NO_CONSTEXPR_DETECTION) && !defined(DISABLE_TESTS) + +template <class F, class V> +decltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v) +{ + return f(v); +} + +int main() +{ + typedef boost::multiprecision::int256_t int_backend; + typedef boost::multiprecision::uint256_t unsigned_backend; + + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_add_subtract(a); + constexpr unsigned_backend d = test_constexpr_add_subtract(c); + + constexpr long long llv = (long long)b; + + static_assert(b == -108); + static_assert(d == 554); + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_add_subtract<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_add_subtract<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_mul_divide(a); + constexpr unsigned_backend d = test_constexpr_mul_divide(c); + static_assert(b == 22); + static_assert(d == 22); + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_mul_divide<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_mul_divide<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_bitwise(a); + constexpr unsigned_backend d = test_constexpr_bitwise(c); +#ifdef BOOST_HAS_INT128 + static_assert(b == 230); + static_assert(d == 120); +#else + static_assert(b == 210); + static_assert(d == 106); +#endif + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_bitwise<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_bitwise<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_logical(a); + constexpr unsigned_backend d = test_constexpr_logical(c); +#ifdef BOOST_HAS_INT128 + //static_assert(b == 95); + //static_assert(d == 95); +#else + static_assert(b == 82); + static_assert(d == 82); +#endif + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_logical<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_logical<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_compare(a); + constexpr unsigned_backend d = test_constexpr_compare(c); +#ifdef BOOST_HAS_INT128 + static_assert(b == 95); + static_assert(d == 95); +#else + static_assert(b == 95); + static_assert(d == 95); +#endif + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_compare<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_compare<unsigned_backend>, c)); + } + return boost::report_errors(); +} +#else +int main() {} +#endif + diff --git a/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_2.cpp b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_2.cpp new file mode 100644 index 00000000..545ce068 --- /dev/null +++ b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_2.cpp @@ -0,0 +1,101 @@ +// (C) Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/config.hpp> +#undef BOOST_HAS_INT128 +#include "constexpr_arithmetric_test.hpp" +#include "boost/multiprecision/cpp_int.hpp" +#include "test.hpp" + +#if !defined(BOOST_MP_NO_CONSTEXPR_DETECTION) && !defined(DISABLE_TESTS) + +template <class F, class V> +decltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v) +{ + return f(v); +} + +int main() +{ + typedef boost::multiprecision::int128_t int_backend; + typedef boost::multiprecision::uint128_t unsigned_backend; + + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_add_subtract(a); + constexpr unsigned_backend d = test_constexpr_add_subtract(c); + + constexpr long long llv = (long long)b; + + static_assert(b == -108); + static_assert(d == 554); + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_add_subtract<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_add_subtract<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_mul_divide(a); + constexpr unsigned_backend d = test_constexpr_mul_divide(c); + static_assert(b == 22); + static_assert(d == 22); + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_mul_divide<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_mul_divide<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_bitwise(a); + constexpr unsigned_backend d = test_constexpr_bitwise(c); +#ifdef BOOST_HAS_INT128 + static_assert(b == 230); + static_assert(d == 120); +#else + static_assert(b == 210); + static_assert(d == 106); +#endif + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_bitwise<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_bitwise<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_logical(a); + constexpr unsigned_backend d = test_constexpr_logical(c); +#ifdef BOOST_HAS_INT128 + //static_assert(b == 95); + //static_assert(d == 95); +#else + static_assert(b == 82); + static_assert(d == 82); +#endif + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_logical<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_logical<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_compare(a); + constexpr unsigned_backend d = test_constexpr_compare(c); +#ifdef BOOST_HAS_INT128 + static_assert(b == 95); + static_assert(d == 95); +#else + static_assert(b == 95); + static_assert(d == 95); +#endif + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_compare<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_compare<unsigned_backend>, c)); + } + return boost::report_errors(); +} +#else +int main(){} +#endif + diff --git a/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_3.cpp b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_3.cpp new file mode 100644 index 00000000..c365efa8 --- /dev/null +++ b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_3.cpp @@ -0,0 +1,99 @@ +// (C) Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include "constexpr_arithmetric_test.hpp" +#include "boost/multiprecision/cpp_int.hpp" +#include "test.hpp" + +#if !defined(BOOST_MP_NO_CONSTEXPR_DETECTION) && !defined(DISABLE_TESTS) + +template <class F, class V> +decltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v) +{ + return f(v); +} + +int main() +{ + typedef boost::multiprecision::checked_int256_t int_backend; + typedef boost::multiprecision::checked_uint256_t unsigned_backend; + + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_add_subtract(a); + constexpr unsigned_backend d = test_constexpr_add_subtract(c); + + constexpr long long llv = (long long)b; + + static_assert(b == -108); + static_assert(d == 554); + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_add_subtract<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_add_subtract<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_mul_divide(a); + constexpr unsigned_backend d = test_constexpr_mul_divide(c); + static_assert(b == 22); + static_assert(d == 22); + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_mul_divide<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_mul_divide<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_bitwise(a); + constexpr unsigned_backend d = test_constexpr_bitwise(c); +#ifdef BOOST_HAS_INT128 + static_assert(b == 230); + static_assert(d == 120); +#else + static_assert(b == 210); + static_assert(d == 106); +#endif + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_bitwise<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_bitwise<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_logical(a); + constexpr unsigned_backend d = test_constexpr_logical(c); +#ifdef BOOST_HAS_INT128 + //static_assert(b == 95); + //static_assert(d == 95); +#else + static_assert(b == 82); + static_assert(d == 82); +#endif + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_logical<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_logical<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_compare(a); + constexpr unsigned_backend d = test_constexpr_compare(c); +#ifdef BOOST_HAS_INT128 + static_assert(b == 95); + static_assert(d == 95); +#else + static_assert(b == 95); + static_assert(d == 95); +#endif + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_compare<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_compare<unsigned_backend>, c)); + } + return boost::report_errors(); +} +#else +int main(){} +#endif + diff --git a/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_4.cpp b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_4.cpp new file mode 100644 index 00000000..500ffa1e --- /dev/null +++ b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_4.cpp @@ -0,0 +1,93 @@ +// (C) Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include "constexpr_arithmetric_test.hpp" +#include "boost/multiprecision/cpp_int.hpp" +#include "test.hpp" + +template <class F, class V> +decltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v) +{ + return f(v); +} + +int main() +{ + typedef boost::multiprecision::checked_int128_t int_backend; + typedef boost::multiprecision::checked_uint128_t unsigned_backend; + + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_add_subtract(a); + constexpr unsigned_backend d = test_constexpr_add_subtract(c); + + constexpr long long llv = (long long)b; + + static_assert(b == -108); + static_assert(d == 554); + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_add_subtract<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_add_subtract<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_mul_divide(a); + constexpr unsigned_backend d = test_constexpr_mul_divide(c); + static_assert(b == 22); + static_assert(d == 22); + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_mul_divide<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_mul_divide<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_bitwise(a); + constexpr unsigned_backend d = test_constexpr_bitwise(c); +#ifdef BOOST_HAS_INT128 + static_assert(b == 230); + static_assert(d == 120); +#else + static_assert(b == 210); + static_assert(d == 106); +#endif + + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_bitwise<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_bitwise<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_logical(a); + constexpr unsigned_backend d = test_constexpr_logical(c); +#ifdef BOOST_HAS_INT128 + //static_assert(b == 95); + //static_assert(d == 95); +#else + static_assert(b == 82); + static_assert(d == 82); +#endif + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_logical<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_logical<unsigned_backend>, c)); + } + { + constexpr int_backend a(22); + constexpr unsigned_backend c(22); + constexpr int_backend b = test_constexpr_compare(a); + constexpr unsigned_backend d = test_constexpr_compare(c); +#ifdef BOOST_HAS_INT128 + static_assert(b == 95); + static_assert(d == 95); +#else + static_assert(b == 95); + static_assert(d == 95); +#endif + BOOST_CHECK_EQUAL(b, non_constexpr_invoke(test_constexpr_compare<int_backend>, a)); + BOOST_CHECK_EQUAL(d, non_constexpr_invoke(test_constexpr_compare<unsigned_backend>, c)); + } + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_5.cpp b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_5.cpp new file mode 100644 index 00000000..0d71df48 --- /dev/null +++ b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_5.cpp @@ -0,0 +1,294 @@ +// (C) Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include "constexpr_arithmetric_test.hpp" +#include "boost/multiprecision/cpp_int.hpp" +#include "boost/multiprecision/integer.hpp" +#include "test.hpp" + +template <class F, class V> +decltype(std::declval<F>()(std::declval<V>())) non_constexpr_invoke(F f, V v) +{ + return f(v); +} + +//[factorial_decl +template <class T> +constexpr T factorial(const T& a) +{ + return a ? a * factorial(a - 1) : 1; +} +//] + +template <class T, class U> +constexpr T big_mul(const U& a, const U& b) +{ + using boost::multiprecision::multiply; + T result = T(); + multiply(result, a, b); + return result; +} +template <class T, class U> +constexpr T big_add(const U& a, const U& b) +{ + using boost::multiprecision::add; + T result = T(); + add(result, a, b); + return result; +} +template <class T, class U> +constexpr T big_sub(const U& a, const U& b) +{ + using boost::multiprecision::subtract; + T result = T(); + subtract(result, a, b); + return result; +} +template <class U> +constexpr U div_qr_d(const U& a, const U& b) +{ + using boost::multiprecision::divide_qr; + U result = U(); + U r = U(); + divide_qr(a, b, result, r); + return result; +} +template <class U> +constexpr U div_qr_r(const U& a, const U& b) +{ + using boost::multiprecision::divide_qr; + U result = U(); + U r = U(); + divide_qr(a, b, result, r); + return r; +} +template <class T> +constexpr T do_bit_set(T val, unsigned pos) +{ + using boost::multiprecision::bit_set; + bit_set(val, pos); + return val; +} +template <class T> +constexpr T do_bit_unset(T val, unsigned pos) +{ + using boost::multiprecision::bit_unset; + bit_unset(val, pos); + return val; +} +template <class T> +constexpr T do_bit_flip(T val, unsigned pos) +{ + using boost::multiprecision::bit_flip; + bit_flip(val, pos); + return val; +} +template <class T> +constexpr T test_swap(T a, T b) +{ + swap(a, b); + a.swap(b); + return a; +} + +int main() +{ + using namespace boost::multiprecision::literals; + + typedef boost::multiprecision::checked_int1024_t int_backend; + typedef boost::multiprecision::checked_int512_t small_int_backend; + typedef boost::multiprecision::checked_uint1024_t unsigned_backend; + + constexpr int_backend f1 = factorial(int_backend(31)); + static_assert(f1 == 0x1956ad0aae33a4560c5cd2c000000_cppi); + constexpr unsigned_backend f2 = factorial(unsigned_backend(31)); + static_assert(f2 == 0x1956ad0aae33a4560c5cd2c000000_cppui); + + // + // Test integer non-member functions: + // + constexpr small_int_backend si1 = (std::numeric_limits<small_int_backend>::max)(); + constexpr small_int_backend si2 = 239876; + constexpr std::int32_t i = (std::numeric_limits<int>::max)(); + constexpr std::int32_t j = 239876; + // Multiply: + { + constexpr int_backend i1 = big_mul<int_backend>(si1, si2); + int_backend nc; + multiply(nc, si1, si2); + BOOST_CHECK_EQUAL(nc, i1); + + constexpr std::int64_t k = big_mul<std::int64_t>(i, j); + std::int64_t ii; + boost::multiprecision::multiply(ii, i, j); + BOOST_CHECK_EQUAL(ii, k); + } + // Add: + { + constexpr int_backend i1 = big_add<int_backend>(si1, si2); + int_backend nc; + add(nc, si1, si2); + BOOST_CHECK_EQUAL(nc, i1); + + constexpr std::int64_t k = big_add<std::int64_t>(i, j); + std::int64_t ii; + boost::multiprecision::add(ii, i, j); + BOOST_CHECK_EQUAL(ii, k); + } + // Subtract: + { + constexpr int_backend i1 = big_sub<int_backend>(si1, -si2); + int_backend nc; + subtract(nc, si1, -si2); + BOOST_CHECK_EQUAL(nc, i1); + + constexpr std::int64_t k = big_sub<std::int64_t>(i, -j); + std::int64_t ii; + boost::multiprecision::subtract(ii, i, -j); + BOOST_CHECK_EQUAL(ii, k); + } + // divide_qr: + { + constexpr small_int_backend i1 = div_qr_d(si1, si2); + small_int_backend nc, nc2; + divide_qr(si1, si2, nc, nc2); + BOOST_CHECK_EQUAL(nc, i1); + + constexpr std::int64_t k = div_qr_d(i, j); + std::int32_t ii, ij; + boost::multiprecision::divide_qr(i, j, ii, ij); + BOOST_CHECK_EQUAL(ii, k); + } + // divide_qr: + { + constexpr small_int_backend i1 = div_qr_r(si1, si2); + small_int_backend nc, nc2; + divide_qr(si1, si2, nc, nc2); + BOOST_CHECK_EQUAL(nc2, i1); + + constexpr std::int64_t k = div_qr_r(i, j); + std::int32_t ii, ij; + boost::multiprecision::divide_qr(i, j, ii, ij); + BOOST_CHECK_EQUAL(ij, k); + } + // integer_modulus: + { + constexpr int i1 = integer_modulus(si1, 67); + small_int_backend nc(si1); + int r = integer_modulus(nc, 67); + BOOST_CHECK_EQUAL(r, i1); + + constexpr std::int32_t k = boost::multiprecision::integer_modulus(i, j); + std::int32_t ii(i); + r = boost::multiprecision::integer_modulus(ii, j); + BOOST_CHECK_EQUAL(r, k); + } + // powm: + { + constexpr small_int_backend i1 = powm(si1, si2, si2); + small_int_backend nc(si1); + nc = powm(nc, si2, si2); + BOOST_CHECK_EQUAL(nc, i1); + + constexpr std::int32_t k = boost::multiprecision::powm(i, j, j); + std::int32_t ii(i); + ii = boost::multiprecision::powm(ii, j, j); + BOOST_CHECK_EQUAL(ii, k); + } + // lsb: + { + constexpr int i1 = lsb(si1); + small_int_backend nc(si1); + int nci = lsb(nc); + BOOST_CHECK_EQUAL(nci, i1); + + constexpr std::int32_t k = boost::multiprecision::lsb(i); + std::int32_t ii(i); + ii = boost::multiprecision::lsb(ii); + BOOST_CHECK_EQUAL(ii, k); + } + // msb: + { + constexpr int i1 = msb(si1); + small_int_backend nc(si1); + int nci = msb(nc); + BOOST_CHECK_EQUAL(nci, i1); + + constexpr std::int32_t k = boost::multiprecision::msb(i); + std::int32_t ii(i); + ii = boost::multiprecision::msb(ii); + BOOST_CHECK_EQUAL(ii, k); + } + // bit_test: + { + constexpr bool b = bit_test(si1, 1); + static_assert(b); + + constexpr bool k = boost::multiprecision::bit_test(i, 1); + static_assert(k); + } + // bit_set: + { + constexpr int_backend i(0); + constexpr int_backend j = do_bit_set(i, 20); + static_assert(bit_test(j, 20)); + + constexpr int ii(0); + constexpr int jj = do_bit_set(ii, 20); + static_assert(boost::multiprecision::bit_test(jj, 20)); + } + // bit_unset: + { + constexpr int_backend r = do_bit_unset(si1, 20); + static_assert(bit_test(r, 20) == false); + + constexpr int jj = do_bit_unset(i, 20); + static_assert(boost::multiprecision::bit_test(jj, 20) == false); + } + // bit_unset: + { + constexpr int_backend r = do_bit_flip(si1, 20); + static_assert(bit_test(r, 20) == false); + + constexpr int jj = do_bit_flip(i, 20); + static_assert(boost::multiprecision::bit_test(jj, 20) == false); + } + // sqrt: + { + constexpr int_backend r = sqrt(si1); + small_int_backend nc(si1); + nc = sqrt(nc); + BOOST_CHECK_EQUAL(nc, r); + + constexpr int jj = boost::multiprecision::sqrt(i); + int k = i; + k = boost::multiprecision::sqrt(k); + BOOST_CHECK_EQUAL(jj, k); + } + { + // swap: + constexpr small_int_backend r = test_swap(si1, si2); + static_assert(si1 == r); + } + { + // gcd: + constexpr int_backend i(si1), j(si1 / 3); + constexpr int_backend k = gcd(i, j); + + int_backend ii(i), jj(j); + BOOST_CHECK_EQUAL(k, gcd(ii, jj)); + + constexpr unsigned_backend ui(i), uj(j); + constexpr unsigned_backend uk = gcd(ui, uj); + unsigned_backend uii(ui), ujj(uj); + BOOST_CHECK_EQUAL(uk, gcd(uii, ujj)); + + constexpr int_backend l = lcm(i, j); + BOOST_CHECK_EQUAL(l, lcm(ii, jj)); + constexpr unsigned_backend ul = lcm(ui, uj); + BOOST_CHECK_EQUAL(ul, lcm(uii, ujj)); + } + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_6.cpp b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_6.cpp new file mode 100644 index 00000000..4234300f --- /dev/null +++ b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_6.cpp @@ -0,0 +1,266 @@ +// (C) Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include "boost/multiprecision/cpp_int.hpp" +#include "test.hpp" + +template <class T, unsigned Order> +struct const_polynomial +{ + public: + T data[Order + 1]; + + public: + constexpr const_polynomial(T val = 0) : data{val} {} + constexpr const_polynomial(const const_polynomial&) = default; + constexpr const_polynomial(const std::initializer_list<T>& init) : data{} + { + if (init.size() > Order + 1) + throw std::range_error("Too many initializers in list"); + for (unsigned i = 0; i < init.size(); ++i) + data[i] = init.begin()[i]; + } + constexpr T& operator[](std::size_t N) + { + return data[N]; + } + constexpr const T& operator[](std::size_t N) const + { + return data[N]; + } + template <class U> + constexpr T operator()(U val) const + { + T result = data[Order]; + for (unsigned i = Order; i > 0; --i) + { + result *= val; + result += data[i - 1]; + } + return result; + } + constexpr const_polynomial<T, Order - 1> derivative() const + { + const_polynomial<T, Order - 1> result; + for (unsigned i = 1; i <= Order; ++i) + { + result[i - 1] = (*this)[i] * i; + } + return result; + } + constexpr const_polynomial operator-() + { + const_polynomial t(*this); + for (unsigned i = 0; i <= Order; ++i) + t[i] = -t[i]; + return t; + } + template <class U> + constexpr const_polynomial& operator*=(U val) + { + for (unsigned i = 0; i <= Order; ++i) + data[i] = data[i] * val; + return *this; + } + template <class U> + constexpr const_polynomial& operator/=(U val) + { + for (unsigned i = 0; i <= Order; ++i) + data[i] = data[i] / val; + return *this; + } + template <class U> + constexpr const_polynomial& operator+=(U val) + { + data[0] += val; + return *this; + } + template <class U> + constexpr const_polynomial& operator-=(U val) + { + data[0] -= val; + return *this; + } +}; + +template <class T, unsigned Order1, unsigned Order2> +inline constexpr const_polynomial<T, (Order1 > Order2 ? Order1 : Order2)> operator+(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b) +{ + if + constexpr(Order1 > Order2) + { + const_polynomial<T, Order1> result(a); + for (unsigned i = 0; i <= Order2; ++i) + result[i] += b[i]; + return result; + } + else + { + const_polynomial<T, Order2> result(b); + for (unsigned i = 0; i <= Order1; ++i) + result[i] += a[i]; + return result; + } +} +template <class T, unsigned Order1, unsigned Order2> +inline constexpr const_polynomial<T, (Order1 > Order2 ? Order1 : Order2)> operator-(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b) +{ + if + constexpr(Order1 > Order2) + { + const_polynomial<T, Order1> result(a); + for (unsigned i = 0; i <= Order2; ++i) + result[i] -= b[i]; + return result; + } + else + { + const_polynomial<T, Order2> result(b); + for (unsigned i = 0; i <= Order1; ++i) + result[i] = a[i] - b[i]; + return result; + } +} +template <class T, unsigned Order1, unsigned Order2> +inline constexpr const_polynomial<T, Order1 + Order2> operator*(const const_polynomial<T, Order1>& a, const const_polynomial<T, Order2>& b) +{ + const_polynomial<T, Order1 + Order2> result; + for (unsigned i = 0; i <= Order1; ++i) + { + for (unsigned j = 0; j <= Order2; ++j) + { + result[i + j] += a[i] * b[j]; + } + } + return result; +} +template <class T, unsigned Order, class U> +inline constexpr const_polynomial<T, Order> operator*(const const_polynomial<T, Order>& a, const U& b) +{ + const_polynomial<T, Order> result(a); + for (unsigned i = 0; i <= Order; ++i) + { + result[i] *= b; + } + return result; +} +template <class U, class T, unsigned Order> +inline constexpr const_polynomial<T, Order> operator*(const U& b, const const_polynomial<T, Order>& a) +{ + const_polynomial<T, Order> result(a); + for (unsigned i = 0; i <= Order; ++i) + { + result[i] *= b; + } + return result; +} +template <class T, unsigned Order, class U> +inline constexpr const_polynomial<T, Order> operator/(const const_polynomial<T, Order>& a, const U& b) +{ + const_polynomial<T, Order> result; + for (unsigned i = 0; i <= Order; ++i) + { + result[i] /= b; + } + return result; +} + +template <class T, unsigned Order> +class hermite_polynomial +{ + const_polynomial<T, Order> m_data; + + public: + constexpr hermite_polynomial() : m_data(hermite_polynomial<T, Order - 1>().data() * const_polynomial<T, 1>{0, 2} - hermite_polynomial<T, Order - 1>().data().derivative()) + { + } + constexpr const const_polynomial<T, Order>& data() const + { + return m_data; + } + constexpr const T& operator[](std::size_t N) const + { + return m_data[N]; + } + template <class U> + constexpr T operator()(U val) const + { + return m_data(val); + } +}; + +template <class T> +class hermite_polynomial<T, 0> +{ + const_polynomial<T, 0> m_data; + + public: + constexpr hermite_polynomial() : m_data{1} {} + constexpr const const_polynomial<T, 0>& data() const + { + return m_data; + } + constexpr const T& operator[](std::size_t N) const + { + return m_data[N]; + } + template <class U> + constexpr T operator()(U val) + { + return m_data(val); + } +}; + +template <class T> +class hermite_polynomial<T, 1> +{ + const_polynomial<T, 1> m_data; + + public: + constexpr hermite_polynomial() : m_data{0, 2} {} + constexpr const const_polynomial<T, 1>& data() const + { + return m_data; + } + constexpr const T& operator[](std::size_t N) const + { + return m_data[N]; + } + template <class U> + constexpr T operator()(U val) + { + return m_data(val); + } +}; + + + +int main() +{ + using namespace boost::multiprecision::literals; + + typedef boost::multiprecision::checked_int1024_t int_backend; + + // 8192 x^13 - 319488 x^11 + 4392960 x^9 - 26357760 x^7 + 69189120 x^5 - 69189120 x^3 + 17297280 x + constexpr hermite_polynomial<int_backend, 13> h; + + static_assert(h[0] == 0); + static_assert(h[1] == 17297280); + static_assert(h[2] == 0); + static_assert(h[3] == -69189120); + static_assert(h[4] == 0); + static_assert(h[5] == 69189120); + static_assert(h[6] == 0); + static_assert(h[7] == -26357760); + static_assert(h[8] == 0); + static_assert(h[9] == 4392960); + static_assert(h[10] == 0); + static_assert(h[11] == -319488); + static_assert(h[12] == 0); + static_assert(h[13] == 8192); + + return boost::report_errors(); +} + diff --git a/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_7.cpp b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_7.cpp new file mode 100644 index 00000000..9e1676f2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/constexpr_test_cpp_int_7.cpp @@ -0,0 +1,122 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_ + +#include <boost/multiprecision/cpp_int.hpp> +#include <iostream> + +struct kiss_rand +{ + typedef std::uint64_t result_type; + + constexpr kiss_rand() : x(0x8207ebe160468b32uLL), y(0x2871283e01d45bbduLL), z(0x9c80bfd5db9680c9uLL), c(0x2e2683c2abb878b8uLL) {} + constexpr kiss_rand(std::uint64_t seed) : x(seed), y(0x2871283e01d45bbduLL), z(0x9c80bfd5db9680c9uLL), c(0x2e2683c2abb878b8uLL) {} + constexpr kiss_rand(std::uint64_t seed_x, std::uint64_t seed_y) : x(seed_x), y(seed_y), z(0x9c80bfd5db9680c9uLL), c(0x2e2683c2abb878b8uLL) {} + constexpr kiss_rand(std::uint64_t seed_x, std::uint64_t seed_y, std::uint64_t seed_z) : x(seed_x), y(seed_y), z(seed_z), c(0x2e2683c2abb878b8uLL) {} + + constexpr std::uint64_t operator()() + { + return MWC() + XSH() + CNG(); + } + + private: + constexpr std::uint64_t MWC() + { + std::uint64_t t = (x << 58) + c; + c = (x >> 6); + x += t; + c += (x < t); + return x; + } + constexpr std::uint64_t XSH() + { + y ^= (y << 13); + y ^= (y >> 17); + return y ^= (y << 43); + } + constexpr std::uint64_t CNG() + { + return z = 6906969069LL * z + 1234567; + } + std::uint64_t x, y, z, c; +}; + +inline constexpr void hash_combine(std::uint64_t& h, std::uint64_t k) +{ + constexpr const std::uint64_t m = 0xc6a4a7935bd1e995uLL; + constexpr const int r = 47; + + k *= m; + k ^= k >> r; + k *= m; + + h ^= k; + h *= m; + + // Completely arbitrary number, to prevent 0's + // from hashing to 0. + h += 0xe6546b64; +} + +template <std::size_t N> +inline constexpr std::uint64_t string_to_hash(const char (&s)[N]) +{ + std::uint64_t hash(0); + for (unsigned i = 0; i < N; ++i) + hash_combine(hash, s[i]); + return hash; +} + +template <class UnsignedInteger> +struct multiprecision_generator +{ + typedef UnsignedInteger result_type; + constexpr multiprecision_generator(std::uint64_t seed1) : m_gen64(seed1) {} + constexpr multiprecision_generator(std::uint64_t seed1, std::uint64_t seed2) : m_gen64(seed1, seed2) {} + constexpr multiprecision_generator(std::uint64_t seed1, std::uint64_t seed2, std::uint64_t seed3) : m_gen64(seed1, seed2, seed3) {} + + static constexpr result_type (min)() + { + return 0u; + } + static constexpr result_type (max)() + { + return ~result_type(0u); + } + constexpr result_type operator()() + { + result_type result(m_gen64()); + unsigned digits = 64; + while (digits < std::numeric_limits<result_type>::digits) + { + result <<= 64; + result |= m_gen64(); + digits += 64; + } + return result; + } + + private: + kiss_rand m_gen64; +}; + +template <class UnsignedInteger> +constexpr UnsignedInteger nth_random_value(unsigned count = 0) +{ + std::uint64_t date_hash = string_to_hash(__DATE__); + std::uint64_t time_hash = string_to_hash(__TIME__); + multiprecision_generator<UnsignedInteger> big_gen(date_hash, time_hash); + for (unsigned i = 0; i < count; ++i) + big_gen(); + return big_gen(); +} + +int main() +{ + using namespace boost::multiprecision; + + constexpr uint1024_t rand = nth_random_value<uint1024_t>(1000); + std::cout << std::hex << rand << std::endl; + return 0; +} diff --git a/src/boost/libs/multiprecision/test/constexpr_test_float128.cpp b/src/boost/libs/multiprecision/test/constexpr_test_float128.cpp new file mode 100644 index 00000000..fc3c3167 --- /dev/null +++ b/src/boost/libs/multiprecision/test/constexpr_test_float128.cpp @@ -0,0 +1,70 @@ +// (C) Copyright John Maddock 2019. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include "constexpr_arithmetric_test.hpp" +#include <boost/multiprecision/float128.hpp> +#include <iostream> + +int main() +{ + using boost::multiprecision::float128; + + { + constexpr float128 a(22); + constexpr float128 b = test_constexpr_add_subtract(a); + + constexpr __float128 f128 = (__float128)b; + static_assert(f128 == -134.0f); + + constexpr int i = (int)b; + static_assert(i == -134); + + constexpr short s = (short)b; + static_assert(s == -134); + } + { + constexpr float128 a(22); + constexpr float128 b = test_constexpr_mul_divide(a); + static_assert((__float128)b == 0); + } + { + constexpr float128 a(22); + constexpr float128 b = test_constexpr_compare(a); + static_assert((__float128)b == 119); + } + { + constexpr float128 a(0); + static_assert(fpclassify(a) == FP_ZERO); + constexpr float128 b(1); + static_assert(fpclassify(b) == FP_NORMAL); + constexpr float128 c(-1); + static_assert(fpclassify(c) == FP_NORMAL); + static_assert(abs(c) >= 0); + static_assert(fabs(c) >= 0); + constexpr float128 d(std::numeric_limits<float128>::epsilon()); + static_assert(fpclassify(c) == FP_NORMAL); + constexpr float128 e((std::numeric_limits<float128>::min)()); + static_assert(fpclassify(e) == FP_NORMAL); + constexpr float128 f((std::numeric_limits<float128>::max)()); + static_assert(fpclassify(f) == FP_NORMAL); + constexpr float128 g(std::numeric_limits<float128>::lowest()); + static_assert(fpclassify(g) == FP_NORMAL); + constexpr float128 h(std::numeric_limits<float128>::round_error()); + static_assert(fpclassify(h) == FP_NORMAL); + constexpr float128 i(std::numeric_limits<float128>::denorm_min()); + static_assert(fpclassify(i) == FP_SUBNORMAL); + constexpr float128 j(-std::numeric_limits<float128>::denorm_min()); + static_assert(fpclassify(j) == FP_SUBNORMAL); + constexpr float128 k(std::numeric_limits<float128>::infinity()); + static_assert(fpclassify(k) == FP_INFINITE); + static_assert(isinf(k)); + static_assert(!isnan(k)); + constexpr float128 l(-std::numeric_limits<float128>::infinity()); + static_assert(fpclassify(l) == FP_INFINITE); + static_assert(isinf(l)); + static_assert(!isnan(l)); + } + std::cout << "Done!" << std::endl; +} diff --git a/src/boost/libs/multiprecision/test/coverage/Makefile b/src/boost/libs/multiprecision/test/coverage/Makefile new file mode 100644 index 00000000..d3825ea7 --- /dev/null +++ b/src/boost/libs/multiprecision/test/coverage/Makefile @@ -0,0 +1,313 @@ +# copyright John Maddock 2012 +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt. + + +SOURCES=\ +../../../../boost/multiprecision/mpfr.hpp\ +../../../../boost/multiprecision/tommath.hpp\ +../../../../boost/multiprecision/number.hpp\ +../../../../boost/multiprecision/cpp_dec_float.hpp\ +../../../../boost/multiprecision/gmp.hpp\ +../../../../boost/multiprecision/random.hpp\ +../../../../boost/multiprecision/cpp_int.hpp\ +../../../../boost/multiprecision/miller_rabin.hpp\ +../../../../boost/multiprecision/rational_adaptor.hpp\ +../../../../boost/multiprecision/concepts/mp_number_archetypes.hpp\ +../../../../boost/multiprecision/detail/big_lanczos.hpp\ +../../../../boost/multiprecision/detail/digits.hpp\ +../../../../boost/multiprecision/detail/no_et_ops.hpp\ +../../../../boost/multiprecision/detail/number_base.hpp\ +../../../../boost/multiprecision/detail/generic_interconvert.hpp\ +../../../../boost/multiprecision/detail/number_compare.hpp\ +../../../../boost/multiprecision/detail/default_ops.hpp\ +../../../../boost/multiprecision/detail/integer_ops.hpp\ +../../../../boost/multiprecision/detail/functions/constants.hpp\ +../../../../boost/multiprecision/detail/functions/pow.hpp\ +../../../../boost/multiprecision/detail/functions/trig.hpp\ +../../../../boost/multiprecision/traits/explicit_conversion.hpp\ +../../../../boost/multiprecision/traits/is_restricted_conversion.hpp + +coverage : run + gcov test_arithmetic_cpp_int_1 test_arithmetic_cpp_int_2 test_arithmetic_cpp_int_3 \ + gcov test_arithmetic_cpp_int_4 test_arithmetic_cpp_int_5 test_arithmetic_cpp_int_6 \ + gcov test_arithmetic_cpp_int_7 test_arithmetic_cpp_int_8 test_arithmetic_cpp_int_9 \ + gcov test_arithmetic_cpp_int_10 test_arithmetic_cpp_int_11 test_arithmetic_cpp_int_12 \ + gcov test_arithmetic_cpp_int_13 test_arithmetic_cpp_int_14 test_arithmetic_cpp_int_15 \ + gcov test_arithmetic_cpp_int_16 test_arithmetic_cpp_int_17 test_arithmetic_cpp_int_18 \ + test_arithmetic_cpp_dec_float_1 test_arithmetic_cpp_dec_float_2 test_arithmetic_cpp_dec_float_3\ + test_arithmetic_concept test_arithmetic_mpz test_arithmetic_mpf \ + test_arithmetic_mpf_50 test_arithmetic_mpq test_arithmetic_mpfr test_arithmetic_mpfr_50 test_cpp_int \ + test_int_io test_float_io test_rational_io test_gmp_conversions test_mpfr_conversions test_cpp_int_conv + +test_arithmetic_cpp_int_1.o : ../test_arithmetic_cpp_int_1.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_1 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_1.o -c ../test_arithmetic_cpp_int_1.cpp + +test_arithmetic_cpp_int_1 : test_arithmetic_cpp_int_1.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_1 test_arithmetic_cpp_int_1.o + +test_arithmetic_cpp_int_2.o : ../test_arithmetic_cpp_int_2.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_2 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_2.o -c ../test_arithmetic_cpp_int_2.cpp + +test_arithmetic_cpp_int_2 : test_arithmetic_cpp_int_2.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_2 test_arithmetic_cpp_int_2.o + +test_arithmetic_cpp_int_3.o : ../test_arithmetic_cpp_int_3.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_3.o -c ../test_arithmetic_cpp_int_3.cpp + +test_arithmetic_cpp_int_3 : test_arithmetic_cpp_int_3.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_3 test_arithmetic_cpp_int_3.o + +test_arithmetic_cpp_int_4.o : ../test_arithmetic_cpp_int_4.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_4.o -c ../test_arithmetic_cpp_int_4.cpp + +test_arithmetic_cpp_int_4 : test_arithmetic_cpp_int_4.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_4 test_arithmetic_cpp_int_4.o + +test_arithmetic_cpp_int_5.o : ../test_arithmetic_cpp_int_5.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_5.o -c ../test_arithmetic_cpp_int_5.cpp + +test_arithmetic_cpp_int_5 : test_arithmetic_cpp_int_5.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_5 test_arithmetic_cpp_int_5.o + +test_arithmetic_cpp_int_6.o : ../test_arithmetic_cpp_int_6.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_6.o -c ../test_arithmetic_cpp_int_6.cpp + +test_arithmetic_cpp_int_6 : test_arithmetic_cpp_int_6.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_6 test_arithmetic_cpp_int_6.o + +test_arithmetic_cpp_int_7.o : ../test_arithmetic_cpp_int_7.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_7.o -c ../test_arithmetic_cpp_int_7.cpp + +test_arithmetic_cpp_int_7 : test_arithmetic_cpp_int_7.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_7 test_arithmetic_cpp_int_7.o + +test_arithmetic_cpp_int_8.o : ../test_arithmetic_cpp_int_8.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_8.o -c ../test_arithmetic_cpp_int_8.cpp + +test_arithmetic_cpp_int_8 : test_arithmetic_cpp_int_8.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_8 test_arithmetic_cpp_int_8.o + +test_arithmetic_cpp_int_9.o : ../test_arithmetic_cpp_int_9.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_9.o -c ../test_arithmetic_cpp_int_9.cpp + +test_arithmetic_cpp_int_9 : test_arithmetic_cpp_int_9.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_9 test_arithmetic_cpp_int_9.o + +test_arithmetic_cpp_int_10.o : ../test_arithmetic_cpp_int_10.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_10.o -c ../test_arithmetic_cpp_int_10.cpp + +test_arithmetic_cpp_int_10 : test_arithmetic_cpp_int_10.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_10 test_arithmetic_cpp_int_10.o + +test_arithmetic_cpp_int_11.o : ../test_arithmetic_cpp_int_11.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_11.o -c ../test_arithmetic_cpp_int_12.cpp + +test_arithmetic_cpp_int_11 : test_arithmetic_cpp_int_11.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_11 test_arithmetic_cpp_int_11.o + +test_arithmetic_cpp_int_12.o : ../test_arithmetic_cpp_int_12.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_12.o -c ../test_arithmetic_cpp_int_12.cpp + +test_arithmetic_cpp_int_12 : test_arithmetic_cpp_int_12.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_12 test_arithmetic_cpp_int_12.o + +test_arithmetic_cpp_int_13.o : ../test_arithmetic_cpp_int_13.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_13.o -c ../test_arithmetic_cpp_int_13.cpp + +test_arithmetic_cpp_int_13 : test_arithmetic_cpp_int_13.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_13 test_arithmetic_cpp_int_13.o + +test_arithmetic_cpp_int_14.o : ../test_arithmetic_cpp_int_14.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_14.o -c ../test_arithmetic_cpp_int_14.cpp + +test_arithmetic_cpp_int_14 : test_arithmetic_cpp_int_14.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_14 test_arithmetic_cpp_int_14.o + +test_arithmetic_cpp_int_15.o : ../test_arithmetic_cpp_int_15.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_15.o -c ../test_arithmetic_cpp_int_15.cpp + +test_arithmetic_cpp_int_15 : test_arithmetic_cpp_int_15.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_15 test_arithmetic_cpp_int_15.o + +test_arithmetic_cpp_int_16.o : ../test_arithmetic_cpp_int_16.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_16.o -c ../test_arithmetic_cpp_int_16.cpp + +test_arithmetic_cpp_int_16 : test_arithmetic_cpp_int_16.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_16 test_arithmetic_cpp_int_16.o + +test_arithmetic_cpp_int_17.o : ../test_arithmetic_cpp_int_17.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_17.o -c ../test_arithmetic_cpp_int_17.cpp + +test_arithmetic_cpp_int_17 : test_arithmetic_cpp_int_17.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_17 test_arithmetic_cpp_int_17.o + +test_arithmetic_cpp_int_18.o : ../test_arithmetic_cpp_int_18.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_INT_3 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_int_18.o -c ../test_arithmetic_cpp_int_18.cpp + +test_arithmetic_cpp_int_18 : test_arithmetic_cpp_int_18.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_int_18 test_arithmetic_cpp_int_18.o + +test_arithmetic_cpp_dec_float_1.o : ../test_arithmetic_cpp_dec_float_1.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_DEC_FLOAT --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_dec_float_1.o -c ../test_arithmetic_cpp_dec_float_1.cpp + +test_arithmetic_cpp_dec_float_1 : test_arithmetic_cpp_dec_float_1.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_dec_float_1 test_arithmetic_cpp_dec_float_1.o + +test_arithmetic_cpp_dec_float_2.o : ../test_arithmetic_cpp_dec_float_2.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_DEC_FLOAT --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_dec_float_2.o -c ../test_arithmetic_cpp_dec_float_2.cpp + +test_arithmetic_cpp_dec_float_2 : test_arithmetic_cpp_dec_float_2.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_dec_float_2 test_arithmetic_cpp_dec_float_2.o + +test_arithmetic_cpp_dec_float_3.o : ../test_arithmetic_cpp_dec_float_3.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_CPP_DEC_FLOAT --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_cpp_dec_float_3.o -c ../test_arithmetic_cpp_dec_float_3.cpp + +test_arithmetic_cpp_dec_float_3 : test_arithmetic_cpp_dec_float_3.o + g++ -std=gnu++0x --coverage -o test_arithmetic_cpp_dec_float_3 test_arithmetic_cpp_dec_float_3.o + +test_arithmetic_concept.o : ../test_arithmetic_backend_concept.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_BACKEND --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_concept.o -c ../test_arithmetic_backend_concept.cpp + +test_arithmetic_concept : test_arithmetic_concept.o + g++ -std=gnu++0x --coverage -o test_arithmetic_concept test_arithmetic_concept.o + +test_arithmetic_mpz.o : ../test_arithmetic_mpz.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_MPZ --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_mpz.o -c ../test_arithmetic_mpz.cpp + +test_arithmetic_mpz : test_arithmetic_mpz.o + g++ -std=gnu++0x --coverage -o test_arithmetic_mpz test_arithmetic_mpz.o -lgmp + +test_arithmetic_mpf.o : ../test_arithmetic_mpf.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_MPF --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_mpf.o -c ../test_arithmetic_mpf.cpp + +test_arithmetic_mpf : test_arithmetic_mpf.o + g++ -std=gnu++0x --coverage -o test_arithmetic_mpf test_arithmetic_mpf.o -lgmp + +test_arithmetic_mpf_50.o : ../test_arithmetic_mpf_50.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_MPF_50 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_mpf_50.o -c ../test_arithmetic_mpf_50.cpp + +test_arithmetic_mpf_50 : test_arithmetic_mpf_50.o + g++ -std=gnu++0x --coverage -o test_arithmetic_mpf_50 test_arithmetic_mpf_50.o -lgmp + +test_arithmetic_mpq.o : ../test_arithmetic_mpq.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_MPQ --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_mpq.o -c ../test_arithmetic_mpq.cpp + +test_arithmetic_mpq : test_arithmetic_mpq.o + g++ -std=gnu++0x --coverage -o test_arithmetic_mpq test_arithmetic_mpq.o -lgmp + +test_arithmetic_mpfr.o : ../test_arithmetic_mpfr.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_MPFR --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_mpfr.o -c ../test_arithmetic_mpfr.cpp + +test_arithmetic_mpfr : test_arithmetic_mpfr.o + g++ -std=gnu++0x --coverage -o test_arithmetic_mpfr test_arithmetic_mpfr.o -lmpfr -lgmp + +test_arithmetic_mpfr_50.o : ../test_arithmetic_mpfr_50.cpp $(SOURCES) + g++ -std=gnu++0x -DTEST_MPFR_50 --coverage -g -I../../../.. -I../../../../../../trunk -o test_arithmetic_mpfr_50.o -c ../test_arithmetic_mpfr_50.cpp + +test_arithmetic_mpfr_50 : test_arithmetic_mpfr_50.o + g++ -std=gnu++0x --coverage -o test_arithmetic_mpfr_50 test_arithmetic_mpfr_50.o -lmpfr -lgmp + +test_cpp_int.o : ../test_cpp_int.cpp $(SOURCES) + g++ -std=gnu++0x --coverage -g -I../../../.. -I../../../../../../trunk -o test_cpp_int.o -c ../test_cpp_int.cpp + +test_cpp_int : test_cpp_int.o + g++ -std=gnu++0x --coverage -o test_cpp_int test_cpp_int.o -lgmp + +test_int_io.o : ../test_int_io.cpp $(SOURCES) + g++ -std=gnu++0x --coverage -DTEST_MPZ -DTEST_CPP_INT -g -I../../../.. -I../../../../../../trunk -o test_int_io.o -c ../test_int_io.cpp + +test_int_io : test_int_io.o + g++ -std=gnu++0x --coverage -o test_int_io test_int_io.o -lgmp + +test_float_io.o : ../test_float_io.cpp $(SOURCES) + g++ -std=gnu++0x --coverage -g -DTEST_MPF_50 -DTEST_CPP_DEC_FLOAT -DTEST_MPFR_50 -I../../../.. -I../../../../../../trunk -o test_float_io.o -c ../test_float_io.cpp + +test_float_io : test_float_io.o + g++ -std=gnu++0x --coverage -o test_float_io test_float_io.o -lmpfr -lgmp + +test_rational_io.o : ../test_rational_io.cpp $(SOURCES) + g++ -std=gnu++0x --coverage -DTEST_MPQ -DTEST_CPP_INT -g -I../../../.. -I../../../../../../trunk -o test_rational_io.o -c ../test_rational_io.cpp + +test_rational_io : test_rational_io.o + g++ -std=gnu++0x --coverage -o test_rational_io test_rational_io.o -lgmp + +test_gmp_conversions.o : ../test_gmp_conversions.cpp $(SOURCES) + g++ -std=gnu++0x --coverage -g -I../../../.. -I../../../../../../trunk -o test_gmp_conversions.o -c ../test_gmp_conversions.cpp + +test_gmp_conversions : test_gmp_conversions.o + g++ -std=gnu++0x --coverage -o test_gmp_conversions test_gmp_conversions.o -lgmp + +test_mpfr_conversions.o : ../test_mpfr_conversions.cpp $(SOURCES) + g++ -std=gnu++0x --coverage -g -I../../../.. -I../../../../../../trunk -o test_mpfr_conversions.o -c ../test_mpfr_conversions.cpp + +test_mpfr_conversions : test_mpfr_conversions.o + g++ -std=gnu++0x --coverage -o test_mpfr_conversions test_mpfr_conversions.o -lmpfr -lgmp + +test_cpp_int_conv.o : ../test_cpp_int_conv.cpp $(SOURCES) + g++ -std=gnu++0x --coverage -g -I../../../.. -I../../../../../../trunk -o test_cpp_int_conv.o -c ../test_cpp_int_conv.cpp + +test_cpp_int_conv : test_cpp_int_conv.o + g++ -std=gnu++0x --coverage -o test_cpp_int_conv test_cpp_int_conv.o + +run : test_arithmetic_cpp_int_1 test_arithmetic_cpp_int_2 test_arithmetic_cpp_int_3 \ + test_arithmetic_cpp_int_4 test_arithmetic_cpp_int_5 test_arithmetic_cpp_int_6 \ + test_arithmetic_cpp_int_7 test_arithmetic_cpp_int_8 test_arithmetic_cpp_int_9 \ + test_arithmetic_cpp_int_10 test_arithmetic_cpp_int_11 test_arithmetic_cpp_int_12 \ + test_arithmetic_cpp_int_13 test_arithmetic_cpp_int_14 test_arithmetic_cpp_int_15 \ + test_arithmetic_cpp_int_16 test_arithmetic_cpp_int_17 test_arithmetic_cpp_int_18 \ + test_arithmetic_cpp_dec_float_1 test_arithmetic_cpp_dec_float_2 test_arithmetic_cpp_dec_float_3 test_arithmetic_concept \ + test_arithmetic_mpz test_arithmetic_mpf test_arithmetic_mpf_50 test_arithmetic_mpq test_arithmetic_mpfr test_arithmetic_mpfr_50 \ + test_cpp_int test_int_io test_float_io test_rational_io test_gmp_conversions test_mpfr_conversions test_cpp_int_conv + ./test_arithmetic_cpp_int_1 + ./test_arithmetic_cpp_int_2 + ./test_arithmetic_cpp_int_3 + ./test_arithmetic_cpp_int_4 + ./test_arithmetic_cpp_int_5 + ./test_arithmetic_cpp_int_6 + ./test_arithmetic_cpp_int_7 + ./test_arithmetic_cpp_int_8 + ./test_arithmetic_cpp_int_9 + ./test_arithmetic_cpp_int_10 + ./test_arithmetic_cpp_int_11 + ./test_arithmetic_cpp_int_12 + ./test_arithmetic_cpp_int_13 + ./test_arithmetic_cpp_int_14 + ./test_arithmetic_cpp_int_15 + ./test_arithmetic_cpp_int_16 + ./test_arithmetic_cpp_int_17 + ./test_arithmetic_cpp_int_18 + ./test_arithmetic_cpp_dec_float_1 + ./test_arithmetic_cpp_dec_float_2 + ./test_arithmetic_cpp_dec_float_3 + ./test_arithmetic_concept + ./test_arithmetic_mpz + ./test_arithmetic_mpf + ./test_arithmetic_mpf_50 + ./test_arithmetic_mpq + ./test_arithmetic_mpfr + ./test_arithmetic_mpfr_50 + ./test_cpp_int + ./test_int_io + ./test_float_io + ./test_rational_io + ./test_gmp_conversions + ./test_mpfr_conversions + ./test_cpp_int_conv + +clean : + rm -rf *.o *.gc* test_arithmetic_cpp_int_1 test_arithmetic_cpp_int_2 test_arithmetic_cpp_int_3 \ + test_arithmetic_cpp_int_4 test_arithmetic_cpp_int_5 test_arithmetic_cpp_int_6 \ + test_arithmetic_cpp_int_7 test_arithmetic_cpp_int_8 test_arithmetic_cpp_int_9 \ + test_arithmetic_cpp_int_10 test_arithmetic_cpp_int_11 test_arithmetic_cpp_int_12 \ + test_arithmetic_cpp_int_13 test_arithmetic_cpp_int_14 test_arithmetic_cpp_int_15 \ + test_arithmetic_cpp_int_16 test_arithmetic_cpp_int_17 test_arithmetic_cpp_int_18 \ + test_arithmetic_cpp_dec_float test_arithmetic_concept test_arithmetic_mpz \ + test_arithmetic_mpf test_arithmetic_mpf_50 test_arithmetic_mpq test_arithmetic_mpfr test_arithmetic_mpfr_50 test_cpp_int\ + test_int_io test_float_io test_rational_io test_gmp_conversions test_mpfr_conversions test_cpp_int_conv + + + + + diff --git a/src/boost/libs/multiprecision/test/eigen.hpp b/src/boost/libs/multiprecision/test/eigen.hpp new file mode 100644 index 00000000..c01b949a --- /dev/null +++ b/src/boost/libs/multiprecision/test/eigen.hpp @@ -0,0 +1,627 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/eigen.hpp> +#include <iostream> +#include <Eigen/Dense> +#include "test.hpp" + +using namespace Eigen; + +template <class T> +struct related_number +{ + typedef T type; +}; + +template <class Num> +void example1() +{ + // expected results first: + Matrix<Num, 2, 2> r1, r2; + r1 << 3, 5, 4, 8; + r2 << -1, -1, 2, 0; + Matrix<Num, 3, 1> r3; + r3 << -1, -4, -6; + + Matrix<Num, 2, 2> a; + a << 1, 2, 3, 4; + Matrix<Num, Dynamic, Dynamic> b(2, 2); + b << 2, 3, 1, 4; + std::cout << "a + b =\n" + << a + b << std::endl; + BOOST_CHECK_EQUAL(a + b, r1); + std::cout << "a - b =\n" + << a - b << std::endl; + BOOST_CHECK_EQUAL(a - b, r2); + std::cout << "Doing a += b;" << std::endl; + a += b; + std::cout << "Now a =\n" + << a << std::endl; + Matrix<Num, 3, 1> v(1, 2, 3); + Matrix<Num, 3, 1> w(1, 0, 0); + std::cout << "-v + w - v =\n" + << -v + w - v << std::endl; + BOOST_CHECK_EQUAL(-v + w - v, r3); +} + +template <class Num> +void example2() +{ + Matrix<Num, 2, 2> a; + a << 1, 2, 3, 4; + Matrix<Num, 3, 1> v(1, 2, 3); + std::cout << "a * 2.5 =\n" + << a * 2.5 << std::endl; + std::cout << "0.1 * v =\n" + << 0.1 * v << std::endl; + std::cout << "Doing v *= 2;" << std::endl; + v *= 2; + std::cout << "Now v =\n" + << v << std::endl; + Num n(4); + std::cout << "Doing v *= Num;" << std::endl; + v *= n; + std::cout << "Now v =\n" + << v << std::endl; + typedef typename related_number<Num>::type related_type; + related_type r(6); + std::cout << "Doing v *= RelatedType;" << std::endl; + v *= r; + std::cout << "Now v =\n" + << v << std::endl; + std::cout << "RelatedType * v =\n" + << r * v << std::endl; + std::cout << "Doing v *= RelatedType^2;" << std::endl; + v *= r * r; + std::cout << "Now v =\n" + << v << std::endl; + std::cout << "RelatedType^2 * v =\n" + << r * r * v << std::endl; +} + +template <class Num> +void example3() +{ + using namespace std; + Matrix<Num, Dynamic, Dynamic> a = Matrix<Num, Dynamic, Dynamic>::Random(2, 2); + cout << "Here is the matrix a\n" + << a << endl; + cout << "Here is the matrix a^T\n" + << a.transpose() << endl; + cout << "Here is the conjugate of a\n" + << a.conjugate() << endl; + cout << "Here is the matrix a^*\n" + << a.adjoint() << endl; +} + +template <class Num> +void example4() +{ + Matrix<Num, 2, 2> mat; + mat << 1, 2, + 3, 4; + Matrix<Num, 2, 1> u(-1, 1), v(2, 0); + std::cout << "Here is mat*mat:\n" + << mat * mat << std::endl; + std::cout << "Here is mat*u:\n" + << mat * u << std::endl; + std::cout << "Here is u^T*mat:\n" + << u.transpose() * mat << std::endl; + std::cout << "Here is u^T*v:\n" + << u.transpose() * v << std::endl; + std::cout << "Here is u*v^T:\n" + << u * v.transpose() << std::endl; + std::cout << "Let's multiply mat by itself" << std::endl; + mat = mat * mat; + std::cout << "Now mat is mat:\n" + << mat << std::endl; +} + +template <class Num> +void example5() +{ + using namespace std; + Matrix<Num, 3, 1> v(1, 2, 3); + Matrix<Num, 3, 1> w(0, 1, 2); + cout << "Dot product: " << v.dot(w) << endl; + Num dp = v.adjoint() * w; // automatic conversion of the inner product to a scalar + cout << "Dot product via a matrix product: " << dp << endl; + cout << "Cross product:\n" + << v.cross(w) << endl; +} + +template <class Num> +void example6() +{ + using namespace std; + Matrix<Num, 2, 2> mat; + mat << 1, 2, + 3, 4; + cout << "Here is mat.sum(): " << mat.sum() << endl; + cout << "Here is mat.prod(): " << mat.prod() << endl; + cout << "Here is mat.mean(): " << mat.mean() << endl; + cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl; + cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl; + cout << "Here is mat.trace(): " << mat.trace() << endl; +} + +template <class Num> +void example7() +{ + using namespace std; + + Array<Num, Dynamic, Dynamic> m(2, 2); + + // assign some values coefficient by coefficient + m(0, 0) = 1.0; + m(0, 1) = 2.0; + m(1, 0) = 3.0; + m(1, 1) = m(0, 1) + m(1, 0); + + // print values to standard output + cout << m << endl + << endl; + + // using the comma-initializer is also allowed + m << 1.0, 2.0, + 3.0, 4.0; + + // print values to standard output + cout << m << endl; +} + +template <class Num> +void example8() +{ + using namespace std; + Array<Num, Dynamic, Dynamic> a(3, 3); + Array<Num, Dynamic, Dynamic> b(3, 3); + a << 1, 2, 3, + 4, 5, 6, + 7, 8, 9; + b << 1, 2, 3, + 1, 2, 3, + 1, 2, 3; + + // Adding two arrays + cout << "a + b = " << endl + << a + b << endl + << endl; + // Subtracting a scalar from an array + cout << "a - 2 = " << endl + << a - 2 << endl; +} + +template <class Num> +void example9() +{ + using namespace std; + Array<Num, Dynamic, Dynamic> a(2, 2); + Array<Num, Dynamic, Dynamic> b(2, 2); + a << 1, 2, + 3, 4; + b << 5, 6, + 7, 8; + cout << "a * b = " << endl + << a * b << endl; +} + +template <class Num> +void example10() +{ + using namespace std; + Array<Num, Dynamic, 1> a = Array<Num, Dynamic, 1>::Random(5); + a *= 2; + cout << "a =" << endl + << a << endl; + cout << "a.abs() =" << endl + << a.abs() << endl; + cout << "a.abs().sqrt() =" << endl + << a.abs().sqrt() << endl; + cout << "a.min(a.abs().sqrt()) =" << endl + << (a.min)(a.abs().sqrt()) << endl; +} + +template <class Num> +void example11() +{ + using namespace std; + Matrix<Num, Dynamic, Dynamic> m(2, 2); + Matrix<Num, Dynamic, Dynamic> n(2, 2); + Matrix<Num, Dynamic, Dynamic> result(2, 2); + m << 1, 2, + 3, 4; + n << 5, 6, + 7, 8; + result = m * n; + cout << "-- Matrix m*n: --" << endl + << result << endl + << endl; + result = m.array() * n.array(); + cout << "-- Array m*n: --" << endl + << result << endl + << endl; + result = m.cwiseProduct(n); + cout << "-- With cwiseProduct: --" << endl + << result << endl + << endl; + result = m.array() + 4; + cout << "-- Array m + 4: --" << endl + << result << endl + << endl; +} + +template <class Num> +void example12() +{ + using namespace std; + Matrix<Num, Dynamic, Dynamic> m(2, 2); + Matrix<Num, Dynamic, Dynamic> n(2, 2); + Matrix<Num, Dynamic, Dynamic> result(2, 2); + m << 1, 2, + 3, 4; + n << 5, 6, + 7, 8; + + result = (m.array() + 4).matrix() * m; + cout << "-- Combination 1: --" << endl + << result << endl + << endl; + result = (m.array() * n.array()).matrix() * m; + cout << "-- Combination 2: --" << endl + << result << endl + << endl; +} + +template <class Num> +void example13() +{ + using namespace std; + Matrix<Num, Dynamic, Dynamic> m(4, 4); + m << 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16; + cout << "Block in the middle" << endl; + cout << m.template block<2, 2>(1, 1) << endl + << endl; + for (int i = 1; i <= 3; ++i) + { + cout << "Block of size " << i << "x" << i << endl; + cout << m.block(0, 0, i, i) << endl + << endl; + } +} + +template <class Num> +void example14() +{ + using namespace std; + Array<Num, 2, 2> m; + m << 1, 2, + 3, 4; + Array<Num, 4, 4> a = Array<Num, 4, 4>::Constant(0.6); + cout << "Here is the array a:" << endl + << a << endl + << endl; + a.template block<2, 2>(1, 1) = m; + cout << "Here is now a with m copied into its central 2x2 block:" << endl + << a << endl + << endl; + a.block(0, 0, 2, 3) = a.block(2, 1, 2, 3); + cout << "Here is now a with bottom-right 2x3 block copied into top-left 2x2 block:" << endl + << a << endl + << endl; +} + +template <class Num> +void example15() +{ + using namespace std; + Eigen::Matrix<Num, Dynamic, Dynamic> m(3, 3); + m << 1, 2, 3, + 4, 5, 6, + 7, 8, 9; + cout << "Here is the matrix m:" << endl + << m << endl; + cout << "2nd Row: " << m.row(1) << endl; + m.col(2) += 3 * m.col(0); + cout << "After adding 3 times the first column into the third column, the matrix m is:\n"; + cout << m << endl; +} + +template <class Num> +void example16() +{ + using namespace std; + Matrix<Num, 4, 4> m; + m << 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16; + cout << "m.leftCols(2) =" << endl + << m.leftCols(2) << endl + << endl; + cout << "m.bottomRows<2>() =" << endl + << m.template bottomRows<2>() << endl + << endl; + m.topLeftCorner(1, 3) = m.bottomRightCorner(3, 1).transpose(); + cout << "After assignment, m = " << endl + << m << endl; +} + +template <class Num> +void example17() +{ + using namespace std; + Array<Num, Dynamic, 1> v(6); + v << 1, 2, 3, 4, 5, 6; + cout << "v.head(3) =" << endl + << v.head(3) << endl + << endl; + cout << "v.tail<3>() = " << endl + << v.template tail<3>() << endl + << endl; + v.segment(1, 4) *= 2; + cout << "after 'v.segment(1,4) *= 2', v =" << endl + << v << endl; +} + +template <class Num> +void example18() +{ + using namespace std; + Matrix<Num, 2, 2> mat; + mat << 1, 2, + 3, 4; + cout << "Here is mat.sum(): " << mat.sum() << endl; + cout << "Here is mat.prod(): " << mat.prod() << endl; + cout << "Here is mat.mean(): " << mat.mean() << endl; + cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl; + cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl; + cout << "Here is mat.trace(): " << mat.trace() << endl; + + BOOST_CHECK_EQUAL(mat.sum(), 10); + BOOST_CHECK_EQUAL(mat.prod(), 24); + BOOST_CHECK_EQUAL(mat.mean(), Num(5) / 2); + BOOST_CHECK_EQUAL(mat.minCoeff(), 1); + BOOST_CHECK_EQUAL(mat.maxCoeff(), 4); + BOOST_CHECK_EQUAL(mat.trace(), 5); +} + +template <class Num> +void example18a() +{ + using namespace std; + Matrix<Num, 2, 2> mat; + mat << 1, 2, + 3, 4; + cout << "Here is mat.sum(): " << mat.sum() << endl; + cout << "Here is mat.prod(): " << mat.prod() << endl; + cout << "Here is mat.mean(): " << mat.mean() << endl; + //cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl; + //cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl; + cout << "Here is mat.trace(): " << mat.trace() << endl; +} + +template <class Num> +void example19() +{ + using namespace std; + Matrix<Num, Dynamic, 1> v(2); + Matrix<Num, Dynamic, Dynamic> m(2, 2), n(2, 2); + + v << -1, + 2; + + m << 1, -2, + -3, 4; + cout << "v.squaredNorm() = " << v.squaredNorm() << endl; + cout << "v.norm() = " << v.norm() << endl; + cout << "v.lpNorm<1>() = " << v.template lpNorm<1>() << endl; + cout << "v.lpNorm<Infinity>() = " << v.template lpNorm<Infinity>() << endl; + cout << endl; + cout << "m.squaredNorm() = " << m.squaredNorm() << endl; + cout << "m.norm() = " << m.norm() << endl; + cout << "m.lpNorm<1>() = " << m.template lpNorm<1>() << endl; + cout << "m.lpNorm<Infinity>() = " << m.template lpNorm<Infinity>() << endl; +} + +template <class Num> +void example20() +{ + using namespace std; + Matrix<Num, 3, 3> A; + Matrix<Num, 3, 1> b; + A << 1, 2, 3, 4, 5, 6, 7, 8, 10; + b << 3, 3, 4; + cout << "Here is the matrix A:\n" + << A << endl; + cout << "Here is the vector b:\n" + << b << endl; + Matrix<Num, 3, 1> x = A.colPivHouseholderQr().solve(b); + cout << "The solution is:\n" + << x << endl; +} + +template <class Num> +void example21() +{ + using namespace std; + Matrix<Num, 2, 2> A, b; + A << 2, -1, -1, 3; + b << 1, 2, 3, 1; + cout << "Here is the matrix A:\n" + << A << endl; + cout << "Here is the right hand side b:\n" + << b << endl; + Matrix<Num, 2, 2> x = A.ldlt().solve(b); + cout << "The solution is:\n" + << x << endl; +} + +template <class Num> +void example22() +{ + using namespace std; + Matrix<Num, Dynamic, Dynamic> A = Matrix<Num, Dynamic, Dynamic>::Random(100, 100); + Matrix<Num, Dynamic, Dynamic> b = Matrix<Num, Dynamic, Dynamic>::Random(100, 50); + Matrix<Num, Dynamic, Dynamic> x = A.fullPivLu().solve(b); + Matrix<Num, Dynamic, Dynamic> axmb = A * x - b; + double relative_error = static_cast<double>(abs(axmb.norm() / b.norm())); // norm() is L2 norm + cout << "norm1 = " << axmb.norm() << endl; + cout << "norm2 = " << b.norm() << endl; + cout << "The relative error is:\n" + << relative_error << endl; +} + +template <class Num> +void example23() +{ + using namespace std; + Matrix<Num, 2, 2> A; + A << 1, 2, 2, 3; + cout << "Here is the matrix A:\n" + << A << endl; + SelfAdjointEigenSolver<Matrix<Num, 2, 2> > eigensolver(A); + if (eigensolver.info() != Success) + { + std::cout << "Eigenvalue solver failed!" << endl; + } + else + { + cout << "The eigenvalues of A are:\n" + << eigensolver.eigenvalues() << endl; + cout << "Here's a matrix whose columns are eigenvectors of A \n" + << "corresponding to these eigenvalues:\n" + << eigensolver.eigenvectors() << endl; + } +} + +template <class Num> +void example24() +{ + using namespace std; + Matrix<Num, 3, 3> A; + A << 1, 2, 1, + 2, 1, 0, + -1, 1, 2; + cout << "Here is the matrix A:\n" + << A << endl; + cout << "The determinant of A is " << A.determinant() << endl; + cout << "The inverse of A is:\n" + << A.inverse() << endl; +} + +template <class Num> +void test_integer_type() +{ + example1<Num>(); + //example2<Num>(); + example18<Num>(); +} + +template <class Num> +void test_float_type() +{ + std::cout << "Epsilon = " << Eigen::NumTraits<Num>::epsilon() << std::endl; + std::cout << "Dummy Prec = " << Eigen::NumTraits<Num>::dummy_precision() << std::endl; + std::cout << "Highest = " << Eigen::NumTraits<Num>::highest() << std::endl; + std::cout << "Lowest = " << Eigen::NumTraits<Num>::lowest() << std::endl; + std::cout << "Digits10 = " << Eigen::NumTraits<Num>::digits10() << std::endl; + + example1<Num>(); + example2<Num>(); + example4<Num>(); + example5<Num>(); + example6<Num>(); + example7<Num>(); + example8<Num>(); + example9<Num>(); + example10<Num>(); + example11<Num>(); + example12<Num>(); + example13<Num>(); + example14<Num>(); + example15<Num>(); + example16<Num>(); + example17<Num>(); + /* + example18<Num>(); + example19<Num>(); + example20<Num>(); + example21<Num>(); + example22<Num>(); + example23<Num>(); + example24<Num>(); + */ +} + +template <class Num> +void test_float_type_2() +{ + std::cout << "Epsilon = " << Eigen::NumTraits<Num>::epsilon() << std::endl; + std::cout << "Dummy Prec = " << Eigen::NumTraits<Num>::dummy_precision() << std::endl; + std::cout << "Highest = " << Eigen::NumTraits<Num>::highest() << std::endl; + std::cout << "Lowest = " << Eigen::NumTraits<Num>::lowest() << std::endl; + std::cout << "Digits10 = " << Eigen::NumTraits<Num>::digits10() << std::endl; + + example18<Num>(); + example19<Num>(); + example20<Num>(); + example21<Num>(); + + //example22<Num>(); + //example23<Num>(); + //example24<Num>(); +} + +template <class Num> +void test_float_type_3() +{ + std::cout << "Epsilon = " << Eigen::NumTraits<Num>::epsilon() << std::endl; + std::cout << "Dummy Prec = " << Eigen::NumTraits<Num>::dummy_precision() << std::endl; + std::cout << "Highest = " << Eigen::NumTraits<Num>::highest() << std::endl; + std::cout << "Lowest = " << Eigen::NumTraits<Num>::lowest() << std::endl; + std::cout << "Digits10 = " << Eigen::NumTraits<Num>::digits10() << std::endl; + + example22<Num>(); + example23<Num>(); + example24<Num>(); +} + +template <class Num> +void test_complex_type() +{ + std::cout << "Epsilon = " << Eigen::NumTraits<Num>::epsilon() << std::endl; + std::cout << "Dummy Prec = " << Eigen::NumTraits<Num>::dummy_precision() << std::endl; + std::cout << "Highest = " << Eigen::NumTraits<Num>::highest() << std::endl; + std::cout << "Lowest = " << Eigen::NumTraits<Num>::lowest() << std::endl; + std::cout << "Digits10 = " << Eigen::NumTraits<Num>::digits10() << std::endl; + + example1<Num>(); + example2<Num>(); + example3<Num>(); + example4<Num>(); + example5<Num>(); + example7<Num>(); + example8<Num>(); + example9<Num>(); + example11<Num>(); + example12<Num>(); + example13<Num>(); + example14<Num>(); + example15<Num>(); + example16<Num>(); + example17<Num>(); + example18a<Num>(); + example19<Num>(); + example20<Num>(); + example21<Num>(); + example22<Num>(); + // example23<Num>(); //requires comparisons. + example24<Num>(); +} diff --git a/src/boost/libs/multiprecision/test/git_issue_30.cpp b/src/boost/libs/multiprecision/test/git_issue_30.cpp new file mode 100644 index 00000000..288cd62a --- /dev/null +++ b/src/boost/libs/multiprecision/test/git_issue_30.cpp @@ -0,0 +1,28 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +struct E +{ + E(boost::multiprecision::cpp_rational const&) + { + } +}; + +void g(boost::multiprecision::cpp_rational const& r) +{ + std::cout << r << std::endl; +} + +int main() +{ +#if !defined(BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) && !BOOST_WORKAROUND(BOOST_MSVC, < 1900) && !(defined(__APPLE_CC__) && defined(CI_SUPPRESS_KNOWN_ISSUES)) + boost::multiprecision::cpp_int r = 3; + g(r); + E x1(r); // triggers explicit conversion operator. +#endif + return 0; +} diff --git a/src/boost/libs/multiprecision/test/git_issue_98.cpp b/src/boost/libs/multiprecision/test/git_issue_98.cpp new file mode 100644 index 00000000..795bdfc6 --- /dev/null +++ b/src/boost/libs/multiprecision/test/git_issue_98.cpp @@ -0,0 +1,52 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/multiprecision/cpp_complex.hpp> +#ifdef BOOST_HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_GMP +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_MPFR +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_MPC +#include <boost/multiprecision/mpc.hpp> +#endif + +struct A +{ + virtual void g() = 0; +}; + +void f(A&); +void f(boost::multiprecision::cpp_bin_float_50); +void f(boost::multiprecision::cpp_int); +void f(boost::multiprecision::cpp_rational); +void f(boost::multiprecision::cpp_dec_float_50); +void f(boost::multiprecision::cpp_complex_100); +#ifdef TEST_FLOAT128 +void f(boost::multiprecision::float128); +#endif +#ifdef TEST_GMP +void f(boost::multiprecision::mpz_int); +void f(boost::multiprecision::mpf_float); +void f(boost::multiprecision::mpq_rational); +#endif +#ifdef TEST_MPFR +void f(boost::multiprecision::mpfr_float); +#endif +#ifdef TEST_MPC +void f(boost::multiprecision::mpc_complex); +#endif + +void h(A& a) +{ + f(a); +} diff --git a/src/boost/libs/multiprecision/test/include_test/cpp_bin_float_include_test.cpp b/src/boost/libs/multiprecision/test/include_test/cpp_bin_float_include_test.cpp new file mode 100644 index 00000000..90576600 --- /dev/null +++ b/src/boost/libs/multiprecision/test/include_test/cpp_bin_float_include_test.cpp @@ -0,0 +1,13 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_bin_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_bin_float<50> a; +} diff --git a/src/boost/libs/multiprecision/test/include_test/cpp_dec_float_include_test.cpp b/src/boost/libs/multiprecision/test/include_test/cpp_dec_float_include_test.cpp new file mode 100644 index 00000000..15f797f2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/include_test/cpp_dec_float_include_test.cpp @@ -0,0 +1,13 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +int main() +{ + cpp_dec_float<50> a; +} diff --git a/src/boost/libs/multiprecision/test/include_test/cpp_int_include_test.cpp b/src/boost/libs/multiprecision/test/include_test/cpp_int_include_test.cpp new file mode 100644 index 00000000..306aa1c8 --- /dev/null +++ b/src/boost/libs/multiprecision/test/include_test/cpp_int_include_test.cpp @@ -0,0 +1,17 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +using namespace boost::multiprecision; + +int main() +{ + number<cpp_int_backend<> > a; + number<cpp_int_backend<>, et_off> b; + number<cpp_int_backend<64, 64, signed_magnitude, checked, void>, et_off> c; + number<cpp_int_backend<128, 128, signed_magnitude, checked, void>, et_off> d; + number<cpp_int_backend<500, 500, signed_magnitude, checked, void>, et_off> e; +} diff --git a/src/boost/libs/multiprecision/test/include_test/gmp_include_test.cpp b/src/boost/libs/multiprecision/test/include_test/gmp_include_test.cpp new file mode 100644 index 00000000..d2107d7a --- /dev/null +++ b/src/boost/libs/multiprecision/test/include_test/gmp_include_test.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/gmp.hpp> + +using namespace boost::multiprecision; + +int main() +{ + mpf_float a; + mpz_int b; + mpq_rational c; +} diff --git a/src/boost/libs/multiprecision/test/include_test/mpfr_include_test.cpp b/src/boost/libs/multiprecision/test/include_test/mpfr_include_test.cpp new file mode 100644 index 00000000..ab1ef32a --- /dev/null +++ b/src/boost/libs/multiprecision/test/include_test/mpfr_include_test.cpp @@ -0,0 +1,13 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/mpfr.hpp> + +using namespace boost::multiprecision; + +int main() +{ + mpfr_float a; +} diff --git a/src/boost/libs/multiprecision/test/include_test/tommath_include_test.cpp b/src/boost/libs/multiprecision/test/include_test/tommath_include_test.cpp new file mode 100644 index 00000000..5242444f --- /dev/null +++ b/src/boost/libs/multiprecision/test/include_test/tommath_include_test.cpp @@ -0,0 +1,13 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/tommath.hpp> + +using namespace boost::multiprecision; + +int main() +{ + tom_int a; +} diff --git a/src/boost/libs/multiprecision/test/issue_13148.cpp b/src/boost/libs/multiprecision/test/issue_13148.cpp new file mode 100644 index 00000000..52e30a52 --- /dev/null +++ b/src/boost/libs/multiprecision/test/issue_13148.cpp @@ -0,0 +1,60 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/multiprecision/cpp_bin_float.hpp> + +boost::multiprecision::cpp_rational rationalfromStr(const char* str) +{ + boost::multiprecision::cpp_dec_float_50 d1(str); + boost::multiprecision::cpp_rational result(d1); // <--- eats CPU forever + return result; +} + +boost::multiprecision::cpp_rational rationalfromStr2(const char* str) +{ + boost::multiprecision::cpp_bin_float_50 d1(str); + boost::multiprecision::cpp_rational result(d1); // <--- eats CPU forever + return result; +} + +int main() +{ + // This example is OK. + { + boost::multiprecision::cpp_rational expected = 1; + BOOST_ASSERT(expected == rationalfromStr("1")); + } + // This example is OK. + { + boost::multiprecision::cpp_rational expected = boost::multiprecision::cpp_rational(25) / boost::multiprecision::cpp_rational(10); + BOOST_ASSERT(expected == rationalfromStr("2.5")); + } + // This example is OK. + { + boost::multiprecision::cpp_rational expected = boost::multiprecision::cpp_rational(5) / boost::multiprecision::cpp_rational(1000); + BOOST_ASSERT(expected == rationalfromStr("0.005")); + } + // This example is OK. + { + boost::multiprecision::cpp_rational expected = 0; + BOOST_ASSERT(expected == boost::multiprecision::cpp_rational("0")); // direct cpp_rational from str is OK. + } + // This example fails. + { + boost::multiprecision::cpp_rational expected = 0; + // reachable code + BOOST_ASSERT(expected == rationalfromStr("0")); // cpp_rational from cpp_dec_float_50 is not OK. + // unreachable code + } + { + boost::multiprecision::cpp_rational expected = 0; + // reacheble code + BOOST_ASSERT(expected == rationalfromStr2("0")); // cpp_rational from cpp_dec_float_50 is not OK. + // unreachable code + } + return 0; +} diff --git a/src/boost/libs/multiprecision/test/issue_13301.cpp b/src/boost/libs/multiprecision/test/issue_13301.cpp new file mode 100644 index 00000000..f2192d0e --- /dev/null +++ b/src/boost/libs/multiprecision/test/issue_13301.cpp @@ -0,0 +1,77 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_bin_float.hpp> + +int main() +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<8, boost::multiprecision::backends::digit_base_2> > quarter_float; + + quarter_float qf(256); + + unsigned int ui = qf.convert_to<unsigned int>(); + if (ui != 256) + return 1; + + boost::uintmax_t m(1), n; + m <<= std::numeric_limits<boost::uintmax_t>::digits - 1; + qf = m; + n = qf.convert_to<boost::uintmax_t>(); + if (m != n) + return 2; + qf *= 2; + n = qf.convert_to<boost::uintmax_t>(); + m = (std::numeric_limits<boost::uintmax_t>::max)(); + if (m != n) + return 3; + + qf = 256; + int si = qf.convert_to<int>(); + if (si != 256) + return 4; + boost::intmax_t sm(1), sn; + sm <<= std::numeric_limits<boost::intmax_t>::digits - 1; + qf = sm; + sn = qf.convert_to<boost::intmax_t>(); + if (sm != sn) + return 5; + qf *= 2; + sn = qf.convert_to<boost::intmax_t>(); + sm = (std::numeric_limits<boost::intmax_t>::max)(); + if (sm != sn) + return 6; + + // Again with negative numbers: + qf = -256; + si = qf.convert_to<int>(); + if (si != -256) + return 7; + sm = 1; + sm <<= std::numeric_limits<boost::intmax_t>::digits - 1; + sm = -sm; + qf = sm; + sn = qf.convert_to<boost::intmax_t>(); + if (sm != sn) + return 8; + qf *= 2; + sn = qf.convert_to<boost::intmax_t>(); + sm = (std::numeric_limits<boost::intmax_t>::min)(); + if (sm != sn) + return 9; + + // Now try conversion to cpp_int: + qf = 256; + boost::multiprecision::cpp_int i = qf.convert_to<boost::multiprecision::cpp_int>(), j; + if (i != 256) + return 10; + qf = ldexp(qf, 126); + i = qf.convert_to<boost::multiprecision::cpp_int>(); + j = 256; + j <<= 126; + if (i != j) + return 11; + + return 0; +} diff --git a/src/boost/libs/multiprecision/test/math/high_prec/gamma.ipp b/src/boost/libs/multiprecision/test/math/high_prec/gamma.ipp new file mode 100644 index 00000000..97186bfd --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/high_prec/gamma.ipp @@ -0,0 +1,506 @@ + +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +static const boost::array<boost::array<typename table_type<T>::type, 3>, 500> gamma = {{{SC_(8.45530509948730468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.11676792084632275714192215809847832812560655161416701540037514678588899552795223636051283861515685855053582939146274240113874531527973814210488207830128530900559599074170389066138081891070712920623473461857632254352617595899153121789055651865429663273105801624222067275035146160407682419814612559770937851333313258174693831239060158272144283644033402005812336141640353704703451805075743457651474500575180336149704581761302422616802534269713673320145810616702623379426577267381016596640646036780085640e+00), SC_(1.10438728442867816609665916944098399086765601795314917615577669041382221945245269046345957164829024229823010663264720601624809651655116368339246859099278886577422386896811750937967494940960029250224075543433744666205413027910764506859493838993507216401131983731121529344952082060498119577899781093069658373786189150246027769179901839580061229387653730476486565832292623869480613925012343335744507187985817127088673548820437219886661135524261767270766239756270078148544872782377812888609878714473093021e-01)}, + {SC_(1.39026832580566406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.87837246534584512058304626597150000489120292563756272246130863589440629431328166236343343023478965830481648988944668013833863592688512739847732271129409060356695212103238739655240822053671736250775878014127604440817225103010320322756075484745769185701456653223475749864397685319786785385530182719007531303116138466452735235078861018575437520732342354574967183308070807923233032727588780923086501266291147367564653286869648484915713961300281876539970618140056759819325004245961660980554836491213594461e-01), SC_(-1.18966833717491030777529019926331960352855377707641323046275606078389124027926611789911603150540144713683748681801863772072067302459578683018790819197528173413969356904557087663396842789779718125888832504274452988602707088024742817513733531775897173110489239191365127876847654130551501903438865671258532679739640203442463217240189322306203147786367096739239036281487648421042118138143391813517167916949838797835701356844050619004326570975617904601257077440910867376277877219954044806432791089137635152e-01)}, + {SC_(1.43504619598388671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.85908592055477020544823146996462988920753671462990877927427523793784391636857990149923096368122868020391764231333911220440936193158035215379333873738823239728773696032128851923243880532734156757960723683643045365212843713096041451134263420009087064362953191913886157628325070283143368675406959711653730415068180223485945836948634468821206791379329892575297995361852566312748126836116054701645545213593209611892028096694432232545135202461301088136703343459844999000604508302338782169984763967607501314e-01), SC_(-1.21141502936978554470331924245181844536653300286225422140798757837139525637498346623087068230762388958190805297179369893104223420947821790937027145400844138709085611406641604698885150056395888192847451388558341660380510005326476801210828545697252686002267491495285666799318711798085628503140489815338199728719860874280450505965277773655528536902886328052951994398070322644031431224912585052114632613788261969630244977993915035447500319483308338977079266591371885961850522890584558525442875774358053017e-01)}, + {SC_(2.42817401885986328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.26548780776578840420381427518520449855608041962978420562324571651972061904909219213050500986673056140976438565871543352029900201913847740572555310587852358164122797887781229263011351199466922757394212036282675265716319706112696638181549111225164845253224133071688478880244916384306812998466169110572223013741424946407661202839829092882797566392445456945362691783965322378415320774013882498835505927125822970066960016136071528037620210173970460365408629248314390843812310532824823798560386378408531758e+00), SC_(2.35457666634852101044747755129837867262195483343254983494923132129084740599968117459876158642974817916730545060077157131801833625262395918879296296970891493947670708984616066541861044565554092681572085484952572699514279293900419924199381144525738569464382042666825565090748449951697963176145208698932021640416912747873111038321169415221202446804427993828714087337477405157815350337354930690780319199568346826770338612483088645913829939414504125261936354188139129621440596127411902107048621213505069787e-01)}, + {SC_(3.57062149047851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(3.59555262870334436745200120641865977981082010640223266050140391459729626943767312409363221404703574210201792392329936976650125743512284944198899260106526015752278902956864105662898272567210147921868074256078713905235180221793465538428466586341769298190208746120283067730378397892254705825257704963837122035302991309312466980646767864250193651830956876235658931110573123437458150313676328781121766284025470150078590315090776590886236623802578555557213388547550022167969734537803949609965981618094724875e+00), SC_(1.27969770083427483263559414629301871307474084102320799462455928302879005205354752125421307226546605400047836370140458006536267143631687873530833586669309191906361501163139082755585388593517415370654307293917178772625291488912516115091663101505703539344031184872454811817406134618932582617064239611554551844783746009143025742360911718166833619539628430237988628690562327369791903400381585434826128475496317596229670997626757602054430015393131562841666713598775620637208642977504313979362509202895607109e+00)}, + {SC_(4.06173896789550781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(6.48731472437243796002214852775228043537971289437086104501487473581409244022420469963455826960525084857707369435964359746591711750992308312134021384929133564129501204286710897020809578552486451934456957768860362014269537717479180144139729241339620855382881397577147860000032919343487135060920390418900375031787607691106910209429859657872451356560041801073390128288706215902201331458057657139826067439256351480798777075962425946562343717935253011331255750532440357025778171100855280846427732600917368427e+00), SC_(1.86984868922060153870312299296985062230442937856531056759619014069475862184353028955695412404454321279039154862003433554749490171187759936732026866110412946881723664011929498452905443575544100221689429429301260523169470423568601285968829370009543627369171932027568492297164723547129769130081972774445920326671338017681314020368749098739160450063373166716481506986205918192305159100153286510376407089509591108263911145163810109598636638395246173348456104955704883803210682048233858516700403662613611101e+00)}, + {SC_(4.62103271484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.37858022875149594619786107410279090175590970152450034841009699269673431346004116478067172178520246853732831755995428799078017457601602619929245113749007303704101480579352988396977510269794581778372002589383281670752713644566761172166567385676042002118864154022560147254396699337453643014632090052598274319291935807114460343942482405484801703954155955722485464313407185661674729088557545190877905944424466140889980199318964713781724109009297813878567602461975916768052038274217796168549609238659912800e+01), SC_(2.62363924281956010702136640841955277162733070564811703055105753296189488826361566652602311409061111092399672290884891722467926760684437721593990663312995512755267781429591466685062354923692239092672056520234671473631058306668809726966855071037418632102365123873577786382809134249130150505178623394283970906330326508036001313708698839654499118129718097194782427944111675244162629125074561075136961120514757170446709158397509674944733810061359837990599512420837675518506637113899833273305688678962765784e+00)}, + {SC_(4.95617485046386718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.24718008439809442788209027528859402116653573943432441740659531453629499472973958227907469705875895142256631027950914323449546506579797438670714453791272026575254913719473832861478582258396938106853301770393264870159399799869055007015434958058676797199878997709812870727729689757402018497925646205685684353323505015838079500055817602615533853494694556319446442067489405159190640294404045513497256563510451692946446390653895786899381651426750779600703169258576911088938000280179624657230202494914554453e+01), SC_(3.11226122735527283001436732061482084336251639227376046279662642923418290806738326523996478116609979831948179805587928769153274855556446413175508510433259718452181123790997348386826344699161670878673065209529046397787130480356474953162252901005463887577216685154644547997310645330563385245975795829493688812633389752782939580849857192152477705251876040149405364402545536520601697980677272545641602109841104148780306607027762094861640754264955688050582460828241131111154401178777085333226922469763304802e+00)}, + {SC_(5.33216857910156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(4.00553052022210672861172891969975874467163632878273365599590082567135977861246512342058540785194845011420653067457140609085806825580056355742227407837692060683249358855542773800094606807421366553650993901731609418359571760967157147365961249446904066775876923068467870410926669834554889478280924299804868385789300760220221433734929715355322308163278946871106748327149891409242787740148917181937009887358066189115112391852948848072127151790776708831129634358782375387973685405984021144936522217818263887e+01), SC_(3.69026112921665738447356052157805826006261575754715146030823722328052224219481629888200194228992542456666326715599926038404343629111229712712603676960882556465809932702973923780945184481220774715262397366111250231958769743093585550788457957942102664449774653173349379675999754811893646753690219918461483472316926459116111911304869770192038163555120045323216247334529547388917331185628279325595929211450347309515919824526889077762242709640299863499904979658370855846132644540836771202986689516605307719e+00)}, + {SC_(5.53525352478027343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(5.54085693989980056689828323360533202581167492518911769584949988804497359322368776091779140395452638417269585036316553435037135219086785310992316684430301271806800120535089861233390960140463559245483746277411779351099714760817803251461088125523272968642271161431162315313967100838668611319145908704926154612773615372669849504199366490997719787759920807270196610305978144012121816428514168683064363810139266508908745055811779478349322540193892120037252674767004050526902154688580542341833753952471325027e+01), SC_(4.01473426408354864195493680270670709888838156351643199813406405422986896254574554048671301238364016812565923123175708018422414574326651898972233934077155639420144616008014038365563539926679491360504159807520765365221328661239870485108541575449867980981545393136165252219742866201168516059324361308415876884333514156647228147093027677746525367094610600724933388522700653405326906335784642279271969391106974692408051454996866825096351519387380897644271891521149125368306133131088394686999544511101518839e+00)}, + {SC_(8.76608276367187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.45168218533635930619607726245392030762486255761328567765573105304410142150402005341157069836143490261271426854222130497382499323807115021070916489489298478742485634020491842325402560577110358831959602293247200484183054212413532479513045660120433744022721285308357503948919422710448107932657085485948275312721884150067715974091281450199363008662962715355890258330430671461730647408910607363125434042429218606193952080701992994548099674296660794648968213053267218182313689092204527768537711239353651776e+04), SC_(1.01071147671863185327950157842771848355690961582839471529235262209976315476828727800911954615182577061463048910838217130723874185086084459846607683789832726142832119336764584676848615401316033063394103140884481795844812690718880319719415999249412615982273170075510120797100374050563252653874652680187908298681878272779417833833904258535562275198810553332530273476763030738280101705876045770738375074123044968182559538889713229283788787867195197583120537344575175235851164600007251143003173078342333609e+01)}, + {SC_(9.54985427856445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.33124191564895517786198318510639290524555281956888985019623709579905630894735541649077494627871914408573260648955262263687000687922389445792928188297142800467321281724332423337091736902596942422833231242875215268585640866036266522615474645034218515281333865398887209402026567283141579237158080499743426939983616583610354938189196173205223749820692938362654992436789626030738847465823771087487947240361096515842184486374295691072049728572766139104577726261341789838495401824728814337996569514215672530e+05), SC_(1.17990377426754288264606297368466274228437984450810542718576338503909998685774762341929430182869490356000015066861395002069084429748581801250795379187983074979512796001712324478984009900922203447046990385175865774213093475908924123603675885921802990784925766315829148516934071379020928361215249532812742053156207303049568661090315018584992187158785059549794406558582306711751933404845316792962749621780233564966634413100993442521511005188505728824353480225249328012213643562389033203444688486307902948e+01)}, + {SC_(9.98056793212890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(3.47351022609890987414462933366655334807141833319973833485251821949760940947774277743644751214737192294292705395291451794427578900001693769046543125025183131602481174315151788533280598536553924629403649863673849420583250744590458701199142358875405761725682245457269733335734933972176546054405142766845620327689012944814485692211235417261699291965304764803083155748787532975237567590477444265639447563674720522368236482299715573776562543955819648355145672683431444493845732956957961329768309749681829985e+05), SC_(1.27580911401497751821060654166800202590984496449712229747428650640526916490109555857587661865937014134922557424041425172181625752089956083590448352036948806676504958753151299078856881837898249233659905040282763080155929482264803438269944110781266460182301983820012339338329983248392343095209177995416838143030575826729498027778841804157021072458776021811820523457953320987753027666066945590262453676053331880351804554644478900495289023610283211137423667420410851307848590104509490230146431500262752007e+01)}, + {SC_(1.02951927185058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.08612298941736643153732276006220971148644659875558920927931593935920431599528738660802469977290774445824488741549217537449446921507610892464943125096025919672129084867587667593276450909932572372137644264808977599843418764122976594717814108353372457029584218389242429510238722931886606180430128463378160039188017925774025486288889709479511768650943318951092782687590293596990714433871292584636475060962701358649279139597185057212208578482611189796103472554385131334860031392843178420809951208156923205e+05), SC_(1.34710638279404681644246606540609769374801440275032660885401198256118967063141577514087022647397538479355822457739408871059474039830713174834411157800996577575003311438166402418585060431559564293388138836927893978284436415357597898062083173462936431367544773331148767502281557730664161817089644271957806633291453970250267498511964473754051015546891232872019548172225307272336307735201303435433404493851119019530317135541933469566759049768381966972245871852168677664931061501876261076443912299692533597e+01)}, + {SC_(1.03338241577148437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.73986220626843824927920782808904522315975049074439916300919381933777932420492642527484802029254954306553334393810376403407168820887408988932837497169960027734038427684853032090933230195065129695346654952158714462914263685195391164935001537212016209463929695503000587847065615191145442143323988524634373944112251531098789566603760664904054993411039655201562870364683675613858124103659455770298515793225998426718316092021479792672373860638612991767438527054522949865358951955431484811761620729003812382e+05), SC_(1.35593093496056969893535567112872929008143709636940002546329087550711754131154961097197217187455599859178992371199445448253184723282798555078431187938048489946441825776243184601290612049872086792875137747821946976340754196960872289509848440846460379366990183257537708184661560651042893934128712949967929943476493798876208818924397255136148931131306701168208553291581298942881419034795011951056848436534335079031462364949005620152601355133144874348094130199610942718142353840569740996333028520392372556e+01)}, + {SC_(1.07135047912597656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.85721439538838439705306064451879294595570947494672710722016789190114576336023487676613177353802996774898485646539303627310434036056012918512753580667010178877478176833272081798430115689170325758260542022430547407739443230778886561790259780329336075012938809440026955925762010679712962413276914273448632895358656771817332068220175020343563819741374166286834026905759809649949412322517870913703226957295986639927654451683223262755262903967113925053844635980417582441070491472062229124222544924029831654e+06), SC_(1.44345882862223439605716424404599011683811886773747370676003171837626128033041503920384113195787471603683676214899764638312008488583005220488335395789219780613434308649120312121034729352210431866865784472394171554538335954672405161157639621786194857241841889876862506839092638714724364137545606219369672259196484835450223961242251728879195312134729976462122220398692613546962503263752599725385404222086718253046013692763924083452585153651775377988077421839166494678150854383938719506103970152877660484e+01)}, + {SC_(1.09323768615722656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.09592640575239809666846121677771927780752936023924158222634560987255697519482790694905618663865531239972019760869700752710049719590581148223169481122444885785273943932972303081018927714284131922497997127430750960113524416767507128317210990572045260941311586013903134659634029880246927905370185375976258340419589414037729179865857038384049918002627831330701395495031815286029217668797369925413755055132642560604612676671367161537762429344852598381811521248141946161530867133014459723058597428437642298e+06), SC_(1.49455977426574165881859039685195966050036759954579121951129510480837185650712389225508184363631645514043826849142044045040551855302422436604545319679526057379569083519990130330113590282035739010196088875383247254732201194190303019409460033340883098002366906771159957984278579595308398344453039602978600230132604751443572911980490843010703162398503070960907011556740635051049333707402400411399198983397314439988590436484712278449948781729679812491581015270188673991965076859499698834498233560917960844e+01)}, + {SC_(1.21413345336914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.64239751689040135371528638503817996701835072784502236912289045699792089781694820687717658364779020991311296750597862504701825127504810312222159827182159743586084452766637995854336280264240514840579371599354707442049464154449281372330704925798340213382877182134914296548090310931517654388018712040859984515487022805743836777133727700635356020676861026294060728418886449803915821559424461129887396581535139042681015145325091941876084305153799657023785097396446763077777426340282617918626524288619395821e+07), SC_(1.78484047177896642639445392863215588612603563477346865541091120435845320539752039062941627703344836229145165912845742723048104642698908304308667638772267977520902894756788859805097365912048607248507329066498228754882410916966189530240937511360454967870449691910124814867332860502660647255668051145601077719174263919348318346132226844241305817669112243947100811203383986012421488579157948402877689650632629847846451925035467415986612379374365476171911041288360390893986721132229765766169947887290345542e+01)}, + {SC_(1.26162376403808593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.82777774460762820033523820034243728079553256953006439450420968262439443258229978114270959300622199344017589718484337858393249911256829041745903345314343540021091394102881560287779214677084313708562306054370961578828297883697715344793988582246419530881616323476544054179572977852567036054414406650284290159158304002405447887376199358950937031103957302647245972058773317232396195945757609876519304214193127881603995124500024819624489413779759179354940420338115740406968621859707865148350733475845952234e+08), SC_(1.90237816256797246227486669171399919483589830643410829499611169780971203727215705417400879721688136824911355853063650984902731234860248092757443311504792998093607313455433758450408496059290244242681574445768041303125717871774734258258916678641036751240624455054024730673671153289368603688545314472036533629426132929060447459830632651096898621496595339844352016930762821590055173084188243609293665424086528103390756940221127719143780039156761291057797334820481397090824517603472596681788452312169840980e+01)}, + {SC_(1.29071388244628906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.78979711385686127340767130471521612722379599046594038090610466732167125460890560800984410126533342426520606719054063104503899485854375039568888760720567975382288567002034953346831754769783894495550746676294468918343305967613458205336282656145318524932407160094387129343422463229080277186575794507758607320164639659871754591094259369822469703782501303055901719999275366090375714916904397953707312302390870259506790449629046479476191967195743783510726934853174357019092037673410791812913166721722086061e+08), SC_(1.97529932296499248899054969602240355084343277816619556255091621997733876181221840458375733310196135385376238395185401100147169373094887231377881737783120407576462599446938149701246857892596701863463492500388160036922963943049284016497002288337499802270953933638642449541165787258346216476205325085465966266931418111121786445927723544963171253130667638943355007515068244083212372359033804849408937371366530665125994577600484715961413509838873453584307755874929916416402267850814780033556716715227762552e+01)}, + {SC_(1.35178642272949218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.79077380560185807841570990731673158935617629510395723286664787382434734070420593877008246737894206914955382051323852831817642175680990221901969610060683074622704421995675281008392086832771359843513683914881713246638554404384417070742716548305737956113214094245552797225951078125611475598587551455830850591617669298207289396654820780436070659318515035173482574219537805431072651843159786010862043473811995143369242030904717771431696545720568246265152229327411357391069165707328893357622936422285295649e+09), SC_(2.13059136570194254239407391037067150343599098058780133116230659201053633257372017234341370601553301782276116790588041904156794338078073857655337466751556849619829258270710327303032110154928475210007538757757396856518851171282354554599684740830735844823274301963455406614426566730360797546058398185390735765301739067716955024649756045796974198109080635531733693266385265544023263308650055411770824121854510040354730758618787977954637753032683746887026837598494068620361627965127360986086863865184764952e+01)}, + {SC_(1.38514175415039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.23325137095218598823971508296873948225192100644656374441758763040983693132346484605144687295568219742283016535118774974652008388142683636350053130008764423355018809447400487103279915093742480389910985450980067599008027299644082243337006654575030469262199653819047967799574420944180011273945204186267448102919341312955232949125097106021914351153335517551925258398293551930646836566455578001158894380204272564162401610398812172090461275428017675992538882528626329695230610272518852177524672384928016285e+09), SC_(2.21662361803630197383736953990278887110574274522483085040259559845237723788490205822308182030543596883541881395918821078845085775974446457476054196005815674612301742772034161774111373919630099608884702083164754366541205908960231443997976417378733390798364374463072495586005992104412336471714153044446120371382372201888375362378102351203405905480129381177692493032749613678787997288916943591927641771378065548744049361287040407849471796087174360733780998130688837875865278700496584306157387077295518105e+01)}, + {SC_(1.43832855224609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.69784802869578241859347170270044660362887975172105734174126024565266258464185679860969819855411237159494880208775659644483956130836332702232190530810929795054649744757422772161305573550173240764511358994665056914899731991099146899770847475853729703216656351615055364186019583922630511131963769089890507495016742632213307435586487273302550332698495539906067716345084493618187494962743675749595552332810650864210967199048154977243646054575151056382106763855672206878008442750138657969446338772392977931e+10), SC_(2.35552125136450700909588091745369060423028983139872816520903248095735988926096539408608197096209270376093052063987604229172439260225265802753685264545909375191912435806334754171252744005893682713003301574855225372780111914101629076576865532039773643327758840495625596026543437624197390101438239785844326137114997048983495383674156592651243325855108913317388476131107876404382144566047990082712164794523533480397041648000824123176019495113050076473636073664863555590914648212166240698682112904657612891e+01)}, + {SC_(1.48963279724121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.60935895139790537882629053978367065158097494775553779389162718199800962660976404867451369776960552719236591600432068910267380128788079356527364053960742437279838325192792879200780876443511952756771766081043863962521162104251062512261561306936965054762849927286751693584912828216488502812828560112184399975250481114240534601033379784321671805062685095378497826204531693763778896248141719307161590520638212293837683630156089631247838355678237432158041439105369297598948436211360132325716321014950992967e+10), SC_(2.49143375974668240626505214390533380688347483901923600653194410711886779420898803117624305175150341043802258914439817725968253567447217611716808423940751959127906426790655770430309975977208455470753965004376884277299048155174271626994824768948180598101500479226249068284441503076898274128487586798561957754510391434547445793560602560270702926430292523945864871226551425545008082382964277470607798416267823092545061380983203872604535986283661640712327778671943611430748664004317504626424589546239492000e+01)}, + {SC_(1.53649291992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.32398807872101770462604880522949845437561627327099970169031926625880177450787091305806943792425166226349760109416361742988524722129994365817234844238217238280776183875198531958136053329307878216615519634840197124976984100478274525072421035701533163566711522102036089012153312827728373125004089091452062656302048171592405945248902229742770091130711022681649993555144430335475329700255829237894423454387315510994513159322878742867851744054629488404979443584886753077599413674731935221399660481631292785e+11), SC_(2.61717207322728943748655952468525991290519456198208118720796690982830007941145343499391768661158582463079187427238318410030877071806806689640550339944814862447936256191385266543955562161363885472431312410894245972233609522570605788757616905274288631653175310899279503906728266948467958956851326816621095525631182949074151124133792081477439296299976706029974164766593650975684320159080549146560042369407008513487199017496956162903888043233189053512653189235110362053698908875636116486463805068025729702e+01)}, + {SC_(1.59457702636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.12715953502483062538557724081013911658822971839811638302861945974572255693067688962255936258136107927159156397019302467458578812492570380812155193959085864099568927830194891977976197587003543495844952826714426145342302680345261219277889687416267358065688920139224042982062304137579381400020918547309462488468333765784769924476330423965481843915430241826273531524867193316237485463139697249608343870171918262645258569752948674306051499024008349628321871360036489296090979855831343665951404747705820007e+12), SC_(2.77507218982215256456907361110029229287160594943095798751436085766564504848854056383180784211923609266348581824808197706776547521649865250928950387154147803287982062394737447091407237366260446253353498962361092296149900138781573804265098616530053928097718490754142074711308776540737540544940575655663700893805298458558736564909026609952731500867191306772061678923921512976870506621853315858796712939270551000744125644547207963447164060931746695822731105902019293199464525704273081787738905029417478261e+01)}, + {SC_(1.61850357055664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.17392722860575210882743801148121974761526064642942975611851093967221905620309266419763230958019607719000964328222165770505474606502916318180914198593539748204197180563392900865765447623021484552114088793224264781542092820754404856979476987230596794282235555744748141761312510208561694016754873643072407001696236285213178526503889324998095255469101726657562023259585497407965044819950637365173544139973145694386482527985943557955822398804411240998455445554905356819455967232872943701528948385375416924e+12), SC_(2.84075564305649017910192637580161893383118048529446948578453913521326656332735959875038712393333194906778182926725108659503499356843472051464004490569862771906374142762551592434578842405679502902794587372543569122097856395778041583912094359797049297611712374378720254058067502855335154430899898507999303154087163660771590573370318847901286702302096288936111417508352764313313004247849530921319320099265194394899418464209193302262016659209266350773235272677342977910119493741328205818274708511919664895e+01)}, + {SC_(1.79338607788085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.94378015972887884516054763336910522189606118466825966602817074458033507748376119333205280093377734568080933812880181397469279239108543720418046546393242253747231118747614435825455274299153710665198721150627177394186314404834695391882245373547307599961727815738420343965876901510326203038625545238547437760286841659242817122054781772597614247162591992302074382664668628852013285031977346808546879744116856146662512084091293248247506035169514171475602206223147110130035231646012874447469928518936288101e+14), SC_(3.33158858259898907905342233247024675861169393707251938469191257033208410100917459972779143360867650229432762775061293525931944909544742308642071992211692350145763818232133352151340411577042857364193387310895562018291498977196157678047600884999805062602410706712089770431715110819479340956053207090126277256504183113502483235445467450928666924159010047323141890303181109020773812171510173380978164764095893619679219250456889910946305970721684560117313859764609917216519924334102644122154693368351826177e+01)}, + {SC_(2.02786102294921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.78859109957017847350282806920274651443560302946482537725653125558373588979620547457174307951510988004914510354699121792937106881509562013001424269265755625105237218390644714062461417356368115049002169379320461604955950947878703486762597646209323773900580501157767451153175713764274367992499988740605431735689546683299489274110181899056071627310526130380543907317998501513254047217553619093579672465892040589757413955618873138414486248533989782506156014995258049759728528931005608771532253666614776864e+17), SC_(4.01694830669526712285716830720908080882784605592145521661108558578316317527808950051455910908149355285774153589463257476880357990334424535910402395335745791832884031280007396583426939303870758983307128710895934002284078747537321267500943681680075881059064170031571211276699731527486478859823036488211903833218942468550621597608313941585272130442321011122624067155297304145649696594141596950613934123390910581816377733641660900214634788029862302747808523415329729542689300928045459098419353956909660512e+01)}, + {SC_(2.27562866210937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.26972717526065453243497606415341251348549318454328749063345501016789022692738877593139482043483197655452092404409624945435401219712933394751055303990142982542638490626258864903914758776542688825607921286094934655746026741953782617609006929140731656413762147816621347941826019166397620687687617958338526588369802976978492139986030868846810514654286239871261821515071359533295231298352162735118150234734814078164911480645099484217443573112986205065139813455381998998545524503845393344966318045384553643e+20), SC_(4.77136804516938476798186533137278659568953865881033246633845276278658930669490843676898202801665172965195014497394786428050799441324442769697063319265977100562116857211797345235476803678040110610393920650678206124524914628475872696681953068587543500695636587855133335172354100595270626035010678536436625753656761085054662461148396845219288688834873129706103341090689496045171046767844064903536927719224669351215677098391551160145540606820140357781318863155446012873587956509028891262429102384752237783e+01)}, + {SC_(2.27900009155273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.85098335220656084805303753490068761820757328359109281073754662291972968463434371144214286766024639873517031309922165539968225455173766065339586915138107926116592127888942444414715885558417950943361068757427461766594924751498397917726333322398470362673163297540882067039707423998766149888779324104167300223636316709020288618852558987393457348461154024630406699740543022425870516117498401176476538043477712028469899604089430212225785183179305838104047207860532079130574368373942186221880210190007152526e+20), SC_(4.78183116013926830266939183259939860179077401608681053044395603667528238495675049839336412704201043952154019083949862173611780027988181004560828830103443451954397089056210419243214747839359840199778090722414767193111651430144242363037947410279734322169557386711391485096580518452505090282238086183149731814313987854823078824578754372724074767852358281888048711745936844806125636457727893417650220468092526639171962956440715985639690264187827522903473648954513132769343415198697642180909536890448571370e+01)}, + {SC_(2.32671051025390625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.58604880812110241454443187344936017835854008969901521612448078397011725521182274260449918557110867645491107680639172390431077293986497620091929943773518926625158875779142019678847319857283976396460950914258149177614913206540387945470639191549918779093413871219422081680931454303332602911745577297158040318588167794015942180633957877188108408414511350070549894143107543827204317830609472493471081736807394919923691843857608432586473210000605737670045134417963755562386466190925672412878850646405985887e+21), SC_(4.93044181070299253236362391869236800187815014597272180541031308288681644381707365789003158170467418713749315130448968112655720169833488122960784450610406416247180917673304201957658843133539076388057790707488923355640879455639581251965002019288706112569136442372744159529269447953305171290350588295132657475268242628869310697250145988245409523776241535152519668623579732121296216600629204372942165520109491547688534215654314055296728672031442410394104670473467792491661621391099880487208839854451013164e+01)}, + {SC_(2.34526596069335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.62194975792841895720749223385860556288827451704690827966867908358586186377510532992856117196302979122682031742504675468607786075384709904759085834558269602839780592168397856053584192386946531537679056796693158685843165754560716769122635655901255012872787428573542960450960109793983675945004952430318551725091155795551025628653468443465024160434232452983803513580832219466805463816175449786449373136370649942608714940833213805408426003631122813929992880369255230264983494510767186840201746783450842382e+21), SC_(4.98851035944665136137672192015001725735574448523513365461276385649832019558648067889044179541346456242532613476455989696732448879451563256006193760059216702387425562105599088225278858290384189947360462270135584506260058165911777571573884965611063658304139334304428754483287036131773544287342207371086479812475077828218358906305532901236624147816345056599647796401492252269211474910191441753003225672987417389814408598457591482775445660906950641840923145254581785944936501393209938814257429135828147670e+01)}, + {SC_(2.43377304077148437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.52671715713697706891160979125509726305938336857375227981739347280081698156098205470753157358393470750460871546434129104796564469110666737796570417551872488487369188073057706502594714426114378400481728758709479982948715130976959130779570582764471731950180408630090081483358852495530725513094749077112560162052669265512824439653875495097130381916363837830846819531583435928645935366793957053876871421785132869570879272293855874083797851986233376775948840120201836281261161838742176319534574897501178287e+22), SC_(5.26753310241112015000557522065224390350586849934355945402173111140887220444172828628317710236715689207521455346719297310453881219153304785874778678385796785828487745332446719392011066902186110879351599887877146447912243725688438833509660397006601972675603832872488107271508427519999279790089693902852256436143910726195407163225441297282809223811266507340119799040506075622206616925202471755069436203816801744865249899061716663635367511603763321855757959797826421739362819278936784467235526333240005423e+01)}, + {SC_(2.51464080810546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.91481931939477877200409821527464389427790319314797981010141882262885019600788076048644650040650377535362177964203706602145245768311983616827224624813381373244539635935498182983132360406349699087792646029860366167832523331450326682612483319992522395430103670071900483202700829114060346675708927264287445975661170857236542789818463947863119214258860704868166437681591110751004614832328001369775822848877648740658467576865672192485902213245799314604742998766424238759484022554804825427810329237718912340e+23), SC_(5.52534876777131248526088011136399421247639005261200942662339884519382967508816892218214048321898008927408573543448324823195874404479702411208644428859048494602762423291775256567201245544467201367992361359313525579920316298681194519601969564215992810071603097749504526447365148514435274271195385846780047802038148332510936367474259891938847053684708322750072216689143695444833185320648783070435734567796528700749836875689519053250541378436858107409851809731784721711286317464058683088715442244108225872e+01)}, + {SC_(2.53307495117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.79121106112468838114091066050696844501804129293613245609247373367728816889376752295492985773345298518680345254160672777414539504784062244034366992927071130241068099215571660785123653342892863707964883249932645030018511623502406446490102199974777274991930181335480495211340080137603634352285453834075031871718395777239743551495314947314361106557691247822941892794875598790154099400695381011643266719344568091225519853749774286383156255603731266332110509289734693913588439967324719134777130623892593179e+24), SC_(5.58449341933998661286597122372310908068026588697772263463044249340345894176388328944725581420298209141152460517528540753526893441781211306768929743670148144017974107618983180476923611386416457648485096243289792960090120596855752984855873603997392677295099339567129282671168990101291687441406306439558829817161464809106382589575255498512347192513308661185569879472434035194625729156771795356097872108174749327142347398543920205622238328863320715757170431227274886985176738777251222302350541069469760158e+01)}, + {SC_(2.56547317504882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.08185222038264310688484759500453549449343601064644164578226877871835233183599988599849700771875502956914278412964901381416613960210544679350823989995570437369036190734750778318562793404061483974309879014653863257393556814923674671866439781516249984035720382974086561705649167984614024640607429055768235065807548056537920522450166912638945908740103020466720001647701905360891552471313012203374488015308653398882613931193426996660927901125500252723485067627245831870925718793482515777531619053612687460e+24), SC_(5.68877180373048439806916604413364161076870205125629884067172953865884788640557118206524342356674419695257884468542292195573826085853803663075083194084437053651584483581690843123643213703040991328755997152307630162420977755970157738226132226009170471317409024940261640805586477529151547757888099874951697765060606236562111098316847459517577939192610719956677422578169633736070048128858421326896189519142109020020555616416933177181768098595337956671066929651426668945879292365721802750367824630784573999e+01)}, + {SC_(2.69469451904296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.38946145226621904297694624320451302066263074623211393616779873785651027366717911648120891981347459583972771523166906685960614818223537432379830257868186481779524300591340059147240741531278586780245686715266947950598093181762116682854730864826733954340270125961248165415267045490110541647104674953517683504102672070314779850010955167318136591288937266213480474554707223709046826452399185053344741367632997822647833919635890641991088509209448968323023529655570431435255168043168502497343886638000217508e+26), SC_(6.10878834629790988160802927408530013637487637537408024086854879487937538346516092817902884700523912851786680663531728945594087355952290948434712469565483226874890331364554842522170361208548681220518063358284304337845142884753062170082309483382202799671294604562888151796855985913051886219982752646724472534051089361710730038401364058530216782736954910601778240054306252894308364042420468921770314303281112548652243358425470904234578569201244720441942444412712160479229668466116080101258970797763193003e+01)}, + {SC_(2.86065521240234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.18297535561400529862154201588364124930726316786053177741785127024911984659957345520275127146976325947623851930449300294321327287322540455295178302795770977364632677858658542197868062436973426239080094795366182479671021295104621542595009889405064932729645817668857395088805081325759068124462747875534272079475902645304662223083207008913183208964990676916644116280376693740913044811987470193425546341939265091095248895519540770857586981347068792465579320037618105504314455654476903086548497888600391790e+28), SC_(6.65744384237173842615460580640110866830348471432619027751155697794991693556178792187152050398500030319196838124695595345295036549337326091217666830844852771807996923397693517071067680518019247408431217179931029441945675593036150502785807644274142395991615983425158657556886396005376861112808847592605413421879099833573662691886365132153489527485249192638773347480454987269091802611271643541747113868528167028724782368679415651577580896606709898140508508556601010526085370686307990029623178600021561237e+01)}, + {SC_(2.89363555908203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.46364169422991361911522707578343379455720401498976706085708772208004310307378137253150372308002784981732170240094025073900289172767739328344138660064293375101443634174935987514315071992162722725383072608509641160645023665173358444455855164226679929391852601054044121137601734835260033769268144202422171248364140069795502358616158799151473495887212541426467037741443982494760074928831400539768195579118314513062832534540055300337488029865295302834134358823392899209355307899399975837372513512615528262e+29), SC_(6.76766083156218277259765307036062635553227023339066248067234884992807148318643296403891585461022484029987169548871600200984229656567414527135292403055378517881471207722154621994051797163447572374473358813303159020377166394396154103712732393989825413389704424065299279408848274531031692626640889901897059424873169831268752195564405077908811735292342504900309993677035536590868613014160891096302448676770957030034583001066480278991292017941290191602708891680676674452826414806539974597961193334063516752e+01)}, + {SC_(2.91395339965820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.86734729521848082710338701890470644781523979144988928547521261078461371643143804003634544436307379536701089936804033119939526653843615648442229267012609024807113082453171604450219011300824936008035118170099021658680615814976974679835360871193258898622693738894568685412676828664766739487806291253172480406131437510013598190306985820790872533379477435332338651334325566223190849428336741119210959477577377495620582613192165806843439901031017616746525463204501806407089611814441940521988506672497750797e+29), SC_(6.83575167822765613078684054515645393136576932380725334766476664365352993590275062109168114307596103453010108572728218976725262757036021598627832561241938784794755114892484886153522451656847822582362719077906293051861728306450132286688917383098776586452863162933819969125264194211479702244724500335892028324658730280000067192121885937096181331752363056120072640955413598291279300652293302670284003703187827689607921107713327366686226032251376905617946954001970012496577909171241743428353950962394964080e+01)}, + {SC_(2.92621154785156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.34523745563155188256040850939691712650558781254414493284991099149137086775804978560403467599728219475856175016819544619020204249467030945623725845540950345058678326769601337070738476482943736837088975580253665438542042740591916109828199825079851763141821593378584210340486225854165051144199045290135047844682296062829530542554728086498690404716811675041099263451123596611795451479772232958162850444504127494422572533383884316076437492806332042890701380253588643377173905471284161483319427666467625361e+29), SC_(6.87690198348116810755812737868634699468768949217905626771535888361356100725282583209314122253247668616093135958957553107771336225034668220637724665306401194336890593782398203171190925637074066752678780699802538897175854158127889554586448762692453288812540699296363525839207569798672579000882179456645801295452654363970906333003928529475402363082584130085014788661889705740056095052998499027843848922205804376125960585791770656488154392778071834778842343072126162268133953305536914279513720072126961022e+01)}, + {SC_(3.02215423583984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.87297339346442413223626441881552996749321322868278677388442717804533541719793945413780361025036005578239666197991100518333589788384638801500010329805962773586448566558417273032380150895643250888070791874193065889150921484137985142416411695450300740875263016453355656734191678187675741194964512719726130824949769908095511629218244723723630403258622347581987003968996993057199504979872174846428171029999991758822801819524388081710906001015766599541753063033276293523002868633523464206937949347128472368e+31), SC_(7.20076651008718393001846413394830211369113155296905387227354397003624157955172192372818147723165782354086885513643610166959516337066924865599773015660602163993110463698236133192801490805972757732043844737488363072660380105391287770687977882635109700948168715378611974019099812843028483020620951971385640401828381583612714653451198525471027241404044969339383278643839951906402460060093046138787896253406949282594744469482087285350575317701851773982283579551304384758910839844880960048254488720717351531e+01)}, + {SC_(3.19958267211914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.10529722092897347908375684350487190665386510730995276652694837226076152333891160209381011736663624367269277904203119494159424128154849290145466186191251358876514454753794811668164171088503081783194295000984263660061488617874426296564985345060633416828688738656050177656080448564016966741708683129986866682190353169745781845160526162005405982688031758376601477472002985161237064932920608952502081314817246651441220918323804178243806445392459543046096048748961265026413160455472006160838251124796817586e+33), SC_(7.80778258946240115261517045561166005792687796547024600776968032807657415113574297406466783012067674621855018033737058839515115740858860654069616412947264441341384570632838998094338026850938979006690501945806609196265904893321792150114088608539539741776326911715297018531473204914273174095721894921550227325411988498328959109687266688893801219762969037285120247383013653504865071864740541405778651655191375983172120022638414111231251259362331464540155947096964038949774188789788535095913097967665089985e+01)}, + {SC_(3.24185638427734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.49438161917542816534549417847110972760529902701104654598890087201011890720206561865852952926013434976490024873073435910795715920427118281149452661845289951217891902764247541018950583339572116892564901102645427222988297070750380042289494295927433982082431879908501042110776671962769426274191594098526350490499516762791016191688736257490680490659195962464698070712029836564078042389440069057635876071638944161783898392349333989011139633739055040406159649536024346516120217708186552130193376168867187554e+34), SC_(7.95390495888318212998760521002149494523088095049632835167693899200198082090417159595012046716410467802260264700130964429772344648971739989016371122586195899096394787637702142096084678211476489290836862451591217695503566590775034007077763468945954230266946092732190012837261614121604340229450019002476022441998401781862534130907660183488294438797763449874362792394654275157077174892751537287233687405534258323091423343923021443606445885357115522172366770443711515407865380305091563963432540105037663781e+01)}, + {SC_(3.29585266113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.27761128930354919701485516775667587490850229398554669934207151381442314632638880588591793769213728389937267758877156797146431055220502649647576202415695404415293690290835812871829309812033783385556845448116306922255075063107579160364093224587629500425003631224353942082977712187414611070893088706021680061826748100814195305872240240281013895126124269098074441195123008020302776033608084468484346891950551401159486446276412149880984130857820108962206580715231553561781131362399471520223258292277658124e+35), SC_(8.14136054684274741964145377939215014807692010292090966149434708384796696984176953862437082883743812556422595798902123120393622328481916071778051151799663129957386718254369476701375784883357238860912730696684301085661489681041613263972448106796350804708520721594200966626630627375617024352994350036701446953170131728026058978104853485950120261498236749505855833440820778208559278867213296060430539496763904209131345097333341183094665414276490139448832082529973477245744065749067843522574988437041848634e+01)}, + {SC_(3.33357543945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.48300159181761200701204355363695060229791968154368538754064262719097995063035564600374025008951067252483790948590967248724178893972678588775440775549447497293942678266653534753786827947462288065307814703139034747179856597160532948750746902188231563587909018174823911788915768593476118531727242871056689064731971077728987075607744609112629093496420251907631517330062434138506878049509818111073159446603636714880112371770070022582019195746855578498298366073462908413983843045898442239545322487107538287e+35), SC_(8.27285426032651351766507271768183412890756355274009940387465402129137436561575209724804631194218211989913771391949002133767203973838994464541580492006666861174959066106401079823967507815953112500273849939997916717763734452443126349117613296752896480185065537237343706449268677750584685983026546829631494775101667241984395834326209591964078498650831020349540175250722375517632363885845822067443894671624263457755868122233911423047215640037633600146529028518371062907190179673629943284929582240228457933e+01)}, + {SC_(3.33608245849609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.25910975788742653205146646366082007340773610996176154798821130540958169768564085960223240057348637196035929960628015222869494448079409889252897937593634818967229880319441221801264922080032552468069216002312576208837467708731971964200629039661948814022629825999101060910619328263555037652878100470180845146148712279665244935657445018110862558457547071725686710241891281196021326790690207821250385916687871554698057461130870747660433547873539611604037601274071252230760029267104222180344524243865665364e+35), SC_(8.28160861603710079118490053139180341967390190183525780661970734769298370225490936552881352084318266572549229847106951262515221025161177591569889171913498625190184460679288204802168171780327141884782319041783323341744977849737124137079856773929397936817750860289617101494377478049120537435300917814010237687503184844519123896060589568190512563668803865162575733154754837230457246786300598905794327235054896571232850622277200782063661993728071438869663986891063212286553580700214568365161762642741449976e+01)}, + {SC_(3.37393493652343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.48031922819823306403456121055533618854815349116051084146233699504748076904249935854937286448179965262152721118856843542120460979737215048811700334413415327659952769299589060285169409827822674705143801238912097877845412052224385841228833750504879006197212007063193332967923414106315429839140702588109049569590790890068717314510166172831649739497878166199567098912310727916539484778388585294038930091526234141318642268922494504101512277533859788856836664268133488842793137383127949202371793208199372652e+36), SC_(8.41401873696057544417316920924880046938250235320124753087311223250489866574699437076387096536169707942889447446804102388757224486826658788938004867333184091912546002317298246728424266932353180419646334522781207966104359297728072535824671094515322040354822991604351531178940114578851898290053775097461417376852674842647500815188669436253178796934787422746875982052670423777598961614364976136407177160333955853407004352977148066120346666204332050285075576875146205115570129251576319589461496209867854095e+01)}, + {SC_(3.39577484130859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.48619298028061209986594333844848533957474181352087908334467421738975887543824669352195537925855435254962699056278972594896552243395516661570162654604207808668441002329965436921613187220878992455054164458716043116563863146011454580903097467081800181534328436201435735200565174945504067082424441373813455174315131792153573341277760856295122752191631892485396891765788245229424967621381462454620224418898356765251078488288810214189182624366940263882437751772551099000045085151783935984545593227937300553e+36), SC_(8.49061237357601677757426820584806409653635968531783207842298956209531777624307597237621381316962998494942150317275507789715941449133943051889962932131394249277725601498149620868390677403670219936860302219377586891581268839739950203958740517866213446058571530484194674956798719844014554494087163357384615608021899824063679303890626979693426040721560448647891115365732436107517123110779205849000803887184538252508823293046458420647545970247437214057700091133222182379355251152683343470428337908248743977e+01)}, + {SC_(3.52252960205078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.56071715152585497023092290905655959502920460034220527312022335847447157154956146842645630131605527008005874505359774339299742273930860461033228954281920264089749626896578868226710868563927042854240358804527652171128934251989148616435512438069075763900427149132989690880480177660180054073738041633796251162327302376422301097941705408765062731669475812705657287562983925078410268640206842398117229936138220828044117537896910765536074516823769915511458415983380113545538145635109478905390510739920050025e+38), SC_(8.93793334526334738411682956961255144453790132511539285738028665409834504718444888464037221580061474593309610175221455653957374652755769082019267799560912280759842580615594011644440759597791065105166102263051244385684737404118153326841745732831937820401128679071393078811998593562915566091676512497508547760871102253963272015067862936340161303105660559596765477645243666783294043576540378593611717496449877183394450670074809802713021946770650132022480046114445191025317965061628660311957807807192746963e+01)}, + {SC_(3.56992950439453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.53689053093554857618544159347188992495443284898295702182825966086324146810862756817904814830792850077597275262900840906884137773903601193086797431603300382282886366275248632332271576233699015109917579568871683861086177595480505648823337658476139211255709306272488775058725681443846528296758964994516545248044490395799486386700760890674575753723174710531471038216033893492356552206670520206684537324374000788465207024929065117767768126198999045992857823887533746905922201915892267316660275240932491649e+39), SC_(9.10640665868190858448532660505908724776333955128402397523296439018923986341125101822015045933309583940961784261950267375844113972950394330335314672511761753499894659082898535243666439383791158489256919862750008378539198210427205060068688218594844978402783702908704355316521120318879716251526598853592425781150901117478569631977765902386804588349601910594652674056748675521414811504462212070930437095416179775298078616861077465917526850161944018776608228044914807483704248490120440411257414585404454543e+01)}, + {SC_(3.58641510009765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.36424295432157511535440720990490713142478928850445545882177788146631899583265243156599175619499745407860152595623106429048800824391118470396354418159458891946526901518510468502225964275013364445514500603839105828272246032594586879111881480532434185612132159762451613795842833858892548735482618893000745983825064789554050634942435506397112024172110375299723154354678671706272365214527471172105826515102783386847223543521346016357252788490199361446234119782003104301862373067091039928786671563470091942e+39), SC_(9.16515139128693651595196512708547636324651709683123172234498719549521297558840840169159075720023119839428299786498929100525813570217317085650748538899182704393280910655074778183239450945435128247151520084833379444108879242189647258521809568987184893901906094154668037535011831330451742257699231391514383734240951685863272212864615171585376112089136287668760813342388267415735962675469412313082132336996282245207389344858159858989553753059675271824412086490559176145293682277127850119334630174597027170e+01)}, + {SC_(3.69956817626953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.66259459422706588699222738869782517771013101489628084466644305870430406070798942163490690127991724184561667952578780416627685499790363015334958157277107962880588462998393004757322874708922780685347930191019262345739771673209110527629711456840852047746136361035805476632115828791555934130976955731492222877982759318769041605433626949821770046523696970438061167452953903697439594188383812573031381320960762917804462780349360037016873659307232172834758981537825701637399385060943954402291803761025188656e+41), SC_(9.57041606145408355846377105120823310875286105242288743240649449931243534372494492033165984965615897580866359774857197083580527214825807028474050660229744076817699154124010984704156257051369003061832044509444512636886565464528020771580658305752979819543996593298215761253550380750340318878379006801358477171218731347554516929031213372595059582888328507472127737586391933992553030899119731228858902002898978177293675803817519606691852163068196667587353923848696248145698269407401972926102876192198856403e+01)}, + {SC_(3.75548248291015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.74892943333515253042738100908952443037802362410857001178764229199499845111375247272035285187196798098716219931748693667186931599552210927405756323100223125808217466598800945427146736702619067016437164165956073787698936391766902777295693220076385374900233043835056148278714940830326392134463942329279148370477479770746280321753286950085635627572858440912629457352464345539633215981584384577339680355270522130806324842705563048601979210064025901207358610376736679572198026858224873784671735129803922494e+42), SC_(9.77197854446636261549767992618612153338901331734174669538240849915777728762665304807044964569279468081317072465445392919466603094510230879224662720866001647403529844997948257752306473456879331453240965568476477444279665524301166509246024032003595520346950239876945351260944757676816304846242018005998244715086433298063772518276585730102267193042838546658977872168589228695054959695774148909268194979897704922505548574157071890259226103350432160503061387135033879084934257843059503719574103241324813901e+01)}, + {SC_(3.77689819335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.96230102874396888499645027742495248912447947437066102094493234389694530402927062586053005763812544416332451548507571624128507918007597186949911423259731332697345887948321691383515686149543224694114422053539249065095491560459129555622893486016029603928552949258140662583746543652350183245380752554459137575155817510605776788743415928620015393908452765207340603246552035088794620482996203019784540524531971739259410827368602035166344872030932413661636795971207162080060617878261642791350386883582954744e+42), SC_(9.84940303909663096910241318409289245212500019975324319490665242340160947312198602634920535331626298288860399479371441659954832274982476753196020766157386868652317205632431548553765514639828150740532472745982635933859447403915457191153481050654421953287290317189592103415626818480295779308359194099684087776250961300213691244090639997986010124824245592443696072734945753336322423458290341388515832355186237545984748745345296644163498644022002138599063586519001741166436802987643212337888398090681552556e+01)}, + {SC_(3.80960388183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.94966310132054302397003765407203158363486041136357047081300608006350006717205229120710244797692588870835750721429283227140051425723505967609469428044605287187966408282088301594708353782058645924215880213449355758049345549942894658204524680477066959068297785174881565146038159618757197413159523147013373237312323781047617212934678594456598493072554434900688249329779014143005241366335087359096559424072461639852732323393623317543297851215372216617977352868874773093064273882043088007553752439030053374e+43), SC_(9.96788155878398464050970974823848018555124016340239710302064417988281268688475838835239358450786421871399679931398797995835233726341480134191811204238900043548692242681716750073416459676325619327228606567408071791041231548207582968697208109467767013876045530146014314654216878827838721817400523024921837183738330582752480169454610303023596022550679002303388123338606507066113662753266806342456079882031076214547198353221502702511114200315582468949405891307760099327072576116921468452800633334968338123e+01)}, + {SC_(3.89539489746093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.42099252482505175224053491172987287464999395110917309159539664973197176042409395425197153828926115134536219562912529335489935304617549050753694848890326784187104443214648869569501137238672773548427757359572273213897705118085729449223906502037596529602469147874376024285396564985400296213619760577825594742208116824657396999627685210334609177578842262952054514305445759630225916599065166880216435147871714146695241425637568248234770007348891729125230806186695311999312890685043669601127902723920549747e+44), SC_(1.02800108315747176667580757624829155137160586685435413939740338603105579138210801292181451092389926592138418710192414626474950090060776597949734074627296310738607025324151493885220015841053889049529946606110349099977487577341271553333304748516674899399995745728225290763832733902563955246130788629755283822495538598306738794563140063680581754879586565113212214718427262543292536373096680727403567530069559782665899562623362724635818341486292882965759589700454690944614847393328224912276180561566065964e+02)}, + {SC_(3.89718627929687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.71969740749970897730290012846147911686009295785003916412901622093553119195538207033808624095475273429440041234995502918525910378308579137893316016944614824299884881505188300485682346316635475893326590902073416685810355968417714306010036179159455369986745977573646382266585974939814873071165709069115729131193158330432726853181872954032010799755564920125347309967318331099101478259410726026710700865683645570693157050660905015788213110721919051452797761639065826101198888774024165468417198360511986211e+44), SC_(1.02865488780699861093280112199126891329699001554222129308544815672432515028407075944529333679710293149443274036217115425818460906925868653036116530838271231845983723398621926711333323680767611079507871939945224386116305319732929747226426231187768839594051257964947193446101142422220266262855570986577873280585722389225128219470540478608400204575528092251890460091176254511727568693251840571516976921269938059194303054284592498400851945638696563192595531273277999456371365165093683664759202661955453253e+02)}, + {SC_(3.95919799804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.56094771887852659754339674542850544692401459751758415883425527494896691657591433112864036598563840079475388260010228239613975962598011953360072295567475554942703652000460050230046640009911511053410735581139875607363314195967702151493277296382101296360216341042964206487286690492474027343515140566285280821536541768298788592515741054243967328597974804693646128792971486653117608353240114118421559251016802090607898167429626748932448659899792094485347321058606630943042209155693453189531774741842546225e+45), SC_(1.05133859619751442523240614026983326612739656777413443094256832978622427439856340253648166152679010556697821281893454391166534792755872927350004043092036260784892300492613463717273263792090452502567869782859374087618583257230710949894488889157036516384452562108265394912037257984765405157055684158071284455805768007363253644757106005305345135932486240034601443873038626841783178895988705252616961545535592391173264126938223796906149475573371275187276597618947176255298870317039030185309540989920657883e+02)}, + {SC_(3.98988037109375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.40627593316492444992272825412223262199673436499899274677726470023082915445824866560883298321178664586000020727213649149362741692666250092112899640459218507995683203027836958023404493373619001614106360496422473928381026688562865920584034814624925452283815578341383405590966758597941647998792595251927194506602941990484534536954859045350149803944597373911154560785502492566964912792324178856844111383480846116465140788837075282904017135001794788951305979165560179546941585375123808713637899776357770658e+46), SC_(1.06259859305888378907799738967210580839428887862346589832422646064411864637416651304345889163867424880543696554072713410634078133737343313928341868911506283937450816542628397936908503587683112341752316515252368286680202218031445568313709099582003218980293434823768931289876952350750914371043681284514674653547662409120048898441288382045222987739167127214935250264656780339430988611790989613500898841643685370671893866307781570424733993859701243964579656627126825398781572968795666477881860259909590879e+02)}, + {SC_(4.01209106445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.18208916857154395368702420922162848388742166024044813062272795566235213609746749799338864763870238526778712988027884513751820183187654812982992902723115157504157903691430537559791337701464306927810443105593740233499397841866595345518575638157812382630916092366746782345952459608920163041236268086753016916702027845839374869326421498055020440558419581789592663923320342627972875884370276143283894930553232704113807619621842185618990407121653376284442190681954184665323900163113646750719325004409065903e+46), SC_(1.07076452230055961349018934745963009530408242685899091904199838913486514387760205596491425780538983791270407761736341587942426767707401182094852188846903951692725216878150525398824647879901311614817395461224548594179988807081033015265253650683792469069589486412803831092929069079995089595050710980032465698300202811465535855146769754426551932930019839824999335677507135381848141539172684033420408805268269916705873041553871757695257600369210361634571992292136556517653138497930604300512241679666923505e+02)}, + {SC_(4.06430969238281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.18082308580047031513981867693577135844953709455788995033927078437485549163341744994659324610448675205268598737314781061892395944903689750754334036944685391608952301161815358037089584556246568491089654734140280148469134598272099686824970323828495736821141447121275150871410273803476560050882524501896961102850106224667959869457944400000142782600575521603363928626040333995457611724197183012279413386055224125252627414715903126580378222565406209200875218927571867836787784546849410912775700152767099491e+47), SC_(1.09001201738556231502109212028821747819744173956937210611145484264719711766529469851601226202101966363674044959771068322529405703004076853427974169568790980436150996312637283223952251608940600902363778319452023869102298665641807940473320405315253276624239835080330467460005112831893908538319723111328787953563154033212840356431710476416136889509518166405292530241843482629331557000897340467712989345938014565837127436715649812066402504490281339082467632965896864817788227698937607171213816703009689475e+02)}, + {SC_(4.08205566406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.20115641331440339467310215647884183473659029888921122709491804851243055826685883831686008341760302325362966434000996094005610893172525461862777958822533083698245624745695683931800910290742279054784103111180548974580560857857998796163113975003594791881891987057953771318195446012956801609200507156275155523646011353122292253918238750951175292540631928616440892348597646166577336605887813437522385049922505785826990842424641728141841630627868589447100238126726740130420110706707049750568248233449196792e+47), SC_(1.09656859194614760424481999745730080743689952003240194837592904982820016761495823384151814047070800938228767295724381370266368325577544870673863719799856491179412459655379074570077143642096179778941173607408388539921704892876303972073935153969731007313339109515516504838047336843452280164504414683517404081658767756776332645522534734617981654176135384648344172056441923584367044372654115811002135162379615965022393207966077402824245957958379472204188883421647250253204160191473856460368539032329410990e+02)}, + {SC_(4.14003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.59845508598368999690356822122786192315007321315447283315450935378396176720469915594152097905704129591162266777830663415849047027907750838429775541831407696504392052400572121244223497656077607413870009833655228571199174047652016520604380423446828383907772606021709062080986687817756548591328205748985050739484302737720191387375280437378840194735961822813725566987452710076060158391972854275750636578040087619684469317030177741135396923298210480860913790889397509964510394078850965088315821477380776088e+48), SC_(1.11804589074285832381098988403766806882167453395786572096767020977168709412715983641058656609392882765351906530753747748674759546000501253383475774797153523883205963055438064127027071634192397585343592926146251572155586296982850390149169324103514178552519548061443253673605754847105252438455119244896239056965464264638034015785618021431808089844667707221953518060774777061581753081236358805014661389146949376409476029618453753218158016321577730881781246449884935092425611660099548318304231590337873089e+02)}, + {SC_(4.15873260498046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.20430850488529878836364552230116299589347139302018600134994455219285339709369731597644890276614623827683116140537538396715869823317619972266589012874381591244984977401846711457385911850204936287595687811998227590480489823148356281121021601075546520736955694475027986337379895562659885275955049946488528780140151750253515909768287231178419256423666497593936884971433525548497845269710395217999826831412786980017642018557542666638085883545424574454847755827465747444331168181845032946278548455872510465e+48), SC_(1.12498763714220540438563524043282372771462861555428713271523103445069408737133622132683121385631156666035245178814443182982329791609993821751785565723767774874223089328820219825695895391915295530433626089156327800417687038667437651350019555366647713635319509137297336970765651464651843715112398253676843172558891061738496378388977055210658974573259349134471597651761705973215638004653278207036224383533445539659302602104811301330599416142944383381481264448711734199195374854997388262185607977034033386e+02)}, + {SC_(4.20431518554687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.92880881251103730967749510912480493598843595405471163324545178842772962570010986824734097484061068455093401771772721121531905075903632713457103680305348742610712310874643764232296115355411579409633692937815546374130725635890491394915622412113033710488694412608042964148263407503190063442834332858662083332519073678297422005007330537623373751447891670513197624271083086765042342900506820193007162544510882574550533247086767901068075725892817904636702513614279189463973072045013791188933640113446761420e+49), SC_(1.14195005835502743373307382571057774122368294248710931511975477944474224935395676810003354533563234879263171895376838390229431712878450108220128468846535066479841227481417495748296278603888367872358959348591301458722294073709700839403319205740502995726587431105009713221826249006571718933027393628970732036766349857156430552700157390780713658988715267424292177543833550294196408998572552973896299393525854502939937276559743068770595510048601765523209161655344238224667839406329041480127203972644153661e+02)}, + {SC_(4.25659027099609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.76541747444828339579038017619796984359471286039806019316727048877048257539380358253089339523676320298696081898260684379974048573693162756925809315902370541128833474377931812078634583236915517735326549337250047384463153119151884209825460848162821785228341141203651681096449503478365171880240273602509414989550086203413758399602004230055331417266786182692483906103345380471241262882413062169697340607110713479035900893740354405763128235764347187263956844572265588059922589158433642194681578424386410597e+50), SC_(1.16146446258613362025105869625318571393084872722164662450811852325819135149344676536830510727855931806617837276011625611567469842242910743015303242047386557609659788419300778657225959510400921822756093994824407895633345859742201847602706421538229935465533134042778503324053901507147782681107782285461584115094814278955607068224865608673981699876775906032963995715147420329086417091040813993002158649646890276778769302510589547078761773598472659240756642426717399693291853959152186765572951211196144748e+02)}, + {SC_(4.34864349365234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.72956656289594422179555435645719665669151490833170931930540394923332882106150775823183828332220383617382510756932983303586915971736098282331585692286768505004181816760462959102656258137386783432201464814268127276757454206286843303172156957352836291888388893119984878538541897998791928690633028009722293016372498432461107862848660944247995493388469064754794464528855028498449553615946195023389978643421041637870937140583011320703704692717358020944793180093220881326254134670415296923074827029778197932e+51), SC_(1.19598555462162467933148026457348534355944193130390148152606330964950606221650592192613479655954671569609330547775869597899466079145779091282799032516775641299076734660916615477683671761556060464003016474451294004767328010445462608326438799050403655130043418389705009651601146153278786675780496717162315309320268991161246457767219490461631831265493559014025530287815822035748847456349829171011845315753981529970028456542663639290669871114712818412020749472624292340800036522128290544206868424173436070e+02)}, + {SC_(4.36616973876953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.68814993652251794863224878981547465786534513650004201127112212499173138764713817937139783355819330391823621919799549392189984387660232298430029730994597271728974002087860459810819914998571269691400620834607400152357489032975871154006275142032822382102291315307408953002930868517119909628230070576512926794992880041033667617964619069842646694788337585073682192514955151687845228629957372784705408183386612377901465234782668096718165488873061596447190452739003526477286481993297697013318925649609156329e+52), SC_(1.20258058052873536606684749211320913841318151774994016424062717103555487530105994837794793472882164536014792368199410342812750725570440917170492422759674508616322478334545463606118065035246344840252935442447026513835003563333039593965539598067163193208964897341963900598735929785806647192749611989499779600275587111896635290788289254445462814510539615286540681330222410686601717760100330615252014854253402490991006888805973485701862169066213877234224767156317774928010126959591214640230596839461830891e+02)}, + {SC_(4.43486938476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.25468791812059674818075802726253273137197118389500421767647560630915719230566372874805755091307271651210328590029349884142749446165098393203525442334507103793135727453765596469246795513053050205478613191355679257965108739878334191098237820732126348132220181848752784559742716149943714927169182566203113208033329469765353694740919325562090320321287992957548867642768909406976086490542910518621169243395437240396518869340617343894813308282912032715520834572908498174785851002365797607975470857365115363e+53), SC_(1.22850021496549589904106719454578947931632038847321962566863177484470988831972373472928283280292886713704642219705797223420020854888945961080804508893510944936553093798879377213844669481321378157164169646064383220886223821127014941079511752768795228450699483966463786047007034222715103412001785676653468851334388436720728303295782673317779798050475460885436853687370151208583485504058104087062550415852325039810218442842861270794195245093707199758807677284186254790202386093743873559636061406926588127e+02)}, + {SC_(4.47341918945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.70051768757705787005643221470781194832110659669260732490569084761259949445373930344602352754134547843607814413559865870653444288084354780008568386496571756770590116919940137054759042323190520830096899456266200917379520710874285797058116513189434882771150673968931300996051810213106882475828122998907839209847395178439543785649629732774647393938811580789297673134309473455986785492853786386676589392766954242379779333402121722590790390721840948655807960929785284246141397812978871417000406569154097752e+53), SC_(1.24309189182622943375037734563801974736052548685045190679047145642944399136878976110953100048370266139467196398387244758623610482609359098186417799117194294840939266874146185433296262149426750483379751307615953537745853268580981343684728567395638480560599565758864428224070365072509754246648958054305875196539342924852749871276537707041372694482750537772405019200044601308756097073098620381025132603017029627009758457770899915858550187083703967813384108647208048033750398229894059929781335876419925270e+02)}, + {SC_(4.47881927490234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.19037024787675703270175906824802256668177081322569037374198471868314294187129454601713334226158013396153676975596092094045100532798117503704133665203016590433864389581583864000633714389579846243947748106569550907467089547958630535202463362783895123615607549081555441274565969241979835396858131475534300471286406592205619591878302135023399512555867647254188327963666245636949162413520398427502772639464363877586984294087038276975401950153279258436991500098280019827786097195639103068956276315504273530e+54), SC_(1.24513859413079716889471609149241942716494855657922499808839894694292777650624863833898685903676326925038786164757268460095580647000754352776499175721803590494435582033180536808736692606281673139127694932223203775262221520114380284811901136965375921716273693603354819612296765247177033895333364738342530178933237998008574871220342264341590540844843438163019458832092461223509223687642679511898705977569609176084109816510700188357800752241155562857115035298751914915182894875188271900249895635023723271e+02)}, + {SC_(4.57134094238281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.00895985290233668670115700433024083746043210901127969768373352568053703827249253423594342763451352126382377318449657081168034935524493333635557477725982118090998765898303952391564641407905200994222518634479384643334463710034339731549737840578045581764014018294486920638770652996724550267061034708139238146646656924230998620237790675184993271033067273392496695475878552249851339975691034041680399364597040291053269735313150315432017445945415798985208279073996905846439545084621066029644386016432767382e+55), SC_(1.28030711934040369170085309853315597227241145401747153640034732528030582212569910331297382322800356855682037417638163950624408603182347996363131314614965009557147445524418096128223220793705867708483717563206995164971391583728919535379788775190549358067415149827563122933154649794855111962415462311815980167072594373161961801038630838275601277930510440672951033494274773898066936481666055852803363087906658370311631606089216774517991442775368076850394323971774695447095042326288081304896631929106818814e+02)}, + {SC_(4.63315277099609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.24633970510507375036559094674156377099419907568922363303903492850844317662813653019477386735973985177161212739874200979711294338447730474049016228761263271752884456089449825831843270569278309670544869163579920596429350006069074209949900748626912423168029920991458384786198991131770280160077208354816753922904957064286491706095964965292514470849442763410757990865377051954391465148410911370575466485228977574335931993387471519823227077476617228714901522411169999281994184409464650004261241911979274201e+56), SC_(1.30390822573659961338953885492676430504665318415000929930781588727919660473425330004665599213258366743276860977259356309724373064227612999936828017700106088400776000722598615709466144474264636357244405886761721391443398396975162054811810036726395042116626137632154634040479605170823260376657811882616309641898973459451948187097879871916870730849711466430394406473832927502387853125314990621335923390986635297785229547982617274024804834064479825192274186986047795822045408221180842199929067855081710101e+02)}, + {SC_(4.72839202880859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.63821708870461670236425303997171857446030642780412338351173306670769420147013288475535988037410648087799473150752400456568173627908249768063455553049942951523776155895248754336474963088628030133266198919030517445804497569759652017168608526087979704838259502475893736023690377526230499083604699664347661676504249685925344027667270918850991470512026405416304869157971883893321338683873535306925612356247012349279223576584924497035099790542099372214842899830944429445647061766741233489485547108824785872e+58), SC_(1.34043543903090534762118836981051230555585566568719196383506269461388128995869812946092345008605522173013494204003842705732506469940880871502996137876794902558316655804394646347257188110906618332788660273115107153055290361642853427022117840853464302501387721367941642749893103110450462429556839844591187120760400036347174278368681942538682269212945273519985921088228798700698799134555201169279281163880632451610594798285227398823616422503499241630841435993254601481530490830078736679504569142528714243e+02)}, + {SC_(4.74172668457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.73625544353333265615781749855687672233275458008612417052192696528350181797907711794066393266805605907648891659785659212580380748995033976037597055011340614756467279295328929392709562750982325216429658258074075406921660853023861284568266983181973267710575610686993785571322544755119893993236976569824276682221793147216715122417400178890934718771009766770235731147486984899141231312311950165863618395961023563287555561952201873749013746536845402848476835697894251003725120888188217151015886016512516844e+58), SC_(1.34556525752921341531248264471300762341650218841420667462600236955290462762285912840676523938265773113078123711064711053986400179808182028454108757531005055589184901863123207311642722195665966206977456990345232704234193636114226803754398726597017005098191161913021688454814870817048365254142793415000968698201250929034048276110055429109297691792531542243165635466316019586517494151877464553481293731302774038733399293521435396511900710315629691219341794148881653920974852763841833978027174519521269214e+02)}, + {SC_(4.86546783447265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.25325538407266915987338128054208766591917080521625232032844421606051606716692398018934495896583835190168394578450544655593684941639460458609078491932924683876005138093769628988685898032468113839313519672841054158902627568138818383065501903544435727569688200034282590190525849337393146535954334850871690759709421545986963882893742725261113224768353821553484890973093373366532100337559039997766419927152717363468430531396385149501726769479316851724933345852867587952241741466215585423270199892907944840e+60), SC_(1.39334761731298862804294539283176125542719436431058675147008496329375768272120874433207437459271939792468453525676563654931838065228633597665996854592456445418437480491771651687917346455353598725781373478363207223312979418798095127626210148168237532580925885969940796364602265897149086132306230778377574686988087734968651616593042854070549623519949581173709044613343996738031038884087072158192721688170089096734410995550902737931277134299753629372186581111952604576449382332015708599711385812002727929e+02)}, + {SC_(4.86985473632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.85605192834029189218382008738179247292631112150377520053854361588702465308236543788152859643955616159717704347800062618153825956926948758269128379908040436439460739519248730865784730020101969228605174442358741738309648260938369518383894853506074652829517475555256853569367065354399148381461160001322676112571630439361796016624499301429175718970541254456863490084321031011506829533833770403337825140862081641063908721929082024238174556656134000812422538966413364709887795809753131069028025245303704612e+60), SC_(1.39504749423193591654786436428893291086751708723890647425720776660306813217983849065409301485801164208541110792857647302169748170165192109645040609190672295254145233711255779044092868648154127012809911646563314549786886632500661524379697745831608982215969810270206463912893191422465892270650284797102021309328842937434353263073188688514655448627946379412277805897064154026444676069848850427370729572762314038766464302486857035527720598909564265778204169823731366702461502569042454590366866462252383308e+02)}, + {SC_(4.87835235595703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.36035892866928323626003597490688298592375085756767687580221413110290395246119363501254042500161483751096000604731192001474955543954177845351057533404447997454363373648247759245791041482807247733920568308160729224963878297687386572001273988043235573836188152434837448508035574458472108371808169176721812026052119485230621321321887290212166143989977041958322903310001939825724443421609001421308977780470412959500421034470008880264094468021925933219347165639145160097908898804181657671336666324020580857e+60), SC_(1.39834136516787413500007587510694826864396401968853849617697111291158848844054838105490882170287712108401023447992982600168348901295419931547058652315336259524674161908561489574985783144794297757797852248887839090209890498688958249246323290452674141068652938048123555610984820856797509233451931845192133243191526079925354634863247560686566326020005669477315470653309578451268479417275395192731453183344478148664850424200854190633948493894743148373211421781497087971495371828255297385048072836357631041e+02)}, + {SC_(4.88616333007812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.25676402517775076301468278496934692656483126051057917150182178191344337389295682456895134834722163155658017436685311521936985635026182128820450734590168196821488800119072137854226239436945319459336791804472147889086556562163276827272717286292245052201245450202750152430921971312971942793062920469104989094121415606025694182596873705238964298040995046264827257894977852019200307570425098485465822290848065650171735085078091132334101899949959914884493767480321306446032861913394329267741285906711103952e+60), SC_(1.40137039582554296669086379035601909857486506353212457088148813998433361338780193219865913033475110183234265070635911641095928723479322965406468549987886564786421092927422630145370616108794441359965549476717203659758010615719404053449140959679261059542424230988025529277186859295920766064316356915371416710280108171860963364853471914176384067382710684936643955768838392051528115925620120815181805633665843979941904830873787847412819338996882527616461587934247663102092108148772042092241438971390445839e+02)}, + {SC_(4.96946105957031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.84926051435419488511811853980745691886596467533990571070047115255720116282369824411456771076467653111164982159613206766501049189841537324822586271014364389581042302691647366555548159603118608864628163832875165777040744349536109872788458951641450125095608129869448380801609179867060104893607719181097145340673922819404866959063254399533632259195570417957400062003248515558895842302329502301062521977222044431722867167965545645096271129720006691983917625256444131530340709039540437261910682571183129859e+62), SC_(1.43375061602840238196387911284923355888759486677703347734243939633177676980594469572540596647627951945711183677110134004531635998116079359743547196710154174966205304265997127571931089769441782084653674499867407219577029036057998836843043540801353893116712152785856625677177920896429671428856336776949787962164030038320010305538321393785686820222214835038242007614244993161677050533283474490782441167642129200667383925185368224667881315570566275605276821283548240903636414523362833347642677414643623122e+02)}, + {SC_(5.02667388916015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.72359609248419203124278009510985183150244007574292494821063931905291192550361199874577620746648765405775126508129293236688227427346471719162252422650453345352475326215160709168099099325488762829380297106893673243955407060725519552650264510115770619462810338844939975728898103700983305307932912418966347390578099419744232245992772015011779396591256115246555221742020146312599500423864539907811528577739346790592133120230665473591894081245216058989214623669344437495460284751390267766164518674189213402e+63), SC_(1.45607273718315360812077351825961960655360335275523759898423031326599125330681285563961346185235347194447848365591085818579430678126800784165200011806167432152401388929448256893026604697653644245440858771972921457080997743870753230688959517171196148580006810436189017937770375761209803895109732893592165660935605510308168495911111906296905196270497034759766422177237314325587252445463647197616815725300323392577986855382680195617434026290840780964702849787897642616565059952095849864010312060252081938e+02)}, + {SC_(5.06970062255859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.27644503160924816142832113419390792965291766778937392868625148313812295073960597236367734058867673715159417145390229408534004058590561681905994413322197072847690081504170463658644289597444428583296688754211124952090816353074693404099089089522805150846599390193061140900157003665853955147172152552991287890472933088712333479727116843837275204812883579703691969894360803743262499013764977020715239580640744754902720015964274589271972396515438127488544650757003287351203634500502482942637661308177291122e+63), SC_(1.47290339253539295464002145624242690865101200698759610546313109459314524573119664887849635992343918037054039970448863432946580921064132657981311964698024477353552127320982967180335656081109421094348022842803378303624637039558575136707903053327940879482691080653896232524430500832118478313562318060480974630816752136336011526404841504140903498989821005535936495309592708879760743479628647174400353504680504476422616510089906998023546490011818143779872437202137302789823443968254533389555814196188140398e+02)}, + {SC_(5.12124023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.99927687563654832163120177574826164473492516304373483263720224434975728090156994949225082026115772458036505101589570526516824973432795981988428144914029285497164326398802375171273990641022287224424401732206944003581561112156522275454116816621229223008793908586894194170593136109541189183575424736089418849585627318980032235653127492913398162962134870463407859904734476897546237961538370005461048857120820195515090940047137209178643079618644113912972824144160270923947959220286021609552771102745451890e+64), SC_(1.49311252791857571944426443742989240699293169189104984644328788533525071766062614852651073668833512464197788105537498139220394509186286770568588467534532456111838319290866539755611126101502125037727889023843649090520797315622671809084602100822709946349482175131824617113945666387479044506740241810153417195036975445814082078347448259125312588036700092111250540454173356138964523836583453379889372133114319367547150774128027019566755710894205995742742073109015256513593788534779850640976780823596208118e+02)}, + {SC_(5.13560028076171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.23026192637653829089933206267149964173181878750951137696266425435477766894776959662393783465354622510883166332313096861504304874217242045231455687124373685234765546537380906671149144631151556882423384102699948151576804252589990470079816451923653014079199791860836899051780037952091022656131842521787241251049432588833471535361080041988546532822087692740422650115265516193410139725509602539651590030574971762007831872907261184051820389377156437317770759725191585333705132134581317603939326528788120470e+65), SC_(1.49875258139600638677384317905313051110930801241264726031823123493178787964241545162365061893622252359253420828909574612757026646021507513309437547545277475444768358612137193307312374400012176105129375230060395894921288074531612453050914778782924708171613350467577656066140634079316430886465783766714152321878107968964528462731310279262933101768782533568602487689238832241854772517147076307206021006254224136315719558970885725011297528338864980243200993681035553490026602098042547489545481928320640399e+02)}, + {SC_(5.21595458984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.90981363532390545321821957580981160389379575340353083725526256797176963279392859769357846541564731609442597893669540874701936055129537935484451190072143044000222738279488869366532435971590546803721041182171177688738154267257066471125241819107721424237495527897378823511727860857970760154399303290489105510632949624545822762708632342233005590846781101245713190716795382609572353369541851158507962047279715422507459867212111957471715401541457172773147951175626054512245232328120485001172045198910443721e+66), SC_(1.53038705173895567049914543155942539529563108424105025798868954839393701782777434849481176175639815531720609524352444839956063026657808950015560763311429110479726455402604523788186886421026505595724516333809087073552716062699773479432983413235305842921735857421175536537380992743676101280137113483114395340363769814615698190132874387690604324261096519258991825073089702866596561150304867906248340763186131591391391787918369957028071021291990784941422501181569793228008259915879084846469200023417336312e+02)}, + {SC_(5.44718933105468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.80173460431759042276531692713781140224690587653067416859419330202555272594989519785776442562413672670314844845499831814456396603542418495392131474699424007810337531388846940463846884535489991705941523480800988009529316999708021842571965686802509207137254401158482624305999707415827714148979174195240510041877334333999469012836629211860992333238496390024839787170544088609050327601905616073272453702431232853641400462326479878566836051665182851779178144685903980102157367712961317755422758532378214935e+70), SC_(1.62211195236494486842137679955399170210821952986639965664170409799102885629436798584179104241517223062978567846790211939285341389185597963171844038546805098393168320539348298180993080511725958212127383019538951139319500426412312663973743171437651265600679423008288688394357920195658536773809676397543581796728439157519560740884067835306939932346578856048493383325511119070524158665272591734958337263086066922987842300651994068789268007151868001817260951294743313380717844919047107129432137234945088316e+02)}, + {SC_(5.45541076660156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.88923093954475296555460010384225108082343518598289742785860838621540066167743233082083037149631143450772288566621466871158873924441131457703196747998028599268995080065238846466216411793416383771276769983993012465337486970399379120945924722620793564589846394211714533987285947129015549885511215640122352742105756827920577188242283366633572586516180526272406089739238082483458311057365615733115202707409705441125056979536148015597812278487353231068666952931126180364642533905090214065855160751150570253e+70), SC_(1.62539167945751436784365061461200949005630300411607114008314187648909852415129401768594670826889962061935904856663650035128421537930667621120193872601440847111405352872571020367561445717633284481417612169617741083612708055944527541391662257911146210363739372586741093027681854255554446655006091132290669608078027957869792605133562698565732501973658345610170317281702751071987392216962406615635572634798673703332621049982782083567199976464591918134442209306173953999317128537923466369577831811990505059e+02)}, + {SC_(5.50533447265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.85730944855171128837952400852020457732681738535776686067033565638595958409944167197144361023729960216161600023159694184489531348717782562536407434426714296769627483724028605749310394264725759155728265167995310344108963472950279318135602602405619976237322233553754966277906532700177676410923166095578127366105347200870494860524374321518146934073189297475897914958501944436895033247992910281617521511740888108212444520135924477737728458215906734304055568108571319399902797584473184704901951618601401224e+71), SC_(1.64533422032369233555064135775082372564903634891929403891212957385782265078635506984317907710713735389157508226127087133347180522811226385654349518357170803522331589646835742411988907955552403694425202656698721669355856890469805183019074507700497641719763363327136524479713989118739444056128582381046066604259279394515710551116967860833091013105018097573175423841933592160766326992151395034082321062661561787350295280940705488051266462611896718603847686645062109996393774788240170135481392777288490570e+02)}, + {SC_(5.51723327636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.59912571876643112843423672581711050010048297317961607409825899152201568265814939524420270783676418983565192336821959178308980267384169529844813114515861139342326949176632824266265482473183125037840450257459957900212150939142923073681233762674075587052192448025588088282932927107938038749967806775395259684873810981499095151858552234659724816251014527026911090935249406686093634962334581572982993744620288722853674961939196712451509769700523090747951376519438102824496906099852506740240121078438482055e+71), SC_(1.65009407826870653612651933214957347531916913256171357048034416707968507274796838179768517286247353976812021079376446710071709918891506283503353252749845939622475785517947468014113580751946861761977807445698139136003999090928604434264914562129227594145225130236704164978424029429423971788106902840659087081085602478976117497757721020106416920731243987640848390588291719822433054772349194724340191601936560723898339546139749382460638530415300746726876973444199391562140782410955411138156479694530761867e+02)}, + {SC_(5.54448852539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.36963348859129932162725830083885765244565298120707229165880920560014323244220273824004697217390516951031394823135845449317019210615190366107106578822663857637154953631879413783762758791737654221732809493474544825324816456840318661919152960357357555388443966261856466700801561203734123800247936068531733100738427856642639151771290953169330378816709811944085113405163922644421852150582157231830068470226209468036866154060478617724774942146332669428672162944119724143173739570707335535113322498841820437e+72), SC_(1.66100669873044010904501433288458732499812967893510651881848204943272568308438668632802976387744572965702081639784750195299092078626713239781119668835184616238019332450833479935928951025069106212418491420026061659292911620401090108396262046980730549281511096258695057625873055136884628573905936028503115321061043301503194818309842899671082066259686213249217936866681165807345765765864262235205654246463596164138969890804318684364225340323672345829962204119687379612492068585994745111171624256672951720e+02)}, + {SC_(5.60617828369140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.62728406523296111131355808896408220483122212493644530547421409440889381677426598214179515024723875571304139457495625118625370238465377699843404971592441195605019230840968886831456268096329174168019131782115361294034477360839270231255641106839370252937972696173709528605243232234934094126811293362160797978384326890310737756907774144291689575885298983860501089605430193321841929026875631620592449674704579391768483259112420485117912758686374200703034840412187265262286052457833550937813696437999510829e+73), SC_(1.68575624196050997267266028127284627373835439062853280709730250641775691895659080234915944809115351391194349799081170650336129460284583581311182837182434777787020365926067248555954377811444098668933371106314388177858633906779013732328021748296720192733105063123796421239840606117383188280665865626704745056680142896335801095600347583401898777316702764187536635745970202725607621594424872915595196978772906401516245756637987366616577772028231781285735190365681022311742523413918589921589652465404639048e+02)}, + {SC_(5.65145874023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.00532796061027588342555634039840958050072003725524897780153120525098039110972677596923302643017425247011776700456138656970587815343252699971432589970304541137216971653146921253019828921373932258505387424233563536965637072767427539040695829500810356303246421059814881499893139107001150451269597055112993867253825858647093910267606972605767467096492303580321271252736901613460849517094992901230956665411827631262731029008430550242963503955925018314197909669408289089678939618884714603915651885774093117e+74), SC_(1.70396610698802152306545992028045088771637522788687162217040911655994103120991078484591541044681814790234322605912505103279643770594640862031996645079876918340627167621799875799132805688459562663055836041839080964225203965870990530884592024930226824328588293910979352119356940879703753504807864546230692672217401386749251975954569686363045717806665309755015678650005954843235693630661880028625814985348135511544047438477027345440190935907742739453062649940307557554216607174200782135239117705440723125e+02)}, + {SC_(5.66864929199218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.00893463079459638306852377972162212832314281566339974094846403036833933679188303046055230387181667031933042449188201886422958599767084705176877993559428627960437073918886961487109618272999237251180284680777602364352806575884701907864629117084864327798406054087618133419827665763186982313802818804484662379248030769718776783842512416335502226422458514344068771367203490351672278569905316747759436759190325047231031396542725204357314732687817257818939988969471353446714317126638405408286279074800705704e+74), SC_(1.71088901428681912074940442067870210399918955371544005621396360219841515025008273102784409149753294662455477907345342433925316078920639523342844469477264979432830558435811422842728066450696651669699657071024334864037418969229809753531292356478515883546040020790521605315474695373051968354857737158398676456447944828086746246078055573703027656096829984338245632039102648845378550125773172367923607477081418755563573116154024358661756787074602643281274378133464726584156719335260469091519291187320234883e+02)}, + {SC_(5.83486022949218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.66581874590082465496734219192934428465315333521254767418155023566452551364671696043600154602064786390918015735794727953682909582293741899527795433835466229225777782017578053755928795450576702258516311538492179414197412787539060300069046660508877295084686993107797129273447838446631248831643936224431698066040453728941611191917556730641074451575955824045650867440725370691279897877397079313549571165216405585458263738561225559243034873003030010837858599717957007061657127273454442703054197549781535638e+77), SC_(1.77809368902389560556519654747745448286133172277814730190202423572238433139459498749757973337779309761402913422192990146044788403885949227861537332221601596940991035689185054557174332115771043545920552344987525372742450169315871776578854464324264816033096820391038456926902066367740213891366558650708302768798931468897897175393899041471179739295386490478563083906086506690354436492491188848330806379184668481561917447521582179012903931952812528845553214118197733608383457336735789605458597140262568222e+02)}, + {SC_(5.84292755126953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.31111967907968108564453995966284273070652166577412570137755436665123577124838509441936653645447598576576026037074759853571168566602779123395303099783690660924490120450513769954709948709011202016999747959079100427549136730815050629753848445397095734003665257163391679334625280792749112291303920083984170684582246813632656063567466419038283733376599906778545803403574425352630710904790589519407199933474550681175535686868562007253713481702903319248809189782732834090717268736522302713544246016616289193e+77), SC_(1.78136784277199791355980792993301578877401705177001075500315339022921965898320852451122120109942991987872235659312837341982115462584258391166452781567213633529952056867920213872386761172375807748643983194728614291717942731369559504670522696088784050388841124328589714361309478662831427762779233609754195822939445772722611522584916683049270125720102199221013596849873478037351888114024969976004496166291593935489527520236453106735125128078448367001664408677906231281405007287820569237580932655505337116e+02)}, + {SC_(5.89785766601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.15434273852608175052051007957642130376175355567520986844405556707169579584277006050601431497552351794410079718939397622430842292284069664653775293360690691144451364004675301732538948711177929343415531902649211880657979203798645415145113592481692269065315857656050259143492366733773252421884545554189076127852258046550549044604541757433866428171998298663197078716604101092736549227739434262194055095943034111018376417700479683389120931266108913510501887702995757124007870448387721782901462590044575863e+78), SC_(1.80369122936847833747244620569394042241403568233584693954872045262000138107949636178412482662572222067060256012498246282026848613652111521810028375472949571037943007108229418943905242079480072521774758221319676601855780617550008032128487904542540431362243741808393437284925124052171322198361092511256761756805568840787495249969603080415359347576499135535249451812386160912834561464667861208207405943872521131917824342896068023785679236468172670460985637658921039909878761896734630899508143826458508817e+02)}, + {SC_(5.98653564453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.00132385823406532195342969241575307062220442173885196890428813567099088944230699644113824335346668962868193903487477473257524420549118385296443027202466553272385575239725160345326269538237168306474105845435233094726596350253358535142477920588235087499265949077286638979519744020953413231617901088981004226798455018084713439728199569166897944080677336032949816347254619616891551126954818721258802245261331958655929372783202877550532197146374267293901424907475973903859686473262195736368518574304724290e+79), SC_(1.83983829356798021112695277102918916473354077226552128937050486109009612802197835789738736961915496095990330934870586550492358340881933348554061876390420029246386508770057884901756947512682678410133178882335106137027931123425242262509468851698599678577917986859627502006572635669264212991783791259182455083384598201976527201156604576062694711662752407780348989716944966241981177183352380049513170749345083806975563338443088290155990565362951436323577941305336038226907855799662285201997239942491174813e+02)}, + {SC_(5.99618530273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.18668722102926537686863939509792177324229461246086173298665244660060212626005303967211923026239764928480666430339370818761178314295116738937328950259822069208094863002206170870796473287216774849356450437446051969409744263120254398739732763046364310264795258893303437793700374326669976157331901934865550261825914359068943169512619064038979210313222455753372124869774505344923318152917450863789512421579479738334432508076125486689930362625524901574853660403217646683635521674487002926598422228858901666e+80), SC_(1.84377973016661553300761083998264163865041999231213658531016469846184962844040216010269828613767503702200271396320439405197315796937770361355914016214453751567338529140029955190627434035790921793172278249561877341251490913832954139497108122400060599323840039514043471997972511225474546435241748986793882562481512955086942096212395141866194720887944537106646237238255359617235172430682472462560851135251878435044590521732878437044695408173963600011371193781768056156302719569901165806818818566873081647e+02)}, + {SC_(6.23226776123046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.91912456670046432469852028589778466351728144671338027224238548727258605194466678572928419297177448918791979245220722313814355499221027013903704799880617596448233076474701583332203353566959481686926189218031159629624421889569371759574983747270910431395179217232975957379645136744743804228085152542422986726758752459429669982098014666639714849501097444268034200478506951313388425485759765909606913437555419471482645604506503985352870252218852203638516838282424150305484003613426746707079008036610862687e+84), SC_(1.94069016938717002121600868465417170068275722132136830549618739673540558528595721646986474264244223997245366273670281481954381402563333141326592053919264453523185795443198806564053180604379559769938027888770407669907747539473560815410497659889430116583677006755491651924796112845533170563607089203807483875211251378906735074149245804771030420040753961966836276519727633696564992683265102297464748789065038807327540135272530607479359251689316239030159424321824274758007537996660136043615694512713923461e+02)}, + {SC_(6.24204101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.87204070452368133653844358723219684465183819009686917972438864950303983526648003998000078903116434656906362028654248915812455366066883079692852261024214133379293179572879333758317510445761200423979917977777319858647495824203654635929565314050503868097559911139962937671629145171641481071329414102124252208250217633461118428689666383022894295062276894555947097299092847546251830224087702187626073543130546956809963957622996880721653073905973385612413024120900809097679013486079273744980732653070468486e+84), SC_(1.94472170635469670990129901877781037441234931236216684713262077122035127860610772038408743403779382316925792913510258617846476491211139695534707320363709525445945968639324638064740214239560630493495130726799393135575689124672391884286110335100009167957317042894860507476742519787005926382667001472755932127084995266518174229613287419023814214494746387155814766215779110520219447018454861865608050915048474823759933764583932302677383449086940115653251190200643736920299436772417482218824788254615502032e+02)}, + {SC_(6.30627136230468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.07883809322567587351304757700919210201400372370028014733669087628987589983158274706635048998196074484636986287053637580284941284019292351038519817662734698756805000503791605776404718964179164829752346964420397249229213797900541748569898231526572393623133190548136164426880316375610214932566459240778317683457371797073553184975848305506903222036894019361630611615621088249827934571099891820583768933088571065492922189640245014904782422808773799277443981896105025033510586570306426738661697302847069341e+85), SC_(1.97125545071279985432055206158754163270540648066516758657013378166384538578266055959270557408892575336885482608794000336080223297390417923023114804281023887503320918760718681135095586908775440404505075418483157233375973119353660228493481652445978888497972610501593218423789175261014894766342625067988760426210673357531336816557704135310997621019268260940292968299563365486947135813716127173841000025739979707835004269227483468161153151246727699291670427800414125264412036226352142701587621084843256505e+02)}, + {SC_(6.30905609130859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.57679865750026937130403923658564977522695010429730697956762246223763963254944582095624083570446236139633946216828720775064575249565825108056873168699600737856992778588391840698550523979297625479814939161335851759855722980810086831768127340710930960729019286335431680773329676256863623979576264110485129404743954192093539203153625739684379335089870802004829007562145642119923820657807875466895498912481110055111761241384215082335460167017039523979462575056521850291932064701022425782985118168843548349e+85), SC_(1.97240732675138865404966804720479811590190385318354047554648859340319512572550562926118989787546352461154699317140709430612541875001002602391460101795979044389923331104070975137782943289806651025391656450371895942135634950530237013746064731025064678707401765676305921885664469729627213468465279967518694064279728433332635769201668442507443550642503464029098718510526907763856324902018709089779176595806441529143846106552685370658607660243268315489642814834632633008382960728962777104428378537063900488e+02)}, + {SC_(6.35773010253906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.43413031568444785230583446080523334353678344672827638890428072339897608400118287075075748023575441301152252081381518778105909960253202649716579087577790006138717813293929711234603593342889945612147466568848588310068827187349087762503062501361532456509808803806370919672068134422458480643496217169097363785641909057230701881150030598693049060661775637645655530388973347468061009784075202018600226911603743905594144035721867585123234504154294951857771941049092626495361012512470892419575559684220599104e+86), SC_(1.99256081707899105995238537106332708026334244963919723532514110952603392293425804378689627822409513988073007866856612085968395236548793856786165144179368152868330812796117304609784819548590189391029998601290429925391101535366306045639002309495224031473582463016679597605011525217050180259191810616270062645849536614663707082699976497201935204365325221630524442864415807503299603937528538236291174847569491278382517658996181943173995923450076572037101653211885771916905333999022232021675301162810521983e+02)}, + {SC_(6.41318054199218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.42698519898335022546569319874437414223161000361853491645314507012246930440411849024371126814203890210117420903688773509265950146019646804999322046159830789746426084532755841419833713009469348095814753785276557813342806360547275468512809281273857182746592448980100258242561981413748711829776566203219384363064291338316358626801822999624152821809531297592767666163800955537894771893334785422176052647269926841199742845116784302273434716885975538788388539714047585834048357448183283245905993491094483591e+87), SC_(2.01556584014422414705416034728203732392205944644801811404502168456434376113630315163232898457402016141182911028807363439651328454836614863527616927626599755374990658967127451481932277045225117961544308086635341225409726591288485039940137540880564875688261058269186495982113937086209632615041014780508375528611128332946977437941680417056557805521035777021329897035964936079010863537427455263131990129119080954927720597875082491541518620821296109588951507936968477013760594935907715801177547198838422484e+02)}, + {SC_(6.51713562011718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.59176538800911938350814428766006978735945421889918747449436416176734427252777388352821120714757111560344853866869242754596614235407063187052084519490127367917461657689856477158122827538313663948496743163417391816727552524399420700989108905425941816917039799183267240679248758347210698287716414463976400404936117652776448357880746252798439463824712564801107914120618254084707517725422190286662576461758872999940377255406507185400907527167274291615298548601355364186235814615625035289236954368588135354e+89), SC_(2.05882412536978094604492822987905038263933337923558139097816338191759338923650770311106570155528318679110140524205765896765715783439245284881543589855028997014931969590587891245257589050135016960379801058699133550089355823471261271483420702999297086101179456455422738790343489292132383400900435369796318443279665308348186077844574157190017761709342311710175434225437182344225198416855422822849165263353074825246033175874829300040290034949824528522691849044017704163743277517242304803034340516836073205e+02)}, + {SC_(6.63102111816406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.02042767502802236838052517332070636095415859169105291322614886559121189733678241986292075208016773103947665521996041465641301844729658254655013812226948565114442422547281040480132634202599651244616039520633843921307466447913810731030067065695885450690904548777892319268591263171440880592547970815812433995605132186502349603009727226107723853692642251515143204480281646113214547704739214532918847942892910865647709977877888032239013084740695535189025579840934541409863276417526792192505931529959857981e+91), SC_(2.10640641898066274039032912775682771492148229468233994108303959301748156780453696985967152523444533629282724550139219905281963706053673921436112311017807494239048063400112752991704577927550433643728258578568132056387253315525251876173518206873100174136766538138261863562198346084044445996825023130868924131313576937241312855820375033397304911073941499725560879661034357252668623689396388749398002019488847220513461349610575365395135451608745788625026382151715306395782047438833586733014561981163445820e+02)}, + {SC_(6.65240173339843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.39575122167677575610208270386905265806729379941853186968465262209497100975510972380161552808692742665779438250305547514419290093652214875451605701218704075674462088117785674406527678262530298325164572156064158323693760229616518608304153170438231372807984698086309690520793295480452320535401442063000537533059350350288541391932286503974746178889933960602387029641055958763358111090943791587971557202668425888836069857913931126277006417588153765341610635832007349595746112280707875714069931567289920811e+91), SC_(2.11536149138542881429953686350281053300655756618879611049698159678932781608060947504644554480742151376381461339145780777164563886056584828272014896244304294127461783692773902298599152911376586807152218480938440856918333672768654828848322692993711493512910124245380697103447169245927887156729519911056083251564743753952766433718528529400914505812145000197339639864206343409356733570994638564012049842630578161967664437238116642276612216504343225306849207855887203688608862952346693486753793358417226619e+02)}, + {SC_(6.70259704589843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.07038187670595133629430007175837432959290946324944333023736730996362439759386622286470232089193331923584334413950641053543771258225138373425862108125488059451118296745371352622417181207120845004565066108038733562551562401132363377720862326126821923914024246148719899804740883548994873018718782653014005434650987876618543298801582017146827879797323285517205221379267910018340442548423315614973812748071871945567795717366271080107924314832979851285930901109782882648617544440093418815787162720366729316e+92), SC_(2.13641250070687384819721023298141854021674308522169699945863526766372631226582693285959195606567409637003709392029624732096703067979349517331008524414985605987119357701477031607859451802951467613970098779547036798545577512518280150523311197695896483937933016610121921897172597952911336551357300967589197328630945125647322578991469766915109898429859732859211713226663253802217668559098004420396578326155965147156055622763520240103001095622696401445939943714952532596484885727462059067739973900614225589e+02)}, + {SC_(6.71435852050781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.94654537945542967401303266491965790751135473718332919421309929007687837274073521038496729732185349496360972407556564901268661671079342273794410552499384881092793967734398463779298365152005655118301245048534032769019823477681162565194438728072292877726040908450241010020686027879375861425121224921153291348822636245749868981305654304622482235625212970405991969804089865390472145451576041211655732473907395508260288375509085670079949991686131665876920159108687012939811203138959286213610108382816911859e+92), SC_(2.14135053848290827980384905957152639408443824026010193681584489110942310126243185979385219220756963214320908219292035061403237189243551069499740711645081582968202936867810735282903902280326311100947540780539614924584882544996605110362005409273401341732635401108637729726695608609691853395730754929969880242143643026047293456110413346231976904980922843961028802475219762261569645554798859653297485445421638385289736580847935992207389649744522270606239292155807389736671409208364902918381623727408885929e+02)}, + {SC_(6.77765197753906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.42329763943920629786424084656741602177180860476122439376656705986831463674502641173192798441368875545663640838622189524635348813597797599658428178363017662961048512050298836108614557492997978056923113761690573574598964007328708512232703783225888329182799049392903679599962725062094493137928907978794362252063902382230328721329785607967811827657503486237002502359505944620656402414340485916600840331870478584879096444165574504087380072906092173084628459970463197911541316728118307647336691208112146320e+94), SC_(2.16795975202020894959331067783611790241560176157791421153126679456220429243228883228918420730853315357353207568803869203688330691136792045010826542419499052259815629750175692876361572434583284891588446275913905962383345754994948038812469663554314080399736094688636379112725908900709351636469025824840213785169018208417640182991911580842706850103389522631573021289780106348322079882478206677282917783743570640057263485251177052349305371022677908707518709713462763284102106606549773598947439659599324084e+02)}, + {SC_(6.82992858886718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.28742728434753828470950476373460937230032048651940555648949326006453882895637418882283825736228591181830700026820424453917638544173629674644723558264007129307065859795981033520492449956951693686957120036443188702573162473328012082936878647736488091582498164371505160579680594612610246164757992856923720952956388260560404273989795199596507365335656143579362306826603961790464250912402365212438307219440061856805177242373633455799268254384021758889527365496892631661843137744874008746911337847621644182e+95), SC_(2.18998229708218472573221124383337319575285443959933652214730444555778968544528871363492835295996330510778846644463129525381504046406834553254285787162473540821992287327195138826382561913503202031608620913208487263375221420207779131355930504270217809136342782183648485925931369193382673398755606007846749454319400029536613121756413080896375333067702367554833212950148397289927961931522491545519692572197670162034618763874158341068695781524700037151022285783627122033713599144787290106762266119419035844e+02)}, + {SC_(6.86930847167968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.78194524198764253935293924685960457304186507685341002124795160098720397877248055084547074129421459978314217860635897835210742481364957032335321817600502372035091090721049627357295736936985016617932355533307724475488403022170372901012537447057064407222750371792229474898811793803655895384557679919461705505238331617192249427768904744203739044846861797803931051857381486653754869112682629123778313994659394748686240728046366514815648010511692752805050983119394324243019276569152142835273111131600739305e+95), SC_(2.20659847804083906384907051514872082061230620414541674044042921288843119583551298204632257060496765706867059434541256865718056715357766042999851689620781307975502879660162551314304874688575088583418644818982822427963726538178844288967778976291078192323861012077958372167260468411242670517406288263354005147124463832622774308429881070899793057196386309054065644897572808994660335187044558707052835530972888952967277974508071086506597317741709813213979340438569164933284793186907303388894211408854792992e+02)}, + {SC_(6.90468139648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.02274133511019485583988469899204776980456774056684066672286969620453688307444228491814508991434754830000820409365066402249512140453233753077127934740479709875672706144369331562365000549295378072233131975358641001193506696992584528857667157933091543789086178697447848031835456706532575059842492635758962253361643070511799598205228352711927090751127148286879531092647429814165348528175265811953037424595680858019938674670963305706080467545069331967872512258184827331019538116894453702243713920673210901e+96), SC_(2.22154333073937963309284270464451305415567713356183916996809028250224446324976629918561880255034594588139465610035548638444479892335980626915207148799415948364392093782126809151718720827813726904213047270727073845012006511768403305403791771252433182022505470552892587913386905125799070732624224012150635775743017726040000023583318144128558407083977660335631622322836590245813033509831928838790173778685268563388558828899739378886330796996037861831987696663717952401004216895270706364036468781635421504e+02)}, + {SC_(6.91464538574218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.60649260710529772233473137984105410544232054261726481804901382352456603736791207353288895878692489945797454994320261720519981568199528074068243600307457024299096270656939240358519093216643966960316998852658905467409459743025668321894542307141623557025880996958371404487147215287026431391504473435758388440094311393508369867761317353700422529638292656142883895250773165627587110507038824743522069804645711709312079958726863572820726828956578534635459474570140307017716422854786215483659376104193538697e+96), SC_(2.22575635672110695115918590577182031381966802318930949156616309616868514484270689147444392774966118458931416771691192119217283518753777221963892104377362200368507925400050176951613839266277524613349776088293713738939903474184705526304759499313018568067983097681361651924611784414420788881822624226463125441429517020372283342751973503754599128184144820600535877488980638508126185420353735890080633115417401716461134997981796942552310592995641498450430406389193343801815830115905801596467675090472416441e+02)}, + {SC_(7.04339599609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.07955168370258431501067303765307041042253511749662108499654172995195919890728621572472265604548157874425594951154488292915690876822306705540706807497155520368115695313979997540753080862207102914364114167949746652315616647011583985106051436261150572485947960668686207997789998067343052714998635702824843686520461266899198993863582597484559559022194974388735364402673541227979847184402063848834687319523585326114498450674922707083475386513114793967781049780967212396264967735570494025081299191102600215e+99), SC_(2.28032470053682814150909693659939401086917190673111549985833216202733442036570175244345294263137322389334082412883205915850819372371153905224137138568851070681942685426002412704795068433740533335020313801587357225658388021327925840302498743460913140248750979805432142282679056431020456697874356644535352384674096157999420250192127556344582057179264673020098873791204751289807990176010774686471374333310634428685169600262753904165502175379975971287196138991380181729373176666849173285889871685443192502e+02)}, + {SC_(7.11850585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.63350639773014098330391986843573998095148344846438639704280326830561525054532992266151394782624557657729556558678640210625187841674630182373257217648180868976835851508169037646737210618405346034928397410814234450897871401906937806043520003563445652706752649218899032858007417374978845485122177335751403563652773554947671601689033491144144324684814326258879173333280476762089154236210635460147379080147574135092948768026951044779584253185730061594787890924261378815328110413923272130365565592245349050e+100), SC_(2.31226825488706942320221372209052759874582593881790219288020218185543021092397231928378819282290633396851269467760376214835813537601586809929350368068369106408868208462608101592366234623994189052700749994189050838419131640345688000684932907809888196801722858616196932788075245301007454503206331714091483786519540760772557945245114058781412186499228946577913932289437780929138851984933005344343339761935519213236709763065510382791519155409439843482777059517548135082900878411139308805363383410085533831e+02)}, + {SC_(7.18507385253906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.49732330886114956729903492967231099120981689988470614601064338672708151166612212409693570573697532552453303336069988141982860111367711698182206854590245467087429086510932930642838004332475148547653465131896243811450945687151783960665902929229554392946636288454705065990897116487932510488896425121635005727457531756737839020028190140709062395495772982206742132290104264959510934652975963427615519539426105392687228317301810268033563861263131522138185870575767315052749438067728273033861538427160068365e+101), SC_(2.34064576791946060896313606119182488082566529844459748960355933124315417775876694818169147442870367658128072602308015711339409451957631318365734395020638352073825545811417527613101240287387166495001733714730462773451775603992969559210417622967701828034603900976804223721336845723876182097307746315092522887814477094532177768451945462296621415438098797333009453107985658002443597004122700883763626112244440083086420053250212325853266731701488423921240429786666074904542048428895402985062775020780609270e+02)}, + {SC_(7.19748229980468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.63799471891136424534781581037881734270209689591691691081570741626642848063715581515463925408287199445978593847300138730779433961633501177058550310117564525664058272076855042491774645034794591212729305598946520940175098602170881847040428529672184500046688023767346931914653501159766628184918989164050591313897018136001253593550610968679908774841461364253808215884587220575731471838139199944268527092762417993923355816335944505951209359016119144117907046251862182229203833394494471672149610892614669429e+101), SC_(2.34594229489778730713395183268481268533313625049321103875300316143286582678917655079164628572296479114156318367073710880351321060647563247630502264645451992444023031952017156904306798526134821751416899017432876584158140320330851463120804059509775078069199431076511808513669124909294314859261410937564808861779079999863781431595903854446961976571791779814964065183234651321058423766174913297352318301976488510550472104180145775350394475463204546994493226096306737923551596471864643784269614031627401875e+02)}, + {SC_(7.19857482910156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.00270707801080667284049137931007921397071295858533190749182181674533881049617386936830453405939377809182267841513942539726511171736762460427803321822929563423006253553551302220529378391240077466565459187851544672111764831101397708541056852997129266454471645598874823171404589319991748783062461420243374104014114054229392406314737220859305688382677447311497957896298449260797868887844371397774886361677480978196153679381787665490340524747298068806251709718124920062314551977212941639835784458709791310e+101), SC_(2.34640874261590593094127152924672401647639982404939559186941475505215425504035334920198363939078389457481819167880046593190391024230612216202981537917474010637750415091165615994957577277305363583060006173286690346793212661694349941719407081780582350194583204552812083593148042583454042845941903084773893307192833332140901636375439025610597818798045159225257684627844390762342071267673003184928742894850480752496758083244850624302604526313698595834705671677315868214301011365215142174377762024987919291e+02)}, + {SC_(7.20227661132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.37303805465152212002933833481069295182808010592267121190344032897885570445603922324812010280450755478774902585298695970671508035354187420144033783169240640838653864920083997632382117139666203979520402870913656694719573287280930814348789662709159554341652970995619762734437041159008417774513513575175997159826455311393615474032080189567347307824752893439818807444114127616338517289998206205732345037054157126317153754271771112658168316678156292870405480742977954214021160941019096116246926351436978164e+101), SC_(2.34798931668183689489811003714947822248687075416433892703360967951861728101603554652920009368534958567518413137244607063745355575358759569756280248655040957334433376108428711420069724040151198409411134694564740958346393856536904924842105919713613062181164174088917032677415822388455660178097338717105926628433933783419222660487149698654081950085336262631094590672129121860761900722620760385227790497260852982842757021734835281954304352709204338967635475836677001274419319261528043022078402221616872309e+02)}, + {SC_(7.25073852539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.43520106836729084085778956456263007366457610660211308356804607795903604205903006861626940571616758431188483708705112541065913612170982868979138374222057745044530838311693207402258346596133020939130766196380325691152564593723037668386878730891740735487495367730021135561331968282946393311387564533951038834032038906087160256673685147382181654337851041727860353702694472391018833498621069942838095743280549222839978177874201310102654927981792274736107415722890492564295715073245406504748411010278457116e+102), SC_(2.36869905108431683936809799701037213902840132962445950159087863767151392537365457829088012233860101415133446664625069179705407273558177815837911402413725567621227251553290403977011004098283213060126615067528770905043526027425714284293642772945512987034649149749940987987282066153578004652877777069205069806361585955091537122404255644671900305284645385248418831413253227335874194856373739115256548574919845614247054282038560824065753222632104305482406642615557915998379231124924466235671891452085471228e+02)}, + {SC_(7.30574951171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.83368904948692821415701462368046695202486612714101765523339198368422240427056106672521727020788297278838134755029853525826240430171775696905992365128734083532239559070717069572014894326939860499578167798833295684570854229896751700580561265945686503512548554188728825057363206984887300823450384333435198218629970990833645722377925579365942064093032376859696969471250241177602826353281251607669250065823723888615059026741805474782258611176825211988273205012026413517684390964185594288523589770185452205e+103), SC_(2.39224698120410479538322942693900100750302371932518498513970196809717285652555406363425567070534620185762039330299531580293666524672539016689119664898814223622248034618742951717581421540067495872362627125366893309516167623038435271704408134175732192131341050335394507347567907240217514740760674515613232222441102582815234411374214121906829085760029636754767176893524536921973066034719634005122069259187062974845953794788953499793268622745250139533192406234834053053126593008530180248729385294424110576e+02)}, + {SC_(7.32414855957031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.72351873906468427927434749243813946718492824644298051464033227651267721874131369030686360453838674597281399653454392712519996838482097315107046317757791590222027589172411232504621489664643848650270625328529794090865340207075554086734771760739189005347247497561092355456867147799893035155774929656399042984297099726370028645869467397024372525417150906070220931522239593143561251296312656675039260494381956881118249845133633386942844663451695203906956726307735499310146186355391329884667423153322820283e+104), SC_(2.40013217650976835621157835233793262249556249983525975778051994370838624089108870584615523205800434868396676458119595830101103363230974997475748135773578471342878612674199773452945355873782988600437154233324008409519071732216320083908700784750442896633871090689414559645936711466290041943618756257745187631302129212076472621111660377092879798381611049325838760290122015763532662852607044508731411589596965193851766890674323066780737296733477691014068044838476213088598919241840640959953310417958070890e+02)}, + {SC_(7.43542785644531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.05057539261721842528885509969765973447368871778403642251340693683832762582599686981915475758777749628249363962669620141299715335451343165630801212919842103593909541427972819750900099159556082957831589787429058178547275551230067634268190277872910180466774262088408710522934303590920264498295736830153661283971355721388880579406568443053300160496066408381694585894458038897108824998578614767961733859040676188324483688946286431897634148725088944123683570990210525326213482732816270511822193032938057778e+106), SC_(2.44792140290461559015608660191683906647538337402235360992803950058276397205841643970107666957090600251577902918891601081931217556177441460385443330358798306259795876776818599203615425018561219763807467394039107536233629358829593264171294184649424927776279069503493001556067798490179396110412631967842755164760965853830835968513373138323962196968498642464328928626116147386543025368199899990416183041916861269940388736111702241880139889967663889428674332508520198705205469187793144595358628515304034126e+02)}, + {SC_(7.53251342773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.34450173886605871850746175647689853845137789653006693475073046311373226224027841491530308732711009686586842056304257354013893945718172394735140639993167627210518718411216631690896419969571876344561671600388880830098642765589735803154418308628711332909033149022575200265268797452406626511994213601291123000753123661105766161403857816977935150857042024764226795181284878290595587741079595041602434781314700349706197292957258354683643495630988675216599917063436026736324763554545773796709916187725651109e+108), SC_(2.48975213533400885587637691407121384810544183192148335858861452453468279767415393776527155273533576836354512459448312350622908135443050111088976233097955451277405326746182472346034496114600748614371719947507542546467300701612516141702635968086610245143035634860001899594688878405584897710701059457452625844410950210744613604800040262747640680619205824048405143301800770844766969588318895622046783778912109087656103522244258726909926657151419246134983372663728981134772950698713692886267202772290239989e+02)}, + {SC_(7.58867797851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.52064099241120839241553555175065154800825782614604145472044725679618326874368100714829996224430528944422099953301775491447673521847023758692869380818929370072753340828440188353412171234222451046111156082148590337005097363676186470812736096355739264956973599076774002187509871114514244238270432371453933456401086514329982789654412301889250531378151629276080470889528069665845043022094265532108347096706819057706648218300430313387835745459242829301745686486046199414046908590639218083263199743197595955e+109), SC_(2.51400907087850065913573947414625032904671121383447551970348482268163455985642835731430617808248297652550140604113191015187375045974571150714301822493699595430322794110657302437321260873980014851953656343264038486498436740894972501820645365798347590337834137982813027441633538926570243517443985279225897432905162521435549176598139109497346323391120019990290150009034934628687017185188831652277517092336899156528663579733300039421610455619418045056887614965483270716367739725999067896145673923299273256e+02)}, + {SC_(7.62846374511718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.49922614094816158687439961093661481037234810702887805516931122154637493554212818932955073139417858865556442362239274940666473504207297806766385685660179254296756645324382472145132719416670933652209264214351147717858113551215145625224552303504637643220376444209573042722311431724120473342395806440765185717702904512609122454950044602469120536144869356135738716318579159461251534764894261031872874364617223515229921670219532040826309832424582619620031545239192210739605925994909956967596442929984888754e+109), SC_(2.53121750253461261157926165483338259506280329295050669213959805473005613085786853264918544920351424774759224890919503206082158569005711201804286932818636123198065034824258540195752455187274769227201462726202428280344798809973069251017733585289389080574191285152182058016757534913424799037881047219705041395775580668115715995698157561159537648352763988254360776036505973177141699047221833125099631699656501946106828699155634763374572586547346355388965816585722422683987931689969984006767292244890365688e+02)}, + {SC_(7.65285339355468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.44328233143715865979067125362218230750511545691741833774669401675093822089298916821946021749252994666055618327326639446756594002322692098327061303976382405175725973297465838679821381012919266387290046952061939154345453911454165050224113452847446481526177049450322842349725029204286296504235394215207283967407565742687133377051738810399251865021358404288107379562055972010855458043773100181817459739385583448879867365058483501289268058848398485010733777363308695038824615742826196288630982490737619083e+110), SC_(2.54177702582457404872599490166618690101396619429694510433333174582246355837919426933697108445480960272390662026845326249949216372762237888604462531876530331763138586218132408418266282112006133279665782434076767039342072318958799692295680538293762592852051844924349525576494678256521832924987145984682152496544478562763167898941483491938838964834902734326521933830878319015435622053505214202281673655648142102864872210356314882899338205344297510694121925220450582814976347866533520588982742320766439488e+02)}, + {SC_(7.72524719238281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.63869307336051372959408243660312533363160373438260403644142677514038035500017680411528973659763860595946543595355948939034470985819043891159099267948201467366660281597652900701211516596330385863199386254721860339020957922080099766864203598309704547571894873772947649942164988823440922198664615400569707361018370742266695047806428050897559497924940067587680446013069045998943685434113022629105921541439968982931122191532865303630945552174649927475106238161562965905486263818811438986496825513637014581e+111), SC_(2.57316597636415280125839885539832422327028384008465105290539607418833102861464491225192479961609800598603388977003020277656192421494339452190729124101492463431890165256699199041374479756510159928563896369245691749784052847992085392738924762063155623268080207335467141395162714018568674082778047127838097779641551291941776339847523209381716124106191078166858784799123524766863312212028306342532526489067229074022676360465811189965473674708416255220146449182899327412136084950163226199948137452893680442e+02)}, + {SC_(7.74194030761718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.16396089613489472016995377678658380446923473961245920062030532600259290874052185870763071323324256479433026727236377805170595562642403572323515509706405293503612638534638124581548346108886569907276507031504079347672665740771712883539118519211205906850696296862664443174013717675289484573935053571684852228068285897882661720487640714252756969472629393320568755609971119607547454193719554772166309047227968669585212681948658637840249673648359931543555176934236488679101517981820203875534938182054528036e+112), SC_(2.58041359169692229394146470361757102165171481664924088601840051965221160090493629861255364611644912107425923030168859131035219386259396531102485379780552486978801953153190487248001969894813943359995888684168354367524976902645748180465727249368626912195861924811960911588788400035921242866085423934141173065042123358071932446406617142131624614833689962894262245461566888105904778058762073759481272262928070662967439223048222714778709958246110214128080579870289345281284344445624208510454423495356501333e+02)}, + {SC_(7.74887695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.57318503556727811778535046198574625914763729721329800188881059948624355392224696914387989746465413861123970505464968181390903309008515740780910945865981792858625294044088283319093981345833143509860817185609094808435220499094014905467770825885351007714244936734979151217533584392146957401656086507563928928175770816739721410291117377012227173693774106159236840499739132409784400495436998690624432116376101102365629523652827118641421933684786146996920727761397639054842551147160965304785710365897347221e+112), SC_(2.58342632664765299479261435032591639897367252976699088770326519539616458751460436198267419198929221817391439292446653099231773357359378953909093696958925732441991326719007853975630750664600116022789643028746413824014096475355722522052341236795413172551448202780306300398706230667980974479833198735645461251771059269197235819448033765448433853896655518402335711421785716185757300432929144147828841660031749371859857434653339192478951210484668250481047873215582224562308994807088571889566499812208579266e+02)}, + {SC_(7.79611206054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.22592881794156458446052462717595126536262539090658937723483697079416119671002260444795643872522105776563001197318927781078731229717855149387116040683142410400288660857353459094132627642437287400100131928719033799002443287445543810490300646052632335621698671153552243167639303608865981129351233813614118131149101613467461610042458138597058419807568525249250630798103454408426222503790875152936389126191608008771920051555513329641652288754274772662938190006918185060994323146861705058362696710330744166e+113), SC_(2.60395814283749057130079935554277584867813599877917620661240914444376387406811844822383436557177931094472429008274043483007263670532295108521433652222694381426330087436463972983665698624623201467334190235491047796740683233227534777329571432018271488637975693352766700581687049143464728836443474208841916151709004417302089301594887700875721776638799017258725766477572363416260427171722136077719566612571650358218332597734123984669843135210714237285262719294895510682502823915696104275394521940544919085e+02)}, + {SC_(7.86635131835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.61050567305592220456152565164230942148564845008876468783079125218738568867109739531648027886908405561920936404327008113338837668823045462401416814664853080167844534284333759220396595413078747532795418553321714788783912512656022776146260949338158924577520045933863185993029648129748796563225259082682813710331126899403283474477532377595464796028358150441834390887390602333872930828230106771171894718510083301238439996675425133564310770982602045974376029057672235890376329572299897207660789102547476188e+114), SC_(2.63454244548355645406557573404138621150450803835148763287902126807962988944888186782690423821551077565964473228346552243343425023594359629932950671821996960194806057329125965993803317853525313585118175847049038259803134572085080825944549279422931339045215986274550237455342692737666976538056517491589701667225209690441329079917551451728242728647018956436123513148819620671153439928606916027213268680772701127633453892183849889751158464692401042242515527605717337698362059975173305670741190034582345513e+02)}, + {SC_(7.87446594238281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.71837624022682653050662525112014758816867875003265131847902688055964642517176593117496287671116136563264491789852708222849348640239441380785771635209017580907263863687289741192677847138949151131649311369876561874912704943331918988855886232533705013511310935868278254710745534548689545057888076936160205888610699783645733278440630405505887873943782027122090065276384500599678106888523954477191375611451517934837045651078621522364579858561084030976295747171725697367071221913449939276734367948915626281e+114), SC_(2.63807987679752100016175435094436543969868151920491747261488057556253844905264224201473242499982049961008046751556044728136159727267854644919940576112165419414802234138378185979596500527688970168541730602570167372809159118442057938651283236319820022026854148490814115502143927520204879728916437074242250572621439294603499695241505072139606003819854900195753589328738735320410047165217770312930492650858332385736701370183913635591828104119352224598698412801595961685080520596865151065157552096804467251e+02)}, + {SC_(7.88913879394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(7.05078178357726410474499063325837303106920910137103134019210104418158882633130228551893986765522818663440917130327860147833061843615538131479644991925275085115368694397206296587077791582003608613030789955656819980122303298903900251318009299018370819489337668916736108240082513671186640654973589456517440546988704885759583400584082572413524186749008182054736492250396198262161257003088599222961663885218760682149801289472257557104489823675144839902973674850172712268025619505445748264626498551225801131e+114), SC_(2.64447839103284956128235684594872838722673490951947089399274815716094892209302547464293885712494797370283683422781177442364743783116820914043603349899664703253477540140367138878150328404445864988238511331734092922313868756906609435883645125621324352909387547291631944141820483150765666108068429269928198949363614471852366168035632259245468001541921511923247124519423964486485058911434025471884809396247264243909679683975547281199015891927901064232110010913948020149398704248939970397857783512416201869e+02)}, + {SC_(7.91408691406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.09408630889928784995366101034741320822207279834027238270453249877880584352669825603178562703284706934951631129471239102447693830793569725967938487137562041240629518418460157493730099318010606043518294809161339258419997179007349381751297235189597986225603736673752801175758389468868908522525458882947950545150550030322078819854648909136701639378272181333812445555534256765672912080535194117216902242324000109327520303102170890466509052343854202275380426325647730946059107590555586681253687814620983684e+115), SC_(2.65536403023153584181009366509944939933636512249483928265309684189563613494760548624391320929669336631354799737976611608913222008521274835382161622182309975779259029765302144876959170847767080160732361049556841935864400648818702093248178882045296280850512931678721234983400481397860250228997304157007006352976939819877862820296819278998885809808276622234696039204137254724104197213765964626523801038106954428152996443899583239076910904674512885475994700472760824262723489540535051774095749851263249929e+02)}, + {SC_(7.97761840820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.36079199634029091076938651799381162227395151854994589288343070392917661651832778942033252044086374956158961748049622438314469763959461683034382310349408060154074518497763738460082990990829647834192310943330698134017546905950238846166131473096056251978957157805264833546417571995706041453604675019148879806136858368888755272252525296383236157048398929667609392513772845625191397222628185041916430700732817309729016015053983279819231463094079090001106112163736903059352653651668590397732314816765520047e+116), SC_(2.68312047446704936551201646268308565989055995669224270332238971177523275624114106350924550827954832893926360128561841213655745069215375268280053327774384246966880049772271110277211800705320934862873007557937526250918855419370827771874390100701496371022372316379233768522789505608766708182727707608743777576965999789704312554625387227826464806494002725220159991665546408752810364171404216636162283932101127607340416316313963340855647610740487718780190284536361353566264092648153963919226671135448911486e+02)}, + {SC_(8.18258972167968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.69497801715505291341823944466394478653573226015069840233760301344112615036232003853340643491253897084350091966138150705300215882019420164546028377252930702792521589338261508474246880627609446162999468530730121238092726471747329156922095797928479805876451237606446524587852029517769329801343279088501888513954275307497747337763865806806406346467581445157182819019726753590749164267109489952242163494169562783305480340836442791424720704311125592005637989205351675021345658628837029739353259846801475693e+120), SC_(2.77301601206713380033617693878153786830344875545259297416229835015583825907512523049571737167755512875924722446676821999765409491382152022874842176237305706792335228881488212118956848611402510374718226442209228435834294021556287185295412732101171221125002257563707702688402289790980389117777811679193784649416884695842513310123040215065358413741319245326119322458004021327888264601330050922125827878039913706293920225934979437023174398406286148561214942428656926999902319051063278086461970390249047859e+02)}, + {SC_(8.28075256347656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.03355259286154819704219551226654395906504099781980718189010222046388212585372158450768002121529565043941554076356321710498359531557447501064276145807321202398521366659833156357752972507906824738391654526335132932573107398337998291798297386653691663749579403316591054269038802812169004153547651014880281564220416404484856409392749834859784000416182037739572623416447024555101585323087262487565041454643160808490925993113405987429965247852197914385018523039216649953285606019240086795842095595940237530e+122), SC_(2.81625165654526077068925249924073121003016044311700871305387088866293803727317559314224290963119864575313632947917677680669519628303166226702784572771996712364168797470224812933324626509432447937204021470084030660427032168951011823872492136779555076262106191456052996396539130060062732303932743480718984452917269033526737946263143307278506852358007407585518712083349536526597660621880354083566603740686029120834703866962079788033455307212822174973485847830329491718286072881212539315054338676887614104e+02)}, + {SC_(8.30768737792968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.67371114734752908061547616501953362888754075123545344701696519965806930080461201134144351921409889131577000496545476418900593918789113203113291903553623430829522236655918744889767943693226589545898620418956144487819505119387848652166385429031636818347206755380790194158017299123963514719805333452005960947638713859594934023751184336332845824811763594963561199189413088144447828985884611507816281472365035371107039655044344477957681971573509626723153289201570272369616087170053842773571123732195148399e+122), SC_(2.82813557444376584828434965542575667785580707101066679231071503820665911776936151156471394971750487716282814977361877634271653128160695426275036808696002806135071055891547537428728895767109593217204318330470768065883592419876896552206699595320213856775213385864681977009237639675750081260230142974936055389669776620023794558780124186887105662746744143136387863932791251282696227816499996110649743686550043725473956807326664285881088122662448072069170162126507907097586775108499996228535395664775430721e+02)}, + {SC_(8.35494689941406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.38087594810824007172317526482395395315515281973323750835943287918036441101522146181320950280907005936536644869459515895630947568893861360978438970984364099029399610364983195697978184477779906525913175411730400106972861856794282812899887472785589696827140820546454454254452546653559671707908916494776611762380091135585066103947092509652659548063168677267386196413563849419530138316458816291678031326659324148655637781459343823674365831836666507888399565257748869028221680258772558892324258985830216952e+123), SC_(2.84900817614821787311354013125196922305347499212422605892549254341126665527540833720877092440986522108374379472367009353725288890020954841214326197685621378601816567939788801160808539787411925765444721012192661714680396001381835054468656070642240272057212425534769467099305112437120256925562311398588675210896965199313735364857636659712200395328346833022585102465227465597221999247665850846990320554146744067996563763776745474329124355234423352968479337161445353341784178484608139997913928508370571956e+02)}, + {SC_(8.44881896972656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.42666833057029522002844137163176487295236913142915957746565021804551354855453463093087070413348894685610837082261892298754492817349750668766296094888752650865034632398047114223732322099618094063966849276886337772747081947435890554455490878510521949227307238529178533803221256978213585297126604921130732879198880933145677343705812949585481044421555113226040199998463630234148442473768452479439746175913886297512229427251823762336285728638121354786435192375488215264066783455853500502632517317397191379e+125), SC_(2.89054725081189490845947420649741511146685538739793217547650555624606175297303059819056692884372884078386830075996318731414936158025276846982001943699867169461703458538011827884171588294993801700915253891568635380810721968776398838118775237059164552862557622592417261801286604016100245025050781126892995385023634381604544996542145189076944911500566104957354877363628943389158576238909259399367640949833599148363947749091718337785962555954463897388654227267906460510958277041230544448075498023250718775e+02)}, + {SC_(8.48019714355468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.37692934320932297620981374050517322995928364822370056283231561336179289500921370929456719470695055723488408828524737123108775932839056147022184960787602221185341428119369781671947613160459178511396173156859877483907121901485026718017763578420717931798182513542147552062432522848865118538541035507673594516917038643758164417956892842566318015890871496409662436465557092347656329424195954333344196368227152968549834610314913943949187093924403634495721405296173700996916826333049876082586793987975639900e+126), SC_(2.90445577623558718471247339061488213888242311002481185557085466364156718241788153628570698399972521875326124272416540356360973483982924299495472732527445855579350412985885474284574788179173000292494530174623026334523333562459396879146333235990015088570248419292901518441428883606347370774550166714396697556794729204594146604214365196382675843836228991246510493222815148738810134784398272967005152613250351795609342442400866153886535045246197053653739010937545045557089427320285807941370008488299231342e+02)}, + {SC_(8.57517089843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.33832909826857639512345469794224629431863744746205019570713593413174355413681840734251323662261286343037475743371405368380106210626282544364717088243965802133669782776732738382008496885261218884763219382809969095376871715586408966585332510293058737930813384640468837357162158315784553713430950671671887901645968817163396711406670251520106298690149906371213473021604786054149922929270903602716062423311090876450852576785572572036859023487557696205357013047761812845708272800521434743464252230061623459e+127), SC_(2.94662434149078852864533044683430890751857634692011865421239447493723034471975719502158478358928569225693134671590721633683310220971342015064124134366039686660903743149425635581599837403308236420466274409421883921364526784964902879126070829463180730626981694996688156372167631098166484804873769772557801740883044257753022047460509209568607086637282554678558212689974540373894216164095727717722436815597302622187007814732051809764574347873019922123648322650228948344186602466898431539586997877758835265e+02)}, + {SC_(8.63414916992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.28780442416473245220993417125843211443922827947715176026304195790252522756485988254317574050560830931766655835187600384518616359693792782766315376195334660370712947697015509483345560675594842551719958111070071113346033949776784099516445593701873985922858303738123261934902146229686136604642874942111538415537933528926963380513072791644764824044448102957590604260889847887609094258686316384912242648224998422816568196552377009590433850216097442453499745344913667602947562258887692660118963302873576680e+129), SC_(2.97286415767791898783137273348885728560402374821784965819753791581931702220185036139846739534002423747332846154884200311239613175043647820938132227917299223856302828493526636466913336383317225296782608199960652994652737854245932777169314282737031524304643218872099503414611159163700671360099767073557121674554179784953493763081417956047400998059429146915818627056653259309380153196074968434469066936204442302320347293458731802718060055214439848310727105052057577070572283537251105403348908202350818273e+02)}, + {SC_(8.88962402343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.16497091538634954176808558126734139383737220151002586863764390216608325311354224623945807833387024682881726665479459285049470005141090454361104648074463928899349832949354678335633489379248100907353042144547088922659153696935259491401491453935889921332339646024077803179260980585115144981597236105432685913954327379590905087313647429348781575292997793558631588353170474662811666116917800187536083681419094153230087707754630865253287717124464223227710268458962380191485579036954798227359751349462251363e+134), SC_(3.08699098582574540874901131606444829079827093151742779994254570119225093746828470772591943962894899861194077510256353570911176148460678141159128649251499460366252572667406638613671771548486374251674647935746903854762624451710412919721911034042884515928480795510065676168065676205440554995458081789247569791487484423535353436040389054764355826862135210266509691969507902762609484577337926933364517673031481416783636479784014250799567230708999670147781779276540235164766801425268672586312525495522925408e+02)}, + {SC_(8.90027465820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.87780606828579839682486297865207414473915059257037797744519875719664626455476718573609744117214029167978785142314872357628234581222424935700531114713879884267432418261610741511776815059877815129756317302341224239276034805977343452323347378456909427278334973253635538590224095981120699481587755946030574521394259861658122318014234956945530178081130491793013572104343521414300728519011590257888824694899803503988988012904865970868166408394593025635261987537708676505790837434031472486324842830042702493e+134), SC_(3.09176506571632456661296387169922633668592672051072655211196652994040766909440003566891242532352089213045883882170560833941457377382708950526763313018699118120380453698053681452767025054914992997126231495133852442181265968658060914464272207315249192819183080634684126063465876851228795083042228478530126646865482437930517430804028064010426712428251729707819686528889880916047040445248119995350317206960036438745949753331377517382844268845949439741976689581628956251067901790913220675968694083673487767e+02)}, + {SC_(8.91088256835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.02141237770653771296145159020408881160989590419650870839398196043333840252005325735288677966280345378465299219993301159178503922963933204046292361573954097969187224839371905345548563192140105220315764875768864854417184036541687412890821354212141753891135605827639941760913661912426915299535839242021655832752433343294076763148034591512931393116354813721135709720774782626096642546416987266526920210682051827938993518486923365371794879517158653786326361967520012063105962048816773936536423552751777116e+134), SC_(3.09652126858000418732466228930005261043074491779209335334289775565968084841448943907137967412878070307660884256018325421477534987598584720609289107279261354419541514929763582754168792144055368288970235585293488977201112044387382737255177692549721807160464339051691282827080114501542353004889999789051718622994246873560334278221827736435746212582206773547578069546225067846456243190088267218770093127288806348372196341589640382469134243923012237046136953985881262427736754212363159539850461019015212532e+02)}, + {SC_(8.99494934082031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.31558655781768041503471804823072857551660987893193771300923694866722085437810174718689818184686160543355659918836573435131789037101312727466050676295123393694959558094041971618998566373464656975432193808552085084233941827245486553707076687396813195185672678723677125523966734627106140802401897221851259098606091358250676198000082721515457318154554511901375574094053788420170179929670798848962491431604495643329405322390907180789283893100597844735061218202734895598115127593661000761748877366559387127e+136), SC_(3.13425855264940891377739322679679701437736153823573638382405842870462047253093505527290921595414702562601048150543646554826489940007848079633436803489842171709369467138537164298268952136979863927342727600551602860705692198456751414362549778693316384937321572839532158459656954184100209595837489019219748987079473338463489774192604391414722484649705407731580135667950294425840948003237663213903701146822180319710147233578390478895236810346201770445751100986412992634424999142036287829615247919394118871e+02)}, + {SC_(9.03739013671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.86792769846398073158588185409127746786518317702712458255738775476500152684870175695995359303076769136193610241864674205406202900267195798945109864942852055462148552705513394540607224575512328698207619061607005694145838607754787666580012469862576573548961202438961423960092870203630962408071476306928156592084871044853220452396635064991834653131047835418341620932617272679036446479227435435487997430981426228453395058498001575602632012466601760224395255128828602403730169970645524832506460262769922979e+136), SC_(3.15334013785828495349532035339943156665607307939960487381337115090498107824790216760180318686253963749203757541456225918165272299768010575932572807072640852990782052206587049806078170264820194544725219973399085424751859003502907821494476427727808358908168867699978266761176417875691596682525237264639469902785748762642384210586356867116426877838848316248603954248921190243183633654720939266664415838936601913936386430973862064257478465914198609972828748670649934640702939726267333018813626726609454334e+02)}, + {SC_(9.05481872558593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.94261458224695981141369098133253703867790026761588476125416975351640813358316898519254837574567249935885699486051633712064078624593548009810348066141179943221841646706583752101191904588544454608775434416781644692544877023766579040440447322187741464563615930635828169727556640003402245628046314192028796512950830086356489427205097330722518479146042424090370497276188164843129478617752147158051725479824441211533437609225251604421732365835604215593256934779460210667503156419375982154179739862634423949e+137), SC_(3.16118192528703981418400552726276675687759179303740395416722020128790101184582971472358963500259877654665311620677333946329822781359101955682422429096092123907256975382594705860667116490690402904172004096156672614298752088275735696742123448129137473162400015036946095606068303962089583623495361335018595347294184045421628733381025142172965399120167601720209789608587228023512855514598980256349740228973876344585607589419418869879867146874889122744202917627670004193351717048152115460737505822893451488e+02)}, + {SC_(9.05739135742187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.18107069766063532419245836536254822108034581886312685487124135068440298730035208900320969514016652201174178281679735598938523996065020947571579893563292108033119930166754761376804960651592977130363219599641365682045191400497026766381310222652009526402992027295622685573221910910908248077633982927941624925049581407580258434709382788105487147587609374487313222064190424559820002903700012636149088840939067057770871300337937992979322966291480522183800733167189183718550962254058813914237328281314202052e+137), SC_(3.16233973642128564520032932606887103522789825214982046617415401063507803185459982755439000054699836581126390400649617259579813321911330312947020882712562563725983604870138861006695865498089759121565000116233173255402040196144186341206231273407839332614281226634929116514836134924973870494418933399410938288447188299481752862253218523748103363577520034339390698612761924972864249573829620361774154178407493269703532971305225768634929351668515230243975361330413576077265666511139203265571070996965851636e+02)}, + {SC_(9.10841674804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.17089665501277517595551491907229733926969412013051104729239208322727072951318423453332457345488055048181460539263686198330703061316372319516650492049625291376040683681859758067121828379387721946617331150152729752363611541139910838851623342515366957959364633894875643012137605026777313017475728823654503490417214077721204466781411604783313610050551137130977111588650236412541939649005511178465633299085498656850775152481958684817849474595139738505147201917724867003003701827781673310025120058637152956e+138), SC_(3.18531883120459976548615729866147634441190179578312525476830885292496876482788328492878473418831237059363988430585051185057339592951272144907044357413502988207447267137688625110010071322221525949923071671571521613355840749305089157474748077261678948397440128206643598140207611964328691008191083631508868839672114731744050729909748981781227060098849159297799612737529871671234603519914901020813641140606586765729072334713248648594326501502908462297493397490043102876133795816567896205915324748575115571e+02)}, + {SC_(9.19048461914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.79755081545306548897379109253071423186894482112400872086145886986301975112745218201844640998153519427596175551962716792273867553295516510225315832502296282361571218587929498644543442644312445406818903988138895185284535095750031741193379456797538008865996889750152568147035918802977319367400899386928293301143849614536172256980163098556365135714921713860881948901793786823981460641176103634977234216076900415820825203690705726681647558421218713699918815274959798235428109180875994004078087916625467814e+139), SC_(3.22233801292493518788961789947859975913990456514312793909579443126199933711446105694104239875773517016004540630259354820993243091605328124329481861339187196332689083458888308284212260237240115982648701006355037449090598696837120879199932468347397459713028503969084184990055184508401341459156444093429071507557479441617462602833480285640053902106974820979175129222432824161961256287329517440511054485890040359613179100497094890900276364013150370494988665992020244449985109624724713529242120122364979802e+02)}, + {SC_(9.24501037597656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.03347783390537019995503033019530819608166604007801391222097581199482642919778844366630918624668009424402059764475017580151422700726983486117050232924614200359384516915589062855863077559206548341192274226656219242158437998625118666163882645225084170519891503827371743578722940996092006964596609494457061444809309058646513250847902584632763211007670082396148129094454199599918632675755285930859883816437928751984279199981070882010422759307631303773361004562273046166390504043129282537152418344467557623e+141), SC_(3.24697427764470095450376166774512991703359589712997497306649401762049000374460787679508683049679146954502998877961987740384542077388737473823517305509985484988988852971606345314782540584923480056377654521924933162777881870819776897530496276653082358832746433247021011492518676539713762283368975340564191433339902907305832447160388983172881179649272177993224057664902289075282221446020049342897769048937232289163945154508432948331388358608171238071308423485980105911638638134646435087810345033453672797e+02)}, + {SC_(9.33306884765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.56163559742893659226156677177183415615362557335830459955572471558565744177992107156024207554426985471898717302110186717801009469009715785804467574873947614452021794699034537593022205783199218855623144954785172443541352762371963971841409175045103636744911478347262427818178642822885762821949102692844133467130594140191577058768672274241329692844448087302575749946551810836961763514438264081274705944074764712006006301467656628284155582794853442402993274559736949774514879090393937800669939634849563033e+142), SC_(3.28682975442356269450804361546353446775558843254411478792369728401699860762124529510889631897131000122723366460873209759442298321848552145472750755150492428806841202335903281774836748820357949322186462461903375376525398853696038655720302809519345764715214843086320812760448812504197113066581913369118760097607632595456891768624200303523556873732191738474213257464469403988760431942133234318675610849865273495733187891293036714164585971922539509751717274889473990366351481095742329281810895159417339621e+02)}, + {SC_(9.33645019531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.48245884324047592693378940012945333450224979745418856720209654706125635837956144126715083688340791473619470518428425773625931818233663964590750262499718984011983220430791664799946794905019853484988855659840230414428119993282971449533827793399231610564785213519537138530461802152418285400472181357386639996800791299432222438897290106414967230361477963008007447474679993155355815915254632893949176310973043069033669159455455810718563262746816084461206604787296239673163384054824455148275830637858147254e+142), SC_(3.28836183094662658961822295032749628419239719474009490883816527053315609621861146311931264278595978531924168646428032586966673735242679386468446652243211829021720037890551818831158077264285655764818403466140136311676288139949369930226820606538721191579868075992233332789006736850437132990866630322260318207551070260162047052662890955378320735557477345776481703702937383899591318961756477131142376888760267646781910870095650790562725677733989920486927428741658028463119639185097971191832795958571835833e+02)}, + {SC_(9.37523803710937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.76164954038386323004848445587140326469032220373101116257601133416814412241253225685672163730416426100328136156082409851178292149201362700314445578373394967833719655580153780818803583756322339540564203378453973785823049257208158246228542536868014844546805189024288766267804088495153116155120682173974014496007569213229677178097339807860316609301434481972104823908833512243616107207006116063922983558546779879018687190610539761069583007847793120863839934735950847161274713532225092934253594486397581064e+143), SC_(3.30594525866895214951026132241238206166748567400482469598494155136335192618897080105839026840244107305051632317221620706098034393801456511907262008379417555151588665957193894179579989115568231372256173550497100205568070991730712080877788193212107298668456562017219680363644744047830649103890523566400212254885609965053492863377463403703847255492463017184836005150386313379289484470683059285387441033310602739164348747481112900047334917463926166413763627950805183493664296256643963074213528516986813658e+02)}, + {SC_(9.49651184082031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.27838376219628673891092217649851988126764531199798807890290146361590940654850007618702649147926834058003362655285112540263448950656129542206938036094550768131763615084015207813115690276604016966803189068013411593812003921954580658407034547403901581019210265845993202918334650153701246384864371215385225953893283458438032316950625126312477346200390326216764345368804641891671497909447055837014162347249478963586084879790434747521877671493340004289609780578035454590620777455870595392157389612690513392e+145), SC_(3.36102525852210065380668443735774423728976193524082620377015936174646576647285438027205142148854452790085614071836922050574459959922606454296862287333058234054022167631344911718426942450703981307806411492642746516468347897430961194466789112389689739809369673466374040976263657414475658834995507613956104273735496371594417968621857137691549510981454555469005437225190699728493247476272421470502012162453174746447750828983776995565113221375302876169954112170144356666613733946218896083396998695009273101e+02)}, + {SC_(9.51298217773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.96276747437628698491352460237248259496626684260033707005763227822013370019653342953784232077884190935825645989227161077245116122136934263916315950449044355587721816388549231723743236650269459273141865777655737253552006965141733896779654501922543258025003406101463741888081684328231116460814692958214955556748851267533974424385873830973452925516089784761619003744572571487984030102240163421508616303159507022185205473070031936156375531911971248839059294360815564326009475981758577654219196924254459399e+146), SC_(3.36851779031193908419600146248383629080902012445957782412992132294243572482871977674538504582245516373175991422237922615903665006378579427226267142371150432986512873651136296108959675192147003010518105457487118640943905414430400970973972730175748276752276987821445691530315604382805329868168412943160512162305508314942942981982918029853896405837983025487559033043459552983592659151823279071396895171736819580860744170522245106128382142935325997632157072613927808553020391071460615875612817120823542627e+02)}, + {SC_(9.56334838867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.94402294466322492664780789471509891684669808277558270060303082798925971886343113857358108473247312587626779535494118409642777698272855883690084352721186322850448584677396485622430792251796208253402039064690946506099908493726120068544064569965928247691033795776280422468396739129221727700957244652587298495565648741262404576582140864092814679846534962677104260968516280525640566429169570052768898388858777011908253884236193338240045360249963351810888908708660609692865672036587639611587752153131410988e+147), SC_(3.39144768178903611154576513932259822435828878296128644191483079168254033693838887927979397184673718377716882172257342546153685018920203286505133111508789747654771949404501595246222035849289436795912582662676925730885507190721625399973610161674490068558375641100068386604660001870298150423765325113018499943138123861909290369909868670216978062261723067381806756231309995941704325749243483157767001239482771598354837777258928962431942028548237854445433411661741077061012420226965779145908688609131798861e+02)}, + {SC_(9.67532043457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.21169744956312399498639455549630793101638510523115256212991432826587137896748185274765824853263981717541314120462560959899030988978065056350270590964980759984318293166529560431663444907668943073203792179359574376805708445722562619888783394502001954316085106412385599888730885960997473921812491801513821448661862450289562198377543474727080955599661344303695664443585113003190765509666260094630216552777786839743320069847183523581786382266370119362625483879039637503342853952338493384883177979748473711e+149), SC_(3.44251978453975978374745800747879774189361811030869185021040420288142023108381585370203061162295491199587721359027345899087313215634137179026773935575206302599871850716081255115454383423425373728218234804045062121974725293497216937165192678316620041794496639914341221603981972746523105510386899410906294184355454380397370980325094540245905990712376814296156381253545591980294873930514771992888761841851391888241814358528503926333370744886324217933385419830722831133674613612592027573978330001465871304e+02)}, + {SC_(9.74890441894531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(9.27748828991886412538309707599773754507919038322041847048360331703677164554558750140118371249999112923047856520365587882478092326144398321711017275204417078380790006163788219386093013952074269642134046771675198595738077908437389738569523335022286226393241408867469862637418254358817746652142034322749303696419920176808712593265277216991150957940883348509764711360229737460318908377251092199416863576246462746293745214357831877521522520574163902601228419374989812201640714432568431255668739712278198143e+150), SC_(3.47615354800856447336156742602043631636784276935754163017637226242831700077490633569878084429133081451727469860693462347186772127059315985769843439214265602676092826128277472706807516025993082209419921249964774447215026046195821260324775297102302720656604146624172947236747126720144586144965303896599606841641640538342158145882231977847454315344618666911069649256883623971626487922850619963697283794124504861737713804771202256891702804129038385908043657200508229850073636759622636008148176425703091210e+02)}, + {SC_(9.97344665527343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.75212611306447520909858927406858433023122496707177809190073316231201213909552285836588252577681463819793907197633576012254029018017530475940549270670747327875547708149734921788106151648036158235955207982183955863767458078644890985072784784003157657078939847654041154970247192315236124080561972996956826056919766749997692638018042864132793894798768475224229161182646426868561046255948721393550598468635922750973777737790810626367539267239500147871398512741844024844405941448683844846584113373116616584e+155), SC_(3.57913063159066396581073316038608646148770679653962124306743233835262807077597545920350868347013000566526176914739081425845196396586525066488617318862480150671221153881448121348388247107816625173070919595245102453823775236161743405636490832617367473872170698471952246214374847309993080482365037909434794981854043072050647922694348353117006595085077595746987066212532387246587367424722559377450911273762645754169610858342062275803386085396070359095336458652978786511669257538622997396529328362712159203e+02)}, + {SC_(1.01136779785156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.75347730083020939485038162912066221581429168828442196039463827459526861430475699995482981019212730791574136303794770558637632653539966787313265805232908285329023762299185014861422418481465071375177624076746341202484154198136575647412930445794774509044561075216290472866615013219185046317886077929047200074616789305725185556966392977981343942503814374008958810840813123055662448373018471435385626941585862611395432770072626644156391905251833391251776044318450848049340149430633834651573099126602231921e+158), SC_(3.64370045538509487768445421235423359724165918482902493162567594435641438527780707450531003969050124751986459088661597995706808788951592146239311177685403275556816691605701950098832189999694016858167797087116289453374157732684624480988017079231000288334505158201945226692599276945487043383856946148759913833496062922481619161243219041334799839274405494278270804667465556754366581890426570645342309897086504847897108276501084043877611362249341645546845389118917835053899026722978063924256857388180755486e+02)}, + {SC_(1.01315826416015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.00457510991281502769226727004997679262304075469381924599171977187228770022537420994772365328581224262995097856713877243737738916378690255197406841438367198157367222028885739188819221893998874723494511253133823389573653928815922129563859445580146007786792038790844726836014513597109949268484909314677825366551459118028717639223624781670474311535217218824243945045099528383265311230189072692780987851223423192500364210661988512605277297349004271541908259006339755059345435938135279521158674365292894604e+158), SC_(3.65195882178042198649931968011149621283488971146238633105553740987173403757008718100277733785490878156625277039060382059688590867535166931940037968795818220856593816974768959327664263543693451366193941953177034784288904784400121716218959936061685743343972096090999742020173760420863474502571598091487483375402518801564373621465430088239127603159201322793775638351939991008845336720733856574548730516780561727018106577182606384397065860093671233778487263769017285490842275884249314101743662659144772808e+02)}, + {SC_(1.02065887451171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.27801326900345153343880810058385458377628466548919310319356208295001391627711028108964043747715058688010148167891282897721251134516392211229815633735336900159682119149211036994496057477385364371651032335430129210391891032699021075886871436986468388270303685964233997952971494238945883816291938728495688468471763874111752586770041106497240128592171108689645129535717198560117944070009013995125562286608487870236034608620214564008241724858089991811270552418742087333377223955627801273083063706835931394e+160), SC_(3.68658921617580562067411514817835144132866629706014763116035557045564965652500986674593929360163570308689443456931582700224614304705183015314634933020226691177371648521879014819766803156565604404215993318093870166021879012194525067597162546457359170668710956917518936585625659425567139073681368857775138517401175534361146257935927911617665535974359591758903503434806360013917203029465393008200496054786387251147733354953504701878799021807780313234619151600219448162688809231005073094405010463658717590e+02)}, + {SC_(1.02115722656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.60896816319517148534428232121099224472906570928174955627205730308593272095810179245609783698681170668816372103853112217011230591695869860419178941850553612575073503675334345279935542462445816555476534631191068558913617382873813056138931058171084616630332337766283314087190503645051068942875378149790513113094622500955980787327266672560687639557162522929706635433286775216561301409145003020847665542949100467257193220016339170437994903646874584701565461530200931941961289559836505330729535444901834160e+160), SC_(3.68889207960158981723583667551616655516830734599087849468445758096998943085919557111615958075388853500061364091220347702900711300471342607601759599003918524084136225550138478001032313242708109422326492734155678074073630480118105464454933040136288641575391783537716074249697494130114919412515825448403613643656748307302754155472693436900441158560131937501670474182282174058574205247092188856406444219190689086275769410408827865199254939649958746821341426770306076300437929253259079804248817293057357612e+02)}, + {SC_(1.03151855468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.94228835083308640822499028852065613673755865463851531438327058166669144767579740506836323365776221468064491933954523159827868739172089087439476571447114427920831324461169567100875893875784444712930291417219026660402685651505369912395579027564548381277290431987355918726720732918689421442193807912778226301137893083370436981941699729302604799060234688459784051256944786362508416192857240452539630544116665633911680458559146828307310632090438458941753853672353518092049434148009251404963278657426193131e+162), SC_(3.73682651905258726016324716387992183499818534851084298433410462119434560214759364867102585112961493700822216081248742887146719492455762826533973189295420418841342987957444088003076054261871688210676983131129943218370437493592743430770371244025240198136170570468525556710224653368582018246366989546767129729722257332667137633309476018669688145592375344762651638361779174376851220119649663435444291450998820250943389730137090903748676104493980087117773829641533480707556994175120002401746782494457490678e+02)}, + {SC_(1.03178924560546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.20171537110984503746428094029808236968900471595454569801962284884588253557196632314064311459204453401037547137721252899300675605221605850701531766220848178426107307853997571883397237019502185275899323162662253929989135552592369277960721465557378037302534013923856069596458354461160387042584077252216864036273505791483850043082366786730546213958546404008342532072130559596289868522883170995937443132537680477434575640864461406937897986942411334230967925180998172232605542618057362893140400140445826896e+162), SC_(3.73808021835721356724446264394902282290701854468791430816957474104121357346476343358635806510697201871317753385561836211023660949327877603013631398345339633717493827744828981219248357257956092252882039677272319317527100441867500400037527723671076722449747821677450262639970845980491755826511803767753250916930554390222742906323165035718151118786667333899860809495013023183520764835815549229361219355867174863504630209806067234900896411194527257618519084429726183193460574424568568946898172759856223065e+02)}, + {SC_(1.03298370361328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.82872819288012606122385963898328361524996417570678799694588697839190735174600170106720351533370631952004594424240260318156779543743334978103622384814628870820163074161490974171932900138828578654353210801510104125408235246750846394710609418092475390627709768228356388946400329979573725826559253114278336778834777284568651859102449899273147358506438973775986112756427925176585046638494816652143034181522337019700644796616551060074006656209089713982818770293251665711950859025929851173563713461219206884e+162), SC_(3.74361317748560163420326195479254375911567393555110750073620747146220483395013793807665984626248280853130047026174123840945129104152085488651750620885774044742807786443568160709678805304668243081991382409243452732728488756014968718551977463681027566731857857313817370028589856267110564911929005514836552959724444301628121435649598322899197331618582218338230007463827482009711821766574469772696231132570472922552328948998512472526034965401802610875788479029246956411298168633713329249088115783146293828e+02)}, + {SC_(1.03869995117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.41808227279543671333479039434046626158530188922152731293342661306573119318405563092633134973716965074833789372968028834168586671063089271054131771945825757582712628501547074057648793172598767906983963530048248045469128383694252974808161180554768191225424352766335755702327435659330161865775483738766096509778836487654811038642151241098269833579763630984293257933323924801773786235314368186353578754883559503875701698799907224370192903533452100452108739079966989498051874352278825688032663449334565667e+163), SC_(3.77011112086662963245675580860653273445838266375268938166882906410114995628208781265159991648954543286824698469454566104293241788084417271750687731183944221956896689140884801402020542550881252898680087044980595246072708009401646582838771785004679721221825826352639947747005451212279129556801460350965125343184149109540974126900025713968760305721500405913148311708196503510152872862100655916816216486302262077083994494966967519637823805835378877890290286168019857511375509827417374620490655688713244690e+02)}, + {SC_(1.04995117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.00678523887863281704315445004350037860113537505562283492519854184776749854976501039747505498206401986883371851847764028733559550284466617856098938842238483952037050298291535951048537185026105154426436130154396602767164120565673550208366259366381260022023273091633469615283569334286640071657511517754084778826488799083437892306566642932709776272954596072694419598606462123813205893259756109628659535751983281630078565414508016709349672242918983953337604798489765842178411006944951758872882478372023226e+166), SC_(3.82235887759759441458200974176916588835183231553065060110938275665761681247044148976503853974040867874294045938826589445275112659911927287757189056270707637343453819762906900535146711866787538123092016166555831579927012757456022795948174490211311393179055868077067837678849001862692893473813415204752098333075191785274078510424264923538488387176952815122989962722692588617583471346613585349912068428187382230147398757659645529871296093351036151672007480156877831337995025225476574745527346807158512968e+02)}, + {SC_(1.05218109130859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.83976634226548322572919174800895706904078782065799096443773537981885185694587486811320986028190855120878999289642598311337692901073887957309137449901201645735680657243697681617222494949638844130220749832373225763896507711466261063162058760477938214785464118394399129254067717894129969752496013723160483839247141974257398086747003573635548210067354653795490286183627182332662761041292473910667668859123430004827439901075874987993414093280641989070969395337540471734658869020146669349679577353694738477e+166), SC_(3.83272847211949837396147225745140765469959845295613313699908764628230030150463473596541716965378611569009511597916333970267521155513934265321685315234895891969446621245232567943644593070652475667579171884451144515803354855337891804564947800457461153269074076789377868905007126549465728836749088552564963936223398281798497975704081603691785971120903388881817641414000874590895163255227705961236388698142750934201258204390506092394191759642714932949354378711173864295679661862382593386315557987799072805e+02)}, + {SC_(1.05285705566406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.88900467122852977430860808679378603739475246531678043835303735217279471293400470130370648772140034717690092903165160234871744765682784827549731664070069315567174235375782928260650442113456405116882860216573420614391827950702876286870267067814697164882316796311045310813235466126083138233688957753026489715271094509332593818528703642543607758021186386446874667512334846224158518227540773901225191259373031925996619779278140509075065215271119230249696085858895953181416251932353757464942105324166755880e+166), SC_(3.83587278693323204678890258871277514297122579999980052845382376239620941482865363779403085682074841362888123392166265551639163741824554153804356554969593568545217636228911896958403439549653223554962021643289594844423916874562457761621160982899462863735444243455143610572630923426116761775450603225902128263476482113946133239847073900427016395029587377166423819829557669486815120023155228912681560989377874894297548582630710711089740997403499152876589237622444767284857349769977956865106013347728272228e+02)}, + {SC_(1.05497833251953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.04350370816229367100337942994885015279526453304169331541405449930047964503121921902865055650340720039463167689349929845708781929475609818050890432868358093439084801254450413723989850649265525551466442998101968299189171128236309030393012630061038516261354168877970899971437602497714061636143465994990186202477380118969487154531802906088826512149158175433112047766910317896476878380545357357485271295125700882753012863548011070030701648140146862221625454249948037342300094075825716659580134996181284283e+167), SC_(3.84574294531115932149375237677159420320457195540146825957123495914414920297717536466610017007678437690910405675946752707021447129327942411269020836249064404337748747238670706269799881082342729228159556123744710580924770007457392898199441780776607607891806663764705100979849989516424656253155864858901648204573820569648064373007896785842420760427289138945103659594745663220485538043333864464089137493410979015162544737932793386917842752543631253260035596795692444801975621684522304127220533656281498487e+02)}, + {SC_(1.05828704833984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.86935956323451034432291565799477420264574942460752629257797287105180125557334515457334508984544079071767666796613033989403748997881217445422941519799379563116273641327023162631941708376299025410868259586929229394778423337476191581551414019662216362920147345185750316039793792632623575204684065564644397428240912491954400102870524046480730628911687821733279947204985165713648677583149023921958316124707430853691606160653731533104584128854331165869722998686041425859590119586352716477202105857590710998e+167), SC_(3.86114672951929698920136727392816843089699454656769141911396678839135235848727229316681941069390642024780171542748255637922022854918760033993710968586074720223630214088649211602114032519767723479347094792538717501386586907984344495988912231703044551071876758677854971788450576635886599900775564701771153163462777589135590249132185730805789045598754662767748313567978567438568723900971984460828591161471563030548874218738918047647263078674169570979611202710872458752522074463742432423744595354217919401e+02)}, + {SC_(1.05947570800781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.47057964967248252231166620098113781658646191158671537217794950476766464376688211905662156578593513863165040297072873806429364722113126115761718841905680936283098926911470053640195196526527218515368034033163783510136466037445569865348067661306367025365777355260366857280020526593626915940767362350851006614893489309153646581809145049958378384776781900879014799258412902197094178712661179516840945378026341080851015949108183637856891790502608454874633154649210421029466798941800508041123592391193864637e+167), SC_(3.86668309471944568173873408861675785956750190916661831558743523099932149098629806523288989756114953035470141336019959684812949218557337267651631665600615158996271397540668902113775476540860392860108853985273419143830770029749580455603334250552677535524171319220534100409209112510024597889087808166032884868903601521170566559402919312007576674322088668600236012402348072933729370125454847239009825296717738299684165498340245352212710242840034371086411457472259617137813000304057537478445399704488498025e+02)}, + {SC_(1.06391418457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.70253372553870180616568632006838011262008111599288624112221679342026079198720173779667163682688609926140105963022610965054503934880419416222545629271723490635890185015871309235096787227762240948662532331680510789028326905466753803859471535573334773242801683198889129216185936382265840225801389333989729342025191831962960520494997526165478262494935157207218685085223581167474005602834693600612719550255711040569227673243779565592510107034690926824984016810418471339323297415087891987884553051309611794e+168), SC_(3.88736781245899953940754871507990416578546629339707501918767067261604547151163191578885524717075630505524762529790143874069633507144400490235978616476528866086388209735046595453000867923254174967190450967424770807319302177358552810149630796131430929481175954855450418810197954997556927536545749752054152149864042626530175822752029241825831049068593701734017476681900559812610050851961920439652843025993713411192941779830288417577447789660892810097778074201713425542379357723870000890961920731359472053e+02)}, + {SC_(1.06903533935546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.30700351289897181314450905054985266289488684324535147146260597763649242079004782619877273438168913943532692353615377684351171321122204064108098010571285355518105232404665880447750758276681478809795964634527929015238334015730735095567847214499189485328582323313544185916079967142912088067287634443222907647626161604553446017786277114953090957290426735983431097623085091413872247113446278833527752761880188686692149421721682834608764942022244622605891794717380016765264738644678048674901409072234496451e+169), SC_(3.91125713989560722178790040938057497009401657262916760720576971411333581458641421159616178119162799252382773272694065770554737953272582538120034885447494838801178651348895761514685750468178877403399909978049083194307117902445860237917261352975524424512326526863242969477672410140371776053823367033985438504290530202855527840453592025869406782714598946028221372940777740084055176888077809785889087862118392485817728132743130196943661570923772169747816074472003406570793358969889066679820010617888748059e+02)}, + {SC_(1.08258209228515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.10523563441723981064740219999453918816472405151221426356738600808716133838715299960033690433569133368942619954844287346727777597592291878071099672434078725513928247006865786031356532332235255184614908387965921688554218876519102528055922157730794825502839908312954978533646964247076489581491815711525461012511293783018451464364852741864093985255611963826276485550701285130944198688453437874846595608362202016624464734534199679119447477006060881888640500092737148440161100690107330035937814410794147491e+172), SC_(3.97456899138039707890948570315290488733498513976209565411692258313056522298592145152695582227072825212326333836893020714945122334276123578576097726330488199540062511818312036859542350990047879679407265550936027302443124803145964590805418469726951144986485765622541837619352076240042792150729067920562663214944327090703228239250882201092755142143865892685870733871461597901111448285596377102268529974376493399715131821123420954432137736314556416335446707375069549279793457317288290656669586179599985465e+02)}, + {SC_(1.08388183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.54290724282979442706558253940482783650481422003372689166299736333701778003516903631467085844425812079793077081450861842771132198977186551743197361861180089877315441155964532837705687391125274154281502265531452429262571876612425191346931039764014171118854205326273022646394270962898584542088492672505493836667204179076535355815522565984938355503985049327598724861244714407243291752160672007328264253782126273656374903425598076114290525946342701022162520689281713164230473921106508024601591456486075128e+172), SC_(3.98065243678652530679562583928563238573445755920325670751636005098772936721865031618083662090873238650434876181387977561300938564143022242628818771049949796031981885843715917621039814722880110180807880353179423547796765769140998851644554792404933677158601794730016844202445021848938402455820099640791660545892630771071666346567473238325811546810791935690126547720493246166910421170649183272861254531655751957034164881374278460334601212695923927365849230430783670359610897776977879741246916172808908689e+02)}, + {SC_(1.08955932617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.07747256194243113885203040297313895556085428852551611711155419564211506922915030780145423949066335564339806351942173279152603844639865708626284369435509418827818163537081641943682876532495274132971730425754987902942973588471091890601320158071135248015690233223958478940459097987698223131485083572666562847234820616407156581422320897862447915301600030652492731470663247160784592141722318665558938527718107662325117911276078258478060384268244801900818744085850967208922319561309747184331498607713479135e+174), SC_(4.00724424259080899275397538109311439592402143854607985548286901285704407355766243132836246175216995560277650826839672358848994227274861071350129887754145398272622904557852220180298232269336737495643739367146692042439940186771597207990128550589751087652655770640311810676854992879707004269436480161814129573600232710135673526371133699418992323131557549743959446123917203316544463415157076253667623706481841406329700061355408235433086573766983539322418292770466535069398951154474788177787251236088223928e+02)}, + {SC_(1.10545379638671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.87227475922430528066683457501038039731800377829531631191370060541332189739848568983843566292085906872349548097902062736081335470494263317964978823818253886434354651733415974452242957678323044509043223743842732808498552011499352567002948776936717861071895124245454655823104494275748133952764029853040365521072682198808090947230180891885567723886848126500833318953689991957684640565104686277919805635130003428277463962279583900452292688059066883767252042026961752799826211807342433272535661902642560658e+177), SC_(4.08184715600321276911551202135028705535668959246517460085918517033156794276522217495392415983556663961596454834073539466163115140660260910712924882902401214455183282921081456551903227551122184800224747913430902261405850063460406647718031222060424957718291264904187247019707313522536337186251505805557580890102312193468916919434782659948124963980924145472808365004066553751261152367416034561610490221397823106262088537142605217756024887372578075565606914445109442556506858864414839122870155204990670827e+02)}, + {SC_(1.10774017333984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.48596810472108103911498482391077005591672177348146888585874100412414421115200144529572266177869171188289566660493506751163640303725297195005979828119098281650113045979402683887585427807796758162170390373911804746944804512415197933992017332855632322767000863485395892727404856192927711848105515693614975236127664710992118123612438391254504708081904160476013474011504675576221146011859598408566925427571553285299222843745987831201133272612582580336727182010520178742275653301815798644341813060791736667e+177), SC_(4.09259755038503853019497982483630256442577198063393189935621077915044822542092739433619777570961450797852365979698027171593423652063447497296485180127984842816878295603632760179314273261885697476586961945221346066790028349431090187246646455302684385509854393456940868355146420343571892169692424003914360371046893432692541229106214882216832135180069655684513279847700562743318321610726288825126718897540236765739792248697775458869192865519762083790491292602694372954887693326625339263643490793482334838e+02)}, + {SC_(1.13550109863281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.65706287284339161473648536938631519339023293105137524829337353668507406650913397434694757238066470452515915675294173592661278967776176659404173138943660488565080044984558460065204526764432108876123996922254835104918583047762860904504550802483953629975101092462727722680540253547476697448410123852667247592575723025426680351302180453534360531204814389542188073742591558289987640506810985842081705354090994604111008304801715084677651387804733695975753476363715879237420498346497275997672732022426979799e+183), SC_(4.22350293347503061210907857753154404089749090555816284618619171028808816639726486694741967621468798003637222773846765986683614652789613176635150938480786422268711789477790093734455461853171295566915024047236178166712259914036169441023401526636005529498366231446006034880000983078476456327322188613649370307361386685150088028871847824392752437056572000056026544203619158103091287763011383227379982322109552391220661259085733791648669952943467336955158379629773254647666577176298639938526736802907171602e+02)}, + {SC_(1.13582794189453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.10108526735402953791039146631435277595565662206551241331004276219808208674052659823341551812315094746011518898803597116792210237596426904965313808443513323768162824362993801684712484027959351356509874879083866861136481802056936998618606631917122909886339065825277170238383930682523381383542053429086426528577100238598061074664662171719324239918734496557442508152697613910295792508574304578410047341432410026951738013138207559657356237954009512689081382449079729326306382957245187425063896671331602268e+183), SC_(4.22504824154378805700554761248741137838612335403095564061866846562696448056142283164164983876372066707475090838512513042361061186540149163640088285999423330857650196761700235637105528736165436074717351229838854355019215378585282287195880464623705938056537008553307479838911633227348452874234683972669697126776155473743188764771056778452220553998838745031739070609800144584036111481713682570624111635142010984207622020111453377938775838882778749478995856927714203245407058323183124080698207200648819316e+02)}, + {SC_(1.13825653076171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.77941378671180544420926592611394626126082262254572657339771165686948156653641087051493862138255655066000194932072471732158822591803529196848180119329554177268058395376004128960034067499293883118165545257578247062452100968908253253069115952104286596372195806398690862044722282190648245323573975671379228971127013146056881758136620862355912587346738573824034837965312980444762664158326628623341312238448856715435758390079449381673078998750173842552298414729424709689176654902363831333948257583776768019e+183), SC_(4.23653351560151594165888093993712385438773385054935590225652486221893018742900257540062431658397239750958498597461905765829277977173095756335813401723164039140324101052486525141934884704209020119202305835310841513791818420575739308387773213279373033142532298781187226935729515764776913232525906952787293461313689140288721739721215627507636968964154501462538163813352622766607370225330666396825244981311233504032950971781450249876692755944410545529918334138056528165439059929433074876958616761868591807e+02)}, + {SC_(1.14133728027343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.20128381223634428197091796398616789003843668299989968556949803261896552701605793178360827741974132313709592972887977386657200538762362643339462317815450734570324415802145047648636478704502346354858408114959842149426042695952544633641388774410223061144535611307529312409957126324762778447558442694304245141103506536627024036565717349803769829164443717149587697156631623215844566617148944231569472472860518187160228166666085439611668440288444443630473655937604179957821087283117161427593928897439949940e+184), SC_(4.25111047259066382143620883930275143995665817329529583698980639042108318083301195918813635238683737679007533880814153961402440296555518428398412220088457992794842540545463712953962607656534582828634465858064962620323309600444499568740650656969574855812201762613515614554999691514297179351160299447307374831534802407922184726217246974594531601638887680998261763534891751530229867605259341683914260163228180884603624927038384491395112235360091306834514813430604092216292868418303964625689842660750630515e+02)}, + {SC_(1.14467529296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.04045082832484686610645760220558090416853250826100285492917004659321185791955491919148964014082437989339595003320299344424165419532555701269755569711002137473800445460515985649568538806719901582877620115261947593301192361548423788519072382988981098216887475132191969300597969151487232928775921578843526790468838231802411859180281195261897938414466058376191590065405009015970193360098989276683404067535917028291129928177148037226873370662861577529471516670224930408261557313103931378299928193788821886e+185), SC_(4.26691412981615824154288105659592803753603572241553878232442275497263040983289963012587733051992735262478420570088481183617461288634642827025789213176219751425369327811985669649799788291195032622044705405128386661000384383715807966929792962573104177224099979920925833037813171378376567888039096474303458191177510972411629783089166199836509767373378740300063250542452144019623476599341805708964688793180639261025343058339134833364219384862813076064485266340747011439506311366043277995857458464370333769e+02)}, + {SC_(1.14699859619140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.13312555620426978634469842284764916491461832147785714289728903927768857400726157351397438264381982921791859017488027582094078927099048614316743515338014768397045642974722610101439401184170387881494895224693135612934290294439442620044185530024023926782297514189930195290392788122595942308993536110809354520657934235626290498025774148381048574489862472577143836610812926369902808004984385317721744724116864647034723795723574168746366964082097816142051361582792718537689331756674228416478210220813709206e+185), SC_(4.27791946702565627650213115782565286494068066394598357922664668007996492330186613179530827924578785321849504014052092659264394626596036315010545631234732239172956993367997604611240447365849650230167388400446872225976725574862271485612317063690461006283602043150682205419102299886717033451711911162645749086699338979195203863080649811292617625210381547383845646694925084119850569015047764391372783657471277002804567950638827133054286849646825252237510900353964516376040460413449749625321777536043875243e+02)}, + {SC_(1.15713134765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.49223116856003146494697381966033823617207296668392641196499793635493336241838893278190357907475413974452678593112619317179726987242261251024962055627141948167075285577628052293851440779664356192572239188393328849786147102590598944098334624116694850876149361211327243825982040457541826200103077881736562910307365829556270400698212192314806280184857209497735011566583055678636826459949372776959286993959413843814198080986168109602960227129669955426350558104792812079619980678343714684681596203796329333e+187), SC_(4.32597279029379451078593933581128081511490431848712683743604931167044650674212475464960395190983992861152310130833947982104077931178608746757099659858416768185195633591587544829826035892370886814261968182096544111610546330820347226310635375866709550410797345342869123549502439902598672800258888282098935849422214095877433979441481096147465685950904792537563677141752949715927180120768645869713001649854730393722803695610051421698543411564805843980646099151893890496122211987074355412172028306410679216e+02)}, + {SC_(1.16188751220703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.17004446608904025608956496086628977574244437313516084332425830381370268660733327551254204098763877744436828404040989229648115760372924431294981835591858573086018437745897551811066877142630871603591270037393643754192024624167794865248821435170928199818097473864571292929817439695850567055069753969199615466994134323867646253188303816298694473024975589996825827415809368625547649267047562109751883464453193750244562028761335603498989727176472516538335043961991364219607176094902622059113221775947762645e+188), SC_(4.34855909339158945823349820733929950349328535737884791689763526651127982915961536377556436811553900147283434122632407015715400745873104541398318617580807610012827585359041446025329306346198773919100509217093170344803198183212312808836417504407367313913817722317035668240152089356999677230898067003666913737488729407587241125069849570821175848493118175186198790443922799441668708084943400954084029984215579320457691442750697630580198755156881925172240404256078771322469263426142721875010754671459082354e+02)}, + {SC_(1.16570922851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.40887255208281035867750704559793784417499244704236090639115076261045008800969724107997683190847832743574617913246655753127914879904681990364453437162517979351644232747042081332441545262276057551371652404822199613409214559588045052276658580789357800876677593311210082294744849883444811087820486713553890949146749950847472728950517582710277426803043850390694699556629263302186403234708773874470798206961167419791224303617417666633141661501408526909305725836200847602479234229829328153080627125679195420e+189), SC_(4.36672201575523456041454596536294131188781932784084844042490408168204295888706924551771855866027585571339765005757839351190007070373266373376453004038782783894056422405388094024617846764363113495298765208398700982742864644266800600495773664100844143018356916958859846627298641697934002785308101760897033046115657677245398833181741131950133050595525604769040194154654873993658232600817690590371948758209490277164629486699672127013118904784662123805952903357336299953693596564697121878093990337272043475e+02)}, + {SC_(1.16584533691406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.70360160259213753789180100158348972704576720287992989634964787772507443062665327685295219962719775184838085418515144183797538993901223193292151724442713503977617739966945381610589216277095340002048061956346000071155984056559048363069690595122453397441014241313190961619336226478558166739503213597425238986149437410678144516877244390390160916975560304961426108112721780487702273801885677095315908468066058764174620472097535602050048249653091958874775509693099506609607290296447933460161394019457708573e+189), SC_(4.36736911089557776411891347841248347848031265364008572962199032596341167038791183474041518273656653293252565066243195097684826414796556738199006582195423116005275947247616796730413120016738573458918854386521477809350946718964091994654562515406880132659358724778258614488447743477560823172627059605516420932550179863787488699611866406676684342910878712865491152162891033389556607746611613386104264195045516611245935760714254172618778132968104526301772141480125426973789401263825536609971087974024055326e+02)}, + {SC_(1.16921630859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.33707650511407420339720591544677139847583440499240761893390249300527092433935854581275726205669397537372839551295128273819720900014513423017186178051013750954933650355001940598950197368286391976327871972028969333823756465998975685045529505945773065177909421471456427624857355092428334731555249208809965064364094132158226594839371436170466320839391535741577282604860593672817098980913333012234317236890260810093725541689875452569603975430322374926968660245673621708220632501898593222023384564992994520e+190), SC_(4.38340068460352593041853128398360105928372614479246929107888855049925797094356741419067330097691630494725972056058175798328681520652011827206495283369060314023599806310999055941203768025962206745834689469648285266927418537837329482230448961762068277050481488489872845214734927589532384371671272081923742143052477808992121614798966259211745609582920211818864135428827433532143665942603072688628741001149116323277140268100088017582305707744386004256033001097704730732492079105323552143344930440012918125e+02)}, + {SC_(1.17668090820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.16436490634367457798969750472507392026424479360050514672956925393468088356944227288957960978624833220223536496686540033669491596675368077478252374205070592825601621229386491389781842787218977092839609091242493520304764440464559175242982447426045947268234486064089094903055739181013759335711336667434681266881642385184919113676589299554818928170408258560947548717143223754667038751663902597826194264360479949396124241244939250801810083578549044842207396351436607599688535139268430369966864075179747252e+191), SC_(4.41893531702815812414965384203168023987889398681538063026154693658271608682322807825704700384373771517078125781871648317118079847815449248479221733727535587299881523499896203391756400949355697898659418300868115497212917024361805466777459363263913264631478385706799847221495805691577217940431080121283815839824037273676766871422598696398181609697869212484758219752582625354087099818585762706630822257714667416871662058108819315572299699116966753535175777375871105007396235517510639819261601654532267931e+02)}, + {SC_(1.17696136474609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.33136148515454582979959568081011908772158617918503111930515858506240629365724820844351135672655371911589620910537818155070307809613339141634247479553220025060180143004127204702599976207613436673974531694360420654656839588132297301151502412839329575987910322087029926071019568592116744571082898431333111905504762084466446729849239392561227292913268011656748018852284681386054172970251316146137013559811816033850454465838166204220706130920291379754492894047646055538723838670387033963929895319035115083e+191), SC_(4.42027133691601559056083311696047274623212981995072618213510081027379340363123911787208441948003265779667819818453619654305566790631607024096745298815674034457696160266076574499804523469503682609205909627495942993957741006720611657299173214061894030777223202304802478730149557775485539259387825988630334751560348958237245258765937982026877868576643953417750759966107069542572413459274494064352879445589426784193075431206977621803993989249432778034910997867087755985377589884143012594270881083251472660e+02)}, + {SC_(1.18076934814453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.72865474108149486484131649933421697986107036109869076163957638649793323878283439520907274083593174882530213286554649766086599610548564958475393561154825029636000151810254069838545891177328002608218784675734636331668011385894464531261362321953282270567111851450467493715732844456036654916421903856878879596740523118102004191095518649315568660103864258453270962561375460773293491438638621875417070817219590779057730549958820326485137468696496514038436058982596721528464669693294395717162069725745256981e+192), SC_(4.43841818583339162581867662762709454336726121788332931173651704203372650398720454664477171716866578710861655263311707449625197001412820107802142184875241487388864265356864941579950973863709754182349497752592252541543611466717426169510561909866882015459625465272976349771465429528794301223781309923510600041286382573027526385233354314543935944721705292254115046964467068330460745455746895154715970809904280589133315315700065704348554639443125939821687680355150467743612821134970987973815543512530140762e+02)}, + {SC_(1.18472442626953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.77720291504524648648881731322484100687059774555915739315100656823540818898172993635675263351822116719421666243243708127934606690606424157278441104487199775021190355621642350448908747577517834644993210263718823837841735738428835524425698944664829244100612022121795559088758820964331645610795652278410378739312620371379919873738790286343108171703595146089246289228262428437231030391173269829258204101128620174289969565250721188744138165202298567490410461827663163938071487238394441807977777778037365596e+193), SC_(4.45727906714004952352019411516634447921678793175611636458452338500978153784859963484579886393028747524684591865433631006500528549166522805307435775403368427194508889710146046546106944074915606019670019379280979583046743574889070267555995876312413317157042661588567223578199596081826413419005406805024470244494357125294679650565414524294146189417694990115182198251896822853217018815824485438357711253540724070445305826662354765827560513537279465672718974157490136183898221571737838170582599554417024990e+02)}, + {SC_(1.19621551513671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.12632460072056672164032175554520318162299060799277652876498432740921295061160079105822462145376124849624622687411579760341465101610303982515304207522762552125894404274918264525264226523957336093426490379004219435451621638943531367592280530906177517166803463541441327839626022737421962372018075207024290175482520455052120192929597813052527550002794190174032632544486930740302340939910993070423587926847233015549678110022226517582237033975197392785613541526775321490051921098223435729241747842941146171e+195), SC_(4.51215256184495322034814640378124737829492800625663972702036194627848702086990975750810503559665459574774331742546372774793559664565158405991032727270850460201746748913582497642099176940338919061791599771394490679379745693031400660666285823647673695113946938961762603198282312107140906011957587528723875098555862871256384168973249715201946941321805116062884989338421373287110592051963072961564395544603178229984614661967869363859781597128577214062280228875210736253758397009188202259833643195489272202e+02)}, + {SC_(1.19934783935546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.08077348980552577467799856966874129806077745306757314546694920490194417856677901819475736634867301166901909988147939263955015936935919689267169485903374114723707602998921735669019042728677656713603314725372369403398031451220547520453211776719880376414851795162038306066463287623754670799683004884689855851174370671885606372875464804741979836903994178603002102875553806789997926978261345994295842010408219213896213470634337673891969902678967548285517286858628971297495352901951936750153893953774431428e+196), SC_(4.52712964778115536560754230408068032338466506146945161545262620554748300192994689428291848554819378930240314411464583012351151574447207844853748411074539615824089046068257277315706417665043410755314311935647798326027262205234438658823080124151394620129420221605103927312207324257226542937647783463442091974016434870437350688774760834942488741634052639202981129175045466436484437708603756264783500957174797169707894265058735598260079793491508863643870518850769205134085196507405869611056518147486924823e+02)}, + {SC_(1.20542388916015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.47288637649498397463490584839808929107344610045413957416509965616411662620754492287607910583742178882187088654423261931555880460286694447856866599001736048574131286667946604879506648193686097930960676885340696724883366021956564581528420088383402239724521544830822239308580263633238006859445926301426174510863419037725437725663074973111646011479308820277940927132756596393019987806633529537031946064664529736664092175542734795279360535507481102660263101293210183698325646931639087593132760324077862969e+197), SC_(4.55620544640122560656843437269303075065759606287940202607715986535112373369180268980626533887882325748641574439448944963285240352650449345780550030808331175114982871029059334326943641303732970341254153584628471235170271685421005202709751123245502599148992948726707856226830562659670530825796817830667445375018048671910669419687719660351835068592841089533938210488017554586164286630187441895469010537995053529500125516163125122374632192161521107600865323226487233071977031380091577382690495107251966404e+02)}, + {SC_(1.21173614501953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.53722657705535336598910755611543251746691532306825212306289845173739595441601211505710512047825341157800665236161940268385049544882426969081454686616468509957211832092624454413299258050304111197225197187190443664627667758746226770246015105661635002229798824365375648042846663413319429415266328578827921576207322954591201540697120246016313190834142152905222425638964983155626433835883759265384755132546340074094818770542401996198591013257396485062740168333429750953823469547333066243677389492493564457e+199), SC_(4.58644413374637360842882413286627596832863499457353684912868817120391985305599507283869864214260994818660446133329828451013576840529769639307245397303177103244908030089963629886178768398852530136778090115640663528597306450749472779155402465819224142729387316405886579895055387969162139785526616166638097094888746274359020949306019745431091550215816611639987551751369387900872058510354599922736312447511389768639756548163994906156467435694696045453497864949553337399079562660304412087378134212260733110e+02)}, + {SC_(1.21262542724609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.35432441180218176343831923076856165265118395756366996204625441201239105669269576993661638941379506498174378656574543373382874611165839232650776306884000449853450112297696341788173355032152416931453842827461866840313347597528545828849858021425852678245417948565635534689873746932678010124026651642422953325786760306787737135800797652845269173930743598559869678781520051577027626603211898475806568110368381614142944404399209403983444673817376291361933450954383403082070187806048284861547035093744280182e+199), SC_(4.59070687318157914191312289256104113790017591983647077164852830259422503738220207879411420627809186579434510388947909828016836133662026089031636238529376889590764666508860479892805941188721868324869811209095998124206334784202957565351762618774082417373409488506035230556806557357970542736507765728847754662852921332166714356275159535855081888919895777077090469671053802195518901849564176126196545818556570653046607691804133337133318601405139224802870785218317538354423428299518547257123410617425099304e+02)}, + {SC_(1.21494415283203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.15659045645647046879789461950797822357842938573838016664309396293843841980604659172259177724374568231319470748072942100536548136368379171440824838855290513648641361050758454333621494309287273243466778051219672076014031640791247407147219190830952819786954646670566105638659341678686213549597165653636848258020869286818297989326907522574233040943848183902377673509100971107310809753002152971066326373338686451106204131448714521581310850297966338441125873250344288579039624357160299342265673072370548297e+199), SC_(4.60182467180139304860122635340092579968601032403558915020927721877159459605903133537738872391954445998320391991440475148229728954027615453810184757157614020122160516902468729438231341075928619332967049460803204971161325803593284141007002713078428540395863524949658701471206176396484172048956382179728957238338848880618925905859877186803479300174390555670148154246499522320673034317988917032459941542102622995467992685376716310001361008388125079128656241028950167243444796002107206758405710818162522365e+02)}, + {SC_(1.22615936279296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.55891707343890861333107528872000125384992069081107343075692250198695335778763764722972116930389768118040284757291345971617866950096348397346497109951267659169682475577409416433777889634622639310763376013335877788979692380859256537584667212808804495473460224553344188816668072382698675833299101831022384552940146020714691250632002644132024347461830447762479310238845499976285814306157714957904442780284713773917878711077207101929047255990870835943667110358440294137462882092311108193751971218457562285e+202), SC_(4.65566180181308601687197214883110710267518162901612389209308337182049787592884988508778265520804774316739377836913985521338311488791870394377733839940584935402195196179079671746821601997600647827253159015330050423400109910092244261447079111113935734112772405809246653266606532893097333263689076071768554831343218620103768759172409660450990819328350346129788218404401533419506904914328984508874434198465948905945973422531515198617482429364905131139829112167523142136913416600664190619507696242221207844e+02)}, + {SC_(1.22619323730468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.58449866440180470070191255291350578276430677120008207396604062633952008424517277064268593796831554301512058536322739058255100951061978536288233652914992687980604849466144619188110648281137162102693237773617084748273740092723387623184680690864908739570319524168152761116810062579619604455411809368453388103958420528285875094359460227675579527718338309980408778644406238202194855287733337804770744976939840357419181751496785514223664953084095349641874496362779033280232517588654095915909796647334946538e+202), SC_(4.65582456842031103982765657592733768436482389802303278459170748014779783413746382141872146073444244659037135875051706529023323727096233443454744148765273214127870255401474510571009246531321472548515566713289733557524897722853217818640869277820642987578998266188799347645977999776519628085762656691335248444257233855005328228172874274722463851122172075368501924792150509246112576538951884713556830171505250189733995837713742274803980588397937960976209690666059177038355125038075881849154482068166278949e+02)}, + {SC_(1.23799957275390625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.63544640277139549137310217513566911082050773760629450920347694631060367127408233147593401766455841201118446415408325154981230715715455491324204261136261388172357523685001500794964663415016270284775184993907652766125760462281193288661163961171640181277213188681876991560803305358808116180156366567258747830621553185324244095962080075838713097874670376549945099108644580190029004807825399023241743390345060602994050322667462629590994560048444053441040307609763036694175761903442048956889503549495771475e+204), SC_(4.71261091476443044174009031550121164087922587248538936531553670128723998271795627945494627931712563525489483471271490199751464148211247080290612401958890319692956635892067105806772287886971447093677261959379313382459502418691195246517599651939336449072101970360321393345997029507482162837462872933987224296207970512090035167652338412089600998866394410347174794312023591105235384454850107047396137050711372465161615320162198503385589320814580402754630303852772582439987536871840249997710619967447849769e+02)}, + {SC_(1.25180114746093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.59164584120759822433729640121908362404382528667366168016211012136262493573796416468934454080722442819592729366199883974592653373814997482285151144183211503181149877896916490249979823147443770241205010083434953609838501059082637860084473488684268662196558549799390015357307833087293487106176398922367044193563778471532663491949066257470709103655086794550502277091853533121528333512273743787909493277348483131594566628676120177624493344214015792039239212666312752007868221875289142232496944883926770983e+207), SC_(4.77913724798800681955430578838170972776147677957335440613483895134458910977979271071998858025956271863451521004480877448444705502394603193543304233173262957178632707280054290322433982514447252840302799604750092243542587286126008195237116029804390008945422461841858714922171644469713848101479824758205483289065080762811556114339695355323157367827915066956513303499241227723078831912676134488999078147639237638181261071999491859319941691836054037447435054688905309468026211939592743544705891962656359890e+02)}, + {SC_(1.26056976318359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.47944530448670733794842725159133200821775724242209804922675101264218937133297706754867035444908415693516495267595479792500076322036290057140288518643332783148976313998913201844454266658989159411866622584736805756712772527559512449155625283947557356273137882027305711821105315135660313249431474176183751563787419519341798335634374293968251313382364567201428796735363138379588083817115727239764608230881909271719091638818665238673924844519813045932365983949672602461525090884892917696449113427473432611e+209), SC_(4.82148319303369440301086271858092673802618004483239323480692149410434318394191573757344985828781863681651431261736606862501484815698253191362354120841363869041301488984529555616556948242927585724138368323892636782807303984172331318566293299177190965274838781586071345777819043224174873310548927132848686539982081541439382896169634019565835649734472184794447451074315439663907936970503807173589207462375241228602526217220948754246787406212838192192080655949898449917589909210977252841445312992054564017e+02)}, + {SC_(1.26528381347656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.42182663319913496237126334093835825748694886131424002980650014347744295664965549494446481361598225682990330744946648677685520636990135864919476466055236702155334977475359346896462063239402055686737503877208584652625271796936117224137072133094323273608436610195282253939569361186031744098676026263896910237380735503288821386135118854355488827227941496303649637517454456250708426963234851364505960880285882115055099626845148663492195515897643185551754721052128339042608975235122678944659017286496904648e+210), SC_(4.84427391591301650052381022200108849023216628100423803087799853789983959173696199457369094464401636461657272106469921042963581927578733185196179968915269871290038406151649057065311629432268779618446872958199782490908653105319829512103019653489005006190674262042213969375938486355012220489341342510995564500736624365326611243292379195043284007699636871863629074439671812757434360843610488818401522375571442927353714337151485631022366803160047666556979339491290026656136306875038147348360050502176202422e+02)}, + {SC_(1.26626281738281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.88862751617505851662619430168993877955565535588536451326356637770034582102421377462236676184908641703483865628055534914138322841803124912110919782553953667775847732352875682462046577536819224779680333308106095240747838269420296233544831460693531183439436736036087423110649963930611949368753098090117161978908560789271073011777487156058298740462440037996088447500657381730154283922695105844777388900104753928353262900550298794492094099799678328596848951263361298417073922920854984503396179548222543585e+210), SC_(4.84900925800517672664483042191143848726171016934065470589319654686496076573905490053994333767886359716240323248830372926283174229250940872975446642437440897096206643110454391026039459587744414572034553130902512860727364002056544507182565004256836206869711152601033474950214308009016121030357246527302131401609263486366587179672052658852113611361502754374513090629260124033425429279447872908660946050193375032680068311406152851252925764663112571081859290354963944257147508729494158019907160352804666125e+02)}, + {SC_(1.26949523925781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.85799885745998920983430388775490153127925068873532729669169390918617254746915773463320302282739929494601768464003339167247200641328771725088224797614495744050986505072566022621054416322390914801017366050732480683872837438676396055645169732638593856886846981379591598656894739776614514376900990647800507136987971616732989428416199491647911369262925451227656600583757885470261069111532104994288570336088843258755614269718676778177306165450320965497187597215455165997680296244645872016039685454310101952e+211), SC_(4.86464954647205058932700040335704058990587792445438024904196931470213636195389835233501319979826785327943021837296462912390219851476240131715149969896721901709510374365704507847553672845446422867959018705672481025755092005636269531960624664652432950455618523240891670464839373917635419942739122271834834924041749709718190210192003788420149690752796304096785976223784765116091025926398315502702005847182470739762772788908019519409517116141829756065254842122228844599700547916445634875394905531678596620e+02)}, + {SC_(1.27250030517578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.95867387692108285179759791034988666848597887114044088866820859997283869387295514402198804184526431310068686660892500949388956183563166078615891548045187842895926680712128022081015852290913773464495476378852524420987500146395106345745045475155014107754152994521610288846662130574437281981938171901343100109693670867998703435000886741585872179739002921326486635158897103002665484547764176300773045064483556955889408865935686707701790080584648015276776444261866776987067679190914221646479689390537878078e+211), SC_(4.87919717009344131514631289579241154775821488134363277172297134078336073472950412943474019517221019752833987994775391483035469035515957773608825266476207689928976238170180329913439429207552604863895925712737510217595966475355941728504981837187112347523484432981760617659246407461153791516262864269255521106517629930470586062091530539793980986796861848687684093248450187925495436801626253667290891726247757586551327927898827284033405955483379928728052724066771109747194932351277083766072025197131496533e+02)}, + {SC_(1.29062194824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.21590360545550004800273328037111759735823539832501501238942066897011899542988253023772482607570048592073969960105247521194785283035579854537779773548296379315267988533237821307089515058672624892673123328290349821346743603749158035761635826782970509488437368459451106153525850871416146912122735487361690533036361909315075565397530552385016488129812930051233200858550863716538886393933272639841709630461564028484065373426802698523392243504736548141458108188126865314438400525162559955957719668783144295e+215), SC_(4.96707507337624230835834582593585099424292829056671491295715545791576712585483386980998849050758102873179382833261429221300624185796786643099268596081224644718649242360750271883099760637988191962094328437016890001127425992362342595015239645206408019289479399322533043610452336515295295372963558098454188185248371949296115543044058358763000583734120104467379609850823760791330220841372016697126011472003915244721536043248287088048686085570184152114208170082711831868667736655604873979138846244857555504e+02)}, + {SC_(1.29424133300781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.02635767918607903950666819307682499880944197343260958935080874290175957238114807519205991749378714397245455234462488828189263998761591993374250731656398850403654998342002293021283861294300231498797581907209374665981666986913633321341249973849869957542618774974494400113058322106941110881813291254335466566510306827542788588927974700711757307682138211208910182197058437214618351934024970425963238905879640101814733814925404186995847697463910867546097073029931711592903529105940185039158291317208553695e+216), SC_(4.98465739897072943691074716844816005455804262525363218872826392795772484833822830748945444630946018097946539821268771767792779770797404573656853521184140322276370394751712473314374988767734720967763623587742850797176065743114329696060255957832009138469998584629988890137927939070061921054478030517395210480900363472040704944129357146227657528620536829990523249863698565753597657087229610766086571583276695990881406923809046105229072143139278550641783755595716827060026398988355154407299754484782186800e+02)}, + {SC_(1.30573669433593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.11047037112930704613427017755396345874582320279600548545911791156721430660763403861749777389079710057296525391370371745105912549823698755130456815162941916362515793313915165615809709989181259005687120825883272205574689531515756961468600954601723111884113118157764587818186921702290723851808779851977542885044517298186399535323045511040607831764522190868433521573940090638053610732273845854119620294238719238345314171753103940175114885965667184883405140793980515608522435245655397470874175799832355807e+218), SC_(5.04056706138053612227836930773511019745903578081769948489042969445572696905529437229195116592588294463340493654733509712278887972981390782991171166170630641712428688205252527708212949364619634081469924129701596201684932939230739957616882108608304370977642911193102652520219566934599078289847473327558502484550272204555309698138067742627419911106375792189070578053438859727418663988163096021313840652515690583408085348753420825363568538804095479531437589259166639111370167223851459391164324546850328466e+02)}, + {SC_(1.30709594726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.57198657473474022361078506195683658976042521298148785406897748857331396634152320328053708095932878868850533117608441519872697482457770382738686874629509079054132087268861517725301960152147300248185854688387424228680961066115514445921170527683726157520838569878477926984709891047082110734796837300766043108427983705112962391598568733135510506107054537900306279418705793740509183901597123501585659962324908263296924279890499500285778556771339753879450690940168946993548531857563915771234202837847081901e+219), SC_(5.04718475519421475308021587903598678827185913061229094073537460481591284692845558765667474673048643744759631465391904335287247101873423929736288890690196047120156062961523815762863551801694694310952078650695378167643471825358756323245862588723828845543910649902448106580483748881080017768254156526727494087330413974462259669018702862098649925680097892943790873992309997891961337675649350233071867566329550971552983101718088589057110957989487091892082611974507156291049908237359197522900089005839019441e+02)}, + {SC_(1.30757568359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.98563686705140334136632420794426063419420819635804629691052815342827217474339676322757056107207821055631757016119174791433473323461048935533766001308854797203996184185053061166415162970932624000354196417460847036009606078854375413399147819888558836693415442600056842328952139079661870627878851376683543858361948322311963261616184567635027401932771810155778205621899995613606606027668494150616534496416237206153201761761040527591641945154832290213681862915035222586103839425746298119088508843620302502e+219), SC_(5.04952075068201452877049402384085667382039712175851309712054733696966375348883144866797666228028441956440415208433075850847372002223974621757009454129945034879526159871514410915165309930581213628753781515588339209486892809780812242425478944786501421965168807767801454281400629080690695002606343716236172309756290935605128043867730565378035993871825892925356453618194750102168085639208980352844768548493214808494473737323824092555994291894318005736307117437416184900158723053880736848642925975684657313e+02)}, + {SC_(1.30835266113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.89884779338659572340667722627856777950879031841712716039944733865740080403723127724238455822688446890092898714808084039052086275943289859165528633865210355151827064006313537544100159003115195159988934635051028734240337971394218034429756626314745504466543096666716942769105496284698929192456748358076397742633138863541903000820511146383060249820242564286483301649786212731196689928975791326633683177093822391303994311405487828595741176720301420042264863778307503705534200433933511243281215414252329809e+219), SC_(5.05330448711113547740084085728643393088729057540142359716861526592153900166623616172771839263187289188475213653963382206206780656792607292391915440634805523140306540791995474412903174717913885487108082640648389957957627267579671929059416203047208781406829815504908537090233510445576281627930667285757767870170733774400733629969662813491740398249812314185189751521967234574281785209394751043973315949093403987343092713999935938686179092919598408170887392212493275912766983779341242209651461394332425019e+02)}, + {SC_(1.31600036621093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.20430297073324444437220821750693753464613246950635491860869524757996034204318778211038386463755184564532939798221167016228509891432529361310635867471398173227367796445371474893031468325983962612610083622234476617695393089714843405448851735353769152837451722948166372435965195916922392652779024473274058020281308553443569989036574389784227263322141079701444013212972193344569946443291355397983426399775757361741547454542158519531653967093517404865222607047227338674158623715647518511691498640412293904e+221), SC_(5.09057206503737122364979164051658316850633623031344072914243731310808350391269043112269701381715236707083042095898779601737200121748253088388122013559603714273813355308810812702883502878053310086795630782520444428271130378445215951339280458638002178123797543483134850833815286322251157103777905455496112357784075324808828808840502260423427623967588990828312971943416360309107231070254504658347786028595677275135150700040966302169892714539505413325343491586338857506633444582388135424475614550206040523e+02)}, + {SC_(1.31623291015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.34890153554071906149529006475856843643751489002724557180732809872453487567537580013324845735182681364623819603263290560087424642868366952110053204940750673788040254626990523613160924817804239450455915579901953536902789993286423849735969007117782833444492048897066029577542365441137392306949851570478561227799976033254349445806030147073802728868463768528161767069029113992137784684805014331876027002586606955320060364032209948400145502171437322646568432969224281296125331077633162606235130134587377001e+221), SC_(5.09170596135542071635485907939507005816072655383249004647616859331032889824319132710022885781603007135074720366638005731562930984297217884937926718300870954121095461479959619581243107681841414976524250071299102867834392463171886408570759649746718487447920429310226437182653719834942024506857917378738160034880710110849878165330711698800626112257295745469776597348834001244276042481582814210467327983299164470090152686293651312160064867436343391488754391020479490075778582314493149770434063452256141068e+02)}, + {SC_(1.31660949707031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.62080843680019919873850576732273949718248132887610477835752418351373087232255107303429222446767091920867247462884237784576167702378756866685787235723582082194312231685225050220076259431742496269643395666931926989161361245494650469473168200197681613501338828792960004222484214787748680532017999512808760847668203053412185342595402398335751175395526956679304124366562325500718958908066131857708220793387119393581003308929833214831141006329804253792611565281261549823997147097470972678670570753197264921e+221), SC_(5.09354230611513654152529095312610350686660505355384267208484258596926205528732725328825476978975925986320768895807545158809407801219620739849964863592926642717506315967375728028495669860452401275586479241959878160888708620723000916642297309981107745103582534014810105303665195808031508715399216703921652668968868711979325649694202907967900674700074630676585663286896449600740805134040374062365773045491320099146046085609996671401887335881930277977646522083923031915640684425327783098948145569090266835e+02)}, + {SC_(1.32367004394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.07974731828554602243598676167524954829604432333249686199200513337750808529123357340982668996969696862888447969719988108175036091908061220618035384938734121256991082466576516387811186986231912523022170688565161099100085850104388725471729075526067491977465916622057303317019411406913265546871133783089297807452484318205531517424877673760203009558823102427187524205890103762796000616913276792686635297763247418931989301460494127323302450925275282375748876100888627116605943075436310393738440647082870976e+222), SC_(5.12799152164536461677625508098828962831750569823734125016345352967428738820658510933926540604886371746216477089640439301522969304604479689124091633260606915614563143949634893714138251907868602359172153932413248182308174356343968882434211883450893172968119039149877442419849286186341796732351571516582537288352338118048183842085010326204779953835882065024477537412670008102631597632482607256740792941129696039209781548558122538256573827278333046224430889866265352039675318823746384170099150914814896127e+02)}, + {SC_(1.32803466796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.28070823491571021525239010673229927401137947201366072881652104355715653758563674368037423427825943179632334768820206990671067682112131868828127813760869517245688619623730353791106389098468093493314257541923738404710042820138015545902708203321078405936598569492447767787524108995822184403855483715577641469263403120941922738628425789926464726143448815667666101785768205827774691372221061087963997751796163326855898297808570953176902345206734136236011898491952894937956307253754479421600833336085761764e+223), SC_(5.14930594209023937095252118022912016782660949860856616535319047187025547160832057314457620561305811068004437607306774351795320211730551561202646716443789266629935182231469766334508684080596627066111062924159810854422801600568899593348352290940161554513014104643039559656004795089721242595064414092021121612389698714881600790477067081696100422845333141984137261163653252618760353608323659593957387383454525558195514189040087115895303172455491261027290336633915147987831744448660710264647965445876368458e+02)}, + {SC_(1.33675842285156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.04487592056823951749370118133346032782665582332320336770393703280563240947568243037471203707679509318737959335708187651456879316231500557939253820253928459853161274686018563956401269481831555723011013866139819838885243914185192310402785776841977135186839219448331005504911009488722399614370734935701947013822011755227568394117465381976156353147368926632238096446199449983178419653533485890194760272906098477670188283919492256089163777064921090111092199141029427173806536853519859936160629847302923680e+225), SC_(5.19195106075410034290860984504733637153218280246717993248425635237416403493495318589567907863597845130750552805426305743614661189702147283741813335142860258509308269781662847293834728595455208727081878775197451813729921978144441269605318592415485793856003553608714984355030531049414976690328771919030328500222259845443398300762464777894624528249791401507146478046353231433105665917182756627015352926874667121048774520118948393190128289917395422974633167351915837084164576054561860970867812507528309584e+02)}, + {SC_(1.34035095214843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.76598204812591379793876223679444078853262430851184176754539163761576104963595030733709073046314624652632727924691401224493533106391708005900869581172982911504735447581738915772003080675668641109785459887130595297204140319103083013549864159762889924606591210223813780057786834462548165187477631205841284653024565678833477403213080316183580107319508037372389034956734737668256753103880241932563617233055230365176675939449771718150718882027105331966170334767838958844427133106900834468556463786935275971e+226), SC_(5.20952937953510311612700996652581835187129670670525219305843861214251304631520267187932335943317776423702990089389840495886950810255579571748485262032805903168965775875734411670750100550222166133984562540778446631872610909260428625472595414222131722611295118606849796262580383861869373865597195159398022742273526431038380628536123929447576022776638903828231378868581144585096060415344645824863351043374712194542900191117931870136066149529632894584675792095636941183422988361538418622753330375645025189e+02)}, + {SC_(1.34275268554687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.72257672426884828691799342524423336714621224328121292332405965713113755032186113138530826219867084086181998285740109655389231920400434217980485240762630362516318515206518608895731337543107667246119736500229194697367417769844278581944659860231356492841519374601754707893016975392475518372240771501381577105305041110485323518528774133871865878090055354523988957242238120540653181509338618549137646650793927327789520566641048772697724056450200705092957427006372334621884940334830557330923184989481075378e+226), SC_(5.22128650196882834780259459282760755407083189900754238934391243922566314403107319212937612503047297572240803299424682178101658988970210123124514168813678117747463815253795630968329750494814497716950751389773842284204492352152745197845477388159371449629926682349918291639471700629500236026075236784401238525544228303087377826813849169893932846792228697576558732868556129223397927663038113673265617059961650735929834996007973766584756833331457422233891977712090671035632865121644430763840525098300531833e+02)}, + {SC_(1.34866821289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.03758299144100638981185218421401545048858039481957536450374612380269573236280572413492140072301886580231441585024300960761900033108759439986269361149796275039952562150755856406175298652045027556273869273220383518259909901841567808793911274758689689579058306553540568423349241996463204841712225101660223073490905528769727834336511067903286578939532730136204162010869784842499894531704016034480810009720858585593094766121276753436879212423686669486395049415023005120719348180697872547142370502198539619e+228), SC_(5.25026295164316330412148519325657366368341934191738216538835689753718118244637948844029887933590653824478536507726517366715517280707475985040666990300124488759842843675068931885421203762075092808398239500818732566913870839631327080470586159287657640540603782621329907430937887513962909954497139740333551395157204757935707524326186810806941798522726686104974995691572341090784797510421803675247476639268699340282910305104132171213490831314692011881124391726077917804990741090076632485651333706549098088e+02)}, + {SC_(1.35162475585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.41980376428646991328403638285001046532541402055318879407523787526196609548782003540736420797312273330747025453433773859568195648080910544797809650823656307940556997217802095934416528012621274676805389838875861717386566374813306011804631755376966636171961046158493908287295098146052007262454837398730973136787757242605461232162225787818324467484620214344455285701914485871832461801535652548797585119173068598820943528138136172443348282911091890227275919280750941144920643114850046197721529498834275680e+228), SC_(5.26475496500526181283223415222931159541474564997542783891234224056488099012061586465358246437404585773392755455671466230019611455028822473946472827901176638302255322883082468946520452433719767478326435979014169829059166262878725946001872060728634606060222396400999645731037033449384300160210919895137357153527340054334814098905421275806946610206047604319348201515764380435364861087257454422699435684669676461222307408958852208149679997649800199413405241735896662373831864075082814473750897919380010591e+02)}, + {SC_(1.35277099609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.75330901893496143614480518805021597187220753373090306683623319348243653926755583883821809078252803526660189342177950736963693693418130116521832649223825838146312095865813036730649544678390516412698226308770476471718791195617123322190470103338445472465117667875244772983987288984220754698497563195323971592519002190858693387971198535601156597113239528895027697549041116230589151999239027691989777808200402329520469187931248454991509338333394196096004148435650634439170607672125930211460818875344878619e+228), SC_(5.27037520925066996144123543728795736277209313561233520628514718710667129879712146192231770243356551669952438664771719040493082214047541521130988719545217800317264354623413167385592555762706322082258567717316963570751158300472206989689724105850881671486491348521277463794950583844259767119222102026760477265962584199147543111581892773291923102470529963899022859734152285804769121827324961441111535590535592189163462395036379792298521953571645039332350187185266596748506639369174410682033255965417378528e+02)}, + {SC_(1.36809814453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.43665838167351047881636027667694075448999427774273904740299820753970460953894100809479985551588964957306960928805136469924980953880819810833590058279407962197780122638840505416894074609086563129092943564808390488159277136949221096029113036812220956185572407900765503236591662061061916852854842477810045932391848299911950430896675257899862204466940846948382906025354509618691220425907982492301908575380438135427647444247259871750976886865939605259140731189234797205329218519883224564238500581024595703e+232), SC_(5.34562061423232935236510877152296042596078022530607434214664258529691271359977729440850302313542229637342234080210374018623104298122316086647596436295244701395423805145032376676811315322200754593884339580356984239803557355854450272173588624647335756403674507959004051793289238402811538245865888546753458609705052143578748768671177989989096831031565535509057569105543849401773063950233686232012830592153145958757653871091668532173992683886080217342604942002650012032334072330469444777330514617803964186e+02)}, + {SC_(1.37396728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.57445931970806583250984507048609472939434344132943111073255083654200899492261863816284964557987973186677399599108698857436440141682472324790876275332614073610885728701014285680660939997127797911824164931280689027600115789770298691618495447837633152318797839464470979545365963361974475998077738567098254810060480017073333408534359527573993333096615594630471279868218917060537792368347184506660224588475026107066059758346687104911799550344066179802636485276455238679107330199981626929311674463083068206e+233), SC_(5.37447966206752035642162949220887667913494247099321037099782266542594292623021717676050787529532715116178887368049118780665173468283257864146805822002244854592284046168039802892090231212639806654404359978154257147248849470858213112883265001894460743735137952859232620515109968476658295957583503989037489853223771096565961197376699581731125653687887089436425254682248503815299994549638506042855321848386908912955900927145521952700624216313900629597683786355911331563926812426498370453980352772244091287e+02)}, + {SC_(1.37549072265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.44739806870853855798698202490950606864695117593043550715097510559295232548813664988316665395531619594176287444749444108798452533131857204642671369527004246152238118820312371656837122966212882675668465946859327741171545570202801585675147673421402231485756658720064030527113574783158036247842455280672211892472301354629451152297962450562231788102097454624845758954245145508782659373286589906093172497711014545585098517359319508684005342264391315711745957599603265739304655736626747812329821100113006264e+233), SC_(5.38197464743701669466920822675248386254972181676740047863698971663268651974554470534078078447169258855611630804254247428232364918849597567871875964441111795503383831166191423768561559012434898026793764689292504509729337326575781027128117943992819289247698978928126382933073763904592714881014934910219688679028640141885433509627429372941863297642735889821423251401065908010409591241126459309471086907469438253362943015748884249078474441075907869239597940269825794172317057667757399080180481679248899443e+02)}, + {SC_(1.37654602050781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.15610850324474368845825869389237559430406874889279829247883587116534495511797873234893805057999315374032893893325802128264373371567625275567338160151235408720587666700266970202844234236259658223533617213882520561768822825151625138229456384983799105486798915709188654367736214901018871450295995512195617083052005584391228662521793810570017633499857746817609313185426721124641493532532740745789683793723837348322202913340405861516351346814135006965059436198684684966069535318213110411909594630632509634e+233), SC_(5.38716747920140037545182738110377392481973607055341550468766460051014501227627619520670697473888082164744968378691388295036889329356043727813740600303617277934445692121712859838392338379682839092199608515884007571902595422688150659151926573365190816934832987925104354270846739169599050068020636673931660890078580947461574828742683524190435130009285480503000814762955133740311881081153877562610742025345655822398732234042548089087632632537478252641951318926836481942421041203574565831352909552782796367e+02)}, + {SC_(1.38742248535156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.94137449285935962923897980881150109167214923436042568057576296930025026633674343917193272859437621196571434178851106361353872539709513063363868747070231790985400509048821056978318710066219644155909699640440830454779830661654766985217725952369183140008441143482827248282311253610020569721896629147790967524890801433810696756626692060910581735656031175688825814405709168176964891456674090351340369813384160376834612425220281506935093571689423172270508239929846781879339155506616628136292925588862609393e+236), SC_(5.44073478170275232544960623750237247802973930421719133513177896493502205239891881569953226928075093059226104060234550276544509721821864387663106084487147418544635302635683849165411433837537721948876332331637692495343785248459016956878988671785418434318670591872540493208251638789808096916956075163558173926897176055610905089961134607376039552934917930006620734130726038566598550633358290330365783195782213973448681712438587824991594267676148213376734117184065384402562995236742493686501297157101274039e+02)}, + {SC_(1.40817138671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.45047783862578016771187352316626250639104856503213692940797510094367811683719859371837611948876052889226978388589671660277053201379812838972368868385689068845270488840863386270822552954623006676716684460977619901273200826351757795518310791697371917769666310875915754336145843903156930139978073188934850126108047782541958567841244346147682484158518251765192667106466135047505965766946639676562432318269581456593507844356926543037322049512536555538390905621026319426551197602354083076580019817187774130e+240), SC_(5.54316125600214799588419962417945394332523267556118090767620331268725402488585878663785109565964379443484283988603046143449079496173647142856427776395165218911751915669336253101281121875785693175978516640099613017768900115795539500296330299124520856269777844541770601480926945988230544167248478263819595774845641516075781269952172308738133777384625547194894635615323561692637434420220048823156913290124747030955807793670736745671154828320011088152941136766376276172566953679137781943222876723814726228e+02)}, + {SC_(1.41276977539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.29769358197437978289305486828405415593744927224137533421831744096268714482072595019488151878713466297195803067325683594867278144259117267669216271022979525455634885071497709052317371327844232599879493249027819117690288351866923957864254062116454398782338873217268971517767278611167863097447738261861974672168330424639605623446447709583953653269238481720372824627698880292174467910038590456941626401333325664483155084954331720654078806281686076427405275619986065880807363339124300916663793340207234637e+241), SC_(5.56590278964195363055269190813350557132353108454816850370504212598847703736686463269019180345382347527146231458086393692201520736331668808189290877706107323025923572215186361662566575032119908704324689096914199614735075665671862846093075373454056027879605986530987528638208952705784056489726487166045924339232284200052452678800617599413718428834646504150666420322421857852133816613033713612096579105911460653813008349255145140537231944689083118545750975574875846546891821496575472134896542283953354856e+02)}, + {SC_(1.41587036132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.45700475084273847824800128949600201193728211676650893383703940376296196707616775460963979387665332250851408505353543405797770371522415314044559061860640290889595020145800442452717688191084580220776684619492249010351273719817504537899153816768661850312452730900022703765789368194538916913263249469249440220255347495396821077127844614725067890479740494432586424591673258511434380055449528918178700376492848806540555098630848479504780748525545422396164312336546370069797912169798077768305656038801516115e+242), SC_(5.58124535531691156358956295727901729015506539956060851209731442013027776110960844689352660619743478047064893828864590892880111411039248744313506509692547593260858956437839183313439859676036277217218579692338253620069842885145918557087647449565059328129795916431330764520212869086559988310558135602601545039694988694691631307700471319706533106459300011127849105994462310176911769253362342042988699831723659352410467715100722497117014805512706273364667515126632483543862981978943369630354581749601486703e+02)}, + {SC_(1.41904479980468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.18277659724864023573058199938725005016703241663239935115555242418220171212135112646305947850063102485913655275051836486796200773434429814327002908164764694313054284416932532967316622256652252154918013084591713511558403037848638293814933171582343066678380244082149243054022052803338986675813327622484944489910631057012470427768696858123413430849751475434908731434292467868829860069291608743431929459951034297456950375548090246519738247005570808538267041289349701357231648624558698147475570190605941087e+243), SC_(5.59696042320462978439568756111200475663886377134996576357804457203011096684033312838694859863093553024713705778263178569957006593076761661734563525640132532452211577248177154109646786029086660157725508435204792532722710493791132947690964846647255357603782995381910697774475267480990322814922974293568357886774487856811576818597888244529153401179186252672809621345169721605047079863312166353473034902596376985804904442412811868887448608869454025892661586972785767049716839190669050496289708916166669722e+02)}, + {SC_(1.41986633300781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.77656396584746773810737763234272186871275885715203351598530417029865248456108801632671238261817957872613456664507949730737630096134874716558337873020333155609917315392199618322278544157455920095366877241879319536413766792151195033497448838611154021880038869795134840079316970040445597134438351706274525046579007549954716008807737920162573001114168187522750910778425694618872313532377610727503249367402529561172729262904340554323137798863284651190187993266313683732031181549860389058468449515394336613e+243), SC_(5.60102858740052815335507252670728605456101064276882282423270628984738677282705266640353715153201846731931501529985375769984154197255945559179553921682570616652499539841726163456472036272006298078657865914422591324537250171736845540199057243018923351822710363405301840808518096772177326287216662701012976439963333566171534662702503881528405544410730999299958281750588785448427750777596333548634424573673251670956704985134981663192922835689964182975431954866582558727959277487365673323689895389978372552e+02)}, + {SC_(1.42427612304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.57870043752239386839726679404420067362103046088107575850638678988832376786939927292949624462590888949034872897552392220471385047650198209385052357152717232361402013151131838254506042599922557021522203836604724366828171398195496260361039842947797321531848898456595509460711058701689033764906979506725961522004603520277924536319487480724263618108020449629489335578962994168936435425940559140677298813409365233961281566701722666960021003137255319724257654134449567368560764349753299806583694895082629591e+244), SC_(5.62287364691243587470418516824702690291803865057369160930517009096543310613885900814270521761820188040079087463496297314973424544697940898240000952686179694874232131262568909826911809714242604935869115516738410465045064829606438287978265035705635104011092898510011508515128175847321762480377743984218712844183082888685354633353033343702368814462795225840254844117082976217461960252923189139447784927849067102167408838543749435085358111309984233582312292772333532391378218839869756553026707212646753024e+02)}, + {SC_(1.42991394042968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.58274727945389219384319561854077301522517933430308853974913721288742414638038643710961668011192950919073982455017959454314982046716644999867729476203086917034953232635323996803108863433145158622027740562634056691346529093065748054619201394049768310190120219008587950787612591530405299265360972075564144649730028390439634124490453657094040064774134115734099148027010660153989223513543358084719105524162221506603189279159826755642066698395026788491560522275176546664549031330030827489366792944209215865e+245), SC_(5.65082201452935579386055464673827161043102786912112989828216405327102864980935234010101817675401404810570397749095343902510171623073877304308522566803776644624933433708936493772646755866787686022780705666226923753962424323139011124440467120038633133573520308696615076067682770635159098067002111585312510570323114742145171374950209137328806719638500202143174441193691577014288589245547536497236184245555194037361207570833946398919633703684652413081144011374359706061953325163751597166544102049853137294e+02)}, + {SC_(1.45612670898437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.16995178190660470435013968675654057356100423526443047915030442290477885930184525474088450947700707439590535065674535106824773220009688537124707117771163514576605288123717067178670320340096436709623760290967152973913655611581905741163004105168615813991373436869440699128068453152449208988794551675140202420862219385425129905917305100554048419060569258957398702547464611372151334417605606083406430554977895372524524122522697297127705608486291636342174641790417051207283201854369808936799623920129087652e+251), SC_(5.78105820877420254749018375118334573088180310531321871850936637497417432028678014727547139459642045723422376250837241723845231522704894837309175381694580815979227625387064870197782835254715872148088476346944444050912188945000544307533987758164909942296309047775799958061128283376784026199068715674052158710042201798342707251799089380226965044256880845033520435804086815865400254156724737804125780474293752006393862736836350364888814107081013595530656940208743443043610026304270263460379054106949356957e+02)}, + {SC_(1.46037475585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.69930605328247784982117215220054678491661056184636042881894505549034812297590622214457938484959346899003559534563845448573036077005798131699075726666607922394799460051240397075879646761566384034086433198905900908454792647076810658122571127376004507690505928563489776258892148234324694693825237765781497223919271315876177476972843059879606582513749639326798714947885640953493053562372224253994285795790891703503002691869858697528467125048354756867826942396363160571134501900605040701724274511833528359e+251), SC_(5.80220912683556918050796809047612356322971511901138834716315060163991718224752307714005300946768648550179251688727047278024879768584854435765331125546818016132028274118768640446647255958617632633138022820716514764039994897626842474300875086256234584506012124722044989463928198934591444333537172423799209759309634771723494530188279308103341596078070178667937026021872013012533565450344166010882477577545424971058180456400883811447349766507230520901879827691207081331498132925503598987639691357581146707e+02)}, + {SC_(1.46270629882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.09833808080703326931235501974647441569671295832319519721588610852023346320413283437815113835289088084247445634520575187616176896703878358661268752066563599963112313631480845256454474450059557755162136325216130487396730150025349485159675820857574008820608122842424588512371268744459507483184221425045236998101418458008989238675188688553825206667848231017380725458251129105716305262281243625562854947207889982588869175940821849472906561997424713044310639275973918442426991990997306461733717003965262853e+252), SC_(5.81382309299270564535579676081707966611171658653017094092827483720791290619450931796376715039417461277943213990951541654251641058256672068929863887283386083842584878856037804814013991835121051738643778162387509305336396760941969684817842822617959407571849173442944169183361178744288803625942429124646726715663777722709259287537311638339801749383933175269192971203149450954268678743393795292020521587007890073088982866139201967618214305073267348845300522207706333936760908257989610506416548415479263219e+02)}, + {SC_(1.46582702636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.46722428839224364933445153534390252870263560016896366027344595127107415532077675312494028252559444975998945508299618570275996537740007563206032175948500220545257858159362956203884753169958377204702816406872361704080431388666118330226598178503070729088243026366043324511078631406641581821378158693607891036049881762736746429770021390242379020806818043213303084346055539373066210176590687746829845279335842016544380454427052545373244239247460904888110059941673582368553717476735230928940752296368902006e+253), SC_(5.82937400904124313771857658654680903536693350856720197044360510436432724146625327236137374195694638060678005070192195002354093373883939348211806470283647138646535187855898367405801269966834927264039465692194765127396019752349703798238500865615926967160799080598816049076671359038340777318838719564116898836145851137469267927590924905339243038208041402245255562471503050204505849726751154277069216880956460420704787838223766273541296860502599440174180577510684058169114331727826317860586971525577739562e+02)}, + {SC_(1.46585266113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.48609104746852988166550018522647705856260853455374177301715633164282439984896637588038055978596733176310255097343028002745264678816222429336552569748307950057640909586383033935322202461828617942970802476309786698868245576379962838221351509934868694248666667209792725178334132469780164580670388246822408692357015442925701820016667520587984594281813978332857223100226068316157674927623979100994076151380045439611853040289281376795624912904587499703727958806542560624448511327027452622815149022017351978e+253), SC_(5.82950177742079433013113852323287507065521795992990305147571429997518635673349074209971445273450120058169771043190822032926913616385411425235494315265651701047313263489198809839157152895827724195170973899369041631236139905928083503722369681635022517818485372405300692090518030025984650759238211391642117051685100914401060570656246564140506770730511271375283962498582542827223224016319990947595147866915442402996202075580324422047466793044978422841282277400294430549734597411656134369181408603858038016e+02)}, + {SC_(1.46775756835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.84093479350024209522349037525735200399151710938375792906436280512937352939991230271288779253868690916905180678243427634710216405473907465133213407395299253827011040732436337617031279249861273085543655590262979001746203284896151880852861121105932693354047959815589964574229358103147332960402886162926110737312691716589804750601943575394762647689223408215611376937519384208658146497082212655168476929852303078626676465133482117480364036078901106615139450414686138643561506637150677815761043536708533998e+253), SC_(5.83899744300274859978282451379423423153003139903429419682115526211067217784284204454321960341075305819280505490827110967586029431640699849696412280626068153034782384549707731168609841584742927512660419959069710682265957906615876532549326784199518688629872661985905703316211784089687469299852473035006646465667083047482697426908069123094829154322918776593162934167429171673112572972724119745301364963181498560877517181896682558936500142160350330340530900637773058574094384879091290912117821682712579185e+02)}, + {SC_(1.46929321289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.25972461618572822230055612922428436288638626870356858399380923603218491353622285046487399928626304488542635010922555058640113039324095555488374606558086963020613198643118314604331095454798679768015009728613046497261954367491947693198652406641730873262582065619232993261055006523338213587231626658028083596400829750002285407860157932492891573013039634907981705410947701442659940919578843369126428422701136963127819556383495292877414459417857088537806034143536743700907393123798126975927264248730099929e+253), SC_(5.84665419775025846018454293347905981660681838116551024833634429221581591042649057686760451311760299022592227952902681244072633816656804158285635847122214924526185861123447212451694330096630740199026114209195974537979150411418232602107009531811786352415832054571303482321770889913203039756668385306087847467191198252379462097592058609771755564381517376889222807439984693933255798084736221051686366665615876620611297807799660411550316488115159185423785886898249882701387614515550055663747246864638134563e+02)}, + {SC_(1.47090454101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.84483670615936102545753884539513053089700151357430321642648476001264799093797281289636104314979677643557260173226794005817099190456625884360973075235766052040644854663723293806762541728047652177148540154587574909357024795826527797265908403825181199585840091075653718260363939384873215253003436210696043894522919132023328399494539233266095876892342791400063712975033300088402085800545553728014319097104373943091383410109118523472799782073410829681595966515062699967298908460066524617615004730672071434e+254), SC_(5.85469004387916506343071426061154024843026943789425756614569107533609910419658917987674983489943873270431728270039707319467479857211834219922771970924193128292570478900929839859892101432983513223218658821830267297956573492472671082998962549618398660634609274923794451229705644482477414966655953057803119768913288192987981056495152214520800757780427010345884322676779043442601525338199010340209291245316113308826806834747533443924746788689222023532853101215021580220317169713595096984875178176143035440e+02)}, + {SC_(1.47176696777343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.83648028920450890375408717088234753371966435344750941529277703353771836887905043538823309770995894520968992077022784333505695588252812429540902403587143536426134461715372906996871253875377214202591536594401482259295743122139714002423954239526949389062163645976004215458497879102089074861778164766792510764716390746000695895639804042560511762900633439965557987547831252708309216963101367661361822428355393332980931173739539517321653508992083271558006366113171918271212852138989409090798747755632333352e+254), SC_(5.85899177569263106924767300699652497374739484436933183652120993096146245964603836676044792829372195414144408742853762436816780122889934711794856382587847949014684449384104305880256816982826103832996051439169986296760107274839845592361068806859924003412818815560219927854027159903967001985449057858529989742691061079330366875160748795349546962058672577849208549697245675650365061906972821447097300473888185772933805901670502032961608288634525713334961574899167164424470798708606253617869331779988255928e+02)}, + {SC_(1.47259216308593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.28111626837909252696263042706334570150067940548590417532139391797060305604428969091763573841265804254986576605459362666003642615635496092928969207031582498947220761351876404828104238250240183696488891108739699178678661133265321146586192732484736568488518426285664739142989554684468068813905182262127822740297658144899430935476957862868393662440683042929944474700452348297411520682676797379670218760318387140915310464761907001237314828093058310203895564049986922084727721696443734094289785852901837901e+254), SC_(5.86310827406445144203688054657583993102936363273189424952297552413631834722609985053314254378278748310207446818136151242606164682797345826916657255286853012983395893940851250119441549767974392299134505592331689925270770248301527806477518951483009433467007589642002331966035283593134642187675253059005749579849962487556870376008835813981269424316584261707516350709895172640167464935090292269861639386496913842514786877503500565750491455561370311951036303949218184789146422152885424080349997235152416889e+02)}, + {SC_(1.47732543945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.54362793639373123432094416265996736888137468491714292282000789985508589396613607985844566402319270097276582972640593182541918284330852399871568702239357404001295099544529148712577772268395519116654494859574221748217352009970650792176486975023125084944274086603763835720220573953967212860935235158236595599580448416721335805424740350194045481697092227809938398723229137494469229561947255112949746257768707256033411199390241498757010185223502807698431815195483610943471760938529764541351535351628752948e+255), SC_(5.88672924511353091942424433079318880885850012922573636584339464289461983154784129551304969242447020741717937992853458631872358037604165601546405430052077416475250849039308527554171290877673103039816934590433186563138907391706230487722781725212669046495371394510107989850450062718078475129645196592697849849558006321114398441259570514103139218002749080521484967283524450411138666894772736176590731277705470348047425587848444981223329516677526477565567100330220816196599270891263816986664580503212239250e+02)}, + {SC_(1.47998046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.71048098317977644828980598766163604643834804239003638424293920757546639295646122133400981437794828004393024873252894735372338383856622283917216982604252196343866010073253702845147668210012421852718140009968737478458712445553945785503910790073763359204541504731421482547056897334089793377437382016230893848793849694894733075162819824653467864393679870843748989771965964001927642393796131406601881107629179058475352634430970295605674474879810203113920036858186773620088307400428187435712823616818004342e+256), SC_(5.89998558414152704736089419182709588911661208437658892788029485564231230229447063180990628408020804967845164120562530985690899501561086625860220709996115117311442547000691258000214603082660863682885157950925951668935955590567805007370689102413570560556998536631933543728540270010027691291985758124452380146865650347613841274699137150345741773432893447513552177489297142928738268132428790181860863691779546263051445114611355655308330760203085861954291276326322150834747000547962230731341289744144121286e+02)}, + {SC_(1.49509216308593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.26492766549459710744176949193928115117754321598438310343119320191045676580968675189420007617661156542939261296099745987225078755863354110839563667043668744425058948609358004260906709325970889925907191088707121105772663315151788575333069973868685525293754663116530280872156297326431128346159111632746661903260947638287785995405943950455077043693360360235781568782919589997589170741415278870763019465302312066371383782843748428496349541592089056506114570093010525938495130879301433987324535394322494613e+259), SC_(5.97552776693421545740946098710740735472253138139586244451967343752698326895427880070452104872348601377630873548506825434017012088315458226888182590589273685874947344783897343493109440960064711914582372948120075689766311683082827805920017997842008105384156337896001006126813987542435527100292777885619211900623305492684919034378077403988460983157846543110456968849529636108500344054712109904309426907680190926820852901530481096908997041327826895250599440998178099699489686559738666854038290723255069067e+02)}, + {SC_(1.49563232421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.27825223602630873274361627512830742117155119548498076574990571416917010288512787206125597410409756978883789230768419318012509861271900829027701746401255448106722258669292365176045672517781050265877854309300887480494790128083952755995096165863147573750945040358984614668698916603078624780083846786685949787832362901918896495720073819827354752981616406742282512858964235949967185400623626066466309414320198521209778351514414293262092985938911616350371409856216374730191336998574627954737343814605551048e+259), SC_(5.97823083655582873358225236747089728209331301767346327980642759114170987728554227959484379910569262522155546406143337827085106164940148816611368559836978070546163779096071370339702997310635998561710009171394831454594971516618815771915423257751073718119204758567560848974206520953216765524007162624929072219930637334585097265282923974218034213725651988607691916695425401188165449733198195495325916506347537327347259960853512807953803189877500918923040039203799914776737179504234110160844454948611311997e+02)}, + {SC_(1.50956970214843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.60465525387296632302040777223412285801137295434966242566431979827406216982641703452419152730310909466362257007704104578258735024185415723485793634651083057206453115389252734230743196440101353311080955820476991721044635409467613984281813863312752404936168510516706567409395543910887825386860203988192333310270304479242040849459860040455928228289441423289304062534703914943786026693435470652039505916803278936706403318022599675311646917352702002915537372277716830784963948437641693482957378711754304593e+262), SC_(6.04804362167907908711799449340682862988324735174584269347440552490720685120262642282465320593464142378877566183750451189995239367828992100557831861543740978181245519543965960414384418920503509398655384927989321398348345705816946834639388569317096449126775178535667070318627470350588227410035497599175803467870984602299283550620747335692058648613113799898670237715876790665741667924219493347770901735216997962048414104963137010150191689056808625594784062571160348584000324026469279724942240423445596914e+02)}, + {SC_(1.51098815917968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.37740868121943940923782966908598434861040805444391890361217606732282151467151446344178152129278528183562818398181501048547796861513091424510841917186568323060760599248596196444102768202383178532413151920793092429048100592006871124050220353521690572233254000779945066500163887121310572985767468815429794287680121952312212232567484123100591117469133902082335529064838689479643788241744787774835520116617653216737177703142547519614025479197713530663062364763432246838953596196896849927773262321378540392e+262), SC_(6.05515597829293352250331869186282967095714038368933810258159517348952534823903383028761690496742448749008246009604915295982979901952191675913429840684261303208307611147658168871516319712755190354141413776098136283649715917903242377946844124137661530355179451968619270840785385998232315036789060810897170470150717324222695890259368201594254359167673473851511202537080684624719039039211405219131785663636942283787085263364073738714983189926673210950351174624381231376099486883642661372961738191999517403e+02)}, + {SC_(1.51431274414062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.96909890697008352319430956223990533679861037540042697056820743986520614063546931349696576202887450564769554191015324160534353149996433631544761317481796241673928503733185483615855767778468106036648607386465626856497358048410854987136835271215789259183483181758893383060851109239266534980418966242269666667772381167764251891237110061043017446372101096137511855637503933634050738365048474775324107026991113823639696161002109910171882129548037904534819703529117468554973299827624882767407008303963501858e+263), SC_(6.07183117974659900709568910481377550761006130471519431174407355549442313397923882408151812299512903349365057172585295502250869306093719448749660506424057269810461561619496775458900178194330070164902164762869615110209864945536562021956095180200360328476917786617389143147295087680965222311692896643950690064231493658954033605908713183432166313466005434165582816796013619020790117077884427468306833560323003805738127953268606785061048548712152520436001935021736733585844867115048942065844805917752167905e+02)}, + {SC_(1.51649536132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.48556076450714618889441679609748084144405569440503215178135349125970286770304809843729836999236512770499832597161673194436210068911618357323646580301942325618608990512739004747019452361174409273540593191772376414524691766077405980583485713014177944994079155367629078092705631817252765451282041176276121405723187910609243399049495476854825753451412909772939398878113990705289459633430454709733094808340334753356598332546814162504030232058504815703563879778069164666853090310189833985669715581872100078e+264), SC_(6.08278256870599270038041620369942254699806564093373580791795496340915306374908983692560682611826092144539663817736052814832053871268208746537378782233857817097861595993313056246652627918137454239817226737292814972347886316235759350833107679901316473975688396316436046269089394425659980912459504832990337516083013704658381989092161407062008229358948103943028387939668832661718616320092501121653635945650399409457526705352966657410287510301508815880034346346171918512479908455755733184367026447996356354e+02)}, + {SC_(1.51787109375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.96309635149365794201904327560940983178987087583292973957995881805226670134047631066819192679174720736103724585079710826659233358341405683959075767980803597841250764852343519505110306739935884141856358268994355018856132590407433282779506907499609815935973453065289949682627784935518270512041597188346000227681704664812833455020100966056286928541715678725563883620821938615925204483255330142950792854481108517723976599264054524460354301622825426424009562840774759159300971426192646744565111253398303584e+264), SC_(6.08968699336713414602526015493090477822944607018035856632649717622712005718232333523088611967562313890308819921605674758028341423787568807020809895292643673026824314590681840826672040269147920944436937137475957216745232637583959533622246674618661252534585552142236096776224943793077598893061629070168295342149607222918918272486103929209622360145244381839243373138808990053179312362223124980585442928686745384707048208073046291700591208584498431108108438120399799676750797266700331902208849034288672329e+02)}, + {SC_(1.52357482910156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.19414319035371951885126681686728391507451976968617993457141946940047800099128053749741557987649775281529052911964163825284549824613537166467982486762647847691573300589671154870290879078628488146255288491454783153962109865269686037976255517235160004697024222671093489248877838100129107627588525527786912406671937133019820183507090421098718390553280199887567572350927461330085896179514058076806855938641750002120721101671084908269028010397276819524071562016009384006807211584183829835936522443924798817e+265), SC_(6.11832581324698856682421476020089255570418947412117703448713332472659550294230401330014763279275097287369300936961095275127975050900609048980848590046807184669360614810278941664125030147527024332413885084869661385057787713510170325339927027310394996173519769181485618755980901512378172808603838145598528189249493737257041140004336271437647952287962615066747611054118016097751091386761184191614218061761690813813876646244242841601070728057283766120787953214860112185678778531877322640463934025825634788e+02)}, + {SC_(1.52552612304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.38430190827876640272358129386243549342419577805544025076548664607816215859365935416703033772674947799272924727020208412219941454166360694242322301526792588993439354979417192188181881604254728582603471519386495445748060233862793838449088037480017760808293352577454866767305210099818191944871452375690792334726853720842010883848686251995478650482626671938741027088755450219295682032933689561841963371523787489791494559579399853350576714070987553523124588199318436032814962595067254515521870708217762459e+266), SC_(6.12812830711642080483306068086943581324695462016662545022159548353368465932470530397946721931705532853802522864002472247876438347984915242167601518014132995894553106883534759325478952738694474766162640219431835417473541585696375188263222650844035630297593100308284969344189619112951105308300577443461349738245559597737616942289400130428166392524405072755611863262861985827710939861281199744917406663013620531741598218403642819299337286300776430864037591565750179760736128689392750435282252531095629809e+02)}, + {SC_(1.53231445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.19853650398934345238028262905078467589108413424774000359429266994114735048972543152523759196618219340188040492200313220670718607029602632313753942930122771860148516588697009269795200837958159172129921622913878329429323674793743656179283312503881154092360537038386000665064492339734469086279633540202386117547255283141000345760429844724208865010156888864760631932877276361440687954906983844598023952813414773416352160908689406230851377324978247223823998801818990247016420506271514097280795818558705053e+267), SC_(6.16224955842545105140340908015399544611842948249828336947582842101639995439450096535987873927514663479526950512107911632363178655953524781839782003918719458071690292893812991124023992862607904019678625256428677671844369414300083882332378596310039727338448033959114839571493820725718822281429023129120373115369157231627915138208944956018402374758114969161466317459211510295207658618300820365890643525465589063915499078001156874785150137986933790151122015076819042295672778054912565546410600807491382772e+02)}, + {SC_(1.53974853515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.76780074278093093179077751335003435299029855178154083369947188164903929246860377264245506360661701657191220269765609535133568415534508134809320214874411403245076830726314201689354251430796124512543715793671377500289487591725581197517660102362475269117585055117123468761910117441835612034268246746861427135528337884161240518527546902805713379560668415803421749472588193462392156091540352231555796947096218139708491284640607822699077133680872781774923628508886866937304851093814678777890183600355108500e+269), SC_(6.19965126271215403017510712021366614272196133950748215890193496664440720084702912033342923514042553767072934253741271169857558694435403318461257385656674984037109604838701731443587754931043252848126979346023148766693118380007816446645182060087366433357282876286234748218416545079696738538163778645857508124687377048261860514371396221853975483588314737170836353557877957131440613188955160388281733742758419553655249317836927304648300182213388615657260441211534084095859069539566978134697773348009073455e+02)}, + {SC_(1.58211425781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.41905086239896348381282491839379771897185719615484748594399376183631294638725793604106194253392473963987848511821170227108501056982306001885793439691444747776620790093339471878535894119479886511798977131649565302591757659652732718075522018006511933923056893034884443351517773534686087063318473844268744914880670107786649859044270623361983326455279551639443059834666747119874461905331152767490796684625738973667049066717572444323161163466159373049621887863357343606637860774828438139983364369474308638e+278), SC_(6.41348018839287515937528663300690217292169242641269273833535545067959983954082570279855214455116116521014307599950184244100234451522569719924376426131519773100596582411190833648767363905541836393355641947259296306765202933306100681947532268188660788264960200351945176267693339049070057820630930984255581143861232286985687219013462071288832683929305494241097571465187039070351078821721665679418617191464418051588057890340747874473215810395852331978691212652389338128410666105002877252132258199411921353e+02)}, + {SC_(1.58559936523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.99550052059179001905047618087052158891167074036043208522944751192304423223317564193409652456384486853823068783196416096497490641765403805103177864034980205448591171368896548590422638014920850095508016829749990514583165564873581430083570845216090897761737464607629650013645123138233009088048981115428639511411446334857499823450886187025825513057708813051174298250771572337371902723390612871397812631222171792840435674388031119227665927029667744947143437810347410590573397998671863822748682487437226558e+279), SC_(6.43112135851728244832151577518868890874261871591736840900492813711272937260981853791854267260487112116153602354115614618177820318012964315081967085814740463618269219806778391839396672709343216729614874555583713388497084529668766755692269511757058637068451834450619935666616296063028337326224338283557634589604213877281681283499206040168565212750958710844300902845564997134647200181353483243386262288881272800910481220148345340443659493078541769922539860141451255636421617534360150002145383974905581059e+02)}, + {SC_(1.58952575683593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.45749575002857957853555787247251392344932317489868128687704808171647281998876655587490414514382493597060521184361960347107322606089761774257236647563624666199800824212854535329921053474971619491015387328608072940992432732659778216706465868820044886565854423311214163048368659265533926012298617795158206008005959480156325280037270250123559326354406112623351079523325882522236465202639425756154464864576555528569692468808578522512373987609323921567870993940411638682280384943829099732932051391051454310e+280), SC_(6.45100545761638686651800600372215700223526769838982972815445926320419354356395772765176500127870343150970450508890173727516863713430148482471146105437101662553982361557321366759916823118467896413909233359221941030341364546143707211261095608443891005474153786364695433194551440267278927778599398365606439848130583071753387964492124722897618375787120211175956720096719351004084319602720898097426811313625564854872572439650792561562152858313184163762448809162845682305559359181219245225506066190024003561e+02)}, + {SC_(1.59239257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.22862065490396080936595815783721179304422380301723085078529149681564159998066536811074176656788041870497415171879636693215637170087232824230913196548481002247250416413833938409097947116817442129958633244085713487581379189469683330843071796813122560109445757783420558842487562850150352850820965894333597164729877669323266316642445991846445640305103122490315232280140496211168456781321311765115803248241210485010289340270608270479866661132306183063761907880487447838637688815206893677218520782314045730e+280), SC_(6.46552980942911504800358062860590613286828173202450526117877301633603133797016237664034141859633874249237800739784856001401838471480771995026068677889749152033164762682886208156490455299502874925871198127518811445455722526925798015726126131025721652376901377288348790808693416614341874054194319827811647488678295318940120687767685429087744751506794713078897973544728373725890665712804665479535385978369197352567104191410144990476859996576576975677999846498855954439571368927415377103155769710073481309e+02)}, + {SC_(1.59847656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.36078944795212988200837470943450994016744453623275544443952897986894113512338855075770653765588750083936490104513875299565557929898252596341468098881314145442925401665451028653178226026711657341497432935049664621139930599258285308976156506104667658582913014176035682466296325760112333493454219552259425977330780937756030115613998234824822612223971951156678176021163621951279219004764638397132790089457569105681911042575888913818078518962156191651319859940442019856553481232338709766250006814850549716e+282), SC_(6.49637061232092956498094258221476058136375735813875796293253122026914399571916825402878245685099062194308016451724296739317750408361825573713492039502650320495090499699573467389971156860397607748480740460909967892945967884691582095514669067593087819574760057630689967307758453437070155743108310781606333974237530844672790978266133749954683735095152760209721746051853324766997990798684274708342492240879835423221641049015071457235319166863363025758837391903390263313703309326762439109485222439510164453e+02)}, + {SC_(1.60179931640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.34051939269127885656477276097440383519388042650301111400421307720922606174575032834880357676050213234880125021132471925699879026749982784166155083040564160341800664469719663532357364972922530068220654841904559280350193190760108037990900882897009293078983125865530233915775652251212611613763667450275632645902936919941385606456437646174560452904210036627499809119353944628418602265835586645641908515967631966676157509020418200087925591888423839551077928819901741882787555415029316122386662072468139756e+282), SC_(6.51322405826390839349123876351238751766856783930439539782166157927694856847057771789976515358693150393969093881533992861423028668898500172547555116858488892029306605005922566958026522157427892059969300794963134964300440083707075819173564273950660311025537130138865443821373383678588207628553435071896342684482316735742566498131117896247752334725725160609412421588523776887312295345570651580958974981502125859835842053615865627433950799866759652948414760457191192686201761190235018085076236355296877332e+02)}, + {SC_(1.61502685546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.05980347773323497966120277435004273533423308079724584522499949080037599291941784781378390073550540703631520064318120215243806319691436044917269744837511018194829029707470698219024598988707530554945944461571913270597475449810503261880436144734033510855408574435143972914069315928745574782371689215435224753909753976275872171923320365627701881969359270678598908805690230926245374608157469157377493190427514721842167469661578919066456394542789553635029465456133348501808026896959330234679777355716680788e+285), SC_(6.58038428873441440193931191862428216288248906600451558141839616570483487278596656975092619866222303991604977685095006184955845976669547406922887747723085530669980175407352018983133671014450245458973452154534382329053184761772521858348418079931174301771324627842954897259689514754184085458264470736429903283075388737742864048154140515120136760098909899478564725087157161612725198337716047182139456979976986375080187458770365736474855101470712634985240763744439241165083516980258983097472801187544951936e+02)}, + {SC_(1.62041381835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.36834079790980282523482269789946012466399090175211485155509917681301771846876137270223862469794148354483021088443602730043485733574312669879939440611745966410063757925437229257718542088128665961243085892707960382398945712906224722521842659401623620350300411825868695076229603803212794272973022859369284750788212315287669911015570703445947931936028560393726038783441305945780191617492485884835651992436881293276681367233750887441626129756693547858477311003338312077200087346626663886240806706983987267e+286), SC_(6.60776672600870771749744775111491723636612850537520033516244586834127031644815658701981414824969516596500895806967961734639291800153470375608125767931920499576924027878384102792529629481525682088113565249702486069125339299927492794554035702928515849261917603289938204036684558636117583655482600565310139502287766754079925683880759839919115309399985454693563036020640024057977545792986085818468509375837845882801549997097616830430626053559953152747759867418786956796408250852846007511093255443619788782e+02)}, + {SC_(1.63141601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.52862428955550827752854992517641264392307871605868947265519462906275422452853393831195266384771813181749165350184760305534007614175903309510037753423776568709476290716463359311238086626354285761866628705921676383159136074699676469925111833376379739262439856075778774143589364470758852330463332873897494704144625449032285292643254350828001082953176783076531870473141873476305543425977576317669168674332043063041114597546973154040959069857913374610539528380325549846638485824509291951457660702571485979e+289), SC_(6.66374767271059086286696926224725433955320203362325215410435606298042639796472525625629099373686355721812910912633484495198948284779127821989811453968043144827050126116420787803804183178917670779625165370574692094428908481816849939840836378526708581937082642684093884245707991713995884292407223471234934910321992410222257014924372253793365789509842587565048684820887290055695108769548208128275132470150646917840697775504123028786850642045170147400435774695291126069443445938915924595775689217662402254e+02)}, + {SC_(1.63216796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.70822569800788098348172757651658947438132073835720205680174939719911270003501514460188981098310450300399675570161306415174646499748066146337796717130110062919430219708067477673949754613097782785094224071299867038026962330900922400248575469514462338547286298341402675112630742573072294540024127343807374910025590180171659227190137240380361901439551720008541010189371779629187129269914627029268140541879747266785160307840750581143335032571903286643423248807690093105847599560886807001954009607634948511e+289), SC_(6.66757645388985854239812538608925293971332840436628781049775363156648150720472166849068522873418642176034390588814857419703888524756192213349130234629051116553611107678393420522077947982106951875678566404475344283829734270819377227588950380957849783430909540957429632251259470023007240746813227264809333230599246903600772849635885716026888489271054253985828330029536580579052156835392800233520521248159434806163977183901465784571731805963448375547604779912192496115965581380608839983923364473599781301e+02)}, + {SC_(1.63977539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.78758913570498564436279168274018686505837050427343392283416394388411301663013405873399862331324774594699765776009412231789913405766278147725397313031763537161188054839339216339765472642393648094808975364514371048487920921067518965784053440747021206232341393311070785302346886583845763884137658774141669712692101642945919456052837284888672689105617262480240322054477275178721350876895687595541212753496456486601474224561729308222190835450289469551807087954983239060274280233445290978271300542860286856e+291), SC_(6.70633129921738708952032432126261159523795896373852976026399420289623831411908768280015239148652988330339328617251715315233114505905091947642040817368285846376708671892154966412170314850240206636063239270910362601895697461765861374192280695653878563780008644024544202790907675087103262136203979283389928813051494850137530649564495735509933395054430965306936221399465918252233725823177071957759551702723304774572766065580217416787574262188850851559386017484659135512976397318691947267292750474557991531e+02)}, + {SC_(1.64064453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.78393077860631738846677656531516746557404574688511710538639189286598140966377286942487689253321148783268898209861467131921127832837792364246363497136839470045320345471588890426652320234862484118934181794911440494994603795416436451164910031983966953719007512882068339060719850850740923910293723878151701597392475602805315235694858203655117707608412328529529363192518546910631340580510122153809424869553192555638904409657095667663923949171964870557560094438042791726423992809368105377088993234436638825e+291), SC_(6.71076125939424001220264440822656344510651821955384936028197330360096844979584227373130837182819258405516050411643439977727431007402675913432547592863192725800513717693603434710025088487238404862822027628260824633523646687014451276935543928664469750314910592934513092521007970672453768839007818102281136043321502456159581064101704481833005653393348412872436694008814452921649502779006451343808306822085986219803548863474233478432163495662888009131618941563834350825861759762277674624942475956604093242e+02)}, + {SC_(1.64102661132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.38252519421794678176651620442885198233073188134278302676162690020862476484310056002097750646818235832206012913571856820156184276399424324173864527736358728002033987882192640522024223476121848611401561584657748261838416135330798241957607458064467384146743894504949859477823342196450885326002466084022303172518264776649974750321805975137260446309708652197159275291889730155945862040762858422473009715337720705248086449142078753194758385277685013635073526286148734539756421197148231198289875305068009348e+291), SC_(6.71270884590703823360455528965723416044818889594032147476534185266961291226390638308950292604715886655999523873105777675869434976596775656396124505168253131518189474895853927158203661307930296743032662098934478110684706396833369064515239649393505224957843638623758306164462852953469616055357546704379612002408359336722604911197021252511455224662550728350015216998769528996043251498133911120102812311125469740697737732709152597974989518076461765853904817134723884881242504611196656335370661782971780388e+02)}, + {SC_(1.64164611816406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.63865423673740705997561628278349267384804474286286980915849617283014735406238447141754882435079675732191492867545542551811400246294020759845708148469609580672777397637311443824912861810016311260316860302299544297531657905691694340623642822034087504346832084748014222640613143563402265323922716182076094229662683868104383207214074588444990637044412017108023206354582642762516640671475867295273547320012214869591135305139927403735693161211251790079274589604993790245081351630304207382739053219688833560e+291), SC_(6.71586686350251215368470159030971259431928388514471415506227141631086287093152366877807325802155178189885073231658431160062162054256821720919934462387511036812980890553248234184926945353265444932648435191873951891140930160436331073750977287253483219098916730453918772956178667516990712890317169005974837192436295006958385113712326807982398649559554440941581711468700165822685825881145562652724539360894605301925826774453000678783511546112806694747051230301761302129206360576027367159792900750377151284e+02)}, + {SC_(1.64166137695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.67487747286202967561025535321478821581781018004457129440001698095047325439846717418223057685814856266625671211813801558279298999781112900475455476147131053613031994610549092773772509500091540711815343121528476215945182841973189881647992574210028212166263008910465645328006105030815103011817648744131542259230806915229182845844038332487186467395637692860704632290986210696202215960176890745996807927307012399814246929369315485821553804684539355008568659255565351748445656754365747112709024057267500426e+291), SC_(6.71594465014651012587848619416903939921656751397255713201701958970145777927575287092175502946780463517844846341644105994095149277332289004988636693179161505214866323304810399216194296797565465327796355908846527376690773080583226173695488553659072899492619898504247676092332124208381660956585544737401721175316248648994379758494139280888180046130120978627377202933718813194987793949349820708093735427291989705533144865651985816265759036235786480724600937355567070504364612658417148584349192729857358800e+02)}, + {SC_(1.64917053222656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.15285010329225273373430968083662700292106583636121539745852851956407560390437995242539753790547083830624966812118494373591849670859303409387073845105152598708676882840168805775303220764230926923181665486518553108602859451643507244964981969309237059250560781661622002944369967564967798771529062062212271498313583419728807712037275086342636226337825943145613271067451969491944136093227265664656865253877999607886855125478454456201233392914550682629606614735653765413337884052492846842204330380998673022e+293), SC_(6.75424224840962245567910427632098623323646817736188367285890347805443142240396198667560510058234890622638528769905486842972412696676063282492455396179345924248846254647755032148269705095495749014362020599175684250067999439514980120399341306255478876812371361884313661149916151109251706651270602016268724150379378374662072820935481714626932717282925050007358516463027917025075530589174688238697106746211002191708140689392703826637858170538421241325393001353062077998637540907702322499660406933012947752e+02)}, + {SC_(1.64958007812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.65319536179021890358145049382333830435281976288649716387402807460911116161586947193853408251417236732130649501058184538569567087572565343585706530061843151631008818521354604177536228228131631186793258042933760521081487824203182099906085838307012160654795643509433247392008736741103683927153949100832527823977536185153566278599956693204467645766479809201183815996794101234487805280525848181675655261652411269999797719541166046409442978933408601331341980404519866985562490886037982822078786991834887048e+293), SC_(6.75633196957766261204140164173751202661584030677354174567117193819483440707992236952688539610680617493971098967063610563040828071597417156462348510297346599505597363949635572561375227908713846424647047797680003440943565428730555362884464165983512671446894159736590841896962392420191655220300739643615605790124507690580350235950269888625712308198526545351195383485124912638716197578010187665756702428963564939171234619164715965311187207701242818058180821587008706756117296665807261242835332044513863129e+02)}, + {SC_(1.65046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.17555580170993216069659701240356378912992532283629508571845705913462522717362476459342299823434647526608301627805222996829392989715278050548254337304191860835447150420890118299352225976520783494090484848994603407906071676197261917423463501919038473176361295741885015206021892279547608481624187132206041509044769921515746997107326694827636397817212916169808494572754962681715428029394912965808485013585570069104453759787805002258078921724715812914407284935740375752682359885419657276365053780793198045e+293), SC_(6.76086679722855771191708397439999450306821281894551407120704622814581498053592540153563322170071612682059242756078717779408763800653590684793866922368478277900521342210603896985247723482522500271075804056980596972990853713823330794276024880372537388022776895901503271856687399446739635714947052425961934459067380033976522538294558903908048066439155733093834269411373011006012463147213117608325370710502108859381836834763324284688603389368790509444037839695744988180958720272205568985303816724234833213e+02)}, + {SC_(1.65864318847656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.71198654144943184750018843290107155214748642382624698949739902161872942842656754449525265374194494942558191960503477935791008918425609285567416055164883442286490159629859851244912527342074022729892870584678810858772377474182282937759818649218059797976025754182392121189373588905783311623583280748873649649772391965738994489851866657747360514652992812136877725128061333112911509271001742187189078497267560018445876104975711941469367516313266602946564650830477759919167347473008896241605905507271841849e+295), SC_(6.80260283840716919832502509042538151574490775130290451318846515468402515885297990587064657182045182259858724602178000810750653645985283235507099795232915061507680911458399022596471009051249905789834764907162074610277620252248807341853026743596597019902474364403109961759022642955574015970537755433250292071638713455231231078444202330696670032761551849112267614292579432405333779451742984097732914316326299139979684964531501377727276350151667009075269493993892737931655189987717172432491652881950659820e+02)}, + {SC_(1.67480590820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.05272068178205386511784986867129565139431700690883193324843979529127531088991345108621911159549101328405406249868744301171011129891859122816720129988015228742897318195774544753749719887368243690243616438207315103188176672826610305213981133436222369187297684898644446118811311953543109443245571289996684640969823226363692523159158762020317655979723103842784261035470621088900158659557289114888682171989055914834864709928482927363441001218072378755817968930356627770406788571021804899915337196183298026e+299), SC_(6.88524320743717747426305946412873491451063761422306837995230657476633136866429224850195311828901777644305608670799914868630448746408655944250193876646372123836377201358901298141627572502387176123829655220874065932883243511477052497221164013721785179052408696679151905908764966509642956239815070664817904762485357661319686401674204783082355154262851059053657303874634407634102879215830394878250445572973555622012106734928502672355568968367103567336799974156548895007883861218112682583272304941907334137e+02)}, + {SC_(1.68467224121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.64639293101046850796155190551873968064250642422162086996302297566751525534935637498576953882605384394945355150898760255553686070724462813083449658836608447672312629550769492658813411336918827722880742829195220989227541165777803189015869094762976475431410543264694116917358850066414650639613572124286999278137083928761194725710089214898655908457434767312539797120634831768909275608671729329854748085293822761833755914253907341099835860459403336593325345842938801172650403260798397393915738007403785150e+301), SC_(6.93576699783692238613770969440881236385681388413122458295420580102163065013242721571083893264446621557594646851097320112750340347888497191193974162969015202492180953017035137007382532650311075824141311254133390547666485589060885283776488172835452843645016054403208785610700756800640586885428558743047322527749804102433864061198206054185432548249702189281545304988184833522937021613637662730411102892827307924710395545750912437323629462542751089608291253872668471968622443703701007458124745765608997827e+02)}, + {SC_(1.70346435546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.52784573256719937321087196763126998252072022120717557272934497281653463772182608866741088252761218243919316918934845290049778878130529352011261655117117770126505283054327931050824660018669742968318249435708174504249227255777895369510505125282191626146172621286457835514587036198593990107853152119034404854582337049809970684933897633515835761966471120703639677377344913658188343704863131252767277401285075868948106086062138326274092810458674313633081223773758111431804894112779900549499751299094055769e+305), SC_(7.03215820814096724114069045602758245594300463422780966977131011709797183048832264772841230684748006067721086087305547038329481770580207353734505197134907516427119328044185386106244173057426796725412716922473911942671037043039757994282938137189934979953865989306335438653929026449665946594258891769914798334902696927115545763798472099134253411550343625180228910757618121990170674216143948118762906244758278930708910592816579480588855499343168856249164683179881256711388088797350060516436755525074844177e+02)}, + {SC_(1.70647094726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.18400407261817092623884721342493221669030070786214468462085156313123368684933696469695484834842677094969164083913320600436134061620158350377100572558717214935445523158591072218749200636722110926232595341196907255920103693913239831409859755751782690079908432490441755790719823383056565482777324898909969365124549273036012932725687040910925680375737952362124935280715981498805113496697333262784068140614880812539257766889387983165080074949006868879802684509211284508721523019151738739990486548840238993e+306), SC_(7.04759940432345170467607826719026371278508013997656560352655901550812712249956154426475589591818200510430864620641235235867404251478898493629948633771209940231688644243185858092179384863637695304876799723407271698619566142850592169787231666644091055427081657096909420277650971912072836361286951502398523428051627869768780125194127805912443580614191229900341326732559470621566301279171497794531779991574584099214900576211623804711965970155568719864215969415616550239480836476751932721276314438194114851e+02)}, + {SC_(1.72126403808593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.37803314419839203240547220202452497324318685752445985744153244189181780588321249805994317106878976746464991206446274587332772511888798973884799787270993655280859324912859408930734386451537107950981522708526430546166612505914533051504045252840419620176064196551239542237091119514195228463974579086346730002255689256052216087401329591747545732037855402711115744828993596545261030009557407696516292870874930812667638001611310499103745573666779723659028715256180754084263341535399397273234441367908635424e+309), SC_(7.12365067471177829581982502006907282449347940834206791393174900515531695591196607951693856418499691375041812455696772456761832442277130647193673176168685995062348895229045453456170865372048384226660132506863193303983837014166504982979843412660035570463010815555299936005108434039809850136863402658886559227940074287120459930170488424961077039754807088218901317099005040834828388878316535125980831265702917270736186224338561052269356846448744982083463217734038565569791005511160484138571955928144989741e+02)}, + {SC_(1.72562561035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.24434005665501469146063990275366040691376852763485433476755278826771360634376495809113495885460294860969620139707799020480328136110372363492141486170814672321253197311977354830033585389340203947785876084891931920959751933276093253110687801836757841171238391469250293438701855014660553145819665089536234199774469520388576040016986671996012196516238924123396926765810885462955790434567214623380897770998870500397860458299147997363127880247609464925501356994006541031300339671229318561724353094947709842e+310), SC_(7.14609790344732373472585165097640858209938953680687459805489878704805990316871532408159997314855863458036139006808306883831108350343721093713845845456692985998026225811659640952842897637632847856292549393020977277961828723808656771371587444335735312713589233789352533489498635629806694197944810456127341501347459698787839346725697268692972100305594682016405357986406882768029397614420878620259410944119346394656246734844139687628304332313024703285038356887603236561495296673953221275340416542469003548e+02)}, + {SC_(1.73557495117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.77308608567355328977497699062279330067417006934286566791473444637180181976628698496832366290433601556434148275973100898450042146306548933658693829407186181216957259654132290756272977351760427619004554996908540193503079020143313436481742869840489457361191204700986527868858118553812000630716360879297829473971914949440538823393416619408529018915007406730442012630139532311098929616710390873105012637639396901671634915991122696550159731700263144227267235368489345815215154310688082177656433305713806675e+312), SC_(7.19734442271104149199189679382584649129661430050143828014867277788106105456574602593389513247616177764270211053900531751289321611213155464235296929691651945428137990944613932504984458576247916927054706126006157714935290341068498008849478302619970275768710207139076710908360544176864247408346268273175470379732636083073488820403801649872911608162203355845200743684021599833489528031246103873396572125980999508326120552136096446840493379683767532681765622085329644646664825619866496324800124154624129893e+02)}, + {SC_(1.73911376953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.33834663322541729732460545356563441889702196866445659629610481261341009190051957058185310112938975334274567066281071207273244691099958327012341796228793559927971962894578058019612739339935896563181046611995729282412934590809093830084408660988304452683148287437677057677619678681355822149412240240586192258405121999563816809594370622029015669890172512854078592891592989177106248016991009786947215904050276514787509073721049675876042840556462077444246058719039341377896859268060477924367985177569622342e+313), SC_(7.21558578219772119344406462546913599023928412489596302090248584098180083140318421114901339104413526765098732066810143507588252444904808600120912201364826589033647336043323616033452022844533631833758297857294555995275178423275934288103749817343091739261366027185264217687141103098127571939768410334051675141506424225988901225154593260788199587646523255694625627768886038221898450421313010782393550029171639711908221299552745353624881607115604207179645387191798678501370657158374089025175136140182881233e+02)}, + {SC_(1.74286987304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.62220738429536002180169416581458972793679296351576131551209553305146783313610502973203090358709851626002251792730151277210317616253799170105066796960799752836966561862432469718954968368335099347442305875349124967381601142627346806266405065913379615823527252886538759773577855729101880237968922250178896395374512784000769166702618523501106502843665144019841866146984798065498419781768522334287478244278636695425444401001449360282120309090856243389133618524733529808448678449620925885549382277348447418e+314), SC_(7.23495507004799341315262083422579594864912756717973527304991312009739567920612938602136380197664443476572621035995814823490684903304522944282616517507447476994502599741217950170965925652340366824250234374281866241176857989808513281134223867910780649780894754405821647582396309833041428154881311881889801957076083515438466027614881309944630758936098570679479155819410387366751715386155263245845290096204970711091496386104274350544268068839007744255564610396060912302929241251871411531331548143699697409e+02)}, + {SC_(1.75314636230468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.26118375609591224169644622260908248994130744925188982010935189519141771048865789231306446145004375062845340278176602069604493180714835104593826922550988963160326626444544019543134682470074922554983879335657568887579557071574476596602514451756562820265533209236483009386699958977364619107819918575959277263195400388060472968909222360178614223597393609076055566046019185613884387367635442154313801477288660598148250685760655854132329034923362783181472244853350033538937940785952474931874361193981415854e+316), SC_(7.28798979630953466762414521172177621176319746533840701154529949578329104525307183513096524066142937413444387224004744433803667584227546078226621568585369770242212642750827575830560736200453654961573779894041075670468264838735283062966263446614974344114945115331234976125399010861314776853121816865243326706607856301199496434007401149484742006721367828250235151345225243713379780185678075939543812799099558712163937880425393391114415284291920440092562234216236149766540365131326992925715347884128715692e+02)}, + {SC_(1.75579223632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.27885166818328819447113025922545292562588253621020047775785137521449003003384446694715659457957427895119184602163391052724622215840509661374986020443738941575689800720566088137246340643942397919895120473851967269956242843670785582944836886449400140834406152797917048535992307766360746608539877091664922151992326825879497504057276199238394045694849640293625504191245096488532903891986434217570856921700781509648676231901214586152015523696528650059453165284699657041468165917311577636114077555778439371e+317), SC_(7.30165437020146438420948435914349685173252682421556550250564960189502722430464022726274889643949603075628710058633379021597881289785543650412469304081764517703544941153949826833420597716940984564633434640647099434033344397839793774998088352969448090577569793738439677171615761384407164015458625538854635690099910038692182418590926060153991285355658017711508592444459297609220521740929341652104655958540657621838237819362822235782306337730281045169155800187222790482835941898961864344146276849696035926e+02)}, + {SC_(1.75580322265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.28612940478838613285764710463332317119735977784659402556761765305430124022177847440250963310023783363133733518828871957259941522215671907594138285827899196204118971275960833656968130954879296527594283865196361879217344823543857451976810988633774724185794298875513154826264757434667813298807070594929198830022813725317353376466784326649142999159210350947287487223704445335185738875464598150823052675125268345804486079378477701147592320733258232747006080795302712867920514679667141363562615026018644175e+317), SC_(7.30171111725672926745064343325264521590210602159859072193006656823616585715544235079377133437855586517544623055807696715806056670018049327605401298326837784463566022252056905261917390209465196066309971658905506915382570007098459142912458591209956677955624923819834340592297187370114788270371017444058623742502981616642771211666668765579073509703225731176287597546153169187832926034425152850606162884758531236471896786252353792126653691108896668138262959904720889349343875287758845619452400548080550394e+02)}, + {SC_(1.76113403320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.02052582059954444145797302575402828775472549858638258652337449838485400922264880102001814521844455168114683708960371667726418703832112346144276637968562598124383686841479497143128873664735985988820590124724286261077096817377876672490213916481451475344891177267327245111630781949950497885823371189324614090262174265890658492814142677633036388723002037813465512552328967495610585969562560071474504756484845549709521032926948580723130242602998492858040486469858058142960971542246944064913466882596468084e+318), SC_(7.32925417356873090126766966505072849653571561691207197830677583053540573453273156018521283364964897580074052206023593753088714514798211305800197017101968057977416334579947937295480183826788590173899986400332774900517429114007492485133074194706917987032098429864860936179566013841800062932162660034495594333770774589039627760147506692102845847611955819886641733597180566790679444038865854563752182451404067133604953777976266362936802468041363729385216814190500918698133834576267922051073229052550925821e+02)}, + {SC_(1.77847106933593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.58696581122280508600807387850237005743376257074412179943433937319007263344403598141115230539884802073681689462575305149087758412391475064495604301808348263271223884315354908696107642637077560202125740242269289984224673549616101557807088463070767797249318699493449990226377560110663908217775503481937102990324949931349055009352204913283444841909374525132390908430445632639993282928324028038125224387486559126265018738936164874835645598242054617954170411069835138779160265076149252382995279152163846018e+322), SC_(7.41894223842372120896971695467778464434331313578387272627690128660440449215113889047238223702217225270557947090642985451098640801240380307959045891016227018945670443378394918589719822433946156998371580853515191912147426719160292211000671895613613862803445071155106185976875019446446785610218985155512414067916832429521477750334205663594205036698758567202054604939201673150111781575427264391874305657184104751242830811012784344407925842826341950378798440166465260713298533266995068427063255465227026153e+02)}, + {SC_(1.78351074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.15879959525624809082679521792815306888765184498698273782867804692369318651517881541192702071407855740250348027264727398432619543412091687405921105322147580569054408017841028812920951265678160001310970036202890501551977301103372311586946159880311889620316687427939259448349496566621688871543022174739664098462692687350640613201082085141267837524716787298081319950411594071268312373048165182370619115166290887445465788311960551902411784530322509886325707847543266050487191556108734271485692381261483488e+323), SC_(7.44504537361353563790256866979696561169274292979987135806329745308388622247038615109771750895615435667199178051978312738544686478079611372342783320959891416761667479320362463464749942986322801267031097886473061716886669401182112346121285586340493980406953975487653745158766969158510242023482210490058435092738749610751548647277202591688320385157186225546323039226324054576538352749998390355107047106866506799368109060505372381047569115871095389803469845630883890576681472303492255871355434543074666565e+02)}, + {SC_(1.78468811035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.97323090129015304829948670056950672988566620103360069132626705998662293835536886711038452025071627651801563771763546588030112847819556992749418163913209210497610564952666599516069127677852955185029576549295904060045236020947632616677386416176415724245484203451652003913968552102042443192357359181004360958300812496142078474620578952876031709400267524666591864228361642023123714935719318385228306189781016753079919543343577240226564942131538410979287582829807064989009011837262610114084216769765835356e+323), SC_(7.45114564629836903883142880025817532599406578138872604337592075410549354944472192132212648441404449070057481451608836384904734743979541319558484888772177498462069801799490721472281407471300213885149399515249974303546581956898483539540584041550633939581704471730839975216140632264213746582613956062471259638907198389238199065012906441044381052856481738411339494778087328650384450877294643292092137039394922472016400135373405269235588937963012119958064213918352154220651572397570405879668699117408907969e+02)}, + {SC_(1.80594543457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.44492573802958081383009778440555292032058510782094707151923019543580063401821464124716334785896731053179360123458331378606583993775964000098336401815208295522974825046288945690021705062653504091293275971452833975396618367960024478069309509212413127761425725702401547503489770787474529254219066383550355113096780860939609783039900115962564637139830430287098957985576757675455555982636793820156920269250858351207376085243542485776765040343621160839693800231230472521909769762667442008620515985598284510e+328), SC_(7.56141925251518514505478689688640485796447031730493178069645349326447710013483810686811609186513204997637549237254227850383700627762478810404841601771875597634294163342387192816297942266390129779089956880080490305981215418622694389695990734843318143646996759429284015850651094450456909447407380010252315728731423895937408514482692709030861097258095824752689896174135887774473314084010169013475172927926134853497572921939904600357153526321244028669506193752266382070436803817234272935880029844151591958e+02)}, + {SC_(1.80852905273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.35581191326195651703952631159009131166202209288184110644773817191871658084956909290526151772354562604893182774372066044894019026774162958496575146840786777221554589041308954974103286676024912475152284802713150403242992111453453965532852125999394869800429637241418660255150089818049606049236213833319573166142416880389589096192682582629845272414315172668935758251844897671074953640839529325025692840860945874824728631174619790619252734467377328565212870241811237982353501373680269895720107402908973993e+328), SC_(7.57483908247238706013191041332363564601908643116613794125755092964353166716497824310092103499993135103169507095149901801628319599303236584682978495826304804330608482550238350627808636334580088728426340266618467763937821057688921688867862910931405787908397495646924450623319568412793396037825337388790320632153923066106474780539753764469398887499551564384021577232927092899143543747409049815891732077908467663209515334893771215585650942228198967976932490033024820881898044076565536017246010995364408584e+02)}, + {SC_(1.81269409179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.14656489701661666551426150826993742703922081274410062796127543291436741416644043285839056742503182205938143690550766734443196880076092121376940315826438357347225130609638172448389183666605587308926876761496114462796405389916326188916588429464036827906859598543234720421919794910927205272842738201313988559974125729824648074887940641287945470208109479143068884035443262208528622313597969142116946718196958664771847077763157230425357917362298919274465163066462902239081800604016270260980376823982142021e+329), SC_(7.59648091948415383929563715588284797443881076288302786520024431092713365745004664930550660436146448769928908595472831809952371363595290224670598516160488069055990529667027998377177998334784035362027942891905043625791394478679556663143484761342901957151016985586819836736568694434730341614326758350488828166801956142997723502122900228582567347108280898606605440082085072970396016102333986899570083167820363063830295677529090001156223115171747029172473818854569212171572792179196994366136215652618916823e+02)}, + {SC_(1.84813415527343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.41843670877955808033711872827583329780399673915389894157355923034275743375969872064760946768395710760692162722563875075469710924197941789203294602594587774825793719222440584479490308163057779223031655837089151369234174058028491687359332918700985100795602659545238860363893105370455875892468056366421278624267111370458213026852824427061957136527226963814492761464341676200095205112479999345378820006266530346736884330680379147863141692485839654227013136972359266657753669089433872427207379533214800380e+337), SC_(7.78101600485969496738907472044805207525845873494964135362477949625407026491453906826628363589151657958255875736182538790127842629471238109386492432595799361811851512335943586219934808061471996676226650373516302737451767234665411655782440426010602537171013317283442130255563851745571845004194270181154095416823876765996074472789789444039190622178292345613883620337241208649102987263300954055289765962798067581253424838965150554183549653035650696686335579449451123006534321368874144073115836490911334493e+02)}, + {SC_(1.86107971191406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.24588645855805258012942897324879359693551025583791148397292950102701617281686766503814328086357305875341025350135793052815205254026968929994762764327722507205986125049463465663080368068442225184024979846859779497746475247773819492819638571751788423232524988966985285143728729130330078587242791573411171000071289717978997020517689715808903351460826237012874920523845813327702077005195050813047381259174324216957154073715416491177024185354353075454757007413595044508278174657544345970582127120593395902e+340), SC_(7.84859365540791845126304726360573204383626822141157419885521181927814146148987783802258702151711612074539571709289812117715066864769651085625127711673559831522980738557964350467149519101662228352632669493854289808713484634507521558649057190673127264047506073184500896324426534111398334149971277991497487392753689121494358836984096649384282949073706022769719250547696523433025878899487131973471513734072806237716816347280826527526741380896550902533437911597818220723636306622155516315400521166248311628e+02)}, + {SC_(1.86616516113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.03294541201222121164508235571066373185584783264026365544285628384716465880562626719738736266726777828141495974426409739234588935765141361467433423550667015484917877499377883544804718996516925708468346852692904938784521280325456051636101059721615055421494040481026399205200245425246179018984234929101419835846972996798447542294431461489105063581113226507236521567974054749433549150406332582230737081264009306236517071894593832412593632891448685791692110925076392446969911578962300476703897336493029577e+342), SC_(7.87516516148573383895913008437117610513828966119832440703410801419729919905995203130569560312667200209607419566953988839371249474128781296049846211080506555869688783852307005545043774008109290672119990141932485170760708215195471032725809083717874599366950043078590014101716420380906669405324646737674351386160400988120948057811371921198810450718411266755972013252978417746692239750259384976799876215523190205405078321354150384574306425868958987548166631464855831724406198401639410810595751844254740347e+02)}, + {SC_(1.86742492675781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.99542610617632270083829336594010133748126478527397353695318364326957590586862931371831347138003505744920298624845026059650548698988042330484539186721232265403150046257528675530435325490841419324373755652405896622859988688336193852997036697395398853034296732749465274555614248914342259771848251941031375144479628794105835391662479355925916761305983404615050624475473265364374847969778079357129647184824207889431920748767321883118227971829526615738983739289995284802134298758725660193990717884773544424e+342), SC_(7.88174959418554783749336757544591894036110709774223224824271344579064868592003828026157621498484293875752814384204082165481351097818052748183336645296027303005209209061594852798759520425403411485530519386155931744924285526953828255995900195550163262460071815540048668676259113309591309366995130837147227376210850285979642759356236865812895138347213488570411672545274468806756163328735520628333095309808687054148465878813916308947887628896300352054261806340245645428791616647768003659528869190971855045e+02)}, + {SC_(1.87030639648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.00013208607038784543835466338998761967010060994582435872245800142579849364899223406398425097394985031400661098740065090318866868822430323441202388005446005608006873623476463388499773064032386800278206464129590252790805569332743452949382936785569119293685857945597715052293722655888762017111811753247728204663184932267529632095037738006541235846891204292490822273127166641168390072085570404761325852826928444859462432633259332523118777273482195055560452197092159658295678083252646033008268848210231458e+342), SC_(7.89681341057422191600443509329763089553014955229013084567685248103703964971131505289867916711312319142589541701440748657916415512501891816981039764710739274708136202310894049973715085007799699497369060904560679424531354387361417798792468365505471179015299281792334433454449717667296646280060976616732761157290503242591829563524923135786799501122866943534438663317498936752830952239842824149481773130008874716222086772414842575181297383717442736189388023221494878471500110380734964401070678112067262623e+02)}, + {SC_(1.87685546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.76616858008137000876699990128362899264750099077808394561524649985692676037977937790592025450514239974054131412512572691660341256409303095675680120482124234080094878326312900487048692083153338257185131707529228934850663620949790977014187946923664796688831909317799395684080913152026808435329557396447446787999313388110221894455392197928559696795374444133560908745392255035333820654489877927948373476790359653354159066270090908817479957743490674951339486235331068871132731338150805519376049202711418414e+344), SC_(7.93106735168582688465169890579339874633837425696831651151136001688467161621416533173038983338184935821627170059467628295716713846320010996273868218302439350332561849478557474482210296891544334948306362007816158321211010014344462659514888708752522589624332235750728579414986288165829749717073581022485744194322481455837006627579646589897632563246039454243989959497997025639911389053284993839308204536905832851427462848870120129599852959160797785476300547461620901300626983784121544915143656949964583236e+02)}, + {SC_(1.88215270996093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.42467714153889694379953380561564379431131421450816428693657626870690330823073434015685793654606026646868840725237891149239958998363729095730382305090229348661731733800887853031821278864445868727022694745206687061552658290371598943415470559861714972611034224402957861143266783742329199970555774575972006229341596017093248611306198067771492985679813925847529192174064672914675848858507171475009161384807053302657245394135850548068431010977818799585654853739013357822104473286990116965721350254660700988e+345), SC_(7.95879054396379679973378482359178964806729550808083202102172398711994144813660203436993954323360923769805304648731981286484173671316822747486687213741902959720838697080277644445253650041162710488291300014115594925829430019586557027606925856616083597487344500082836897264808351757451335070114522039549110269709821986159748855085382156833130765768155867203606377950946038383392551541105485904271194223359993252672237127929923238790959033497968914710044389256683014681708221426327506101622672148085636506e+02)}, + {SC_(1.89707763671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.10061098729146171845103394060763999173039111869217414996316018397184463923997465979877646241802478343165477206965204865000557671637745488443470810084932904929448960248627613329155428358751235612132452149828463378992857879043312157900406444836530275609942120776649576482912290726026289531385806874581786395583285742571765640725099859979760080824985930717122365163222836550887134466056635668889597323406217518903031265688225953725497191634302109076082771855000561686934307076025887960535271896230147427e+349), SC_(8.03698062923517145096601407356238933655052109507208661450767545474757083651126074300735883840980260933649776465218591362090082739406607617830823299294038457394581883065971684983480422665660829314790121754187906870584232700277230872294257937362261857567942645979635322015903634095957576764535650715493948932219173429955955558467876965951375093951186025684359116435210580219133944771499275409227130247273611229423879358118948772126612588646371176596311828580197827889472666708946315117484033375688997705e+02)}, + {SC_(1.89919067382812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.33281206150205146643355244324005183806916710600770049002539606130797266598648508887101464202604273500355664218606794200329997311934044022454918190419379348450843074990032218486726420914860915118079544767976077745142582899761071914741698271203297668481012082730542168912088331717987125035740327757158225679345006449049705029718293267966482166453666335604897523454714256529913015501735844676072631736531130208967443017927115114371729015366934002373254016623559400985672240038275307656801619652676325910e+349), SC_(8.04806013865469625731226447611000679262167245496904460769652369715905835763695986703351601251701757988570727443524524195737627994659580060597599021573044077777978351733520508556802089302268146543969567284533316343869097830310592017030899691608604050193595923658145675861439071686382522253131366884370301553887036168423845773140886619988282982704852197954508298827301251022649079410818467255031031955273197356096071555658682204442003474528731494644459565895341153942754125192947353015610842313374489907e+02)}, + {SC_(1.91928955078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.27289443453508087332796313496350003682738987247877702104682167531747985776646817177272941355078798302379866337957633139770515724303137232998996065182019972394147390069021355552622655095550061870827136112999189820158297332123301324005137397021001172414485737522270735603972771739612699090178898122468083951398022515171566920316105159101455125487218519301407450437969176328571576165371562627156385126243702713932115976518400610198315644844874991108140646220089109776050146978223928857875353227915229230e+354), SC_(8.15356416309504951703632605332678821036309251950450806744706264953384295749461971762150742627117821781297591356770773034392144630581794397928939363698659120370639099547683959467363822618083228006061483256645067665154706984754979849976268926741454130725463009144956133345132908516372092826696894902228013387927192035071552009986450795885671353053126809139694384541973300327185242511459235969711308606184671751123423347069659907005661315426399022362349158424073363246554129112770787466603651137216967255e+02)}, + {SC_(1.93188293457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.55889878026328766094254545156130405588317042176810492128458172796468478155842356815117505801707088037047728670423711838583162029118369087264171555276251957441043881320191705079482711288472361395027619329630747426689264957636149302235512356863434311160841952861854804538431864303161165529811626406063806693598450258353735003961302814786852326493110745345260159275838103326746732398298170655254923273382405156979074520081560874755475486268353634381812705834403598984084406506678245260553334473684573814e+356), SC_(8.21977765635959627162277398500133267593301883486685264727756479333262135968695319644233559348715251791924592091370385790355807059872793029080405819671585715805688457536727535203139767056986040905271994053868315155429608568913546474209396572356396955393177416138270423827458478089140014488962991931627499145418490058701846811152489764472359962840683277194310750268803254408016566449876018742044930973743436003375612625493736894351927923702238160859898822663084723609117701120883789753847500845214248469e+02)}, + {SC_(1.93295410156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.67944971215571230381385402915306563585512555925341189618433360925317643914586339063849824950878127104307013236717528606369305013002830865269395228459287083455488726152695484019042634677797564752625403187358632023115166262329291480761126588425506918775135337653840598704951140885230214908854073322452700218815702551486812145166297182418754255982369386423356005578336376840292343516441822924916960935383497081543119473153333071555039616888811122705286740253504233542914725625248259935386522584340786914e+357), SC_(8.22541344386344242196010914041186665024114069648439392079686386509374236995093782195927762500525996080278244596859642782539204903609411934536775255486958210094173365894420274131302499190778323370310139129238118341874739848464194746295318700707267840903671542235639039646093486808559346979742746946680311647738121918480673164670952151788931901931170626500969058896357777838597047895957396247904756825358032505977306778637196016952959821390142664626683015925603705522917454154540020938849190246465753991e+02)}, + {SC_(1.93365173339843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.42430992320999325679716901761938854023772539091622332595739009683583185296453026937618641790078542650510588136420582429206450065309533803404632815354443071354025676672070200124004665167411328304125532406917049457219842210795124059486692276275153480732203812336386422600148261114654394541561078007497308145487109598255499478982975895852651552441528862916255192694217792819101846844204013626833784038081286658695326076316349462736548903860361050866008078993081226997701163281219500204762767794892596876e+357), SC_(8.22908425115018214635612063581608839753092869727377752641769171700126271682157010634919061911194401641974846321342532995136621381223597874473762028259546616779927290488052272662791510845205852053685385181896515373004491784350371134410954170691566805760797284311991129687911851084775531929154515389120642223313112973162938576707970239300848871447062783020049556813912890056887529173933993178266777507443289090428976682711236479015637787419477603505854356179920892139035413965955415729946498477866915695e+02)}, + {SC_(1.93893859863281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.91819189255231346972453640919376279998307983396719139738029327074684903718406648892071035406912232184402454246781460374777342947874726566689788273519347374059981337799673386415870380166268204005087081995314356223242279916619304107820077355589734939140641355991069365137331766135349173014631523417771950432494431741121327321514656936780355001014804014071667361178290389171919523673427736200333219628377521586863539820047681662524056914049746933391647730196298338486438719580698910549416527666870550197e+358), SC_(8.25691093587361426148596146015464335448516746162863480735588908784004458410412322215732597244935302406218793360603341363260365762366967561002732715375638004415248735947845958581888757491890066170880837027901650846382494247398569674556139294199420669658231316358184016068129271475099041211669462789964405981626050981066329500071449503538835947208406338108358608890423336962917529958281023406696516876798696125117237126383133829669122189184734418978403466158942567146769067320497613552863389512499524647e+02)}, + {SC_(1.94323791503906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.76970488962810376929712442822506799150972175518577683878116032296958443013462979383862783705723933319451732313782128964350816582257723045805256908813585734565498933674642438356874957335664076760773465543393587233211955793690629039976559980811635887444090574644228158847603512451821027583991739047996027426376497589047264545707567250497900075677616374072397216443320073160717286311822549091324020863363267285990699612953867495706685176641173823310806130013816684950638847862639432820761867083234102375e+359), SC_(8.27955045104645154343667339772396766012398852624728938891426269247314828825916535991338091709610871917127552152618059111078959418678739813654847782324433429039010860986016354572906951448201401982849779257620256300672083673458788522336148882360032490933140917654256375790405976486227621750097451654002502861015346050197833419724873461666069884066971182335821194088070054899330445318502006040779689281654357901187198743041689050179676003693402625636799037068007429865185453536037619592363781121849239393e+02)}, + {SC_(1.94734619140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.28266491078693236079930505889482845547125001491009809232235625402138987517690582351855054785836060448042403278267915222376926897805477347534963264638197149165940664729313044058079686689562595216239200519439941356636095173846923293128637285688502209436555778780171356993813701298580954984907760437068876535565538630395134017900953276133789505432994858229051305087303614204483595430308393252393687826330879551006222003039667295919054187640462437726280375942789451161245271063078390907316847565839314824e+360), SC_(8.30119289043176032023145415575540825157882404848793759377305457075144300957586366989763766266144808590250488888413557123220202285772294434598407380388732435129545873894291516349267450447185594102826122725546904840257534379265522468101343388191836339735197247640477753997635545264763668117916622255187527053416864645189422056659465731314880919345577920810130440083391940211741342285111847682575427162628827689463093464718063411815127219312548858707951950419445994409706811518582019288596522154579663365e+02)}, + {SC_(1.95590576171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.99057106460726837335254951265469949180685916576201366518330799354603068060628399838542489064097378510079085281408037072910045883121492358198076636459015027497276779671608984401557195042204653074735005161488340297886584764785008674332110456414360320943571473989193828182211205085275930074217211380798304194907541431222367151522162493561287748060709536148037198505832631889595578535060602057144165742122933005877093759125801257905145570971678982661859718663150438418717880358751568903502008356204896542e+362), SC_(8.34631268024518024312544346689613320382750591087057053387033282390229282637137735596168071781685011981870157938686929605629865882581454307581180428574441174752453674660172239991452826982296362269651040153776886234755045958881356017477727650927044861068069375267920642929221008639880607020677782236494414997226184139937170443921952401765508153216046501835997059859183922145529568741476210480409142222925674751756811511184363017080292446209479500016727710625667896500980445948942011818349721058860643504e+02)}, + {SC_(1.96223693847656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.43702195216244192317676186541952916707280677164984247367539335125897646733564643371688025088467054700538084552068298454029647207243130902537417130476881844646448023777021200128825481774554759366020149296557917257391619382631257126596026694580951641418147336801589028646196536138781855540542155286213166573776679373512962877583322900601066141087719663449951754061391451900849479403767415140909921303521326888597157461091024327408642723617425659345878278777631423831868081457536374025602236321680929720e+363), SC_(8.37971018153910645146849876302671100355878564904416318951717625787199549501672396705587516552761922802410218356442207156678453770361108141405713396857271262666830357861273360399171376453263631906584441274908671489520394913910453124951042230924524915186708987401902202237482590481943808082252089807169702360579064304487475062819045711685267280266165519622716900432024136393172012504561691993731410474635522887745994712603442970545006793254302480947110314655556003246095545965534442886579511856764131891e+02)}, + {SC_(1.96529357910156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.23414726746625907416715829443063285923135397751375214247196786835977150147805051398333094509425767588802720603448824250661771073712028894382573028418813647924962558838820236674482914084626131388748080596027314470518145581837598000195509481236116156941383504916079794599291452252308226347555343874962002885311922176274513700554050956675698577966072493017611013450719805180838204308037770887975898160752634753380170589067976564495571187685622124978166758375691766853963371464468158002902770407780660821e+364), SC_(8.39584155804053375527342314852548592073567608519557016287106642711230165566655687717053998009042938360547719401225882983535419584528005800048601958350448310573668435377730089434909243345687233337830049139176062035296650344707700088006827018390690145555342736794903069214927600901587954409530290166291148031911459504898052418814831646552378457779230074298452593752843325946141864017478714236662705888608533264283668477574529443984242441013448105934470619631097589148562165995926859727144858382331478220e+02)}, + {SC_(1.96643371582031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.72923224783066528023999470490508731323871066602976622785745508540096202365386551203784303321602051695271454525393798393663702021330452189152643525364348428491179832354605979734097307438551875553759245401819634420173345118102522332650577040285051755723434219540758402866110654077683693779161776736404709612287605758539823190928772425476186798455690025685939558676812715159791629245093650208032886520127257083232612658307556470384463828890541787560681418149248831066612808778348525971443490467099021645e+364), SC_(8.40185983386390710192076135704248168925348509816019461214950716437392930063583844921188200852070907125874754160452731394430631464143909381175484393050377049143994089896516302461374658193216554660465413071660423551678695680241168931568491899089984666013477801897927803428918057237287299416570116019014163278726638182750233744164815802505579539237403913772926615589113727011366468082795847664443929239086651854547840693271426594036197020338831595646751390203112117358305985921089855500190951968437725493e+02)}, + {SC_(1.96722167968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.17162811815712510039905579380378750968977013363477307164574089945672686217834916896285190643746512384683705292466337425311341098378687575708976991373959046030667770632001217204619539714664370165651664707180686595098102100955000938827975399238685075288710103150084193213363161272046776904672378326819300464241633964472613430867162089247658631038267675808163966731109939642559650197083658534120852141303242102398391010418538136227874086480458366638310586572862462329891594946307476509088866206418732113e+365), SC_(8.40601953278302823715914437001434897326585851451377782359354514510143709016686243390171646070512716911527352890685562128158003076844244060987762076720409802934135114817072570698252972683730666344841130172039600120289262881269496545768851707723811877974915916545908409772521055981201276329797761080478859369338699323312709915881850535299304145924078421899668930260168792437487425790942434771190356780186462366325884970480894071308412938743777497960710040394397614691713396494275690128630923143299145268e+02)}, + {SC_(1.96733947753906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.24680353412302939200987044186417286850293617589893350518753259695986642865759373421287222175982632299577154795441851862631143002139876901717084858364499770158486495252092227254919565386732785327109256215044780609106529634459613462687775593813516048326312320737385426270219126203420114241326337895492874001558548526979886090777954237816043152378834201550716350580646477653398287071852116296228427415539474823987711273104208640332096163005959723672683387762960233431767587584060874792860272003416914396e+365), SC_(8.40664142046288586307098578012950982940920247449411400277826481575501321801418111704348374661856526660437304397102157549566140121053024750062211864903938840218438648122369834739503064495501358892588074060772910518224333146793538667621921225711706091391031039758460516782054917885054942929024053977778388080690944908154284224192422437339038235483093925120598697680748923392729193556534361289598031674492625039905995129099332457813491812192053113409382582404365282925969718342484043766758647802760115956e+02)}, + {SC_(1.98035827636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.20944618702144819435296995467187386930468724356684581700886145002110052068179595371516095682909198536856567991112384692173130332074878964517612238485811376411574177290248523456198427051263118200164102678815406661467567656506974977501654206587685000986975051917619746085652602655774636443931793431285264833970762057314941793143001674101295340029715164760835449162881448034837306270367044729073839212227407984125064269561365343725931323628942684858873575347992677851552112437064971878939927095370338474e+368), SC_(8.47541476779965877146967331261162470205184650811639496892098953020372961149309349015855337368315515057751894701730812276876556836189845145602599367791449996023449498638627317430955950228073319226682424243409234031059111912399674726336202132089429275328048532277028206481590305886445426026704578735467335483762409481391451847804144090930348202740587590332496209837551411334440093728917031128888721007482363710839178563338178649459997005270530084383360495944436069819269225546530178214790217098076960726e+02)}, + {SC_(1.99081604003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.05154196611778131368052401382199557096766465926000728428835404154643680644942997276429557481010925489222942138215117809515648254051601495317154853568251230860379869353011771511330847204161161617505553720745004109075949967059004326850925165650178777793787019317352912344759841467942308320150943031895570624614242670943972923281959878003072390706001341200047441157686391221897443065320844906532339478561195763020866424086276245241727980766550667862958920713461433837413986527397831351664226713597241965e+370), SC_(8.53072131433324045135738664115288434528725110990049135093018145682437475672853017129248153128449935545576341010629882140485762370819485469336716214145271708650949434239195726432153512718403315628017431744827403922372218014961101023728565208273255565761476282562651185175632833997020942688452832742021973579044699786396296838444391108919498160726021420370993213463365965357523436031775621817497533473760274140845623774172583660331569796023531177010010402871966199969403496490153557357968971053015210535e+02)}, + {SC_(2.00785522460937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.53038471159972860186924111793349715756121085385852614145376481107328339255980485259779959405018101696655360418689191755947524674657017388250476329778595966331400951317829495575257624387472491518924953792738723609469981049070180796177369199968029593643882570199329343672361584991491269031346325150022217340466726132508732198838832625511102240690996448510956638381866618246882695118686304361068731015207118010591091682776168392299129402985452021724002211070453057481572603019315056376226319100980238753e+374), SC_(8.62095196130873418125016483284525045912485154509044477830735224874607852988001338205640871319027331228596303029271135316155897092769288603729373918059977700494666837436131872233304113502656742361280668423481510626679892941153874337670788441279855253772338766091147270671930907305990963779495199803536426812659375897973408139926629683755551732852800906654397071001114113811621571665099139260312325320803616377742262239469791393991518027606184447445663606181436475760468080061389174559057160775011156343e+02)}, + {SC_(2.03620544433593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.65143321926177336947232467996576791774863489571035733142117938518314228443063319609695068414610027830548060080434930101604835199188658799113650928723242301814025419554451927694078109662141249893930843786460464504069541546299010614406284401816717867690561952611836105745932468701940915338669364306561713413455966982778774144387067156781082643925925011086395730031615235115064861012250293912515164198226271080460239215486604284946181939385689141466805797635994968497078929588417846687389792691577730734e+380), SC_(8.77140060335044127577055494658049070138166721729748863702656782677174727127369991092952837475183854737464978173384893960446682000728272207111125387872039608527919906883536583919943191418013126874991816322836075294538833451487444105140477827412747685262087345488602089706624637013863537722237351280931337789386490284036989902558931239406263531199796638196208724851070764277876570713546076655407206602946148987824269335638195963813210790234661646648909037936970322820094144140138232254395372433963069311e+02)}, + {SC_(2.03855895996093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.02190516077568225352925006625769365538523628156840603558487097060162209263854748755473281975434014844142353875128620627939326967887306014306593567841975974305794673393775625034015256222466339006271631437321916753648305403185715320005442147613108678785138342429363929838778398420532140590256036175166922463382586028314332781200961173923197495568775773587585961994108508539932951639399400263237162689586963349530872504448211520049356871710673258018824927017862546623151939747966842795727006527563387175e+381), SC_(8.78390807911156236890062008968273733740360663293623174807251675415458216401922658468586780495662960342131423688505153117969523401386784563568666607008655615879836550811861510100311871505084981492493286612002043747994798669566839497908664979634082652877580447007256859659711088969505950647552135137503953004816160974936508379329642382457680848803055546205261387408940928932559777105436555542613618571730409097929484613134216940807704668132154778258567706423872979441199450915680868704496734353373289086e+02)}, + {SC_(2.03910766601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.04519550061459736737696825558626211223691665250321811232308723146433174599050921285969976391716404523777360036570137965100255328108197885749942363104295245545942330621004157488142377888835256713130658130164571550472724669622986351319273702053031825769243786972865591589485416694117143340366299880923018010637468713737647538773350785374916591192931922511230751706952006046325080510157215169536762010623586769684803443313468266042356424821469695707609410385516618238684812406808168846511558277107504019e+381), SC_(8.78682450311499051705542102592143118531464615073289156275066153608370358980222641854492981697674528230101291949307734557180060219454820905694456625689724158172140191643995631874525516525964315497694017087967969027105037882250779700520278683484866631872791334506197300413024318593614287224835750497851676302698486912204695007325920451209278716499735030880447806516573294488944828862942226613073642614916490317760996816663830852551421666590960790381387398019264063659239790743222793037962387391917471807e+02)}, + {SC_(2.03945922851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.87634721420954868320679653396114437042797966640215747114814071292289514679853882420646854333855197669992927145949226440228009068993307726183454975241035328495990463229458605531815349338574874766725546349252526987364072603433578464644703708086973292823936348527413486888173464373298370552283873612506673258171504812993846323225727635777480955133000542387209144433299517186846646032597009982879026954143521098194295817794343273803342274669737273522964476315749430970397810057312143838352903550803963141e+381), SC_(8.78869316848635865143705643570197031402749418119277577772373571777805369195793831867246853876788118380995747830273464810506001333081217540381068885832190844262238438283495357151351813640671486210362169134855621015167660782116400314538798219104763178489465671624454099440552345100590695406473366022421278064064777579668657428993389295582732632068184617079283710640876524667533433223814282991264379338658963728389786465106889424249508756823593288506817598320716914455174905100482212261967621947480780031e+02)}, + {SC_(2.04086120605468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.02743657195879596579356190191020540408517748360270772233350187132670368236338558148167947525604182688475307188027154317033127421930022710052512496367214724389204196539529278449587030030071334484516910605002720685471497496454225026002000088826887804231343927284827136523745689320502914776168715156276916400103517192211219702918695741499683669398591603530163539160629662306406208651611461245313107509259596231005682295955767659457243885582231566582253548170137735315226168787241756908838842743163884014e+382), SC_(8.79614572458754574487438084636445918791782946842598909064854843208039568073600862520039360823565124413533980668580492765234600905746526338468204183418828691587116410169624716899406947165866336582654910638119433469897081100329916618234408915291410360063773879765417623721979377686242861657844602397296898607881848910938512269919531855497922480486653311811248022415772798189471108662611248217274101824539210415244984642003166779616904774288957798423352212268246728380419647160759388686249794821839653989e+02)}, + {SC_(2.04121948242187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.24300648889160775733156586874062402559880556987666128229130787172756384784591504451441176261124778809418081011389957060502911823758697326486324714485420170234982599627159886305816768959504352423650548150553867255926100740917589751743614355742742796617781398611941865255290481457719969272244034198714901317545133168652235430290963725159487045543230285846840648066637514719963010582145585871619341209078028214449667054492759133440212044242066816817432964032357664607423807704341673445484291179983839334e+382), SC_(8.79805038556587630088052582151663919186057969932038946354936203032542340040647864004571291189699384354853888743320567469513593659764584967248393176840575903449023484713535440893208588715116801335911625550485476748157992061702657729396726975122868327645712946965506515046914095427151197705491743892127434492500407518742269514547233097954118003716030823344006660649172687005451703658129727846843123665183503658207565304927556441448742317093787870842638508179717650449751055242144586848607768594191187785e+02)}, + {SC_(2.04407836914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.68365143880375845489319696652162824419026790969168725995329854655816619705820353945636910161396447037807847037756979314462525154016702465684852901928273210651067121172463361882515619106014927366661810456400762814084404469237973116680959859782414407726318096421007506245996957000966110130380693389724470385756009610930429325363910814020733925930697199275272434532716117892373776833014261671955960474795544134737715622412344108541340921131232780280256722975350906058098810706636246354999685034963041210e+382), SC_(8.81325099408857538719794037035613437585330054911093644104793245532145037979386327754393840465268689839637222786988346357245198697929909954219639641082423160327772397840576132377955217119504442031191931892682663926226123518747306212014000292170698456264499561629303488314450881147875974120370442892524806700056609702761641793604570902194608296577922136353429253927677170144185836055583240855022684942918042987756630226015309720119954418802506551096807114871722371865431716271845514419922818181405815712e+02)}, + {SC_(2.06032592773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.23368879335110617450934014357551697493657637474750402501378696069424612949874139215426421109377131362806210449292180891107227994521619424226713921190507536619922840775083365490639223115181808038134372928082158899059483109948141228058173117784469588559176802113041862627892225932364914852130808947901721381017612761142108749416421802877905190165205282158232272203222263626744097879711745143341899642657615393256170649098208261844829863453807824232217972322816131557985205787917544846401804813255278063e+386), SC_(8.89971469422588303597539528396622584243324889172625081448644041395296435706027612236208502571830144856012771670106672337663679837867361312253255450766285701723474070953793205635315484023113670266674530208759732278650290931173916353216486938355910583143339377937586940163939654903232983739892854298177296720683838065873111881527094988924866455176404496696390392291939407913753835567327579675847802887023575896004603081072015135418794160903940531376215756221420891521350465939446212626450156221583224751e+02)}, + {SC_(2.06764343261718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.59483281653793315561944849491802753020517966058457834599780385791671309293006610807112421309007905050950708789029138545321974655614863962614239181289168476368664535037569185913694830534730728853128435738757853396683057364465292937222014085357698132392172515202262764185474647295951255624356377355691744757242649686269646903714536328284782282648025847981449792419786729583440047926271659335029157708036514607118390950018053776103450511487946355391507820701395254860917250728802107678105122194718873445e+388), SC_(8.93869784995215228079262806213738653881194522856027295897307425852239282637371470148992469867322294921829416199244009443917810535291845239126405513404505664264493747643656415802763765640860015275765519501138818763052060049394196697019463988785845282941765893749713246179491764073184207605917045290155137796640590841319138893337388811668060775160471777135759511154718236748314424006758454477250378392325844747846932379992953121602403336808218538896786533378978074484136844477003890524066532376562323754e+02)}, + {SC_(2.08448547363281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.26956997938305885861270864992569317634696139234148998025052858279502266314939306211788246505386860720649744516018360473714556008139121829799827022035868102039512241534804171999884878913117696687586248399361631767844908110955487436936381731764811563311551284602425568721570345459759673678971708239163298380331804714768570771197967809270274107792567445801651493571921093538794581945762275991206448239582552434644965640465065190533877901669057295857711633075061271687035424879272346906130060539747433414e+392), SC_(9.02852034697887876184918228950307567210157592557628151025878255337311450794208100108693081194904407586026536627544727891728278559040733771924029921633852777257177574015107284060027121116620982034943842773463671886324211820337774514949846112830989530858641312660736060185766468954284247723301832207041135655922293339773387672759884091687157381626403232630411978395212902188251538779356595094788517395195404838946369098118091514912829187878056761189665514528987389683561188583781930796488958328412937449e+02)}, + {SC_(2.08569824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.42541719631346857740870277123179694855803129369299265326895905117967064807970012871120517886376749763782710626876870377672885481093313635938710880192105923620214145310044069994382837658433882697811138471623758415092742862226258875051288635177471107853802211075144303628595023516284959320296001584682085142450298713660175675155635096967704984503105572988443502595645997778786490670016943194988355931481999406719595726362875431386156523099995500516289629399041523024905061365248583663524451744477756744e+392), SC_(9.03499360002975113924127787536975190922985805978380321920413767449345974971555113483633012467505182901649928641087356563730045483247025979178309582017111611644841654759797798030326903242899411834831296715164979209026986975291691071332970132134487130379536819919131162781313226791607387767232186193852256361885239373630809541065907197501412901447388849582877366354207566569900259450804692461959120325998443885169459378332602861106681620963700297035545476682004214466892696013597953569975032135397171122e+02)}, + {SC_(2.09722961425781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.14652962119388337892013198073640426716305639367752450241471157249056697505893988153810906568815287379831847592053103240079064792147382117734220104623639114546077700130343551655313649169898489163601042726543497312643959127651877930806732890695009786746063931039887597666210573903294917932796306597253333085308243638049175288306507188385750785364337778307356251935315465638257026383080982013309191395360760465390522476476099715466350718635666319205450199842162724646763547637750632154397143992784357779e+395), SC_(9.09657851391821905248288764942882685538513662571951847769716820430912247756470790243746847239095124383815835596479449815020582004140189922425425031283620580448587760886237528677796437754229866945169284624748190052228864075627322818027343673920476666737417622900906394272502941687757361119603036594805014745950910910766067489773955786771882150998423994134709516232251226515884926278851453839221094787787299099979419856861589551046877849171884303782275573517477294988870970492657537365745908068261007786e+02)}, + {SC_(2.11732238769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.32488995415917438816245506428540358528324936567957143982831760674606946553953675306132781410037004231238081814752827196659137560785635734654175140548044178318241202722028415001529397684081678940287843275647485327417144964558775590245040343274449146902150499177838113830792660215510801705128411775966433381848395099119531574166093829984257362521690140511511932481075474797419275766050042684668062221317275299543262897442477780881557903915077596028239618806682006388663897431306500641386797547090183402e+399), SC_(9.20403844150120573323313707815163443305546205415320067571623368824100327033250751194469692254021552989334996367488215687821238397209667497882194615770114336746522799261295558491608201716982716372159403627607969448999723588810214131748191646851044970099179978571661008211099865472127499633991481335788001559856818151278413515253321351692025407909474976822663022532537882785669403146380015988041682400534853239853536212974739476804510190882624962978418547837129921262021934860580164989519390697310987195e+02)}, + {SC_(2.11813781738281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.23920584189995024108264108441382174581265804453062813967748668597256409290502974917476137156027471780465593434860013512747119492613173661960754556516160997019902325555815105747419678983913395074928383644967234257838183275035853032575137406106812515112775604805291988413086204754420780480482944199551206347499915580094617570264013697766220815619765354642349849162021960389633159121121537405157741736547422517058981713142157673633132258072330362954492601218997356894597490305064009353895881811467528561e+399), SC_(9.20840356065490710629576533428590541960450394297627230852765543314970889049841936678028766187208171546118935983075741374781610923342056839795507928070462593379515984217461275459087034547009064859148045673345196450051882002584567424351090318723867657323371007389165943407650641784608783008011565278189110651932558434081396504135177794283020561431248025981650863165353138893231401452644608333762367635388942206349013882190654054847660235612322249540146064263351496142260634350041205519501124636723775814e+02)}, + {SC_(2.12196411132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.39177662229322494124400957157877266131759608311298891642771411182793190826802351307904756477752153520542052784335006734247061055811432642361807977517652673301861483775140119806808771082039441626362631376343659659259724670152753868639146792172739645425843863887789097252286610659867762024588898509234394082610149512719267651794857006628731896773297856599527322125493409497626506094744204938092978787264219579269340061828050172923677638031779966934938174431159781840598119005880074140411916588471617699e+400), SC_(9.22889049459021859963844572074804274810255113529432769562876841607210895116188455115957990182798402004805192186945959965271951508181947270887520970853459793601922584925181225502649594599989457877321892851918600713516779891126827964426645459261970900590176714052451499186326997576594703757359296902179990814537930932453088854601105941403417430440813446008398651849554675102641358597989457375238027473273539076645380290336618043735613466626624312870277349273591291273756709478496959113455072539143305755e+02)}, + {SC_(2.12809448242187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.70512269115220480595268166531904352330325624791948180356089462647029563967816377152402283553934239754650685522277228585644625963178763461985634087453147507811114399074328277274871421586591394470785652958672442638959834135704467870560725728677870824130990742889477006591329988329388252117288312122037798898578732201281267232366839955064613395628426573109236844150466518272035619875710123316478993314102668129146726093936227472690943052588213409821894956523229315194926353771521764680619545709887817943e+402), SC_(9.26172844451372937297926641784026202226359104984280333952452698885319219565673961992023323224824423511104995712127009602644669134107563593608952662089744340116726101916009626869561136587812837161535913728799259903703727068947653269625719104535040738855813391398842607276573678116770071684704510986375303525438747263213742506177441195801004222400449169302691102086787469350020060636281148117220895253291232844645330875483628172902837608000610315770524202905690307051891801412619078193501905572034002345e+02)}, + {SC_(2.13211120605468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.46757388372185984470723464446322922520183834526808381421853345527729862197466784520531881476984910825668844631053249610923109221356654860758105186026559709364720075771750848026506049938609344217127328450666317508274299208718967512572523857314530499456913380346599284157285384253800783853573460804014106723636223147893218665477293263747636187504707811864236779539466966344221910542064312863330245248401392068608381940688389800794655272596581525021764637668020427619801544130878801457932266803401126351e+403), SC_(9.28325403094712022905598205400455323055353530786950080627140655188919001736244506717145898286392584993526261227225187308817678445652981064028338940693732605499844328250378404504032801390611492495535948165817111599938819106674036675419413622056749577970342306044846614268964535244852796128757731498526010730421997711673126579581404924185429868241464395745125993928809118163995543079031650433152888784038925239661975011510989611970619998749887105771762365404895381271943917487402653324189249409463846641e+02)}, + {SC_(2.13364746093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.34373636673456515296919127535191349632336915520195642625772798041190709635888287621532647756849280277825279470057062295411472781513494370848467106435282040187692494937120102034139142619940710853591531853439352790300953682922617662188819031965947625065863054332620699152572706061943024843245116280442577774550493173481350989515591331175723347933472804804944111576288065111769983720113685823120396444568406922629079525399967352647863168336447128021465823501879806831619694844779171382781822922998053554e+403), SC_(9.29148881331016017438125891638080018212014292291882679200529590547832304567407184326223596084425686214714986231588578418364950582497062496719725055467621486059207426245249948470330830748203915880625660889547495905324917365284070816415130302032930680680252804195125764041781628393891986449221487360280303514405425381004316480855668602480555837000785595641306828033161731966902155019310529405380690397905678939260016915664078410971970917323430108482202101652422307680513973343390934691531297189839502532e+02)}, + {SC_(2.14830200195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.67256447103681992846665737465294479491140557774185558872013991039590161112369580714072727841283114508955245900514838567232530868287689391415360537590686186225366934252607935247607692237346114245242774424129283338340912041906662429742425125240009819454762156263777660340458616775163645203995076874546913465866349507299464269295035492256383237480660937794824870054357393117651593429044017691555159483432555695143676377015861696977994120698081180348729405390282086626734066030673935465537077598305453239e+406), SC_(9.37009712289378842213245428465041698856992514328464053226043507751660011378242955958537701246499474225157792429164668281669766339089933519712342433044104352438802390003954164786043052732709712887759343850099543229121919148743349015236565174499458768840714570982081983359924063622231967320469161737290134596059170102423626835685274301055229984712904852868506882233227515878771133801217376494008126432210768898874172265567661444147476568067640099341375806348321302084885963327830251527427616849254350135e+02)}, + {SC_(2.15540954589843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.93991463103998582508864641373133455993632200375224943316978153990730700500580676570675580332397708737392566106200582630296676076963410931095795527671663270455401657747794956074481851286974281894455637980542990782893623962858174859461455913030832156689089788975914341450201015860706012141198241713678732571053326601754180580960420864052353806627676310639654186640023411135528917463407588301019747092967850951436456169284007412270791270032275595170510385886649947458883486800967500632080903173844770573e+408), SC_(9.40825876997397008740718169214925643060875275548222289998742615738079297965310296955213902079748169062362180776611609854642597913581075536671101595288562142531062838748454788405429106350414603053873057156949021832956250130658872272459660462427620450295305163412757457868538197514318433979409599826544160519202163256722145459662877575886036629112345562998069314389977867119630192926097630038593688114768725813003158582062941123230020345569797063986524813578534555280438704685674231877543576332403270414e+02)}, + {SC_(2.16148010253906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.02761164835737043084807688662982235295777402691450027760392125197765084121360363895533987597347665898329212674880045433838292058354372919265719061656496013942233619026372895194066349296316449636901727288893036841080969920325396632762110173782177020121048106259133814286713353927137592191667824123460144201495829975242846828791563849339438304174284054860162700849003726441589259832270740699580715686148930618642761973796145981388202692077394044849938524291558363091884290919708442513674511550926076281e+410), SC_(9.44087125449245711324964718946725681457002336914752574180784239638434433261740800047457412285421527739426007490956073668290440888907971364923388038040450732089944005676999616837820395081350030038496820411175501226325416439012012639956746285359687856473985067886496244826541064809091026376980560986751749414294696656832283119146443798309622104504720249141829018011514452990348444644465660497127844197454738129306900700398593715891507484937243549709163813988358176635278586847951067591864723111535477351e+02)}, + {SC_(2.17751647949218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.71340431902980835164335762423796436589350350994112072792214738778171203445804164385827969148741478094345925443517347585398501485275407615052525430631963625272970012243841764505731807160622434242814926609466029554521200878574772064056066191281139040442996313225215610751861014869425131528374201938817253066289322132814870942103612911565436241843076514450662026381379893050798719891485183818071811866241701550929831958739365446580273602092936503287791306216378458193675383838809219151103509123255372719e+413), SC_(9.52710458455532851639835038314274498315501215972186403352633860676830029596511878259042607143610127654269615956561600687026648259713548317015317491308191242589764804560361554674638220491591125291771773450012254396706789934186147695605406351507279987276034693925307478989988590092811812125547153934467943528044658158593754520696564958600221972799287132297833915406135313395274815580885467254946870813493050228383823536128439205576179147313077810206988166108614044790010236487489930124166546064473549957e+02)}, + {SC_(2.17996276855468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.13129500255707554886187229224041029570439843428214949849750749289110808805580745649778011757392626156241212375807672383606350701411093419389329072918916690387617121971808387005444726650118614438177892597923777144475441198065916783025549180707754824947115518137804797505530079865767199027459482498132114402357141514190576112432658808706859356016385344296231307583552925520220825752250868253480428489603000088048811727519686862608174999989841133390163636881843124682131906236849947330360998589351275932e+414), SC_(9.54026958276930974866786096141207963510282075001695469937993340186571568033819367507207164283465612989883214252153840271538745727411741340941936973021138044583077867913221099816951460103304251072253130282104096476901804295595445398612503617233278249893386418928541879740516087726527713391095610568463469714881207313741822503837317080715513456908612015665137670050918852863930126689754402414644453087641534274015853384313199006755428261671268771821369799195329141474499040909625923167287288193032767468e+02)}, + {SC_(2.18086364746093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.46120886422198941176094565575390812993189258240032436842291399903280612691688652521870878527411710319300698338694421827954188059292239416312662344872700594786171809674906839067133898297628838922466623645844692894938719602118558356459692453197914358007351504121151247775914823469065212526339572116621919216307184829717978344011587528068285933875015100214000034281094016309023687824022775549044837455472135657518561532701164785646073041437250541734988572021839186113899968419781789080825966314766700177e+414), SC_(9.54511846410307733251478184151031185470650344379357342194903088885043748304808102474721353322145851967969909882852629598772106818143242169713973570162748400391527590736783952516021674346424346695243891102949590560370125670826511627581419464773259152047995920975025631442461827775898809830765756159112646326941479379822520206359643932720929005125311846665376636941324258967860355646167667192500862151802186073700285051544222028803022755686276279585674275472612395003821390017772949708340236625234425802e+02)}, + {SC_(2.19099243164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.09071930058065094245496319664562079255113717209322093772282679444434716466956464796164355537437727770395916936090089222269857365904491254434491886613216692899763966723796954897077521599069572976393753967872106853704538521707960767461481109695537844833766405175885863084650797321337117740541494754684924323503689333664902370956616686323068718959819891317808053871021590598898886639150602749066550286528769125273871409829351057665814458916856560858710544725729239093678663812676906572427729021491622629e+416), SC_(9.59966116324950043746301709963886971173831924283030056135285332150318203910375393754829005925237839246362956635937850997084452898728509824631662233781434620254166767701503446197158574058973097735744336770318186188140114226228467845615371087013275863580849872474235589291638866795385179012628162745789967452025085267379843525230250236013744901475887783526155418739875702778215599395528922818903720738270928962981417436322007321679355490548225012657646778859092051749324834977768226582942177799276045298e+02)}, + {SC_(2.19516723632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.67216493641861127200347874593268548852871630014439491996415942153041279169939215226786289608201574099535056715694493811607068238231977670634179134346828638451975784269428952823639868956518158969899741178173624038340036622210995694040562605609640541379819676667055398583577325757720629491760060193629917614248605708364923842454874386649419671196031172536225218287227111727331444795912064143719455965084302879758776249864782510178230962921527551419863483412763214285412435238701301451587284214422959027e+417), SC_(9.62215582614357532310365557514395430405854343037631613350602404229592578489000436551166861196041340959495358591462809081116701912519772088841336574357932955630083399041573213058463639369361474426677033552083021945300370663512156930050060513380077707234067794031787103666219708483240598363402453795766043089918862235084819248988939566391713717315237704138262667981769953433014526496440651921710535828221477319464253494644824502787848819415584580250951534583483743174553704596403923369793145884604935673e+02)}, + {SC_(2.19839599609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.37225262707653599653711820353653368292680290042107795549543404450780137995523706257804503588565958265869776422803632286865381333971621580552331042799330399101696279128476684207611968345079835995478386717231086868243199147991189871036918425963831786775382615471035894407844699339741980446582699428550700582217520064182861690291820982938724766185631708141908124286316108280281877499048113512908636162667218747555743344743604076941394277313545374002161667560157713395176545044218642696366437819531115511e+418), SC_(9.63955847223110394389235188267594151754178263699692568317118224904285492248096519957597228717653697302640838284224914466477592933601842476833335001277142296514298191054813024974274015115796967229697533859387415349662239171113229864194230362265528950878253332746404383153621089118565361402590964161957454757890195465653219164433010495228501515210512455114814368619339456463159405016390172376212479239322861777452059833092527450275756275707164090803503172966635432501972444647459835011754132543899603307e+02)}, + {SC_(2.22194152832031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.44032262608550903495313976799133886799784197233300486553579224143139553556903624847272076638683768869182459088497481696864297358176383077206958717371353195626849363634979562388962900196036505994767657151750053872585306731106654031487654476647650490389914137506090547371635054136426031331557935145186181680785227757429381582799637850482743930250676439331282867061521315230528320974946749702544505202089729180048458611922316602433935948057076340296214322219855529445898709037420674549154600925080195186e+424), SC_(9.76660946563861461010555925889706895360385538452085228187365134459129072316048007335210857837073714751949133642119138372463788350876624727611896669144379940278862508740728225845604447214346311748388259690873822504933818638163147527164300015506928962779800561757700302703442709568409699620760279637023257711205079507638886106134958413968769285382076583440779626281186698103523780565709021574174683410071972089151302751651383839417241632895323701238879559639015569483986970278258480871461589314159669816e+02)}, + {SC_(2.22939697265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.08849830973041339619849880512102258659074015280580181393991109576992015581662038243987459065078898344272399234338807738087565779427641206083387416195456743446844871142780652716783168821917540569775408453731306985285441321115385277438949024832826976239397688820496083049738921276781967448246722442890080168118915151920065301832844367889918254972881511288400418949545608225939548707327204644504068161350836494885138311797731928010526811385937592008345913431320343569291455112217156672641566365009515952e+425), SC_(9.80689107613285059372449543550941420674648369472249828292039754905949142785885007770608892965223885788218745303191118820562691049784660812981229074467947219978885790974253085975473979245632650898788050611589900236206312674843146926926150180087286686402864383874423569723340689835577614487709179170935290493976265256414011971563116125012799652588343350374269900762013290925378701590996729109220525818658456551614163163684491861419634548913453936895204775165372577278837736236627731759811990947945526936e+02)}, + {SC_(2.23407836914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.01602641534508128258400950214145374273797050846114242001541284534710542653468207980277399224254098852725750690198614880760636523422915547928831404849495996000800662060445653094965254896675145872932515875338797873448295793020068388660061422362203221153377753128756862647837950009432931683964156189410099104121422217337910185538855320473202311427440306769046317038713811978861575226628070299860658425341993205144141972983264782324488774088125826150530755860120210612244114406558912323853971223086644010e+427), SC_(9.83219734056631214805740645496463436211234524505475410535688867450764188677391013597688715887121794422458254521169369713888832262737552174083801113013767124185581343793696319245352755705382851443269006016905678997236882801656715922216129337829606757125264740764759978132666643390537700039675539669842383538569378954333738842591219063945023136668912312923376846665554737447746308715250063238132804164257172352296735140656470915973499582649443599854482390659748267654064813035319225549619002213427784655e+02)}, + {SC_(2.24445434570312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.78203048568578072314975630454129358346597694541867298893268295779312349054115177672961752672090492075729789657087236710851458584409026307715710927531034401281441924823997316505754573561665960838553695186511836116480885300334679016038360405175553662098718417729786579266610185124858219903683024216696158482042037421212370278799528122475509331400384923037092383967020328871785652646339928895909225242591274145726260123768031085217523259780112767159003400904397427387971098997527816604561062545863704335e+429), SC_(9.88832185946077240684590517478819780451128112923953742197222968510336607120384493918723015029894932108493866736441041810700846073361088322303145991164121421652517067040902640800035159265763957018969027518089773608899386328021870308066455195615844063301159614500153922927325923223988512665683867898919540046161912743964469037869808287195463032769869290415963361601589546267939286944320876254302657257848836043740477654481942655172138948629613157341147387125279557708891527067521340447109438205641733816e+02)}, + {SC_(2.24982299804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.08570283125744064071408282635378045401241969592156449443996702190835211221986071541294572366818302356541415307755599912973777296065104685126082161106964718360429925262611433859308223046970504685711082907721101589244124275919321272422197307590333345019716462006909782814102785758541341122309780507203078354967106364356788841452814123987602419979869619346935389886649067301781214220457407095330324474516181076545625866257383290602306079211952881872730447864137788597132669824574184100276125868082219937e+430), SC_(9.91738023223958938884009881065376131555309354725573064026172975476434338082532225486389254099218688500604631715941744807852624165530818749931061431911641159805284509729542885397058261027663314979484823063801479848319523581382232395800774141541503586885701947271915541461771489709321299408954375923542489570905202242397918325319450667664823098951604276868695957185084867227098618625300782013524000820771445825352767851760490231492154993825757921566047222920601727369887072890583913275870276765300881030e+02)}, + {SC_(2.25380126953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.38397630910989982662319897199822355262622941453933148710342334376170037992638646776455752933851589205088581764884554455093887374427845996862764155987352260193822834547176833268670139068679454516574156176879380637561952215681621594852800964810550559095376156580039180603265458146069909847122696205550963305048559966181875267238018292624066290913132691198433801575590704690978934726613364622856743753227525638991659655514117533570607962282000337241256209304615437910334310799421201705149490460361728658e+431), SC_(9.93892131226120893153528265293455417907692711084056105978330316980314148928761315406931894573674925248184025226781657554740201804246189163054722625736294660437392216588384258232617470370960400836719517748314210351406062703736702358115503393330157503550095174818446533875843065828393830314607111282496509861162829462009002548666854888549395427924117314763624845814073318211354521205215981882366525078448830967768959248245541473022064203770291966690333874553467437510022252495283474042268962476720672426e+02)}, + {SC_(2.26118713378906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.39614876650223645360231263473938174402863061383726780064920286322497017588994204480739132264037264067830696295448505052236002652817040227065685829006607407498600502402755802165890384784931203281144550189885342738249756625413223643747714766123370215076755139577913640129626581145595398520375687222484506015632658050093276378770995676010787061717176679192524772406173203270747997823823211655490660005386706548628900207447034920309691242233987394832471599241410916931507071430774418976862458606819343979e+433), SC_(9.97893208034272649735921917255308552717947660761572427906739477910025590562822234904801165366667272410617176406496096031979017585449995098746666193751751704798263175479551023650896948478300341855305364337500163511693100633296716081183263040654911725476599269115441947739032989735343050527770531009113636674631594133928375474154120689814396987658381155565472240695156861646528035166405447476890042313942613111801777675893964149206639663651050740370795921499376283922886501627029955337875033089310146943e+02)}, + {SC_(2.26405944824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.13646636560202198632099891680664160012426117926474512793298011866742557967962503462851801678601440639983785150487411359283183879485770055012521243949999488042088058632091504968760071183881899500499054311870097656885020207776773626582838277407992323550059821879498980927970797870285566527105997224181161537398731430198676368582299493467653124665022798275826974277968868235120389957641081271455676439859708153575229872144232451572457106486921328919966629955489765456656814600779054117312431766562222639e+434), SC_(9.99449854128569500985805506445224310036677709286609573497683142955997164920503198575362404784244157536065579835245612214355555848464975016855355135639594467073790826784810797346580125716082966056623799334363918073005591302070871916300341151412762306056300680129128167620210199680205983088439519866540199283793059342411449554638506634701866889380956798891517235822626677959487715208563502387089202510551655001223006521405112790658935808977694335832575278466549610236022748058733733330424726585197232068e+02)}, + {SC_(2.26736938476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.83592163442986797248261489827130287085214191461912713722871756512942719246912971920116111414598328800132195109536860912151859983913755051117782302428690879733698225536153593512948050079777922978491605603344718815607149738566040626516318819520326219556183342036942846830134480193107978612564899303586610863384541017906185443789857663780749213169459547627352946245307698991614237316373854125626280241550114161410589975426301226433861910160177253027795524092422080333128793772423986098232596794075720037e+434), SC_(1.00124412166094487150595607398578415184286075429840017750669615166514802670126613942281835373480712693905021482183819887959841186834703214515453967087624374969833838207138357757837601033364944274819528877945665683525023273696360579781024258580591977130803459724731797835879337586908909375561106910629402837014768640173780750180259831466071739462689187458769415107681151656878301679976405020325744495319201309535234547402820679715200331411569575355353298139875377051054506410704721362118338961805382021e+03)}, + {SC_(2.27160034179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.77914060211452242008899666386083052076020460649670826869818173953950212848789384309231914463302618136703805838586907800270236441286674518912496507264566775291438162369972641724026905411157420461870414122134915381812750034680648205729906304181318950476533785406078983075377792445976966054236115099984421563591803655093310255335344650795645446758018267005460249434136721239530111153839530584353444102391832796692819618881695984016557439167054304360445240739814704554363517548086200274977304840926256782e+435), SC_(1.00353836579147773636635420989355151208877209533358027678391798050842251076882091526102297723237485323576782054389490788244017367562953521735552232493327071868269081949601477850110684984476768380792623135825977210171083924553780077721841064428303318039606573944924108276012682456299563494701219941692589092680383521323267997227110599698236865458718055683583909203116080409976568849041895018154553004514259189900384004033906605321463098090087570613086042469005894541726984587197472413799479116601460397e+03)}, + {SC_(2.27251037597656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.11052867640829454453052291025757960658413543076952380042287916481944028497762444930919833577206505780772868134575482029270280362186487431352723467266851681046659447223730372445397889620596241932010006197386489151164784203310997758817817055876031118766037758710082090563667423346596804851090856128402325164481953294532643117595074818777042264904054121835977363273899344512211175338061641165997292239896036240484605727372545714312692538576299824378621263658983340845164815186123901327436453302450869458e+436), SC_(1.00403193673239295480477602366256121497447077097801182886245727507501880605751496118687196108313777798222668608408777849907357167617461301895673631721072702260667937113872649674371034709014227852308008223979686762780850903215454691388012863664666009490326014487795233371894668135247672648098633958365917296030831908135942177892329974801305128955359313699712818720289855093981017725188789621063984596937521427893485891583226885884185091476361258699871312799317001155755187769395027893412340304105745269e+03)}, + {SC_(2.27322021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.63207709849931145871225054785721944060815270545810286089969977505335444573747764291754041567166168909984072499145929255553424803538289854369237713214437709292943536625316190051590509936147341227297889304702762825425433706691825011136068978815653313674255578440420644981144821240708594519845304995263875525581279668909987253339379751496898564952924913409885321685682484389724063805788629863604220917361441950073224320500683681966042090169252647631221869593021473584674311386142486001635907899170124315e+436), SC_(1.00441695404255749750833880843462991068907929587087287878830426780880302332327714066072448615165393695871343789747137099406763660160104408198664809359011139454093806868551932276540681709449766166108503346103751510689832411644488747795814493189289661475279548402061482242873616752441433094303098293394131241740743619715423845997549566048204364866262963318775358123150746620392638753760626010116854941994154786213978711089846362617537172516298750146205786559079059329703118874760423940968396267966798642e+03)}, + {SC_(2.28519348144531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.08301840514189880876105210433783730639445773641182813223476146240835132021036070768294989734279876868032148176204430975964088580242578610006274265663450361300155589203181147268538497466525568540177608315212855086785138118570465995366767699292934688282954532312338409594488220264594071958730820220669923128699007881170366835399803417557837301229914738094613784511607844164593733785050701172328912361185164073841579818636273938874589893074550582456915009413640915720313394235265549792227627841020848477e+439), SC_(1.01091460778685136004594973927358453027859253753186731137911366590667427721315216232368931551505274753105674204239182489324570562749892472525571235183751396474083708267602945752573711840268943129444049648503759340713860061917873014164073083341241519446029558416362438957682096199098251924631292725493699838897788658879378577003254305027825024933576706871276335595370704597547489230084515007724277840276175819764288903099904535675324716935973817635743016407309828330516258501329064021982787683819888812e+03)}, + {SC_(2.28726379394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.33311688436756978135668900335799951782243083616744817272925412955790668828317289227333073159665410631743395710535180479105886706961342153682055846567446435932423241258460541837360220120837128133247256439424960526881892320363971573205921128491823460172368940613044457808104439560822060067943968490555424906442156565842835604649144097998443821698985872242788369101897121425359453111909831864464469144725496144503959245794020497640252299205666690229453072788621622430551750598503005751988610263971997854e+439), SC_(1.01203876369191391397537008272298388839527230538744183935448891596555756547106702370936403620577459612149080321626505005366386360474333663515629660404711227146888706650007392058871800825243571188452543934339499169951444698418581119928502493208009552933987567068494616176046415894456738453361351153810609329242330485851335454872873720161453739661096346027323557368554037728986429472462030061075682473358814842217702848228898236042470500021601695060248893896909101571407451236019000869189944883935762699e+03)}, + {SC_(2.28879394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.65135831041580457776340074210651301162320945447995180897277995994680734216778722114489069796347279351480307803271876171024271448087524642981828536415645430827293276149505557939771406156152035527595413645846904431772492351262479410618119850502260548624885759325692799584044895196359964192470904833213445823262693397368765103870015980883032125896055872150860625736736260444796414464113416970335338021601052071391183889674329406648074533875855540014866492877314882973740174337174058595492036012717678505e+439), SC_(1.01286973901338023465149992260320944767495589451801280341721538674674441760940754891147866157152411375926525316233491535111651170380037233859621103603550695028573602272014224950651686839677320052003641472720756972039317929410042788153661183364726698710636237441430816782807753757609306725639743186114505078794658557227065759866527822826913600964425065939668093305689092805427641579077236082387589576411551620192019239049409819646908724890732828334201726317266119543502185385568991048651259506849007710e+03)}, + {SC_(2.29125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.90465795226708556790017669054239224462354429269807487381265966667017548765980723649772797382681027572603162976838938370170818237436251860652000037925826387023967525363791818075226631289162523946339656863465465820726410948453526025835878642915007697195245134620901070936241116545725978462566856005447431730237110518337994080935190293503851444586655133879016012999954639820851270960695432912124491366367196157476373186099072824237976487832801731815070844012065376523608002168148316258296433811753560174e+440), SC_(1.01420375655626517600958716349442133696717847574624546733629537985043871004732049302197607467630694092273058397712207234971393351833901802132958468701652523758663869773292490943710352570936196911816199608025632640693494045837106848016856502024921906420277735092593879433821241801222686972382213994884914975264111441264758851183858195504386844166071843621593620204626779873388818501911290288524863961605511499951632415876373557694746845507515525976867337733345722471269029243915715912551704102811046404e+03)}, + {SC_(2.29655029296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.17328599445677156474744540820672325827503902812352631148115214513265962946517542218220056919226266740807495223944787036752065838381374165589386700202040486455853880580142280010396819876123508311556392119531308643280503500980721984340724405123823704600058529878829235661139836755072061244752119337251084892224874879871419347360822727614012404366318296169076312194398681835033319653763984038215775766958241930120997208201748781040464994071186937000864444561568396233212623345228013137366118153649313251e+441), SC_(1.01708353408586320663465879346567561866010735047926971925795156991006351710901470860348123425169599299760458061388919004414254993007807681385496615676672852523516793999597100430287717602574910173941843661595774649577160012203239954479676817977334225778909099418980035309822175188813783777412355264521912530281017758596993478482210024846748055051573736813430251129741166161559839975886738148624765554334431976307623445065727959659503883665121342481570996531822289700354917381018516576773110305371468487e+03)}, + {SC_(2.32175109863281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.65028582385747551520996069756490353867743417593138571380490769388198987629714626296717715502866244782857681499028028475966556243813924992217605596798478864360143613600787394349911423257211984469664092217739322955802659803209876171687228289703460196056997651405936184394307129898685842057522879290243672155415398832788162325527224706012592857285492726653693130611300664114986254955950091041390482149622138175561231786819467645864963718337261068245278972211328859600961728760606130535906275048832376807e+447), SC_(1.03079246525354486785673682028102788701570905025091920733312422678260569871283511540662885611428562553382152173385583541472628763740119308880655804360319412568333270266189931465893739996002495397527674848101768381622086371938982695825882518212690735322634868055443393525803981229436585770457381365370767557747687842528234581064046150197526489643411458761621755269420572575103889832653490580441691448344796702085985589530834547695229366221918548114968201850198772489098827165857762773352153090225566242e+03)}, + {SC_(2.32473083496093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.35632196482493355248130028476518084667696749878269651171129987099594161236188668987303893295652773972100940879650315989615357005753818087230776696435556405376646870974208936505050108433686460126934829629832266043277453245618620153658714594999035580638727376349710271139659258631431162309088695421077519683884996781795612158187985021119102710380411466638652939872592904181488713684921194827217543223340998110582417974894678896740301600117909599159858363961332219051654706587914484217666688850895098639e+448), SC_(1.03241522357518101737393444391104667102143933628627242178063950059276131574433741373715815692875410742508921901250325766774810623614541705119801498495850448015805077412141164707534647750526939066262688702273524609882263513152715082933872606914620239186161457724986127994417630566256744226848866841314795309971119412070383482707935638126112511003037623452910434306386212485147768519672214373803566820343635071623058580807115864223399827223937207577555928000842687046934803211548105541783448023956266920e+03)}, + {SC_(2.32713806152343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.74386328860427139708480522709140156717097295238476263352838905519290853840258687894960348430780392594627170267325386390740490356736554197674894265704099376693689575412504395343274323240660516375703433770729029172958494455848327317377274733684576258763684332319067909261279776488142490370393200561272767820315367346887415877595167559105371975031179734689134061166583608754876775899393186872700984916001642565912685865206349436098463417611566800620904270839696975574154553405606752106422399839471109019e+448), SC_(1.03372647377720390505312461302837813352314109798958416942286520193263268408295070236735892983497373290409609004357017411946557572785522222817843942888562928412052126206322203596191617395362584494214019632663234183527699317139696442854387213730216677280623624507835715064537863198524758711783705028814304816908466887716821972886975156198102878057331998713435430259154109378891515830322267984193884445950766698658585746179858080102463878140826893562429018204866535312097414306336382208063617202539585253e+03)}, + {SC_(2.33669311523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.59652230251173342436961689893479071619890832051987682509430642695276639519037742307108764387197561352113017685797688723166487965840386571091728724735963038772103347150810040789916987763976893849742303987555945731072512633613678628685805045698461098106633571091993892970939086933041705624680677838363464668332065912230077706640741447662546088952351730357285599551928479725877541554519897435934938643911703341693287057929274991084144152156871690324637742054897371502532209347255792736638275100784415339e+451), SC_(1.03893370464301812430270273797465443931621589838138001868725539378103245226106211699547624384358779493645877870879950332808476711355159714356127393403248642378213421767795909018688531166529087150824647243498932574293297756523173218892933728579129063958816615693509083598387560219923842940734042656483848413017749736555970446860201572396326629555598835608823615041170198622695968531218784313159597703450018676131370651500498024234738652202512810860093984188364583869338612575330092237235704879515985780e+03)}, + {SC_(2.33750122070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.48035542212848748580951456739669118165445155466209970167021107325238198610828827210753611656639746672855622622667573120453801965123116766927533289960343425914807596098189017999233446379611107483123125002084704957184911538582340318168891322148345728809670306031039007532257405968346271664750720477702330999158462667072184270366540303796364834639970791998331915172645614748307729400559386201499163395160431824570064384505391923680439672678391435111828269975380391543551347248276222927047295055329529459e+451), SC_(1.03937427880559721723875271010291664425000712272482747010822303195021385976486936800202960953254150118444336648337138094881785710635932423121552387592325915868032769800362005114311906889861521595924019898210225487486479112793560138223985653696658590301672094662632204539014073516959870013264928770396089685081806702343716357072165714374724696550546140945549149812149654680894376153939404835299018702833912826918021395290784058715404305726774458550537666719274443149307309115195305385504288343493217405e+03)}, + {SC_(2.33906799316406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.82801456973999587757205068171942105132180207403568346005866809810735339470733094874377357719203049772673579622321393451563161678435517446669340532686518850474088637061106219503285743890806502286639271864279715100124758920673787054001880755387713460017747265822416656434785819729290755654738067799648133741584907451376231156918405325219771194528968390017849768174019273636367620581094554885412491341496431636058342972195907296418628288471085357048655824569086171978507955092816797735495096425887045867e+451), SC_(1.04022855332859982408415144993024946041011174818687099670272097532904899371291592732450041149667552397760967946814300639448342297729566374160248868428177893306089505241287932322584962371867294002552574092352499399398200413445291454849585896947462797919655765101601678062637862099177449092271828482862475406588574579284971566927994676631802988559874214856462747454011848999818038586875775249135149599695650058521244907805686249923896277154594123193736501988709962120662283636690634118624488957543817233e+03)}, + {SC_(2.34068176269531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.40508904242176682116449042514135192129185300516161322566680256906472959720494286731283494975892497776007252984366508092626976683330922807310355867436972081605252190723925418279096272760501795732507173163164226107284022502985421438594469900518824723328937339071511396435506323052491106349230840389684572851957126303924608861311893978012477014999461407617992098219307561041406770984279722844805194001040505486287039050952359443948230834932944819759102109332164838256559450378885359575054433390911366005e+452), SC_(1.04110856270947538101194381180739614501940831547553767910940055080764751365700737334039050520215368295438790839219465634568043357435916437266102639570485279489511205375723738730632840611542004733804093586005982880832704926103737948659000585902591150081724989400373774302479939421280720081357450134541122020935778145630254133929893066156597291486410214481515034569493052557427604557399163276974463797716814061123342134677116493289934436571462786251114054111021383881194629007725260193971237581972192174e+03)}, + {SC_(2.34075561523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.46283464171658205673359342187410672824004419696515224137643249493846938374856642233113123504627716101170415495851268629054747411466819072270070335549797785600841880439114525219359795424265817003049954995965790925720619329988435174252153574355193851582031598361707197363444624391173683034448011338759118721330089135315122899534041971055957544421727740563680746798981962962211569590141183476376982177149866375324652933807007761242518507116163066356104492152803643962684824082870010205524536918328580171e+452), SC_(1.04114883812210734373940955716284135535623863254266114994072198399097755575973112137291926747756853106433221244035373782860063705460590431606919373103448643022775888364716485397546859370263675645459152133303174900268442665963271610916778572102610236059216548063098273915034356448502824687565506462661829466649709679761032614191470441920400028363524714808970146412806337881027809064218517206502148220953690841519561424003781360750298388718689647519476416924274628377934089876068772673154382308558782929e+03)}, + {SC_(2.34572753906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.20287125067750718079139615179556149905970705737477202140352950933804030796805778020319006806841535937503813753291900950161423130809793829384216797437008137559874967689299880219915847099302300568176588815959888493888204101039844802309440835065942104357220354489196452767916876269412368577518051395695112924365267720945507718005081347987857139692854851937255638787567714405483457942262895187880023159499253905348472908693377988626310754506957615323282981674782173709961832035743109581366596396000766294e+453), SC_(1.04386080874969036801593481122975719273903962696565461185917306643059214852434892615191390663512848662213942068030645143498132360982781771748445235081671909769892554624777006591416892897140518753063119446522392570255162598160952720607925871933199089741106434900914023889219286870930878075220379877321240091849202182599462305189382108479682374213663824792934325082794309818350885816900788616869147146420656414455017195270502741847894234589091567320551824439360401139416133453177107485446208463479050486e+03)}, + {SC_(2.37662170410156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.69588476604507350672186752288406627352400913055078408716981871368266246503967469530145974326225125508563872740428116310193834547520347257459038069974561536565731880187322224898653241935568316418632480975662809938034805555067221097564206199023693639788694315721481233294887573640242872312656226893068072414074658464079012129365543673872125822028793450086559970478442297078731733678192698753342197922850083792015244154406863318827061756727188665453791424919024617357701152260593008876378756394918182591e+460), SC_(1.06073582932073893986121819132589284880939121012423411497232498336652819995603546229215616017202919646806970309001181138023501723142882120433469844760382028981120858943613690873484190846929999212626727030228784547105807868110135666964008269575152557091851566554910308685442302810215072724949067920772200007993045157033316185171310625916442647714396076525031888938766630589031942049654503222125110862347322527744114218543156807945012208393754490691843363809339185569868911466295843368629487487889402498e+03)}, + {SC_(2.38079223632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.59618044933309459771629537051242306454762477378097715480746577819101505814658760309888699851098124052209552820566129110212081322845191298552461829550023703174727923743890160470567654429821301562819348623836912643125949963952210046866434314885865951794015597027784975902536269974801800646224158739856412737924320313251888837608711617918676184826892515703635752955459512440883646941733927187229956342309875581212455839337808308072959797715711242383447998902505463971959849866808546389345361739978148640e+461), SC_(1.06301695349172781050151628847925561848956764577879967408325982564471939300851272454355600376827087190085627857129662149802055163055954305615719876834754528451285422367660868078171385746539282909272333651366917086823990743687477160421950231251969903877847305883867076189241054568971406032066273149639388192117482419647664014896025094675648822702834273747775461229178334364634670554889108199859490580553973780787630501279613967857482286537056883544715806462908099785746924126543990393689028100842174351e+03)}, + {SC_(2.38192504882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.54168175499587073092180520329596804386627391353583263303094023552062376906891760719594234021057259873797695304492667084786828702680774484454771280201969339152006349027913918717203732359785155603647121841894949902238491358184724862469635770671456804740751709698752857245792952692958167870994067809785211732890734268168709749038686040288695548119573734834741760173346998233828155997415833994468018251961981546305932305862226556095018502477012950304314448062794909916360185543437247645207888756894409452e+461), SC_(1.06363668578548250370401252795936678658214146587153696818905389730130100860689831859941425445709214080634074200123610199460512146443301473506822773406672518644428697261299923967031368142897366971037645480512136567654306928245502642527004354203279461009930460943985372427662669531902550869079353228012359246056102213119930261765576845040554072006843098564543925310860540263267292346640960068014576001822334179811230372937424239438270029449033270833514558013170547162234276094554904595124327979610941509e+03)}, + {SC_(2.38285339355468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.41947397118963617314788755637586490746572454896226633465996020682987607134116483944555498871433225886651689753038477214838858830924218287124058678338088845707104523190503118871654384066197536681461587863450246542829770363263752298596106123095264963271487497185615800319192434155689153810124072113606953587678619118880329327789427979226603186706909941800117908967798427102472909347910366348048511801362295937601258427254711672197893257522736007583671610268498109326859949487563742610128940397491404627e+462), SC_(1.06414459932340718276254844964333733628424778769854642604502015112233072895843496897918274954904315525586616858168575274984910607132443555116623755233506606519200681838174906410790930968684240895745920089002586394197780631346567289638285171542182710036292522114470875839929401810311049350175156819473410738085571871318604415503971285224403504307872198848550092379662069161420116644278008128925165473851538013617353485002911131744330044949423016346344021720680788560292311324809522043915399725265728324e+03)}, + {SC_(2.38449401855468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.48333243944963938460038807628141680728652734242529983503196330107541018884896450269605270390685584045655111474349716665525756455157228888420764079214622095351932293058358702487712129858146589484049191998982061154465391651183192758265896560986975716447245342173644905863227919374482325681486395452150979168995874742224678343035536509001689835933775231898125270451120359615025467375314240659842248179191424322340144486882212653879874824857998197970605647601340495582227310086890254878271533695497507739e+462), SC_(1.06504230239637445500298548527712035599468363901053595843355694420491932752355611922392711324983151830694953190991236781942290030167076003666068983448224125112026026878175583966767564651513079392543162633558750079682061004604189175557534332986159799336667203377326498544563418228880869684058092464801983814894605687842967973700886156083327625053249107724146269370745876324992302075515562943166197597611951013752623883206038944955327246574301159911619035590717538790504354839278215090028669496218534029e+03)}, + {SC_(2.38559936523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.37808122622815690500382267097878998873202671046685442784653396143337081057678608592570706493795126392154927007242948720112233181282793401430241937762280269319616797793204397897342957969475363038861577365168816366186542910958418588343939458983916773058239394873634780101047648471639661133358367997072954234292874405452406442527742981415599511950363089879771273194175468368996547944675734246440049985436493390523580066715602232978855450894692366833322734647102955879936879358004621519562816859069515295e+462), SC_(1.06564718026713188221300788798449318822386679631115909377592931542906431858443887400466029853170073638998929438697252698045097914305821507053489106299600238825989467141308357331920923828067422437132050446933445112950337443966605895270715896592560696475023878200116408756694204603869619127754904399915317031123993372253026740340221408263993749904164694045691921290237886562504789443179794622354363137328640326923815192768951334256414041600152528128088087812324405144604755280874532774575173403318420753e+03)}, + {SC_(2.39183959960937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.94157018887591895950029163728542793408946464139919208038107596863950722829441714083687636831777205813943883550816030552801676734236213942895231828469129488622190497512267498271372734241655353912289454638756834374374740631824662038440983160832828030547695516846994352199521056353737210131359309268596607489388660329143892165771782457572052944971170530662041681201911170697773201968537217365556169086636229957736037640824751108191430402054974991617792017930927543457126672995400808153693341383139898148e+464), SC_(1.06906298017065378187624790057379699574796094882022841748096997547654221159280120433080931509570527773265455753615325241837047249118641673960630966615848418340752374143544479778090743970295675195405833906591135259210501834917009914510024819940224593740504234476226622913641163692720187046117873687162625839022250044219018455743460108004115584706068872740730671027285122112651489320726745685030709857806650888240277344461191044900007279644812364318130783611173853977564915916670449232336680399309889414e+03)}, + {SC_(2.39209228515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.22965588149176883677863436479347098063601506501294581637058486148016429580333788360596199882034574406089046769560689512266958213931179921606214321680718550951158855557957094326401752253776584557021167933373387712139887740399608783535560620660096719919824306142998877127015458350195419957755176242812438880991357564055101611623996309791634738184143468611268765004238420546231730459736500027048766350921461164883247715400680111387616331134653839260533648842805141528698080347847425781597398144335571563e+464), SC_(1.06920133040956932226651899178831678378140063433170676105014975945535835531405946008301947191931154283279937892805815878840500827407033937362784027376567479936168124084428424328261317700025320702773878722368275520967951607263987933289394925217533657502754403110018320534942256277449623683686242687413845378907563655096714280883155894121127292810659928737508254622349637428782210263617211919915908614228230382968923053572998522118132816608706708627636419368172498179970755512087436811012149223971377463e+03)}, + {SC_(2.39378540039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.63461988291952864225994067623663602191421327597184383451593828942053451036098732081069702342147329484498920045745203495636876406301906416282879041998359071240498847876047529634489148845103143353711308005345854350554588069697178872742298481923486516611580575893701853113756883215781067314459664603185439939406635958863126359602153526548719951600913660229816848135080377548870406128893804528813003597117460481870901522422075896578188379937723866873740431915974855618157536225920117943597334847302564141e+464), SC_(1.07012841283800635992785085347866970292486590032130157366223234903895565008124948668497341853672145239612551790060801697773393448723730849842221849579781107959912327731829701690060569384960762377536715585087054264030414008181119739550864608854224105461145376575130378766987896347272444288202711970819139827870250265726164033985118120510088470517424190734753160523791757655570320711553538529532632710323455541625836267351628637177586702164245514362606014356078092189507993727668374723826453086374155996e+03)}, + {SC_(2.39431701660156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.53867396055322384129488232914025466188733497440373309517782486252619714850055327886426163035942208648761914295268988414701140621233303500790934211370387150788422923163636573186379979212363616183424959345205487229424384610002076834560948561388655982398490920750422073502897509440493515594482913466768255709119088614235011109277824002899721078891354881570180887656136781796818978947996209377914569460272454332454285370991748870572228060060041931960790276358333034863606274148834677200061164484295656059e+464), SC_(1.07041952944848996153966139952161324243402102800025817767865351094156118687619512914777365124438179958233790277907704609382961053311705648107838598705922738898163544660259876911789437818363539705971834315028801352529692294264318469332665195632021693961971710539840417816448269562414199398721368148461849281061565916133828035768483888489411615317067220311570705191413775042769486971819422724652702511400307292805331026316524511907073492287921935165853618049207613131972229451073764106459363046787272503e+03)}, + {SC_(2.39895935058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.58440069574079716863433060415505614425792248695001054992436506568573113361125617741080505710931160666409722196210637188289065615828244553129407501359478447712041394737835258206432064680815129181252982191388623689880594520289907379084328244975909228808102020617705819715028591028118727415404627093200583505632221692729880520334396644629277404801609762698874425982020764961452953719532853730335255304997584681802933253940534795961862116737078259312797829485848148571463243429545578162327677104015515565e+465), SC_(1.07296220509155140696716639581772093443397169965248974483583558174561895960246006152036011174855607317424444646458479054017625998172108308784726950437696587884083420633054006725507519193234049878235365252890579007317444947764342402651632392374748434493152421235557911829580866197001662654431022160815169996960631290372264226239871320023503509919344917855854505406637219896990913152625013444888676907600213797217131259342505913976105952930314479063896644806082096327414637850854373415228519407865099881e+03)}, + {SC_(2.40020507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.89649718823757400947167077951524460612069569170739924724478610986732054323059049262923936813149857907497991855749115111878553506221462619402833669969186745939146292893351855560996206348889234697487247736688065215920183119411587096419492463789431413669866205678827121112834670698528339566703335928736010958579198829210799654271653874426161996240008947274247261840057377563969157907695123562519093760418451461130854445770752457104931476613410969555068176588469297715515682723988571301019697022594755022e+466), SC_(1.07364466193476492876048551186409738209718738939823728933265735592193249748264877423649331159224627769568207469326271675026368568981774365739915670977530786589394179892817758554208471773608660303919743206731677900514557860817700174377917327700708102074241147868175251517696915049733738343976041728213374667557859050052690033795640638198300864515996594190759430675768272167972727147768409289191063817268205945021688787296404871571373323909155379268103635818844505904906792747070913714314112647577333736e+03)}, + {SC_(2.40084106445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.68706908771978335145497419201912653536187825194632165097535475236043557963394839721753084536758345053166882212041647215258832448890646214678813646720700127049153399120304804010492928609325462753341521395961276075108926892547430670637418756699791756760154525651030946861164426897455385903178144514861564395708716016677570811111393049951411930208514784749684637435303949385791283747922569494190899010361625748543158605603674370587879035558450407372816503889721792634688945585092930934850557005438807571e+466), SC_(1.07399310437637022175109953153717158598200508200904978208154121260195712977818631630399426900935494427055182178831447866580572567666402697210381738873289388801029502443567662530529953826539856260050700863085564336238016716473024729408356315992034242075238725117312587052039295391048223523442893809549368471091203199129016405567321764782914135350134185126956493237959734804979980145189650215070941282217344679667446108200314884374982363709898760314475456934985597330611568458113984623669918181477657987e+03)}, + {SC_(2.40304382324218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.98379988506134624584554293334006336606012627483173202720669294973690522713177572304694168707406459949265446296998524208404118368290574191567674982097225782245774472717772301332839290622449213487957133087081371198820760622009175357226333728469053391393594151723725413393165786757688131591819097892066077471548298873438325286259403547733777757557043157082065170520140890862301741934782938334333655220921264911228452327010059985166234876779995082414050249291987696141757234529516760139908801481820438505e+466), SC_(1.07520007627782088915699782436285610523850329573383010502659256504687146794475230751227924325397645047272966798126089063310217233507974534484903004997977998846583427673313053049155047015927396972049401157366091216975271099104410337759717590406992188545244291039380522665894882052910674838461833212054822745374761053352047785361998416755664325629469623911698927841249593338616032755404386053212921119186176417863756983455435697681313949377015100023267612639725960334287334440649672025282453011894560158e+03)}, + {SC_(2.40633422851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.45290092042270445706517858930954637018954861402108015335284684055533927622287154200369961358224881777399919496725636111525501793489963554569357513118841555869298121393870373678648941324687066893744420374340782981187062658105519368480418752139670355836763277753264552537051454640625911426204994028440408335864444968153088577987893525530695952106855218936088906142519508504535683925692481951242397994049231261957594013192808172290903678160977523000903153149699180047354975260330636608241188832667886421e+467), SC_(1.07700338617426092420360655683716370212100133442920853289554025092105866912032736305524287446942059072340620021122365533451797645705244497213533406333520330179422087477559452722248664993453801786833333880483084927178665861563694223691008298833686527978073987250036184318995019552859242072556251140856415592470963477089808590333932257259883227893181351600907893750933195213601957847584706772825115751509214042479687855350206986519218828193282538913435834812781923710324558728724992140653135621151349700e+03)}, + {SC_(2.42259277343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.06707965192344925371397162677896126512940865619524129198376053988071802950580636283161794425288502687836199115252604893527108859386980457600123251661302638968303028713365990799614128517496070368248188936690962021477710113555433623851096004137323921602196764658884601624485472038476539713360000969691552206945021805180549572063814803795836062197874173167505741970459775467999898703289143705817813987926303613057191482659889247680992631658979651851183933690304882341055519698514924982134819974861166383e+471), SC_(1.08592050401186205305252227049854467788866453779727410303235344162755799044942609850759917574063726343195369264571026200029028628699209231711416326192355880978026178354859205411431114281881443861063554264800970587426003157325191648520032701335226655222568148716679403189124880924430337315763108072787361940805568429792360106874877423673351221648739934357265010905545355759831504459830408833514863990027273655666672328214627403178141279175713758688160126348434179960959539992578045180669891977474097155e+03)}, + {SC_(2.42452636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.17534614298037142345039474072794647497696754990376840434889758566740309615393859325760700422185944264975187274276221678251846445901506717347325794617383677193930292635564569314924664137782285504547373926526116494078927577102932296955833885396703315241135402451011484656540839764812005017172176813565178956625429875575085260669148326865639709897615495636453077647582700380316251931590038135524676132572718248271200457090571287293949181387998377665436576329144820250885118600935732031232959452642149807e+472), SC_(1.08698172658717316748670683364759355410957402401936662659520228734125636852140668222612737642782068014805017062077305317831951391560113553721854022432860726259611359359906292713160794218426547014373901499615992684721735679759014068037451034041907856685281054083012362210838300218511138876799438302361544441253724297397128578290636884486825921128550097578187812899573717515082635587161840171367822041407730059414135674469645603756294155347743226731560119296989616471054451874695933662905379767299991278e+03)}, + {SC_(2.42741149902343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.72767261793890033713582342879738701579788077112133450788635402422551267989595542378170119233843767010110473995671833847169382830427385783099874616214043296727968211231578343013439643264137629921650700894044930573728760946872993793594612026302259154677736019700059131669277019225919605809562944681673683582463411714732539335784484883983966721360030448186386720572509467495206966930519809289988603766588768081042987081659937591175153609021009554169878820680715511157952582546047874695525454598657805603e+472), SC_(1.08856547316652507805741328133311108459071413379849228249592173654082545295697648962569966487142171527958950589368489233562193669286348468590263117513686095496315254550373721483327536824243475567704466296992104689471024583820828327453734111665196157826358004691008560351210986980416020349429176617197355798571002516082466312932251349387198659008274783174241418059580857383921848453662545165049756919518456266016867927855881199852957480701581932966977791110600298286554966460647605864227651410324291959e+03)}, + {SC_(2.42920349121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.53201276888197629808862504497772743113466279857008013211366135982551142754132320426024318488783339179230789763582074283483318893320108455863809781825085033351985687373160142766923789148043804328952119961818216374505385632857959777416808269685640550515878131380792531866838773936470948896622365931502897281576409866141191016577447398976611054378520552816163939047214583399324698369172847280593442589174607157816208779995991618341181033390903049574647052471516421384328750846316829073404497883327774745e+473), SC_(1.08954933139224663191373624402730733457145944547090419866603838467045367751592532574797932835457944954526422011372262948587042044041625211829540148410268875546702876076022960618710917472852631492543810552679545678543697576455903935445619223796616816185312040389352576031358782454105047585102933376404231777600244040789873790304251070769599630294575082652813327430711877253661725951109015906181412435940635688141912670529932073988741035400213624650942964235476048057467785727734292766796878737300553607e+03)}, + {SC_(2.43474121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.20659830082822807550684162621671242484689725367685698806309531527220651935181788117161449233997312759317999565320419640596565536945722521496265448362031883634996313151572116563625858362959374389422990740551982247108018012316042005491930016052043925455610861097208936363520112103483249651288286282499482846899592608826865439396733597603664674785931212802368771076717041953340816161106811566842209883603837612528826939105638551716536328649996820936321523928280412457356933558946478842255705512594206349e+474), SC_(1.09259054473505185020260148898181799101890053492770093644589558879888631894672765864710016553989091048817273205961860093624982180583460607332174254522806445252745812588451071909896670381103709010753039758448685284652639047827964352787746758304973256731952935723039219875410996554252348640480250159757935783095789835288052595599475246885171573720083904554005862824935045527890974059646530836129165941978331255890016960458670035030354438036004674061852454936042952391002794873772984891769512979230723742e+03)}, + {SC_(2.43562194824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.20183637105217623172923797464848997174086992491947364813682740457671115761321245990293640391813511085508785054493124146310014499293839817916212886450320040492723585301112824160387170478701680097002704841078425560263552545088813641594542084519290981979693925736114911356847346902189717268209609703306987517691791491389768925204678100663192557651531973987910224878895144347901448931406404192515698957792272620740819719519296494929217582125057338968893888145174107909888842732982393375296080500940605328e+474), SC_(1.09307434579070212390463170535805904113810048378818863213467969045901282272927061149715379325038509499348521298215151652230004887326191872947747837819133020453913140305285129398782057136293135870673974261164857986017688226208069949771184004151260690362139381005028254664081367364022975748746162913157884385625883666077028737790496723786895885118549491248573315557692107378802923376848648798762400722087762024766463029425455803333519381078371644951888278291836624923756053447624827650934011312835071622e+03)}, + {SC_(2.44285400390625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.76686405604412539339661343845758616441052925577958567526210911644354130053974294580554965622254763116679371518596901954851046089478839379935019856089757769537416215481074054367557668496038377323308896774712971360400694072692746824145004924761619270508183207114488008375707213119066484252962447630071449173630135456169285964363547617799892564592692898649897884476943097707995388078440279900796228163496936639058915110372202849596817927782734640853621558576352705315952866622510099846454353115925368207e+476), SC_(1.09704821883431333246878034800913131133004617774237652456133392274541645471697996576787786184156131724914426920347374572715413381334698122293227644961269964509579499308034760939130016407824775142467786384185216359267097020505399225215662449753456672568558196598431193619923958396225496259316083275472599012725017480435935609675108737672060703764757880228784522494341609845875563884048952690812875136063236280669030065004284959365248993460175946184940489450837789168513215809156712485244298278588386575e+03)}, + {SC_(2.44417053222656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.70505217151482707560344872388756399027138308394805187822334736401973955947762854604747319589564276506854793958692441633750729878525989640412125275224671557499322634054306329238710314080299049317858080370092529168411441763450207649492644098019508466278100464924576949969538927841268251040178790097128683008741184533864036465320373454339882500767549299083224233514343147298165748260952699007680765162615835008295312794850052062321144867841211153653444320522488018187419379631158239331564040471524068293e+476), SC_(1.09777185639331348788918272466238590013318629710342735299246723455466040107924845548807198614251893421005737503837907341519497482068397078004361309531020459166273788772568115672919382430358447900648111878161378494300520159444389092845636989094866949686312413357276884174317970774180284693716986800797096187980163127206924591208446213909727230018309417417997329102689857694901644134212533436020983025724887211800814292347427750051419458836234795705936034258217168328031894474730984822253622198423502573e+03)}, + {SC_(2.44730712890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.19984430794265702185337311741762098081523028079108473148841394181362312227039458196269034918418425270305130877828991235012942340226308355484361800330517854066656481866508614344435151072974063018004352014047903208039592586919540128879448470195191999247855617285204775739238125821232198480472902585944688075608244654414646203243425374981469244192904780712957862108658666171283285380215239244939363534306582969371750000102267330090898441948646706236770972993322153769431130219630190085216838091544767813e+477), SC_(1.09949619151301391950029701805631769611008807262855470222873742389446963187665702698407346027355925707914163363109324845611832638616458910980834281618506832812715189198095906839378587140839475637930705703955932485740864458309356449738226172131360115617487952377927040196173956330961390453788793597922985941602844919957688997866773378935234047882188695886955486341638798418823900473631510128893834881091238844721984521137662584436674499452763698770810319339301618683012370304286131089151905283442836986e+03)}, + {SC_(2.45190979003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.02106204698474147038524820492550560078017069549293199948065488925151707195680948651883913102800854671181343239118174750115029170987603798349714984004066433280571146164092224677075143391659389593248105031166450906641965645213949744932246348972143365514093614017110204729888998336406629195032134871831856832592925300558920741295636930261794033998450777264441410893875342827318104090915362249664871589326517510791794741813396559204382660378398493018342872803238742888583802615317030001087509362337208003e+478), SC_(1.10202722050968474888880064215995593379112109407763184142677318641969202105631586870170592026305055821546854216260429646876317242972483104894554438605384123147001152414780082340959228810453386924503798742739771505721596804005351916626174551267059789912776142677129102063642815606482970969242657415622402526470898920184601146762751524687985318360061448522235006610740159558828868956004162656297868411448324293072130029498482599821069779766066458967680123115400643566381137300460459884762483914031653984e+03)}, + {SC_(2.45288269042968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.86653972915027720831787156509427502049588713807384140548206034807149055936277513971258726919403475684407026393134105167378727161111256777975926724685784518025558166259097476230351493395673203244939587670021095530405190452611223025617176982378679880717237637319138380855507728364040144584988270825256109859848235931553190263839131489469785119426402499617474922825535381967416304770040184215059668129595048783815231193843315255965980079578631833120339582659051224165256533729464272186344318413587839934e+478), SC_(1.10256233475206431747509830229744348695825520012578348058249577746544275781725989146562524861019186333580363409545874290323216038640277848404846874061351978415170688460061548111738549584200843452963581366737107690051299883448085067024437425360734305824650301990444836621071396666619868718666665828969825040566711951717617737436198630357402086159143736789467227946807362597888350826960054811961623436978477402871717153759169160201862720636297145771214052962801838309044130684014737836400822914960181481e+03)}, + {SC_(2.46252197265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.38096943011736509674673011615919808305961932222319258262583119150669566635487276119860709537195546109799159260431275366100571960498146151994729158182304715370819386303096544903502167517457143859367746226625589241588192512253088199098406829707922453296559754998993121494837876796098473959825022556586909344217868664107878544491461745953331538248314157762611033122329751460588143233529408443774607278731112300662480527316225147489103489133744145868506360022751144635157054197315407725299651124462141661e+481), SC_(1.10786621546826987195007506859825647393814182756004267548660323693123339380447008683339135892488131035784723524332747607481952880840029537587194838745950790700568168513918113699566352208858736370252015625402012289581640775846041470738832537494956502369165928251944421967357231818445502243514277188796986759102814465065806239893983839597046751711777777819172965628841918141498876226822417819086400455329187621480204938433761045454329664806456391712777136426361834019662320047971206703407317271604877759e+03)}, + {SC_(2.46358215332031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.47531195803984385220259373991263863196139132625622584299388720809526944892459644453006399766745346235189577025111791754660811631605881920043368066137720828690018922395679670557747658688812047710101645315314819931114191824798204539054372323646241621100310942748292925974634391273939159223197506546419024299847343820654771498225336589397096171249530724564793746800703862271358630714796681716614284193641124976194678606406255638866888945926440402096879609886186076055300076244980803447673608525623397129e+481), SC_(1.10844979616186625605833253029253504015354946627663325330087282303836015492416428466451053439709913876946656729047064169497269145569680465765151932617704548890478528912275948615890301795787137218810857821013582435672395986815325923089505139732970299202162852732695774336957942305955163689398891030050257603090237299994409039112842935969574919839046736826971210441138256942972125553484752167871577517930334722750911052303381730436460281525338356651909390383677443569763189492497929048212227813458208889e+03)}, + {SC_(2.46373779296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.69673760643584795276021206033535705223188815953273337896454021419631624166583326358966695270250351240035095834418733952817233134677435390604883766984615596611153867054331300437666122626576728397613515354609007712590443749018397601736521690787612358361609603933170074569754443370321961921498137015536480827140800383313532364248611978096086918924314732461789690200115750146814028898033907131724174489068752759467532121110823537148058260538559224656288439428085910830357467392914320088956994609843205720e+481), SC_(1.10853547247865795945628761710077542996121084859000822241768800032208316424503499329143097620992637820232916313097465163950046816998617614602600947085082300024342125823536532903767219924547058423693995923387912473785132428588271542205368801417249704427330743918984619743715945474183650239682783085079081635618694570940600187682735878379496672966389987579537482512660617251110669757738736715933839032694700641225763706175937168613678705451518379268682418215819230946475394437553896147500383286003238504e+03)}, + {SC_(2.46570983886718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.98605890905816935902664972585063135495938774365664149844387132247697634154164084544876510822169487261118083307249496397959782219237737663978689185292457683736699829480956647708042231758148347412189687615573222835051653383871701374844130497177648872832349317575163711161378226127585659032059321239230546660838458364462678372266734827883623887605489685635124875492596874688553130430612623073790244658384024270838282508246832433600607913815684472595276763955986441699443427370557865793836367915242181413e+481), SC_(1.10962112711529101534912562943260228361635607185175722798937658771556845854992072759911213958964564672180452090515445311343017214200478219345671347775174508165692998334247601604093914919662291958003446775403802380630023277225515086469228897386064408468042667754801894314178142102755176878099440170737636064691436824061807192711396651740278591754488382561336256458723458462518947726920208751663599691758024144297984912059552460721498628443010295179950458476177309783144390632287281095548875858926172324e+03)}, + {SC_(2.46781433105468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.54430070676716862693115810390421948931976002394717224886339767037564534120309176521299537203526080523871864027112261973583827525813579609223639673790081115730358923167691062682991145793513240237999993277579696520091961498898991973113384987345827550340957419508605602232295325172334063050970551689327625632593117746477019819405241059003402966379289957151082999690333889975219062338317455943787360949748695609477496225447970228307114621591908511761768499820035158216292752818940308425133880084975943981e+482), SC_(1.11077987066396813375983550556030116010095363730145009449803074825445312063852390560358313774196456800446660470281817384146147551203766155388059311142626331195591887681033823226527201669049461265320781724032422500740720322636163258283977400327908488324013381231482606703243324327173688936022945632266147475242665538452012298788518949061362244248876185646839216950748382604759541499840961090177329034155811895493525769858346071395373195400748894670107987565252515729906142353996963335676634080810431393e+03)}, + {SC_(2.47036621093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.03726697216641365963643583377070861255725839226857137819608236373490116361468665030870506304335667714499350230042144733017895773636837793884654577915209858152075326187319766110671398780490787841461126421773164837214653680613584236558855664435166119999244887247239679329522074528427909659616232716848001691501296415474881129262182123670414079385945766434402522650012935379021133348931497416878234103813435959680042902504145705768202920197061973972115932276009952768960925282718091705337795896965255542e+483), SC_(1.11218518925887846338577082099684373100440129084014869852239046502528659782246144304383897748541818498450034973183658276415327123506136236388676382022743876296087524549286381211212091732033877831656470980749405452135779011348568055155217297691431058355209486124090220868290623085677691510535998882567196745139667930807300190933197510995156237553526751751936307514732732771119749185564433964762101676004967561538612010023100787577408658698862992015520652788974442813172880760711590770657479194250915532e+03)}, + {SC_(2.47037353515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.04145957374018197650720966898854598266645480451376292061458143860151860354411403755636933814860351114878878604647625132507089018959340577083703677850415720131715935951684193280715383746394175701726398236160685348482653456024497916524555662841451913967034278766272625454323977888733836104527269030509781760497656144111087052351278517319942230391791063297690705734767980324491585907080640233385252248891696160751017539301773798881331818655389881137477082721948079694145413563849490352756883317903761505e+483), SC_(1.11218922308166972462283664410940559721964372378649599043806838210135440491265701008417555955702028563810322066423784753339768372134107642268262990062196285127625232125084927509829519803552076366252618657266369187932804353684920293503975836689939181678148657953074208352449137766423886929331657848806495657713901893538231832657027288801610772432412359417530231417257373775771556636617375093290326686619839302577808543897564582461527064584060447481565888679542849865718705937486881679827437348009135866e+03)}, + {SC_(2.47745056152343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.13836625005141097527253563997570355234879426531556936255847022486054354534643507146654064396771235268200006803985544171202521037242927643948038319469811631366458092220310430382029347066068690253478346102410083374014349226688222946344408939757744674854282342139396887819575150466957497794246765592859150840676197246266078542509982472444650071199261973585796033628678323722649878686652006282394597479785982307348210808314881347762951890629364045844344910191388709963828800633534756374339153845771442027e+484), SC_(1.11608792018787555794761597871425769161833702399109093560266737996699317097999466450275890175088587935348969088992516129577325697871066578394780684085582830095056893431071354092821747992470958415688973268603137839171781365825674962296093015271490570819305200074854091868367524921073343049325325162922582577027829620892489911052952976735639113683060019067439306097985139206284658362904900432923869227530515152449676170301181029318868926577271501564963346393087004648815023217791597906770733748643258720e+03)}, + {SC_(2.49248535156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.04561495566920723432260209647631957080999413333797576122207122407499118956399800493049967635372700083459190565775757174038814625946249478359709253575152976557372421788731686697476884579845655840194850232833250041677174205350669758073274529425618616827942406097888052562691387710599994442476905738335356868617474710844779565059857489926659940697801249642493782347425094960895785985883920719175152615025656490821075158608044948449728856201783915133469947560405109683736486457689961041139316807131113309e+488), SC_(1.12437722383720300533732703144576976650220747473127190173801296796953352929238884076703173317343950446261701920731245420014488329122609439902756180874402258206002590923101051526120698243035688178965767382003821300768780606209404145600000183333189285444841853018465689940637292084087799242953540547057571604423804871533766418971394980463330314850661300990984756273857870937193835080327404085295774758740435120394689317047938653705048993815660481680093002460907520326808806036967057815482535649482364239e+03)}, + {SC_(2.49364257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.87328438615297744465096194646450231246635572941758649458903195214719841901359184702894285761560019123207949256398052042913900644331280456780967348058826841252429315899772532036801576151043477370241624504866680241705786040256854518280908183896382246797701544528348989231856539034662912089209800566609362450311834076414694488283454493481236958096637055222419819277630965593544354332424539295114451772100540679463612553653245221330337072322537887865352516598157006733971225477202153835823147250412839946e+488), SC_(1.12501562820680443368216702171006240543689597069180001812424410061058920018269439059791412119786982151024384145579756090696325922505051249226306174817059675028531145382112635697429404352105807226042425228062259832608249125279629131902237297461226049849486125890806692627269902627646157070460566893863621199099721657347446944107907958726306400580055247316143057433474694133203623188659133980123159234495668259271505321535182973001369810709246450843405036159665030460788754244976426626617648081851801744e+03)}, + {SC_(2.50502563476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.07274708710426480479976309691628020779430124487097720485888334697293065565366058444675559426207689696334219159426908734795423285631204165236249707662088279983336826645930883131590681720259861108637124842224516484063887352372785250144522750132913825577411016201176890878958174595058056045351871163786080741791541971254518293224681558173729276871735946638215653784714368978926486545553845820066592686411503101208530284703276767673195220201625106490763553130345207200320480207536680212451754824233731891e+491), SC_(1.13129815548276061007242799350971956663282969471706439003558893479906950414403629362369362015331119636757232935969902969812126415497430260592802030743862844125148209465495399062169787530128423414073761821003582808807744970238313600717225956185744259518248347831246573614589339623395053881927846409262838468848241417664521706158853425434773273857759955532921647084842627513319137951256056561417527328524705102832473263527516608726622488376179433990348944635143366274694655291646510873085100378581996611e+03)}, + {SC_(2.52215148925781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.66546695735448296343500891436923477885275286729668679318641830878176448747444861821913906606784896435601619283389185833995373629552167510816262130864697199232414556580841338932991414809810824963494478598652928206014135759671267276317584552278374538567811744834928749382434036721942532739577951189104244174983415016109197082136721296547613936068538033809115053815273570413891051598222967349815428435950301666838223301085664138390694335058926239694936196625961314619346643082753169947554871576514959612e+495), SC_(1.14076000029284095538812492213530286143000345941738461623639884345622829192804268698288927367755044061416345935302357382599504512596198391076818435077958094843435332039943092077503179319101603900176049018156176118465935531552091150220922336592025582739697402883872841338787398987528411269235431622671778589411799156577821838627054815627778310059804161448592078457382328473104979925464630069007178939435491847656260258311068361335597487518114941132145122236915830686125812822602795267174683116300530176e+03)}, + {SC_(2.53292602539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.03191071320884033511504800929100209521357788049753836988719007816657743269363153829861284603676755017468540712580287489877338188655492428703214723938332869709046984508497992544082262210436204249654450943888293408668136211905190942561540445707590771665105850280062222928052516783335865449357107558503225321102670597604561532618065868917428757799536044202654413342139803149624340335917343546095880030999511730206185653398500549506702060248496227902462735664113586870211450859828788244444589828221348896e+498), SC_(1.14671878845614271749617955031050864728541082277909688253507208878920627341593726898326342194956549838258753601773814934347563807364987686960388930510753918021704021087094196133032315743201042841699745017727353076753904550315141209388010549755621073497811466145433233388397790421917741924559531569862030665642872200058098773366381238450010361988239879991136194310305490507300629587338498638630308205817672300083055514329767011529814315092086223350656551068120940251592683878547959366124588107167105734e+03)}, + {SC_(2.54540283203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.03005428558617524389642890285878844718736494312802631482911046128287444469152925203052711854349077933234680608713163711599825083984398163850650115758647278817901873859522949426292118538781511678906635435281968738581011364228313768246077506770271284259942560877286339894717728365071225996165010140284660261508044427454324266917571414242254927125283384760348186411316044173719870677247187469764624829288846306396406325633057145838206687944738792492559477168547196965542361335319378649243834807638613038e+501), SC_(1.15362474309532219855629179325020760915467644291640360588973618407166761132890681342534355802445951253763377987714485380753622963278794590499140846663436405925979926677543648596024842185554719244634327980758885810890403708753567653855226133547431436501937187099166102812595018346975443625229718497891574689669961467796276639910612456949263481368164816247410114206146488773291362640159982137381102399444103022912843266112217179576887961610680037352713171485921893461528599472834088357664738039337882088e+03)}, + {SC_(2.54738769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.09196180075864530403188183906333091789166563611957397910504118246808674331554103527064172204440255171927959820823856955926732873907899670793820545439159871136458429083040240796590738193503022406711184443444455164915163441143906928799720693284624987892375846891864720725260850423696454131044695480079645082675944262785934839249844685013504382353140264532876676092143431742011579382829524667596451509076288207577022596179958822840908509565631544300384045892449153150046947886464330334138576799443146597e+501), SC_(1.15472393736644797605691250517848268958895310901566935031880346653798199129377083604491862984872508104418000594364925274905660197481151373463523091415460504131469158117407436661270060158254970173747921064652488091181944661775296286005636410325474973905696523224831626056740792161187380762818725182223011180535503959532958509533623242700659610284710155511636044859497322728750861022725217217099532755195977800296327347802414024637639540041460242060325238074278773467372899379908985162705580152090682949e+03)}, + {SC_(2.55909301757812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.02682344686683115607830107282795017666472482431979544614282577772499390761907606813616967762882182180541291523079780858381807103407228385883600131657889196817613245431154057591493045054519416721363462642405710982162249458143285907554731764142705744357489416606981695227914674579929086640030479579922939328776905232036531073026566520246648477736090367808919883388883963769810409171869273129526220123913816591012546473914835288435435456636717001304801970284224777873829887682898692231377394789277618400e+504), SC_(1.16120935663196836147684456052183632471162028503248157526172629450345258906449374768531348114470501427511139957706536967247272184666850539727909509085503115172037279703610155102680080757402088905922399501819992944193388283446387129353348109573343329650403005055995515754783631679191959563782070371163606011272135677568359568291367021150032988135908201750228275259118847650568520783802953630180077282788045798258503733397522539037655333302220464231548669210468078260282082167966080994777712544158413172e+03)}, + {SC_(2.56335205078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.14892015447846929597320001936383408871375214147460215135246929794255440819993932451177495898957213852828701448765401875627627864497167830577666347436548261744159439146951924013834893635312812132835378623507524565086891484337108765292763791143863051292421436908810607938397016851938224530508922661841878561751356032455589686265729078942318992554715118910378115497136038560986632600371159329183179668739362697001112776460345397004975523207123313873706497511301901771552502809081894487897496242505292535e+505), SC_(1.16357043742423004366388876547397517934923017185696223207230140991950892999681751404777434890527995257306131176871918963498172815283610776154685935213203956920687779270742505157212334566057325315338334595808792743411169275890229071317805069527940036269400858158483627979973809885604651271180430322303210761759282508867472056296337605917830930505848881064672377534806190527764002703313807338123711562799144947895599392700429560372378816923604882635503928104343040556904440453194208759288283461661678358e+03)}, + {SC_(2.56762451171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.29703113090415751643660620425745683904714997582351362061363614062666028044674767711616356746446217976093770417467039358862913584638766769747695246010563287270157495880149188378531039015594425891868323113223472370391197166721096153390523109677750651642580513929840575175477224632012638454912162099534083289200692098320612804122242131898938144374717644476449820085207071224035304839571045148864303450412843950585089734935862000922063944874797130648510362103713734504374686478548618437820442343263142025e+506), SC_(1.16593967453145559369544306100308585693201309282869412003228573749046092235465930976818641582095088784604661496590710556872066977581973505247169754578112925822200494857907731722913134974342725157402655749031345094317040512927226925849278843090529115873222689906177777543269101502573110708297252929287992580647243261790339799263792811001485470689828881958611103286102386435502284827728263259952820841941344530544922616127315771484936616092104044789819215274079370627435537585210189816230603452191395811e+03)}, + {SC_(2.58803344726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.90790709724804479132556083453909868917919738689504821860823016074637943633666621120172921379923309482747636586327882413175365540729917559878353042643344484745858486573404853536834763233153552760730647864795734072084176699704638875987400879276867531759597191063885876445027943961321753545873221424781519141817001618896421072011195454953414266410455503643937983624981072158134066139721859128817828290084296521427611983218004822564765033604241751045878532798891518548457905811754983202471030014391422152e+511), SC_(1.17726698940062819798313661811942273520790845873333503419335168714286890290988366395454701452158869664784530075683996153711726018285966212794499193689511813836362434409180619002109251930923391128086670327123293742916004443609254051691424405252610542495444742645853335098700474100504548610912679222583691545386259223880631531393531042318494328318467680999402275909159386120548137389295099242482162431108878453172849462368950341510813941902821388175878611540790484083594295642922726698604751529847481327e+03)}, + {SC_(2.60608398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.33825116486473479768311080579709605596750081119766588078681795108679798073057384558285689635528924722848305590938936286764686322742759286427064890971927056168742244927723155969145580676203640960182842243162812427718549964513366846846155924458163079609730575483891732217625285801636814884310386634592137582231215997479804017305271357401826752101775394739167376194978234876333182127895644748667859796437622142682912901457659370959850969264192820236006454708303991040714929129509871441566541862106493400e+515), SC_(1.18729879420143225026019891855763274986276008788435922588678058013626980061941098074702278661920966764622549536129161431143638765731491034572885689329888972316596903831943562979837896309698499422058702514637450249006751928367223603724456070076394501026520297668761126961002643331092437595389009216572847039947433534367160704429006850102633148790210588206000533799911108269777867051802815023235050725180268628628008402515679296445445617608893371992794240210063369876282338438543866275160426758974865461e+03)}, + {SC_(2.60787597656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.17526369190385711375304023169973528952681457745278357467586004990653921246350085959593509566646565515855934245568024267569767730866850414429559403636636142096970381490652509683543441178751988175989097126015236829094400415707757572003016463654688400294625964188415762942178687066094628160610589258475252111010894981388592209574630069110857205932207628474017828634823399061935483012288393403221248111707188708521846772297762193570515425479358668538827940869783101069606653706771102563806214210048015532e+516), SC_(1.18829540052598717930086868885398749054663698391162067149758431338646843225922411111839066036090981497653653175753375631033750886810077529129171960253170845444390238408261517093583360560676169081386896153240785347947848454192365350123747912935997785681096115251754421457485042201523193260279547620173630972777209581283260011802180279234037764261452055171209905441223407231997070779709687426714853913953891214226688132330622126572736391491813324291715183343651028409055416019073866265182543431335729123e+03)}, + {SC_(2.61056030273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.23096701917213007735128490668804108982852620840302517375571160994590717852525433034255803455639403957994821422533703004085223148448947302264931845271539637468047169680426351588913396038585496549648709315371377734334547947721815213286416144598174129316831911185263342182081381904180030408480287754859494879931399449055861035314310746662904304773412957434207864949666180505634362575103041986921608601604685363792453360999683461381031992698553062661646058636504681248030570964239290373753061685500691394e+516), SC_(1.18978850414441605835641788515064534349157471586560323215420751870551845588663247409989979345468061473783507752771630419525579802778371574837448607945213037506305818374563067103941101943606088989160780878860090200756158928978337902738499647832788024326301735304468846618229301631350380585225887106766241661496714167204262680844550670300327413571162964909823939719263953078681346292667663328204195105725394903890764955284397055869083551779690350933791012925788640904230617682818533265231741941197168028e+03)}, + {SC_(2.61728637695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.20755685213513123131241483961704942557537414940240899921040535417224148492274154424899960711257276179866709020480788225128645062429183519465818068166331152127388662388293257910161006929863059053166040134708795497441974634831146539096604925223692244286866447289335860848479484227011974567539496451187799314589064082127051792986711551633422015764695240328986957802725727294655147752764794138790643631139600445863319069133107857638025290543106871325915138276665578809600598483931769750171287888945943640e+518), SC_(1.19353096457816161133411987794594608162693115619361136194494148947306339995266854909465498062837771575938309532050716024555980376790223076205498807557015679408775518249589343652402449881580605638038942252728089899063030118227919844039989422762116500169196736977734786819335131866567127722964468221086750612272468969926292040935581739035203779300877278911048436754425883751223852023253065643311364664876272329620642717673556084034031846105193992575066434852221254635758069444868044499540336216532591283e+03)}, + {SC_(2.62782836914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.81368971298539218622754882690340024127781012854681913479661657043400871539334700181257351078143869368666062426621153036862005628707117825809053525337859314997426023187576524458117836543204578848739293156516084609444268198664758675609729046892648412253417849050454404115848517921855416430233811724219896833121110946854168257957585963134629913604611610429254726170641528004512415121076113200634054796976650790064349665711002239298146939745533986707327330589355724939440325767952214168877930441350648029e+520), SC_(1.19940012564363448683774716986330278724667629299805381391233636337363142355027380756923740218700471601707583795493916768702777394674480118291332599791718113690770689526674774327312928415401158361325594164065808191037934794167752227027441204037173542748578455421834369136845147376715495868141430148937984847282693667193491679268725516489510562006978596638005009600431829789832720728550309055569247564910478746664766685211824572156591091851566915825774524898965243789824189903845573625624669035752757601e+03)}, + {SC_(2.63027221679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.04800843499851140387677209071811733838013921230400090885249481664942895250825989279301907035422376925523767672930810379834293330671252220720319092734675210352815868984391411886622349742272138932310498147521876538701459900552904318727096899607890979878422723979576385190315143792142477981641948305709271570186263763115408315482797905534515470527141372095187840186692877168775705042624008395573226636498690518234552015335274645968146213142028089460352928075599629701051761701294166654531835765279408807e+521), SC_(1.20076132185510633506202420964568193747923257883452445648684096867229218365914648682745485640143436440696003466503416498043039747165853372804246381902852300360413056909530717259915561254894365404651443251195825014343521667727462778167587500962075039619501089461021070567149317862039430779210689521093267908137185534509955078202251428496238784656027547829570303155182984192531246836959154436680983045330533747445032675289906832902909205602824553390685164239876553638543524241869542303323067877296711456e+03)}, + {SC_(2.63209106445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.39565391406320319649030161233468532492027713515932979738761833734190181801672681401669883181324346751914329920354898589154316739915656175126100059545915776572596780845396958968753013969165881960535384728928279885381999301278748190437409964482275790074056443847264011827538578023430656845799472891571718649651639547309811478155077032326365280627126192480478587104949209485361827003006391116351394502117244859613944074948672203975925892455389181085239001965440542252845359884796393316132651313936075490e+521), SC_(1.20177454763067111384128165687893621854038991777844547399642133707531286081103375763461947980283552905480044499390184195739946567747136179706624426440048971066117013666075999056758797116993955075891828164495685984595226226878877342316331779254566043461736832916971759389417951463366536064020117326785333215991783392947309741932033640187764726469578114048648028132170443961215652682913569014057793000823666456090351086478815271689877100088608353011369804790412753944908195700790346265903341636076397696e+03)}, + {SC_(2.63529174804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.99501375620045768407985427785584880049111114684917813609328440874357575509719619952479883379277988204757363121820805582858322458072129685643019955082411774920734848489421459178439313006637644456655180338530783030565105775464673787065917169690274704331057106971780787245732784668983226650881474207581878144048749544605119816169141719158567436497024127150067907743980703325568729612763499361957136867363556232153063129447736283782776434639929740368240334724427988886402451256933686729856341630226991497e+522), SC_(1.20355785870898265728618126972507572750309420791619278556132868747777929259659904448332621382340490609970695839471168233644516875213300716945199617771312060831469096357827235850659525480515363001842830363024365782648964378332580517470644747269421651366108409740279049311958916117727361200485980527867894181048287305710334764272100052331929591357976325513836676359873207094141599204244498770619307565533703543909651921453667138272310919600843232196337888565849885740029257340224692905767570297929487581e+03)}, + {SC_(2.65799438476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.57335640474801863058467507788035451075034407359081765462103544193680340997391017343041456025846730123681646527929926444787439014594054513116510073384815602677876440749717057760627159523500990481032179409497590701389941883572618275839418829581367800358826659762827093331419946151300134899096429378041648813617549020265355659696042662297857888288242201079689075888689323393939145692883899153674284266044340562112633868228621986767215520985950810277151201582973655629895731234593753893164743583115695914e+528), SC_(1.21621814027571271717851177961927638993644428343431650529497232306580352123159508789408501386031561472668406881319931960439899523133409380272912554986645499274407497474326268475308272758373223022978270227431022326186829496838886451020515792101309313416416982131188162038524826560663040813242535090021538471375711761776327113805905931028196711072226863720049579377469898667314245307518301201796644159803528739125596390875010768712587584490508727871235282947313066554020121519702097823154753882996342003e+03)}, + {SC_(2.66317749023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.83984797487643691068513869936898285931777336511752862178600811210578100824970088474237568051763114366144226190805369945388778572789683401356529667017684871896630462216089564820545001243366075890410999845683353922649330403586403177792538614976250770602217930704271748587600983585270449955872538579748076770326179077409318906434897372504637212331130315438922644544227549059234619551176521491256025481559743509819899498165871557249430713586534071970451632983405894631409063129611218359530136723319590728e+529), SC_(1.21911126471461741578219431496167109388392112833326721224759910458684698797107414402087762267432276077377381057086558399508218969326418629024709471586086882939874670995370205850298487213523104255872295463836040004543595648504071615083142936876323925152810138819901982039436964280705757748818036165307554228571820779858749719013844666647616118250446690417140867808024505670726443385250598760897064339124536053086450637095118930901907746339345709733202569777460971030581913503097885811904945153154872801e+03)}, + {SC_(2.67270874023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.82060549092804969241038241291472432152182720210680778148011471481742600539140214960007785918417041322069087423648646870943820845954433460849425687639132972291304898048664271550680485785489052653646247346968623305371527205606107277707200095034031122138076268983543546921036921777071728974916375806410481752040461615659403036925635746170015523246140185413298043827569650526614608165403410616799189274503348662548500927991207913732399410867422663584384661798652120160244883562616577140960066303964557212e+531), SC_(1.22443408867241214310503388314995678574010017953485632676462698285766620544932815015658927880921937589036547233310773294748673128681895553087879466619537047265753972190665328366162827933508759187173348808576004582394699499076332892311647104131839352336560128208499219306100374439498407387650168791036309018736586533191248438017882077949866090654282862908910137744103000873539824313465914703707606563642695104916209853178567974610574381433362094339259311117818087093158494589749197216468131248295482045e+03)}, + {SC_(2.70016113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.70030482760169582852764870022482388345931265938595212715212288396119629498607619124269850869402618720344327479062538146639431117980887854493736685580240369676464490734089346972528469817523862041950269311699569012080038994224660388803374958490654173476496139787936857987348001882149785882254844611306648729763960342116308717814273259706008628044554069619421800362132190958113879693843571921760932962084385011750578818357797168582051706440303849493520560811700024259194948521654134104589906902329600687e+538), SC_(1.23978414469654597550980991436367375336940629385384245684209050855589983968663915762437852682596190419234980492127156530998615233340670285900612772614100306643047367673575209142853728399963555517010885623210954139688194910734637025524375237622991935716892554218818181748183049020420753119709384549350941727520837319781237710722035260144797775415077718520339650547946423009813313395761158987895898048784966748443558920083430155549000720020356669725719031975860430084363466544682498951350310861567970704e+03)}, + {SC_(2.70054931640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.35556246881482088435201938745499735443422343721422726909167575701155804660269501753454025198385357942729216148058402888082936843037666756431723805620323501277924485095434283087636017157459559447607435958149522997180906655658405804224417556539760418307105120420897787012071320679768264313898846099066487299460291915971555831387616161510990979847666849751425038488602735610815668024003494135422709726200010471222325314888601185136956402932314776075495450512865503095953107580343076836662674857976996835e+538), SC_(1.24000139943808188769161189044102576790632176716846006826446890343815080424906090643968375906580499735003771916399771255513505839517707999638970608315201287275408889481947817805780237318193232931843071926285335241756192960318030948453057411208503566309936023402088802685291522962991586205852685156815682522626395654750456420780222127098948439918385041424681783818036504325145085819717130531476908848760384059860257475127397343293568253686086778784668084783515883463323506080693263777217731790238160702e+03)}, + {SC_(2.70814819335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.36183310341320543649184780325173400163540526173769930780114378475634825477296160168316685403609175589559337491008470655972669702098565121946848573593679324431338475127598316587277136892238372268878441452108433072226956224262370191120904806707643888230324098418888623515864956316042850045865090772817807884853522763923538749356853158927325167076685014314318358981405561956876505456633511175483460920190474812733643490967704064321411488330540453583230477188118896160424873718909273800833108743049568808e+540), SC_(1.24425538827305118357592555393761738435990654574901945987313499664147937484154335765520736983014932993836606434101338832333202125369819770211206899300939246458561612376864158863582216172454087617727999668806234801260065706293556001994731273026786461243331447544042521470067403051408517657026462539105394122382445318834324458333755525518390132339900600741167200682161289164765341401704110242872841171210872232051130938488229750671788141248978582726200946277705990056945784325034403397562184992838413143e+03)}, + {SC_(2.71464233398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.97177482381998940535354909763097323015999944458834301573634975511788019780753090619037896503663692109125581228026401826726818967757253432336799304081901564050591039194602193394534389828735752267035638002929194920584088977922524584412143704141726450871318504326228275878221271435821993094593444529758484592683017933971800340296647773611822911322312265445284681378911451787364766178190823150762739346875673293520095107122726261267812965975002330900269774841133314105941446621237561711735416402814685200e+541), SC_(1.24789261882846456869502381133977889113414512802207041950089427681383499351232412630338845192778918152075982048766029158535334182965970101634497444052542503115667587137532245018686132862895470546848612193529361885030004189367863227583075489553950719849565150520983603037596930114194142772543721578803871022143584721472898289816785584334656428166648515113893572441494761575643807538769943605109408829150822345245502393328452815133294840511092409318411992974089640536665579439664513165349645290316517418e+03)}, + {SC_(2.71737548828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.14849582174126618819556370085380685971394031476430255285356308348322838222805038231590554165174435445253263818561078257865072811420323484216906397051422469604635799018120057442739318600168625181392538122816490258986286647662007201053207570472532819744886135938220547403721968372689107265180708525405955593270350737123666159626384148303312234568491252099307034291475333683386640404039180958845964662589332759767661498648462420142116439652221832021431731899541207169664755851128939481934288943082737996e+542), SC_(1.24942386621872108445411809148685186710218223946095655864592316047665435324333580594825149922369026798820806926292138544612217677339128634961934549707779417285869400518925174314104626146663237608694626441567102506117330741905588733785952324648414576379697701672627581513544973743360261829174199656081910839370335210342632938562960078584213036546913616421838849368772280104016555355278170458069625306893803869641377223442156007242421924692561278917431342975628669679420993564635808170942119050909852690e+03)}, + {SC_(2.72209350585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.83616543804308945749835435795913226502554811146489035840851026110599412031809233110908083307404755354851132729804363092206423094086100827893576757305263865221271616680493559302178070398876441918566907148919215225474476263330711681222803949476337785631250279029633618728878685886868019285858169329173166473976805440113718307604565691274979851551595670394240965439002608645521600181884867075878561717091454741569575957557991402309016328145595971094122976985531978478182977689408685374542462190414504967e+543), SC_(1.25206777947387392334047792966095971046990541157061039545606552540281699888764576542101216130339216501442542058299952976430503295496405143255957217815700010182399825555071244914636174252786355273419079689003429314765336989610049478376974756694621686420631145086612314401117741894118317768781797183241130188707293806751235290450454953552453874701113919448338517270956763590035939804048058942584965507573299803942623314089629820510289969331451117658084963492930492519286455783229518332396323717750308226e+03)}, + {SC_(2.72530029296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.52188641624817172519121946336514543937098639604573351000695978434404811271218972027152169632418814649084671956957305177285269165126298136037093796721736816145973874733519665294885734270659972619512158146726367202155509165381708414271370400178799222931569384616697238621630578914016701587720661336428620271875288056871770134636609055680298776682379852464978840310937452501621391689252368351766832176706688029267299842500900389890602682673209217767507311771136235156143268587002398986897813192012150398e+544), SC_(1.25386528734852725901069658762502773426737514481429207405636483380893921373393252239120298232623383010203579618337070690160761642497085916791054643525558365336940892354811946207188293965083441661205108154746585849411307243125915449917690096150525184755415511414133733433796674745989078156357226142701424440176408849796497866360823872280735765729140889211950268280975563281120256482234459507085426314710247864337327040418562992242067841678191977765567235135607789591085902683637872058029702168410328781e+03)}, + {SC_(2.73169433593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.27000688056228001165783744708351382443004106267194261654166377111492987297588126340652284657909362589817284734278480220250923687921724658273741222845040725490242716458052595113911397005964358858051409683934082011594080977082227687575765076982261994676358112722561574445593150243454497268640517487219164254590582174732284975023029633682602916383288744284002202685210679793098213814585407447355987570778788517531399935437979893812063549826926918605307432580691076351535093127118694372428667057767677808e+546), SC_(1.25745048309297034215225952220531445391459889261578785962191191269973986900052411717492818974317691759879613764778230129833460704635426001696278239407798187096840776148508738997027824655152850188253412776244667299762684147592733104557697527362405034837859459024028019729857743321602202279638700589971887663830716917136021200477399244700449589835931366044758692844727668608247287709612877989811295228794250549929176633402252250131673226698067627069386143132606288117556752691166133840849164424515936798e+03)}, + {SC_(2.73194213867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.45935955605812735495156839693638296198462243581441076048340331635409389260547980405158868074685030372197363686625129804156700369258690205283782313345562255012561206270872506981551312256482533584517674261237204317217652082804172442272303237230430304341018311835011345068681913715420708866207782523431052323184802668955974067735417178283154279812075468130686165925458631934147176186790438845925303667238833076783478575591907165841304527615610353531427214472831817011248671438883122006900507491572977160e+546), SC_(1.25758945845399548334513761484836747762009869404428617210550785484947799916825821741590245776157576456556053200179339128015458381688912635377340082871757228362478131294864511122304924465270742894183506533992717423371247861749808083018612364553857081508199836340857536635789070253936265701803394410400202049374679259690925798433922554703148583113097085061173682816006329799063331159232094483431159854380058634539195720053477928210931223877869495278223645264806353214206465283453045735435319231073321061e+03)}, + {SC_(2.73773193359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.75522187142962618723039696060283752240693051970372647998007177632405178888524559501414961401629390159506570353614341028836747312245870179290809531496336371134149970765075268921209985372664141480034627191088756448867177971946255439924512702480221805741310237363955123795638009160537673520402848726868729811823176646009990142770392882939786392934163723877702015180712562167718085438044482343529946738073746232943024022726669789191486301217254547597742218548037111408823649458949471585947496320465505674e+547), SC_(1.26083719323814551421353305262485405862434567729166180424538391532489349156584827995704606388649105068260046169004592235501004892498165529197035397319477296539811575470165982182262980020109104745816462676795854970280500117694084978970615425104440872789238137786456965583924353661391147605745635855906505631769673033633773005799418253412998114829604828082736983221812590844986007810128205855445726749686113893055406600235659582224834902501547253721021711295799503264764508618467137830159598413887211818e+03)}, + {SC_(2.74001098632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.34893254008320787144503178120105964194671728299186278281524075300030643207009284068281491580609030408330028307245646169064395328620482827568697063409622255518209761886362109978750063736434634921902131878454124877169053179613895650746834104007447102889153041215532618303989475384161133417389744739612471830051596084327291679923709578735731078510109277219904797142262489006652172664731523563061732982125611513689412785297049223685029009482745198123672726358745250759938159030791625989357769183602468043e+548), SC_(1.26211594452936102710342719135741272183036870602148479587535687512613529652826661637708664494180694865774559333682369819417258657159198774272548187565674868209826350019453898525251480790780933930824013303090286706516081828010609826063540686568568119085564812220058109502952578868894711666038722852673588566039044525927966900765516238991449583986479631623707519364320534242607890649674712816366631757236086264806057425343794131185222098672619086794594983124250351863814742288554823438823348613167218421e+03)}, + {SC_(2.74012695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.43963028638349185823005280656218444541170618455375214591813645015022494840216673267261777309484543728861395860015282180490061252159267693052079844011428719248324910430761055431452144980398539874508822626412639310007284896023095914132808753804800384459425625307349534297866351625124866187487286856240545768466410732030757465412220265572977615469607782289154725215331118055969767718716183569923394970560002393108713505658833644827225479316761909755761220073178896919379329480562059487506612444237184452e+548), SC_(1.26218101729579313896351093736544395956614599758855448252141163466602321052519724057974963603297529568189189743164046821940258618202732549574797548959196440866094521888416631817545554967595337237657232619165997336024184824146112247816592263648606263430262853260752530802996686824782343772861987135845423376006182505877145608575758494725345062753542772879577310956393664431500273455031938384785590340004353170588269930105532612586482416935155504762300763321054220808155610614810265234230191497175059165e+03)}, + {SC_(2.74720581054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.65156472722469161165253933894090520098810289671675615091603748405246815054424400225681472308631048704885846439700554808282557082572651900194653813339995607802722127367016233953909033386697444709182325963314037904487222310267772208067495020527763476872748958066457362106555635006304594301988301486259335696781593645542338160305910287225269102824966135856190458436438227462369256310585009936974568464708844611153337702463274908801164875432485128519121891089308898451128798468011211076533715663181462280e+549), SC_(1.26615412622016066773428586665042142297687281952025822418360199718251338686504565890728292129670255358725857075704996774875428594281553644585036862953669430162370387022200689480168340965400531245839730373397928642613620048603589983979482163112632265385395129307195649694658168475457632834752337574468191474285680990314398361924863703422165383396417512371003635628367787122049205444527226773279576799466324058411508462096392731146044990369360612521478594051236345101080594003737662281097247638298149229e+03)}, + {SC_(2.75135375976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.85593806820452363164033497909416525410349365378407834053194707156878784482888985284063098506415033126802337375451300530273567829908216031777484484345257277817928431903186922600706855492799863354279156419896432234629304075872029839818850926918324906928556777501938151525932562856853438482049865798716373739475110622805349816433702247525385831304462678211094333631090366642525356501865624237006769045716607232954971200546442334576110487586979983133867900463532789292652102356842946922082896814804851549e+550), SC_(1.26848307083437102907999300630746202141491375019357280142433722571632992921958110237580061165890254122257814664244660109015268506150881344154195180348306364082240264197721355149004586222817319938014766159818766842054285164014463945573466663365960921671622869517395815648257837208506059370861424041073773595664128482231766478073321582233064529270793394547797093421786613200069804270872196374529966606599064500072225677737363056111122640437455166363606493268714953802554209835604854149801655308732401940e+03)}, + {SC_(2.75158081054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.92422724331120030091206558783828122322889913743417543863135575352674051781582028060856017751032512454913123474696893197513479270502480065338354159771191825527114847980153319575829430540574611725311374198794312905212772030839926655801367881703644064001378770660612691685990522083544157705774493692998115912535772640090538581050505578661984623264263577654537774685867416714114799874816403581310789053598224498041664209642276002614000770248071309725054153966027376042807889943129905053709009374016349420e+550), SC_(1.26861057088725977297887270608413783036524110042507724286694634172319723337793494068752711463209778522643851097559881831407933989806742419040490165023285089006527652146391939734152036605065127611568500822504775282856867457022089892129838642648727941868099021407850497958930844113526694145037095666718766753002804201408746528281364248933906972919793405338218704872022831728671320263555919292074175071318565586882687602491394505574175325991584934111938186652155947501552771879316088365894413243452978556e+03)}, + {SC_(2.76262329101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.41128745891919913333173469559771430617891316932726350154899361342963834845484411618462054383990933686083568118326415668440495835330668250110857069332783495242862852089754746059424485421177116293066099426764437299558939787096761118533412760785394166939194624865808283325759243348864254390535973469496856180313093344002743251007822626509752456548095400352126385448621295685627957001297983781743208629694289618628515105096171723496388846434487530078418013897078921392381136291828003628826369189184518512e+553), SC_(1.27481372301335759962280128701923710464323547362928271835697753329563571852836360293641352576422993316593777842989390319238998458994981793740197328538306304016924879242980464210052394470406649460208861986411057813506728447943607011648849192739213642203579410570061338434172386516675591334831637736498514241193016645215647908723422536411191440119054111530341765344073007861534895322762388720683077245798310456478017139675939926160174316233784478261517826049585379846680939308035557512728753523381995712e+03)}, + {SC_(2.77013793945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.01290896229530449521621768675207501364779280918185316775655308987570806286315225277375344519364841705475074465492326838322861243541879906453840374270600015557657011703896554262881478667590422454630665634559633267929136834368326148172157153505353291490498352388922861012241917132058797918833367022291788698707243910384166447049173045639947013651574887713049004787810201178929601969346786170503464994395032836151091671866117179729944576214672082490539411215308186320465152067446018745562656878232748089e+555), SC_(1.27903763265641700903228790677911034642609737185380154224047441085341591488848375731981035533713741085039154592503440976192533622118213039058299858619741271669206905489616661399074477263742876818175027887944208747055293265004400262102837492446446400077053116741555686094952969892836091321600631269947120249700030062489250818823458072233799039132131740684394207504525313072453087965512842744697375015762177614115711307649424178836198850918745056670006468481172616878881623786208328488422033921675641592e+03)}, + {SC_(2.78247802734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.11372576680750988547931149744006701147047626548900511875343348603356138432798078013648782842377076915546206567185681379774664670413467308733119154763860001605808493578205664080588677634047893591056355879815839278919819427551503369690690693464575945787680549498511845824325791283575449900360326923507589185432897012634350416981921309510087333711604041548114009751580562537766121821126739197363438782145171986640728083962216142031911909647689042696631860667020280503026674691632805578697562722707687072e+558), SC_(1.28597830189560236232596100264571308001432634859744704654093460164480593619800351324976302138560192498860034721676285443559027762467412405622071202836417322702840444276551062467603282750658297968966928815571465811807563183703885782497444963373969400856601488572012516539463327171825467695083911007494104206323441603680320922073784324790846964852222836364282949072314362478880819335231310253197963038528278322852878650705530302794124677011156151843788803423090793399290547472451521864776844706603504264e+03)}, + {SC_(2.78656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.10108193135062361753848626951425722037686523239094630443926419520775419009801671924355050899694021282316527306610045849144473702369959930155759229901990015159828353371104157605555650181662047799796842396198529006374887457315064575023378915718643389022463700245801642852379285927654474914813355651444514363683371107890508148097421612899767633648096586793473262544856626505043057234014390261502171534294053615794865329318965865832255241498165538229353598470272709762551189698794179607083662503529692288e+559), SC_(1.28827681804438587983604204404553949143391861980385851148894532571195865098391316190317521228760034687642324313316744596696307856988996099698773627711598995262586769565659933496711496520308734939026815123343054056230094955826448902369232140185013660051068797000829712235164513490915798374114903233948426214504751604916043424765819069158894164661370188055245852497901675556544360020865969471483685069018315596316656491582826469864947673643631058118068198489945817722079505112919909572781993097801473867e+03)}, + {SC_(2.78779052734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.18999632833259078663491625225121877399613251497095113697647489780359517672959874286285177147380539269570725265951213206375880012508189269900898886535101989569251378955531766296709632828656530805111626750285084747431528024581336396507344513873204254029475490259851922447055953936399755325606190147403553898922378086529575149613287240351302290518356618207746260462803503240496944233178351998410680200062423037902532211429371476022221653413108321269568410122183737633623184073690247625859035515302537459e+559), SC_(1.28896800147720673383546822262528346769636553839353684610721532223090112957274541836283894940664628274990027915523514654088019311707840702147527836808693983396778150929158380817965589432002343569401233667360975966396309727041537312288649704460780731942527205336568947004821242375529186206058214698370942630628996199623816250437763387073725051032878816586047168250489811932418947227748195602026915334221286845272945176812591274535240935168715644310169712531290897326517437075968625234494261947413073489e+03)}, + {SC_(2.78815795898437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.61218618539857076365228227555848748051548775663911736458867566536972264200430088827081530026800447549009017823690041813989472165750258472924046663465130104961109500027169649759148804907355462669329551150071063555206233138310121687352492623754014357614039637684542946892953707868312934514012053163127922723121407814421102679619476350325129089628037204623806894978392340793216185483568288494490052357869289145560450820695828630811931019961170030451724063865118797393882276587768360241935447047810743844e+559), SC_(1.28917481739226487432712060517899736485539445263458769806945903572778299803414922473942450002164197030935581722799464022243117962933502835317194275047322321114589665812824785250110887283661422173405456055784672665901305620932169351555034320183340580645149203649577995105792587544645904290169532332425290368530000946086713419193488832913694353552675816208620800560358936362701010721800423975604266667096261086212576497263363027929807316390043384320778753525829463815714854502847405049958828444961706873e+03)}, + {SC_(2.80197875976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.82618455077565126915297668370507696463078476429570315823328753531129756626065975130154624060217793215890339836013811263446588219118078599875589163035301520577628694080057695616275453415389787714158135594663642925777779987128063423556624463619768271630105579456056052411747360560267081334957288034432376147087760751976209577848208396914886679629116296335928876162518673743325181336549339826131138825867214201618669219598102312045114606292406531380544658744867412551837602775082984507873207349095157212e+563), SC_(1.29695763620104621424279442424402218353593178257474260149686803148316201209617238436179477956399814120863265567481557661076422924970313811531689045931819691622838417380884939395885518320561327251774634742690919786007564345786486591470887220729225634754606907191382347441021443725097897625200090078281192025584011261014378384158433599194392317180107812475591599783698794327793533852628389947789538392283722124357725724608644217449589690508056697238201842824741728681909373063043298217590577432868805623e+03)}, + {SC_(2.80203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.88099402405625379582485677844450210763455415897255722481574686227363417937117409053301995625098819927112442980128036027629389920429562396936275555092694840939063887879871001616224205900146030091968873372297432644395229673104244472844448436514482940201158513886134935726727954179547387079295489295060441557356044456351366962160279617987350829832855489038745874756871304707715141091736720928177916850437030194033083088297702808983255474300262335482820131321796542651657027226622402405377089959318882934e+563), SC_(1.29698720772895798025158943453829156875400869238953335731285171195655117119014031237313561614022115651397706270203757272172284305522522291681152323315077036158713625671837608213276560467385934213660215188794313332985721385135925392061228608163276968285986313765936369660118739710069076233587060124527614220741608394530526370275941320513289509119357977474420574587040823322704012094059038801017919801127746545051276411798845783723542508444869281179260133612992430179540201257821284844033899164658744600e+03)}, + {SC_(2.81700439453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.70162686504736644394390314878436412089963433995104255785939808157776005189305281547847855039113714530850217935564178984216281003601743718197016816169596235507155818977497371764608100727303917704199147465495512737408170198318133117869467747225801301013904150159205381726312672339250627334347473452437445406465862685042204597562520187645401450002221687823130946215956037400680556226799109918666091282373855626857838274358350770576572423894583544986294717276393544223628749919441547837435263449631473201e+566), SC_(1.30542667263879128166272571486432274109829921084109963241842140798609567942422795534093608065831934245392551434390802285547078558805235547320977883107357688613652621017240002991702770452930659864097773326764670362972631745729788725791748302786937944287950017696309987680444508345312453436760156098748574994085832913812082521915982159427627033388672758548745388137805516192190063926389048561475177927472836060670052943508834302998743570767395510580792095160540671750885885226698777234960909972299574714e+03)}, + {SC_(2.82022216796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.34217753589702069131306616868506038282257373319827172738780667091969307019646455312864308287397615481329774411266281815295724298091606000843881239554327824467526967025611195553100876426864392970831586122127527464967794739560542541424380886521415834485763759535376733057777254133300530759799729180849166148511616821677442495386544882899049748630493985276357435635414308064546925525056792785334807959685947586005611678117025070074499538938613069288065541397227003871483385417164303143636840159791545980e+567), SC_(1.30724138107573491685896827426364373193013658810550701865300152069361886797607237073725640963698540156673632914074120538569203831593200254334967198069062658222220928631811532368809115887198775397367646369245050193405872721101875368391409676931422544090278751709465519337511128282304626425681229326796045686837842397962198998872549152568288697097833105075232259049135618885873624935536107557563758482206196742361662407453146976402072407598559998606004884247159407724782121531572299014982848673182507712e+03)}, + {SC_(2.82615112304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.51458783732163405894555521526962015309779922272530158189730224502876518040091381958401083482804747000702592948434706804842575154899981326078750200305557500966537078476491118588033506305516977483227658456244975957908956924900434450285394570457726527047826725906908332988029576094913767554799624182848382751898396668003177281808107969973456878731577451854873807837523480385706974198126441663840712353670090818197900813731896857559274006723614631495235860083811707071938086170961930605687110286319940295e+569), SC_(1.31058606126098658914749980669137752907814114406047377298698542170705452834351382235468034443572103204615156934431482554766795634082238056041497089565811929568504698404362760057939449831205382779380270533452082343098480659616998197083592604072645417645808177718993404212036256514556392706659292762029813225276453075138185574525199272064713417524708281945875429963950917292224048107864710135263220521510477694608226875434250357557277942987261068956401331239003920845690693249365289936462707227721073667e+03)}, + {SC_(2.83436157226562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.55855859415787155083193470210208378361711657010190825266924882127039806081246540316261254469271603852584839833838028915158442164495300298783451422146595109318475173272973235469773243802012118822659568214028455183174646202796115468262518061320628514051619197518613409430128088536388791599960076258092606901879483565868506669185323324927623993840509986953358046598865455601887437743198058974432714936498285279532955043098363830459974567138161539289144424599267729320981318641980183843888366658188879471e+571), SC_(1.31521984951562670782482835206262378008436020285378420546285379263101732820883608949122051631170757207569969358861769005014041362682435194384497463593895032565565074995089647542811142604972111024814957346244370350314824155345964557299689889789136275620641643192836622166752974612956077882034622789825992918310802758209936544891276819168401215829983378362532395170242599025399543486556205575659473596478459784209982144728139189700651481154419757471969688703886902791262574000950576874190220782214559688e+03)}, + {SC_(2.84677490234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.72689566466928903369179960330682897548652669399393276051386014744186970417602111688859365137119806591088859832663321322407729010227398222215695102957666650134627135155914461176494093254946845109947797743409068713921582654393922007566627403236138483370758934553341824625899253149387175773174177362605215903747870064505117188137039287465190801492415063762775140078423307957143249016089879815130805538651333771471677541967892826094914960669119630992746822126589833180603476895486306392232601025646825215e+574), SC_(1.32223016876171751930127690260362228451276043259080142776611117447635298976971660676277739244247747333941430777895438910603903364415089362478788277431690184319422663659469678578578848717168461859668307713007709293400300773144834887828835740531915123068180321347100496145412025098700180155572567571693915443983163713525244308076842256668577625794774923216939872890130913395498266933038221955137351683909322710506162758145957963091245936593419942473687050256372597219165699935425159945089177350622914096e+03)}, + {SC_(2.85066528320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.55568482360742948178753116447520884506333782707306236545302483382325926362166084203731171797423588082049753343360341823584604001171834314603381134468045601439167627038340683184109907021569287545728777442875651246709845779774709664705864947825953633312531316846756314737720236116818811210815571964220628751566305374162580922891567901030838489391041424097996446585903280298110043217953454271541003270009577929585042697537856830277490571046556295670110615936761205150685944850347747034901156930884704441e+575), SC_(1.32442834432129311020270401230040348757600194967804417411227993297073014371790990846367592283835149736497235335186397373158162058317510538606749879791206757657932690826284904297131052423557484805453670552512398295173126339157782769777536005702817283667830229401111439636352865461538809823298496358462581458296535197586798441690867505747540931768033354539435076941034258127236042998395398619386143844516720567482048995549927600273781698769845551334916514431162430514635136061657393692622426744518401753e+03)}, + {SC_(2.86482910156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.67209451393488423647199154835085093626261421778388491758395920651729703075118017085136759283009860995120438245740674900924586133972958469888946144913857894080608167262957035021157949891129883305679378840897014842254727111679019908897771315819131280807540919616131402473292648623536641470203487859280265291071455955908845350748609006177134130302155504053800467229706750960138377058701943393860456198675362051432045232708887993066598492254285598962798227823381877440404684498937240963164738139003676775e+578), SC_(1.33243579122574590984926319328585741226431992976092303142686174774654086734221912050969042358695985194274150239716049202901885309852989554520340477404074130428600506536236702077688238199655525742941193655594162114387542290714158400945853608839737264475177181943991627056464409798943099464512348669426468245342830019675941783095082205207562407358049161151187902485056973380397931585693852275309556091706992133402058673687359431588861810125438604344423923096226075975166061175731874132590146104371235081e+03)}, + {SC_(2.86505249023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.30131802710867055802416285405627004944443605305986263864220016184017472240645872115140983470407904672852212946917148540078482946500339207463265403567520374908135573477644464642099544185822754364662518871798355046306149602073380596685748727332010789651405550596757267402346736977673751744188152044313189403529609820760649887511875179928686549497942279718317761533128781879068042442032415413072418875923443795899631304581303173776883445512104657576502172490865494518739857115438253356870867490896677514e+578), SC_(1.33256213922455977812897109845813395173411322007265383882993796689050065344892046472775278678171245623266610779129718446610510847313619006451562400733456071361566843613133299723512877153567582901137929364068682109402160542808037795140991967432369933374079139541609225824607441961330926809954339086860823364451539236061251866540239253822841662056994139018484561055498469801015336435760075931649933637925944530123606696093702091641199180015507732503503040834718390412797954535075284822281239540293937836e+03)}, + {SC_(2.86840332031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.52824176750358164076496059131959812500739113559202367289078195570160918639734830618115385785162075449318541138205767026948094148150925380637640534588880247019836297374103359293587348776792862744423037028443442341739444584376146685372640751241126724536643200202594566638152802905830655801709868901425768475610663616352513776004689802989586450583270754102902968325420768131021058225175702285650229687808615313082741556969466351500112049822288399570954833372013589953205376803853225516137432124569222452e+579), SC_(1.33445756850755300886310852366747116373314568156330265929319022765025679605091832760006042634427097972425123990224057714373558214332987821397493655971662158199108983919037889223963127098202330136136304633778191633740186013948492412508899341220977549020099785225073412219228723700367957957766855893202571654848753962304297077793543149474041199571899861685565751348528770358717632425747661550893912005896139963996406692414907483797187577784911543450435275554396157567812421677650523995011467755600814137e+03)}, + {SC_(2.87150024414062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.03473996536835749844202230526429008906119041929085596339406306381317263063421363014078546769917249668117684990137811293444537056470273926075360164846312867358742270378020980764225417941673979648725203691862834444807280388402827217076217614875045095619032222224689284984869423339603735989032512003759542368506726476221451220878506625835480860209009536185383283299116072926866925042717482533885968333476709477077317932944663303337428332507026889453387064258608267285223334458864787880893263737675861374e+580), SC_(1.33620972196613057862545018474458683508774246429303078928896604644347843596054727019959159727639180583190207966863834316676279406887323600951026914176870661699641609986904094132247549023546751473416822857842431005653467518202034775579764333672215375560261672962691627243289534807356727849454769254909379982435085844253764478068377569207329781055236843240642891614812135450045500490647261251364538458703549087549771761205156461270664993004990880127287398073324604746729776681174734849962572923360447112e+03)}, + {SC_(2.87251953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.62235931368603576744760805973395587210314168683271950713378720952911252196567865355147186057204710095440832034764605460312213725715497048431667726847778327039443061644587527224034248083714553060272185788579571402827986763936335282410900845534727294544319096050890981973359890483671963969083505166305907771042803709137302847083381936425260670606366311098392200245522774051318804059317275427643860440080916850991104769586189508338397170009462336793670429119848844618508684034406012112344661507533868289e+580), SC_(1.33678647949420338257381511183287844313320567831386055535257365475328554305496519960920771030293980187387578864013337221427261284579477331631327370836195986850986581429374989724715718586245126673988663046325581190105459603730601228769927714877805521773064648967141406570859841427717979239688554411762637240681521607016361187193242718598487509174044220184815718059584494651460108260902193436437318293997784314930666732730269053214473092504955520888121967389030757818751397977083873154631473164056671016e+03)}, + {SC_(2.87787353515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(7.49822487376928593129496991619456807779571724900433890379016922727179188822817432232391038253946481782904202162602152838368852785921526947231533980514604816364664118194409700938666731824534215020170138929963996312545450362432993246182839764004297289618971955810426335741604446550929541921686956699211067433464486824974358064263080873961207543888113027514374829198159012636739801730156715023126639943081444416910170732607243982442087381161459051088358123684532334791232059683601332093922259371292884508e+581), SC_(1.33981660533857141926925380643566819272260171584725198634232654228134827180197337039287759863210818857870527822246113664420042673194167479981904995496726680432320132048846228792005515980585370574675380564601800250316443183159395144153371117985702044124796126435895171646113569474021227567642338387958328031624320043773312234684942560216098500310809828880827340935714150083392053952689331486262202315295456408573437125156466724639958071186200478992889785094972701513151571600988355148526641362547833068e+03)}, + {SC_(2.87847656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.05488333142385484475172231086394675997513598555597927149880029602336592055157215686944121898079547454120473162403818969784561780587409829646247504392438937333878527081074729746707055807781106119400587389122460380472798540673783756469393597940336198328358765912391012719893796119938691127824492393390024337162695503763365189158346405308487182330286763732886461924685718989878827547742759749172444382918249208907202795905711165250423993743454148817205211384215410228405451755126541161105940267179417786e+582), SC_(1.34015795429701939942574215884873268171829288382888259321946097631111617705856662268630326933296580052321731566208579030576247439487978876214455592691116488996075798205203434081869502896527521310827175861845932374667585320301486324405673936118015718696526683793997302764133847612944974467146840256219323504629417706791770176592906004328833751304210817492355088454830780250303083097890307333413326840022932241452011360024877985974082037233006902679105689616851317419865646462378346046207873620661305058e+03)}, + {SC_(2.87923095703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.61684979609188826557433785440773960148555792324374067678067834299861637368561450106307525352671585573317867164429408368840880522152937413462007909841896465904377450707318547717135578445169164662798065627783140430551912686608583002804571332263659013417669912496006462805471741068963217116556314786383894369387772034685007293610869961471282286948420396155589385700260825498201238850550110498224894271051040877266872421912258435469297969201321900601286747279169221597757038086685692437637136225209143506e+582), SC_(1.34058500380833376294160862615122068848333040278064690214068451080901959705990853634557062938270962751717159291653068462794816644510986319168200062866703705462037244373394257571865160181401419644160859261897972796948215330656254270416551336873357979648067859339304940383975005645243666175426992692972991225022622372254699271228283799777421629954043892261138987364435140375335941747556293997376921219156934051083559138278975404970391878774938430492037198178935947232494412932088773898615808568060875528e+03)}, + {SC_(2.88569335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(6.27741314089775276511662713730952852885550809492562065175360622922536441326404367039128777413795090721022687150934638106628044085536081655315565411956276941995535311165878475675560210707191190941944139340354775975538872413921188374762500573473008692159211048416506508286650565395048219704920208731057283266429575656706558797306599764260726777060658654274541773537319106390479236547469858462458615781476042654947282967222646330746160526064130527966019089586365372152408709894353252495219303939603925911e+583), SC_(1.34424406719090708283852098449092651192912931837151030334253769170706457371212899336088630689782681161596126592790226138758892991724817294626866326137374819653365275485198027843272426021845574546974020258425671147145124463062447922403216960551913842768213917736156663567898484068184653980953644017738392003844971368045836990248784629112811882601436186180470639258326211954852039109234766639251154066833651535312785555213779024424415503778104636556624356299490075804415075445824369005752080160909590418e+03)}, + {SC_(2.89466552734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.01178709497846633575165533850964793116822976500009300460736484473906170654242473212160750081881335619578631480862662045163056219988351387754652065630298571387779333809261319746397588721052457496790954620979653820354502309519248134279375683394749297528557515237334478119352835566833184270885227059153740462954718070282552097217238130663545041619512190536745623409307049755143899396219233654553047903976192302718046823190984233338148151019490057620084073666415333004114164650667291546000971693948968025e+586), SC_(1.34932658266278691125859195957356839411956915699838787964270475180585781337904192843463069811989682751105935175120186948864564892651741184747232183683168217893787273582731706152927840688445099541626365323387592592041451846704444548113336365976534758003932783295797338006880559885771565077791261519464921959795073918357492033133764272360975900011607333798512551165276702158609418085774985022998054688888774296419108809744097027098104006421214236914004741214732590966674674694137924684249925480058631236e+03)}, + {SC_(2.89489868164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.15468963660064415115584928103612267588077614837764974596676794408194592122185565793366081442594962402231039476916282301481556320279102010770389758954453247008452073441989922664993547819970643883248670436781951311258914960269324244050041217630215108215185133895912128085457556094388818808134157121883961858147812512976161910464056272865818289179486083989079475337016803144989786737740357104787360356449862060721738771491736407919346112388326738341541162845086084757313997223473584824259279211478804411e+586), SC_(1.34945869608947487230347117231108718546669480068803317382610585033887701772499533330299929944260993663552522728552398357556711034867195034208278794084259708811695816233862643367643062820601016048591685465106412204058293624776401577561087203181177900125125258123672283921830786496097423338541135965015952382557422338835010198858944846902564944793337215652278621428765504515905791790356949439200150223236234190140334977483438030495696668322005718859526062624691051817763036420840472519347075855357492120e+03)}, + {SC_(2.90308471679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.19524147385219244470132948164768645952387402659176644248232649451332495743225411640806568136577825821777152429787665981081834982965099165131101583405324558957832981364701487772474908186677859521942227871761177456864386077274238636801172587366265694365060499384529511627538568144917639423801710131654895866193991508864772356680744834944104931010934233992516879850234885949044906537343760076941305434841384706369864894114423618730043116321097945958350135127872220329620305258329256908546446817698251246e+588), SC_(1.35409838291563810816734756587973452552312498779625060316470814688864881373868034527316477758088674167091953141712021911254039190874338424718456903461041158566566995442766215323510346525251570992128655213783112880604963189741218176389237558401685191050423694189828428853338979384514574558920844441337526170157218977419725134868817733466328638260429425757730703990119756802378165954215271111925226146883389726423674228332542752122313142235886856916954004866568682712083092292621624945180865855907762336e+03)}, + {SC_(2.90592041015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.96616348070008064874616373287210585056507562010636620999589287370494994638712981237978044380341428082759476234800084979754154002254920793570629961443320536090682866102046046605575909343417965965786863402052114762451003234336963160321553061028955902745093007093806222194156890643879106073816537034619581310858126533043798203665861839587148380330784779496490854756078878399132529809488407011884977108694900450342769614999426587923937468534874115245202200752981449160856047469289211964379361040937933363e+588), SC_(1.35570613876827768573077212979918905825378195719256462745557460203157514868421975740484674201729181654869722967493198246560872283580334178114340293621977943603602674782963512789971087589677970295984233970171523356396353278946306310362716981717481409595008106739028777907840661397201950135049887277277864573168266510836965789963844289183363238578955127422486638618731886638218793161544590084681455424256159437152248367727430465133782606865132096602171707784451542766396026631027325589191849782149383204e+03)}, + {SC_(2.90660278320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.78487236270559134372523056104521703363019577190355948641112828564566288084234508187456635264973625453609105185408834058802436811939053506425603401091142444688274416257771964890378696256189219702739844815243612702841684872668060505942578914671744054920303915520554542317257099862559900332239128013567708139174454799160800799479359760388823074434936809008038301402078792504784232356560038883331003424937824700805016404899595550493738893677568049586982862458730300726426227556043240232968934551456121231e+588), SC_(1.35609306587302902812608982250575970013655426141478852856735216493382332135628059973769783658467619298850029115736641365842250969915119354961287889178459023534224929246747384311345963439486525054390823839661530981177867422381755670042005241994627896444983033866940424048264962218653661730132248367451464387574438560953281658326212605514731096599341987987954847800804242707347529099158826463446857630154506916573407975685526655366112977283388320309871700245022364864208623837308437148184117729373307138e+03)}, + {SC_(2.91177734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.65288544172897875410770232714425601825349427018691148029711608937312937110686432284009751145904244201679369890051895293597053443763047327488339669082164625782135160805589639800451672460273927756145545818554587823518713303746905567633417949183694304856777883735871611818181366535964619214875574773302753339939177908635890491874410909484630978002726242333092288199064599231824493483133047779107704498836164868091080313847473536278000636310060789953287199874170218094292264929075176343559218201978952107e+590), SC_(1.35902772737967500290740961714306170488896006477572595442680354958201757864757179384628434523781484152603766693581406070106863469929795747305410914816479507021518947006516764660803698195357271682898832241808649413478488026150607720256908884879384931441726651471512468750875240490014666611569828987242597178730792611073319550629526091003900086837626632934430727458829037055800608764129229909092363132011276878495404850882563836435689845740109981738759761066122048318825494125511548330815838220808734178e+03)}, + {SC_(2.93100585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.07348913872552172438060537336170695465982561385886208512743693117832018077732199717190905087803442769798857774104262030358670872208312136858881211410007479555674339961299252020339682381441400147609402774950129163689293445870814413514269880409238879689669427063972157678850536572019976833369618099902132209169949898022422684069830381857850223500047547437065129388742129657954201361385942970743137393521891326992141234907520915338245404861689565251029578475667289010283668986078095947652654070110147402e+594), SC_(1.36994090211866285156780417655232681730177445549993872158956285643436193188785726991369168977180113887308121341003284593858747631687052712775116809792901903101954218175854827123344938870960635945662719476714050496919288772019479564922849963750897435183204879948753862050909808470755427353099908579773139831785069425719334923580159855697436929336266308377470879117992764845234475018441789422522336437432447449357161002266355972425539397318564426604501700562220380876996017331818203139894455896402617874e+03)}, + {SC_(2.93924438476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.77518107286160192975090619348685174723133376553628978514345946773524629460259957306538236431218247589719771312904897231994673364468832936192930648763261752675406554510421585015960517353170251556580035420434104455460987866698271669391429345869792903624251090234888718896512101057543668173614915937208335613310325271905764376677121123085953021174362707398232948259813861064687908746718001238533382117006339455793895982425669115368795569623477820919153916207594666818615923030608437427654845589323915978e+596), SC_(1.37462056205422900177131768888032652216284107554571360819616514988229042546200969659939005358764415303560171951617706762255367766104958031804213014382297422319688298813058708235551668193649903340288755189361107742227218535513218626025724511923454804888841699955879956560431857964054712383407202631291071279632670492761422872806694902505618351331177643874679503332041813298770798197598924991078718392181492357382522981006972272024242659399685114078336370345259455625989793711497515795188040163459176258e+03)}, + {SC_(2.93977661132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.32267646091032057264117479996725962524063346984656353737999020878114540714569282911520863318541695168857271164281834054963142403874455537714944794610094817847454389534340638997220111815960372365297777509351400167068848566151722017140369087718396312056664653998858312885922892976462087886956556649717842241242014839711124245453776366990487019310493671290294468619045840033136895236436448767316750131915201026320220829933252188274405549187295208028245090252555079871847589810273006546970939284455610907e+597), SC_(1.37492295782309449109513125899561559012571158869805461774571128862623508327145154344308277303363560712007750147659962343399773292693388940576621127958504002159547486877127912389989264297400117647989214449419964322617476628970597202261690056630970927254789905580122873272954213658268918564331212372900137987854833084079076994612249515996791251235528274811463971874437483786205972286614118579382608006610450261782073705056773556763556901941104471584469923293484169254077441965363686099895150541876731096e+03)}, + {SC_(2.94332885742187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(9.95612658759241235812465447721400579291058507058997368439216719564834536617474972374272572743444878958103051493850804833730870744379004716092343451340808448900651563697297156202048777752869166430548783815369375498220508152458737361758440629525376251935383827962247422168872441382301877187549916802482417911130921502426517266682801257699745449609311421877941760615746101613079091796208143355026398173271348541763163751403139719101046525115040043357542232174700518755249666544791105896825235042772545175e+597), SC_(1.37694148861657372633221996636644233713118716362968775446059082421308752990492542112655016520127497825665984296675173284223392313052342248632938493608819811335501981095114726508649312723116398159369267648990864758183952369369770445747903784567043640961953376098996368833449404655587344899951792926546929552656878941202317332213546833149925267669280727273985344675937684787347730438104026654247170240234408656098467412331224560588064323246340067066697094595718870646857370782631751254388800755295550947e+03)}, + {SC_(2.94516845703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.83235121645327978963100817691926829574774836418387041252367869003738880090715463590796702022923992217196258528447889299651554001166831682305134686392526769799710803338014777454610533469989652589439509433566027978504843926482018342141188460069390234236110984820182938829956147486561100168203492916619577077303831865784265002705832286267366697360431897838814586852773697832092310576413056123995483314720897488786618951766492245980069150290100881986063379460507766715485056297792098067046256423617545148e+598), SC_(1.37798699279569051539268484261116926029249691596018107627105712272865541497115761053413890113564648869745670969157330919268443233145801337544812367387678593100800097721720770745161522650305518636162761571191979553292900507064486484516999930986293880641437193952931866232710654194575975952948419442840279178032436129355270244808305285140265522939295089250885428468721564173451421499662803310780563761890258732979833512086663368327034867928424960488053958458358767844025973365083982396983240716839739453e+03)}, + {SC_(2.94708129882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(8.40107220401845648858321104921071972573843068904574581393733823764249546522923011085269873691590304481547442413231466634293352372853447729039818860387039885562468765763029502515714810352804578440883191056457307887255387835951907496031875719157728495199161142225637130071543332928278068351689075504017772418057823100405861764373978896467017120010559182064013052751961745831965825831898048413917283981900769888374650265549295777335765364301044297505547526992362172175418096483649733236850451843545679352e+598), SC_(1.37907424495147840011273728574087035423995148549659305757124254071347258874590468030259998751169547830863350597609563279895276081581854639206865023478141526629575485808136675655986575500400042238539109670504550946591340944369138810818152137953023879474665080231350201114946254983398873840455552474315302795866740788207662569448783820137343972988100297969962440394649585435235913624950263561619116962468992081029657152257586899630418991424608046084216708981450979535245502060097857018787637261038447371e+03)}, + {SC_(2.96237792968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.03812531361052497663902185982298310308174947039421642629383054705158980857570000458751162587598999442550969501344877806292995852725250408981631253697860552855127163779760351868802023611365392677631530032588967742210532444954526900204915603366790139056994017643045361160119941439202100034220334699283274680423864899468223399998488863722189803540528163347927832513506417644347437949876996312168002483041770887790441736368040946838609461428279363030994693956970178860973336803161860812605096805474454889e+602), SC_(1.38777326003371869620392442881659394314184212654519691976144430327762778605149231100358508014213222334062848724474495456377030199975247208148834458623282063601232042599945536939628832663453797158288206962000090542124297705754102560953238816317304253227969932378536387535488664440792357469006990375734638029351740072641073613441843630319110670684134528780043708170928531783433707135360642324541558133958904574236578128175824492672273103186878977416365615410335993463758678593509405604377846659869155365e+03)}, + {SC_(2.96513793945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.42268882268952074762792640032759328684967651571243577207098863132733263996320938386643715579579017435978989743411936374344068146932966097272344712291511398694978342948608590458791621485919292779350971700628179667679496540992018470687014109130452657520265421986902521354903018585115809735769773228190274125898973941140028523715291640760179162562465935017483316456021894276548188748672753964780236343206673327046312655684711562528109787810072079323133569680198034562869753881982512229652220972629440068e+603), SC_(1.38934368908253741931372532546702657934556843402551609189277573514421266149793760035791925112950510679579471877063730809126997864933380968782048493657543835986069494201763329457384890314492279549032110236711683011641117230487222872313803153286427155320725106717071421980538293897275039298230191800669234084056995408670362718824696655215389113392924262079402147150679681476538294228185954406608139408498867983511990563329762366594282942222249422166763420544819861986452074220220324342192498318092885746e+03)}, + {SC_(2.96556396484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(3.08733061572599544893095738566467122339497124976043359311145114037421107382597535543204831452129395887668572437569163689906023244155552696896433330258453010207813264506542214005957636106390199106891767284964638774356885208041408420667674945789610791509007783885145825791117492078793459984449939239069745839444108063354220391076063653936902128053840086474638033185257395909515727788319705878477916754725675853953182813578309468305653020879049779288986773955413261955830503222456148390770119607850061279e+603), SC_(1.38958611791455538539140025024903036538031954018499820241928788807916920697641911243330441981244344101704951338126434370919427459996053120718181215471398554261097292911510258611322258727819892217553084395333462783927901967145172807897271893648569891446024935790847528674105478865069966576665239532737860234449110568683312347691756466158270802883819994063820227934716748200182565368696233038948342327904478924568114816183798706309654091991387545998978688522428533958731343703051205510768373092342362693e+03)}, + {SC_(2.97032958984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.65065488914485337721074521730378317515528229628211789543577343397595391938174832606127820734515276226340187602714937163390715058743098859068633184935898641707783987761133325136500650196760517011958526604789366334946247482909510255060404724687386577726279625168337690865854633129433528501591646453749002858311142169683755867562660678042345855110053262989058121630574544176603053777318271589497620317692160998865399367406053254067650471361244321591961589295685879444782367679684369199464630864478489261e+604), SC_(1.39229840421446158414059401187132308465849144532326911036850400577521133278416325647276549435266209313251580715048230645844396792187212931762819805221020008127577424752135079336787156443980414454085239925046645933754290102904357952168852201296278316339038023098146632704584529640698621272640939910683838008414574922690407592662197907916145616287751826886906546495409842041562181368365116016838774036741578085349625325880779969917664787935921372614468570811677294061895714270986400486024846188318150488e+03)}, + {SC_(2.97864379882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(5.28875127758585664775772369274874818401612555425274337362533582990582452925126420407366036043790662099943119495044383901218555398621115723235238928105653588409977146642363663511822358973533155725179276190312086270135178126404634590785344074034531234013198254897678155721810803017572426750846395839994134507626212773021647810222310111491792540190659531837723333160099836715085173957624813875616612821165865440901899376346278715166145438811148949341025193888325761385753016316823036695320702455814532570e+606), SC_(1.39703214851901049022730852986132689400344353670883777626738203137218619923608207548281549143051031906814767390400440706239659220631609341726070691070420176759632763659935375169277291735366323249824862378629001071349370181059513276997413810375233807216152871265647861415532162245231919110084386980394699462489980738391925491112096295812580701854781624576489660871399540669284901636240871074836671380946186021208235418266668230761474074744982036539036786575812798817601971755281530416514867655522337504e+03)}, + {SC_(2.98060424804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.61531408834500580532772107043602867378318404792385225424543370217147879407674321500374911123927570357277562524697982438259637553584359745286933795118383404986552639498340920075760638753755502412453774497591004259173728022454736997493074277223895857096584808764955869835419159070254683890288630184887315794922759550515510816638669108715630198832675023654497491609554019113095252440785879594593167667228731692821379267364932925196667801205297985835969866854522482571646694590676945179339543887228204610e+607), SC_(1.39814868086709855977134600387840438343583009672475568261584953393775752729727738937123850138906948368004636032605291156804222574014398500926173351016908140186665959288084045641853830719487264577348797044673186837903257068882131154301224780038356563500545676816291258687767861560304780331302852986780045909398150637259749617748094043327095465488708977742593706777925410210923555828599996570675244242281042710938814482064622965171204431371102148950469779634005498541620629267498792772123502257932713979e+03)}, + {SC_(2.98220458984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(4.01913203092977523280798922135732173498586921666201538424869820403397021600598336952297001121393103996753700542498707650326540611849768481692179717994242893806885476998794194069177402969333682804304077419313651329920582994303065174179218201467701455641283135646814953713752441619485507729197595816610567605231679569858816613945496013444813775087311062863524331036489035253800580130826760243342656894102452530853716104597137635561147441993697282252144814718162145119113329588056001316458991522462383674e+607), SC_(1.39906021741400012029338130541586138333662179441839083641847107911711505118695512786481488377805235221735334811404941246813329213578760870463419267543931597716815993356185010958460750220171890471303894087628503066112397751519332692654209127386583618306686241745141251761759667795464413846509226397693885965049803383803654466698341256620598200487751924572966951860386083834483840696255431542474166307319787972505783717380451523714267226550702752068744046987297754855271129593224919642276008709133005615e+03)}, + {SC_(2.98840332031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(1.37359841993752752389528450284952588719032553998539093362923427163165276024392153451598136188470553429960467300945028533480912447612482726879636453056079900519350243066627735778877019724228054785376733281199049657751266188715082124548224606743572715963969774355758677695418580597446243619358673177073028020912302484099213566739309206579083967639513232216832100329448238402774060440556297715019456445133475901481261857483140680673267723791756112901783745647254025067495399407661967818140243125299861096e+609), SC_(1.40259175551366672281814595130199410206726729048793535427543493341189776121812450027289243449216527426177690440806453297479911126820442254294041871764078115750415836544057504032671813463168789593968411175040793172851484985271562547310812254585311571787144326593913276030237458872331063762566380120718695914932132664401415837970084609712825212122574426747001629920494310178881410323419257000590706416337038146645031003353012865121499434464278050773933392813060464002111764387049713996501739204866162870e+03)}, + {SC_(2.98938354492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+02), SC_(2.40128745781682226203298236348882106711204113071066790067117306638783919196024362048227271234435781132783597852292146590334481038234871609134432585632142383860946595598143957411326129473992169530502153830116859068966251380887313781290116922728446436656897956438795664875165432901199002549538528328347418191193679032353167804422277652497487087572561212728720626116567371242871992837438704365399851502289431526275160228324414200994435018638728055777754033817606169040369089679889121782617702940071870648e+609), SC_(1.40315032666765182414481479399344070753898190684807352041095511052632440751219673443203450724260245162755643217096319709443495890300349565793981782778265089445631678243647078286176671824093508710391601904934585748839861643245004319166749889346213348676303548594053569453927749612822683747646552949406957321033730622162997905829908280484876755402806887983564631942961328692424552970134733664909306834103499207367683550933062248358174018199947934705320477995318133774631674009326510358690314737737744998e+03)}}}; +//#undef SC_ diff --git a/src/boost/libs/multiprecision/test/math/high_prec/gamma_0.ipp b/src/boost/libs/multiprecision/test/math/high_prec/gamma_0.ipp new file mode 100644 index 00000000..e3bf7d75 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/high_prec/gamma_0.ipp @@ -0,0 +1,106 @@ +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +static const boost::array<boost::array<typename table_type<T>::type, 3>, 101> gamma_0 = {{{SC_(1.43156441636360688183664865448643158739330056363229723426222506077465368434786796569824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(6.98536502143685108617882284090181520784225065279944459321343460310063824042105596746205061501871754388692206421700826292338586923926227628460021980992867287987375102820871203483062060697666614954318393354992686094982543110966849877446263308176165064356911280715433887048666237697473022869255273999217684089964991492221986910024913642477585922789463545534969256995761341961043378489622694491092689099559034124245255841747358458264103951568451574298386270253381902108950381976482928860300454676297330631e+29), SC_(6.87187849460716195307241085972306257332085866067179593404732520056618176287191986920381800623266452019036583359883694184875415202170061110761480957915606961682069515921066423464205321804055901215315467103669400564886703708251292818882278221076111306170866005908677608207802396451776607673326647945821489765973119269856654977100758235960633379767322574933089743488018675093572248899118887185116534963011794036363538903828089102456817460307090409752243309227015705466471210473582150215759294410478127318e+01)}, + {SC_(1.79146693234808763489644628257161121326585477954787539722758538118796423077583312988281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(5.58201763003960861567789539135859580193439485454005702914698335930268444742331582630745213615777247085201364155083693868300803234678816291383457578463565723759685983298265642045770249117431149944641399014596592494299731209900651334858910291525879151363330828856538879949073338110312308363596227316892822743368020808448586000291704754174750156554217552056937856371791137981786534012294619836443861840926728414921766784846846305707429974243911452854519547303013841568504048941438592827646572038542434135e+29), SC_(6.84945179903097403861349744215875103992060757962123025404796608423978602225846553619170965077356955755357802672163974219562277828210284327971512344158362567867847738326049609853308815256769082679556958330239424646993080494046302980172303736275513780193302833410723002758066285468945113082751363817936859921002909109039191137803314698577973722031573009127625727285778678734025455705063199556191858178447008447936782744160858096688591534358039500459582424936993394926936663017800067374964851005923319757e+01)}, + {SC_(6.01361845021915553684662812684153866129482788357822620195491936101461760699748992919921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(1.66289233059599382108622045278925250222879368299965805063800397354768670022530740489524286087023172081743657291575193949292317670513431375657893264047630789615214924106176337174346019293635258374337002078109120613262494521256415816444259140590129490551962102684902275473895987026116781659018530303429482685495372173326818893646289757008674753758860465244922365484215329043013694653249383965600156071526093224196543564395256619974579165365709216420397501003922915691506013990491427372931318956493080999e+29), SC_(6.72835261508627487441809388914618718039806766838076765738449388127304650638500226155393279449547157554874214601262165687120232963516589317117744273330309623400314525833549943284641956342219602925993192470847874648719472012633435814459477730435577468888682456785797630097073380249832077254791664762750315685378649126380990575187276250739357550980693771790622800409807477947479455730830600697505092486997466317766437101841783321172164072094610651193846740792964214770153922331926924938123871030133738925e+01)}, + {SC_(1.15805324961653822428570241697281798757994191687720197947442102304194122552871704101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(8.63518150250108277194016891306233647484350850467664211488828521671098276856027646738832798460638738889745235576927151073499175108377545838358386482265787302310436375999567002230935819513356910576887220572360144418394608202135272298033654003052182297572299115574956232437725263892943148991293370552472446011183244210703600281122859489582978101451793967074375924992378742386032880290147673310487052110730167491270221379145909984226467052326276061760313245928809376103054222364829784917100855808316020815e+28), SC_(6.66282273346089416734535625179362666621182077643990467879063832625680227791050206585733185502957596233314540660483901760430911805270185678987126994680068402992221525616904588488441229909153800950377006070324398572799927651884646302955793101599665239041508783676953386426252223745918060631306977940834262621283653711331967519129060500243592868823804992668473953470906948420875648942763002156556099370463527314476558063517916220321125974741423139110495117826462394235672451732466307699999303905633370100e+01)}, + {SC_(1.42245694944417038241730866879301796566459337427951181709318007051479071378707885742187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(7.03008973586689712434453706188967052189544377452251027190548933242786882782597583872281928283881475602762471967697312305884958111647827996819565671460034196076646349776435256364489761767965592316774008837231548263375054937427862888061428112304485964913506427137973546426799224557859735091281967123454997149655374130493654203587146086260828222294410435287918229997913562020320493066804583330730837073698808542435953750233088861767005232084367280435329039878489987209426255343649661690999646366391423086e+28), SC_(6.64225820742780683535257712261924121209227913749076443473890372060519527816598227736042607832909087984911015926106929130360483186660465408894557878927354666930836674850262877191875658008191764865453073508984311388701881734517396030408218265504769496117527926393550877643119833107884441914845938545843378909648403549025956978676004449802550052939417816321088510807702282974630203123683236264607529541476291560195226774671285268000217027114645279781317099602573341146438849056594216426188392209461223262e+01)}, + {SC_(4.97012101832753915362870547787643979509599986062878818060539742873515933752059936523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(2.01202344231147724230810353716656887566130414385907540860402251559475890073645391277780480020189554969458171902799377776861135178157011979373269790864340211440027520775401007836782123067346497601513358857239897301150526329963708751115670484000483500722297344616098324545158500747555859233886573924190763930230809498621227122379869747916191366861272145295954082819043984946331634617739137084318984472461083170724165845505521971897573240355846211686074477671195963638013441293957127903234462875211715646e+28), SC_(6.51715235072511457864378388754998157435356973715673258412791513444778374479836727125230109590192077325601920795178505423399615183618242933697838040985779154418085424257031245674733493517221878558879698506150447439006049190511649430013973295257187798595008470757450564951138158522942211934575884784926138442646487836912254893171857625559424638068958366192061382628054238930763500818744359069789679612002531155109612303921215254254747694195676813610575246106335880547522974750286496268913709809509252474e+01)}, + {SC_(9.66007941505749759175817416441747844432341024711874410968448501080274581909179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(1.03518817706743243919823284998017787128647257621455912634163869070166059872671230538431901891097497439179354992612162157669426027906636292231895643723927703757223460655854516477901321769519052303126616273995428548985832279710011127934672239520409848031206199996350739655807535213912727774552045467776829721969059974045525292499046126524249705366001360881203124736372820107025125261106918354118101667092609216938740138156696613533257159162712186798710277184296626585528266265769960723307483161365376229e+28), SC_(6.45069658276162457259303572398885329683158361494024827181717336146058546986400295243949312741758251226140035714229464147482260893374857925924565517856610305565502975329832388352253205506611318819270307820107725007303695608214479732517695140757758354226761553744330994156337100540242975402121772398848516182993789845650062348186821501621405335217798478394612071716443631914367377297227176427909617300917373609884768866750477406306294818746619910517952227127526727803071073422415549147408253665298301300e+01)}, + {SC_(1.23292931325318213137633109542739196875415141549381381480543495854362845420837402343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(8.11076506374416877382537129208031545752074797419842750844528587451643362386982055323101915507674024859960406340146989444652626245160911354305121401560514918118286169465374662239310666900739378375958129364148653331105246827262534402832707407165597662287434176607244865340061287749891730809236349890319758864866554723496495254063628105477907236700688483571320960538771287714513893495299885765536699744850957588500735883090986629317497556750278199990341833620560130060637909786621313289257460639001650831e+27), SC_(6.42629897103672909988458723024910870404416821898215222127400022516539410704531383405982899412381871048426582739992646976069868034841151137810871632844074572909965313276374324555176087210170807432149288863515134794938111522097235775211996947623050218416749855639680453817148045797399149820883035794559402140834591578682886608367287283427546427869980860693429982414804171599334229599589490584031942607532254985111818673092821904070864890840147766974757375588542457697599486106018224639916097437571599819e+01)}, + {SC_(3.29652280413527321597289728537034730709403803142198974285292933927848935127258300781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(3.03349941564355360012064150184228595706904820067783154892030109296391762822472881195726613182210189442955174212546738337284886561017336690039432370715941439412719089329892531356865265081975064636232370994677816511211572902921257370348330352994628809490300819077932611462301055106584074350770615111880273573943059035962668811432859854690471774370491309454815309809006764621402491823519351139477097886747251831199460054088808790491284984413259166462592982630156453579922162794986104508307975648736654540e+27), SC_(6.32795143866050323716760133418296904749863732946975200928947118578322607994583477068450164307701602413609648444048639207929029056223035086133893270694677420843751377393407833586002432242261752314708430347057295480453578837209532569699006883030625680960140262219134646858202581750831824382271631031980228590555215920432590868320228606184600039560993755754788437087523337075244902961115198620434131953515679906038170612236824559118585723278727600502113865815188191107710031491713156376132212151995325781e+01)}, + {SC_(5.28364435768055252017009628713605422886039151425530135952612909022718667984008789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(1.89263306215217388065301450837422131624429762500909613738277870523089267798630746568964190871771157247405784615737404532079180608133788878517212154426651108760035114597438980870405792535468966738754609913368846304859794971254949645193988742238635877174034183157545953026521100953857513511469947369943288857923008731164449119832620087394383402735741445779931513137986706278546522549426676715586900797211295600476831080380451856593421444600033324608401914174483790915085395318359941917879811363209587464e+27), SC_(6.28077665249491897691049827940636540970398543994861233169099871356964217589347125478155697980887940866179062958974044155963995941441194575820156444577833257789890482265650964581797191647152323111036866463941206128044651251402305746085176458414290497006593109264627423072684766714099596688313036477988560744962758440194036696643717238708853234985639383334272562979038431089236482058749177876773587848544135873987589282606791220573117136189470910455726053001892397518963850274607542910338241721343457177e+01)}, + {SC_(8.86586057273120049620324386849842094685003081322438589495504857040941715240478515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(1.12792209148394250283821637021946106530198113703610911095488337733749683357735288766824599638075655918840636782440721083365515523554739468482924768722301671735596891690745164252007005619188503105228533256226946150583868513360183143203542320141069898108879458118152610755855595193019270900648744728405474759634285607695917755572614881162868983190243597181686385780385043194947192656483297254721171554847487312358317557282161067168244426453811265351416570323053082026986937719013776178742039427104942286e+27), SC_(6.22901745936964236807423188366699491237395082581362863038475204196764335339422677682424533021060737567932462267191280241127353523262734638192900266136858588339878538342860483208191254394637373839754873788419222515574108790388057884237928241734260216993505146375338473328907938233508277422196718935311128911439714419720575361379606654030425058941565427488999592176540230675586731103811757799195001504320404652187910673241283381657595695105566385412255027821045966205549848464433924669316746507256885131e+01)}, + {SC_(2.49966909705205994304740110602803937055616662066270805553358513861894607543945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(4.00052951480390792753792297612547756446636308354112378451456968304268692528633775519125653540337556139742594352743621941853552757231088824292247450739114201180697920406873694369842101729381223009665109087920683089903813373384379869972135737762953748899884850561862020898979033509177864717063968439364396918776475551700928193992691475593786044265808700917232151033008792097742668057139762411818451641133325103860432283894810997209741497147809418396090524305457199005071908197450896512609552069520382170e+26), SC_(6.12536391489047683456791920395172307654373024181199187144911145425432965478592302886538061658534635912284286031438597728058141651972777704999971671030797848009724431879789343164823041816910201631030249867326068929534579895965669649438343390853080251794078983618181753609923762928472591231131609267962196214873011951877052947425588001178855301901711271913497699503029013954248204210958479220752097373121722687614004482162043568710684966204871567240274381394573742635156718926230757319557118639628439420e+01)}, + {SC_(4.13105039723262296431436267163873604088076066376267192481464007869362831115722656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(2.42069184309612078735610309396289531456075006005701452319232308780898469481899786562711660638975498443576891437412380505348319376012700732093473068914701828605341797891307189106243524744582901965865091960195620144901563293848963647400347796236403212162016330881728652090676262972985324378411000114398851717735569482703793791472186452067039116212437053446977932154280424530245898016181405959157039069608327504217006545118390787849039405560427420843900632344217146363244036322483055152244720350520312732e+26), SC_(6.07512658027331975479577088722915968953877892639195256368947344929252315379014575284754474798075879668931747060129256164633934573369599205358256458706635358062235593480105093770678843815652602539307431543115040519794608689731244425228894620530188188065811225372150482460249371284136442858221115772490874167846093958384149302455707825340823690871444826129737661538243254629158931922087992517687225059329004092487025701375624298827988692231490866885497114885255366053276979415146569639295467508175390497e+01)}, + {SC_(7.67973655713747804159297628821628769124011532065665619484207127243280410766601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(1.30212799952181823165140121882528410353551267300487990139386626525325211291024568030230970848519462523321250316113910391542233495172804953518059438162757195427412584355171613764849732449793589808648756002181462999052595392577807540209762006753250735181780410531193269824922742158457533297763018004418385433117806616100977526675610500618779766320207731845672476138902627160544984413741977497354820351022582824220122963569820651479542153114314134607530615386140027703759180101932525568349064975126058165e+26), SC_(6.01312122667240529166843994063021266541288260960290414568544325404195544575095829794041035120469854123574649673981547316854462290304396763545774453073567613797603142297644704020352034632426024680109753030361110840049738676836013357598960559784241302812865391854524389664056261621870677748278809719438623073587488273527342019260350532258454443364272867066135071843918273298351325211729169344200131324037636430369715829612165506521055551942816236666920875284797438923786575101586645401435561328322074817e+01)}, + {SC_(1.99929709006070097053663358872093457378141950764316447930468712002038955688476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(5.00175789266836197992253524274830985249917406243586481928958356437141598411984138722862492208659648540426313645171261046500070366734305739654716860293908480183345282315525066342879659673808912526681216851816527758086674670902923821816912492981456459220446807092272059870287398917856957814911955087942529906020699544749520437288684229226072743323074045476154958594811061595567355441543116054826269870495160775013279838715048442052026193416237173077956430343800236803747119123474588037106300229115319493e+25), SC_(5.91744167540296642932633105438455466640616516641281944106250379983760813618537924832488310046560748278519239110324535565544143210026284763893696541922381258765648942880722642974790705056266372562023064784175361677559270801762988065916285030771581562373334272877335535222265668349615364410562602776765986836342337156864942547577113767363493593568061040388382331590689156231846893431183969526225066656037250767253219801811525307324434690649574834704255754342306560284967752740251238298561968659075731801e+01)}, + {SC_(5.15147741524697845975412980082616359162571428864652034462778829038143157958984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(1.94119069034500808603652466533066021838567012298869439701340945032173827546064073709628358298435505063869761045803662384531648487567393382773594440075435175724183604412243156694194932492028878970941961283821446471330266254909674918925098980942551328647919533502012637100674140444753442826674029392350808309173674621706803567435055313380241398358750606063235436398329157810706396769069082270097287993911924029918948917243632827735362569726563281278358132173640383259378355790298494643627193841009125610e+25), SC_(5.82279288675638227521744581984472667501463857487542260681762460523386320409989607920181437766464159215936294441689087772286732842238926045596412700160862731390874584038617859265714534550615456175097106413483539149755980595702034247039218440752863612649821537138773308438672246983171497554091758620898857991717016801958594108321529888222047270727588727745793441847528628771717744394905353164071527110746942189167167910378796313989630478491619937958186173400443704421577577652506214296565647827659664193e+01)}, + {SC_(1.01200722207604382263949018037021122481435020379336719997809268534183502197265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(9.88135240723468294587520823096149819619540476689712710623997817993083189475816383577084956312949922972156866572877356452911798009387999009526605954163888106149571728467821461881641485221579135727239840228161933168563012454259847186432292992881836215442485054048489450902048271065397568687760395141387333368815582691028472081451393202540812412060789893208592124641855931693833129410253652436457888009028232812205367434613971048802458771917161720241635834784826416484240215260071905616525517892376198493e+24), SC_(5.75526916175725540760017008791674277403750658183657019667573395043965482862223161211434510621020178646998074509782225975726388192488504530392658732934512207024506529591122416739406187792824292457201619483969139331538455509702323358241424076304580592500270106222576434714589313899240402996303681999603577990188285524562004708292069045649249373724332501528425003869718292101485821916461949819884935827385813682080426761085178755516591092075170285475651907581965934227857501471685138069598110050036387246e+01)}, + {SC_(2.06429269589654098179854645662305491103302723665535722830099985003471374511718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(4.84427427364262875842177793582518195279767597643060376319794648994297827081054097195940382072797039218621065892526441246106534412586907979155363395093623504721783967370117346993663134634720015066493921311731770109109810916776708584865494093815063529130112517199074056968525199230121554514145114301260244921843558589363080736372954820248471209753932824991565235931747363147022272578757977659537120808256136053752131562400463651066011428784940346704179494919962842998228211078697496029314646389388898709e+24), SC_(5.68398396772585233454081243163015719457273127694317564671579909124104470082415630897415329078724340316758032857229084552171453692626527967609074784678664906070359314921191268418039853212010471717205985371362797477808024589535717680159846557085388955229865201914116328556336605417711822202289369410146331697923086998315821256230168984504108244541247998403612502502907727077479891826525225618196587293524636550350625327996139236466781075913080290453906357687119354962653760957324187035168960795482516167e+01)}, + {SC_(4.06329433289633339525743443387977341628436445120087228133343160152435302734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(2.46105725569527169415983887680710324054112250788475703843400058327137510398066264739078011647200558087326350808351871985106152690049359086642413238317408836089468987877838079876187296081669103803784535166355608455966760897587389088115522647388304688901396509685347705021509288980827182717349153930357355160998461433103157942190593059970182220422601313102141445390082271181048288342624754879410555438595064913555566952651043246646544339420386855070326440604309211163343582298939299136028028873165480769e+24), SC_(5.61626332682108543103894914638265205739494039591792063561869770530274312850585567765343945280850219080051628164852842207643000297697060102013357499398606383713775784855806022728186354069091978795877261624547818135305576719244903321101517119309704129792662326041351319265014075608624116830962662681594177248456643562788865593950429324530694066762617857478074607527695679287002457200156179042326635089136412749258440888089649819236202364351423255552506804629320072380909487742338753291737755545443775797e+01)}, + {SC_(8.13819478186073092670198892427626982497279595207828606362454593181610107421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(1.22877373521325115162328151196138471976141512712124850581584744704992399909168261635541263516328487781554443968352277192925529436530024421006633112093621416957359244265549900396322231619231727354042398710426402533917291689560431212331314867942163998562472153269908152702292325979049258401011838074535270886141399120216251602299571716343713366066427282233107466768238863223341638688213559918551782217436488107168907078748350405159172588636795924752838173975951774548164437216663669472739716812900706291e+24), SC_(5.54680589407017581449312663260900718532236752643429778887916074462724851849598244854808478563726062042713449609513298516922138485589080042918533500047818941095475305997544950753739499731683843803755248795132093107433712169375661072287744142881205356719090133730530388524199409758849195774801927230016968519619337069603229936339950959945894614972178336489693903099001770377373594374895517334732896865347661491160409693023609464135192154062110190404782725103313309390020123729907971058891945976423107090e+01)}, + {SC_(9.57554865497999074939999660325683650957673265224912029225379228591918945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(1.04432658224751051534314719319653764492076403254903353940705501087203904226108528788809371267534452777143739782207618775861320582874754248864333937039501094101917228222578478024350733644382871829557399595988827405718915208248754996663898673158999141554101618210328270114242596449908503778350906723150268970162028603276526593042556952793500072272667839653724623032562627561836490475514812167562140191244558846393493937542533932600626398969074932846968713462462457715092757436435680895751950017915638130e+24), SC_(5.53054144906448593874035705960252565327725371930035233374475045868754601997131177506417834643641068577542592682508927413603952599228162183490902725675527826513870330578615340807530339380960658869221743008220977723760935754238139593711178583463897078717435139016330627214829940443565604990205981580028836645095112579577358064065119684256270078779601982060604318757793537509382142428577689380707350625620009954407756292439931086645123086101261977511377525026818121340639711064353707057249378932596923274e+01)}, + {SC_(2.85516056186804819386971813584199120922280101808610197622328996658325195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-24), SC_(3.50242999765214323664192679073178441988316976402121689738366828010343200142127297877801696998138244162201391895289627133288966388269820082791501666523174699265748272305684918310912716715770179390342333881476222257119067917382383828097056575473305941584001441668576626536239604665841289353700793779427804962841854234138298713674382597487122053790601814569968031027493158660860778248283756870286152743158063320918616278309751952166743130766591170707371648727380827196137739711391014068466505661904440217e+23), SC_(5.42129141514975251800903561369021896767530710266420752809382078867957345755941405132689457634465145272252196685234760413494992978952209599519173817340434015117011005940702842923245114745048817216891242529483752482359028631069418216006995563505772451582472582577624264823737226327430602918404820892619934026026679795159577460335018994519482732498954471793682959200041271002531143558773649050588603615579031798187421758140576055031223887773975801539821645805264411679468976240805660854787612427720085525e+01)}, + {SC_(6.52014364093064091884456528840346284381368491267494391649961471557617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-24), SC_(1.53370854243521973586893102813914310939965427847284394727942326816923530158483359322277635535490460600254860546777471016072796682814782921636329959096588533379368302049694060279320304899005746782369004567388608876800597722684498185816580726353948738996684213751763514979183260672977613294821391044699592421424071378526056882956988747680636997296772179269782489944802968406726338812277631440999738435783684003696158536718815313665608295411332733865266716369836200650975268023336258804965762457776544875e+23), SC_(5.33871458253436267660312480785009601729216078741234807903756510475077269603543815841324029033223878574917502908041974473136581597194818255013348773687457538072821039582681999557815447099340143448346969967803777016864105080422428146552078395204345173179644042513512657540372581522428813903397886613502554964587865832987725841749146742934838411775381167966256392170311556144245615596487835602499722904753756187542702952227808014818824336277067590912165157720497569824343819810963150406333187486453320164e+01)}, + {SC_(1.31098837463635003832097749177504342199540587898809462785720825195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(7.62783270505648920867640128917029682085014404223298750921210449188883287957637267346963792923947398577101641982313673140522903767065871959681776941420786346990663932279594126922699186822003592857543574397975415727821273939141093361267052683898474890607767272618049135227041257172444582130532397303361510817394714073504522661387391945133312715542154642780804313417668739292346961368873149467702801677937149054720393235576921825090293378239947540846276937347389762949029484045230989398597611258299015322e+22), SC_(5.26886758016750764532724250391453133579168931661122683861881724102784766335119510458343279795727755360417828961523650183250788076928558998266697318508102942356639306550934079657348019990471331356616671440992693851502497540967879695178087358316196135449214724222581033520195801247039827371115321875006799826166266808354064309683485881431194829649247848425203894402917390733452728328994293143443163498889486622254544214583416155521738672267888911298790423121376809223944061169250554139218709440516067540e+01)}, + {SC_(2.59028852225433412082328801177410343425933092476043384522199630737304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(3.86057379866586319878799465520462508773374309731222147451540412289649626604311610271505156892543734630828629717871661915627739337921111016296975526068036546011996321933999439105025263806297456366301563262085095498328808608921907606929694250705204329001618943812913711507301443230672701441796481501946959406058733878796305518832400784536950370251240917339676666211604312502114193270809313318899693038913600801258981405147278842314317813074821654637246696524927484395930153180957204116226311041051575070e+22), SC_(5.20076878708021655204184517590029484781779325945365320134692951662097251746010442303228973955429295220624205734359293984540010475530401054700767967040031802383111862364495871155708008415805050150046955904324684920911708716591437325331213161883361059635649619622139582737775763756910681490313609300987084497727073273136118042184330561290773528921435330943144151579989347270239667075286213199707738173963359766442692057049676746685889195318181733518343155600767669257087994297941841427762786592820580199e+01)}, + {SC_(2.93777859556056893705993279786690963728545966660021804273128509521484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(3.40393248664535973451643561545599015646480163251746595187335545294157661290070259654556490228897046833198768473283011025314766585326825660311638945820356275028504108010061473219261760927138383081243874282257741552861246265341571115130840175610661210996672096930564509064007280059700812172651108467231185451280522308365237196553586846212890788781209593678169565625983002898914954626594158457302304321444438490738130358193686145378731322940962556530139169746200404495578798523354146116661641285345779468e+22), SC_(5.18818034228480048495984841998696565418571058823007515216304504326186316117799223812592599800053866943330882932209733319774993987429860654967791070950192182720563465084761871021801510083705614519767136322047619989872914050805017533441004404032584098212597431832228764483076722028111823178273253323659440621758510792485130604460981055521765707306470062276856877280447173587180991702485468042648886026757392434693933943855302891392288442139215967429109453656283435937137806905507213701777697785708916602e+01)}, + {SC_(7.86351191582705469613519475556052962250674909228109754621982574462890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(1.27169642610610039353264616927599175234779914344881805733869580633167446969597085449508303449649856295673996772851928970484478455725869106340434214033522429436281717957271664490947874357052247959982209769067209733807145329602247519581626721334004570445050566096313562487889013608558003318113736293222661115116237175842533338824845777635499715409458146778160438857783694339290802398515134559787128147139201279684177329341813791723791645732119236379285735920408460318017210905600269751682346961660174051e+22), SC_(5.08972238235817915756710145375177450823509597274772735688967008797016311927179066425401316234841495457645680749356303387011726052153995399350107102311415173522242349706194436150181002293398019846980279232678924816759224648575930356637357223960768881058525455547490594553426412812113145828448959563668690340567112115668860640488282014428626692311646693602244887490659454290033238900625854342402063608843879097706509412062070869795895634470749766615375813006168918399107358410251103233338070834608171218e+01)}, + {SC_(1.90381848086964392834489130147419128080699124438979197293519973754882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(5.25260160066946451216401888059962516778732901049570780683024351572719151667787646855463099146585407964053825766930472772728698256660716949502801050859969127596546505976843647978026708358679238991719723994756553212701512367961114046483288579383813550637161150736903854808004565774707190980542096793989969411975096086259679433124457082433968122358310884166563878035988158013841190648076433223713075923687946218147161294236941276929535940783322870621803800934875095257103638684763412873109654240236089051e+21), SC_(5.00130104497222740728056396948021842053725671133632273915590421086540995885813788156178684793591659855727077330324357543560582420708812233670466083001362821798690316015631303321842998721923280159860116612739436828240078595075021023635482180195173811443143861016540316132682754359770001807411742030056445805013793074054109764814553533227232453792365752365826883614935008145498752931608573064596345947693694716816510723270897599891592664901791763900806485055510666392856983244898302151747117597853439027e+01)}, + {SC_(3.81224138507088185839560978023822512827933906010002829134464263916015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(2.62312875547728931624265607213756815229837180169602095107327334620073176917117693941741379801758213948691714295468078460965756685506546144383314549488869924636549335223264787835030053818578531165584930072928904954024349836757669531292599781334847779073929930462134987001491872682250658594585821377388524745624403856725561382616752243818539754229843502888914770520037420032497262912077979169509544962261229110346059316603824642058929794962625900432712959225107275250144027312303800204614559719130614088e+21), SC_(4.93186547396602967807569716447834137730489798578208909181956823619940195091783373690286003795378305170062448815938262002666855919185740745808868834518988746793180050929189726528174841883797281208589583375771652408457949764152811572462780673549541833300927262733221435417215931929623799861721052593168258224331928041117341615950018916874018539855668865299897540452645987293103073809492246918894060636522018825311579944256307429299926433463157773358234415239424681932122613637285458521080913054880393190e+01)}, + {SC_(5.49313358014133027717803441948574150188733256072737276554107666015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(1.82045454640895782737597987629015253196424399819770711984867168537754339866104500301965169548440597151564783591998096204750642251097138511714139431677230119316032123096723638435315702956082607856781221770795262706437219993962584257438868249993742164284339577414043879202101786168615719873186715666650725127913925044433708513784715492777075613064868451994980205253786155564432613892877191420027887520647436384687185562679132018990435662701316643628299136576381271167422303030261887730404064469821661616e+21), SC_(4.89533731735552832041589301430161251020130076163841042575523208601949953816095170371768447691586445244814754879873655432782452790720310931894083872122785341863455879689084514113729905769521595789846313097484306889731804610702066651582493944283543411813419736212048892954255421551910526337589242688284096162070571743478755325100547875689720992357527643607016139503743185301042251704701530808508066708422044540174423444837331714045278436889408090514469447622243967937763842767800209868922707391107115056e+01)}, + {SC_(9.67215262454222827277166131629965173388541188614908605813980102539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(1.03389600931501929871097748597108012503603240764947686389435163117375649258678792903056071607754243833593207370623936419856377159806444481248117223998829490194577017841692422535813595410446015676576831805051126599707021576420891181154412175525551678059867804876476222326414755412781154745397066502491812883871947516897588521853430063495325076052198574002590913096133461052863926525420514129463693265405456836877870291872408610362015129227970482483273273845790259359266596054256231926761044565464033080e+21), SC_(4.83876211526414979604635716263705953424666129250468312064929767779865870430085106549754942840632302924184467393105280221031089458453346711488164184273691108029712931250317685626244951629221689589424633173262031509079949942052033836097273287253793763926645896482582399059720693766548808207758164347982593877689742387604381713327862363173160844314328159732166305198258012076073150997611295564230600179954076979830331378330132787416576665241470078232795284322184660642563132648624641834323472973518630605e+01)}, + {SC_(1.70216887177863917482281209177935599186071158328559249639511108398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(5.87485775694555373167830190810947978074136007912954035211349619261705336638409363420065882452461996702314667318377905295556382085566956103363904724888053444999238638638047322550676699560353465463822389438155518513284160800035024841145198763981778295086704772143892266059585666296705036968955960094559165454125738827162309721849410190497768549790407976026865987343414380830766635337193966062235485294062197370443236409650307028525323119441263966385207051043615749087468096830868638236989811223697512846e+20), SC_(4.78223837080342956793684677947106154961522152824515734094452704401576955395734057320806187417084580015495705104032785915022776196524911035311341716253866023844008453954146289524334796068740032756280072158706992888389727754165739635731112302444977854489414440643254915015070323265306535814024253673397347468234679060454970156387012906763493040337094509367197022134455190670828956855467931764615143248858050259521769945653420149568573354187997851604834498374939753381150748940039401972150105022390568142e+01)}, + {SC_(4.81711376218383283936066573301115756322587913018651306629180908203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(2.07593187408273119152469340787584993890199570636061024535034187514866784687246050811341044476827375433480122929541167222047975713155197480798124497902130577079489261717652034359642106356416547649168312264735412183148465876725562907070038342803242173535250774119973305228029222184206457390221388120526840827119402382489085565296916043218667855465146608182737262945596180604152319863495913770032065685967941222160843715367489927722217409213962422170874267170019204004892033424089148243078905283228037205e+20), SC_(4.67821120086936591155861343624377850408269305810050469109688472737615468051095256528958901042725900832184701847084075487537053023539942576971128033660153998945676607285872594089641174041605333823436914379532594652603569351790857962248245167080191475771720972177837880349399147575537558363282997470664643874116717082159563251158697158617110481785942129499655204492946736783592575692219959790344322588335340149192743106478058297032949955331719952339817796143077569677432793189592681892060865012873193475e+01)}, + {SC_(7.53835218496289623698718975960963994964458834147080779075622558593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(1.32654985527838137100932148001816998202531058674126548560649347649621723628346782156486921309260567626575505247724488705138662753142944879073548888865365873854899374953797004778789748638581143372102322151991790136819332204708988722277664693837174949456397321602470382326078211353728562381264101144823679289452835745057195794802022960930042459359943364735905222631946467121359896176823730763057059644290401154571759016166486610674803826665802666272410848457505223641701711941719977501447883034136159953e+20), SC_(4.63342833378474888230149349666744582083410493325092779782325990451750115439726645419432244279477421063064027863192770563073507505859141449350699461178579618829859155282280329464471157435721507507621366940722327450189318592513979948532139573299619587090909747514578389070859627428039581931779660251967891631196240115897628890456050781081363826940234999078862646972605461455399964225335297811563651185144751675814309192435649749296000702432933328264772882595395455332123984715360567248273515423621218181e+01)}, + {SC_(2.59630539283257292986818211277810775072794058360159397125244140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(3.85162701876530232468016912812562115373016774249503275226081603451011972263884092116338217726073095315378831950037360909099536077599495060933119624377088198449654129198262640605955970599568081504230936190952678753636882742353834162910291504268867570124117933635673759417794194750694611151724251936494514678735433147379446557816715174471231316403411149395136087982745338487971867500234281286818420446085777843840510364259879208876519674749555766856827657168205200716024970765971906489858958552410340209e+19), SC_(4.50976124281920705382894731131297213130572717493742609284798877986990697571350693999371678487948632519864994037977278991511171422997687213322493057461733626999725433941144937352468234189905071478290922464427713382759016633848292380102094051047990921816293731510106932513291229018355894945898305007359239076376113280775919897826671201334146282266277827196326947730939522373694958320901000146985783812074526877946883639947205073390942506470008867088564871610508691951675410364770185985961728739523981618e+01)}, + {SC_(4.44458748032432159103292338558910401502544118557125329971313476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(2.24992759041617511461621764486439635331268181524943714185422655502011940305830955842049995629795499038379372105174122525659372487742336448447414773844185770557560669635298671132635822489541669693773055967965532505432053161714602453342903646974643879994358520105467411119547515122875898507996505993250138824454260200092114888103323809959405846895518855899975499562260312288474932728168479107206688794805002289162783128162902120231213764618237747182467147917636833518130802203155531015258002908630659505e+19), SC_(4.45600148005480883843221099327436102666507286396321419246469079708178654036796335564537748997950297615591540727977401329305621673590499008495012173174392772256892507453002392058153845853189319966166580698136193800825737803950908645504563702087417217271483342543855867136519298690260888636782412764723517798316454633414606328262091535579645033263025779535288322669191010012877722363484688404092994821819255479622047806371600580845074877980334211973902257995372110831043126958395107296424305717728039778e+01)}, + {SC_(9.71557492149857393706909557129502985617364174686372280120849609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(1.02927516701786239327088559412658766939139020160726492118279488473065998991185050649522612566598502492850845923928935444094096535636546140592813025897441044117222322919932658956040882346732304391680061902209382086302404668689151737674617016917845957206762618188322104946471590369266478660595098732069281192644117382544988957154567918982755878771131501810034492564665202549534237745127922812286537989714258529959375056247550200531755397160082332872499569497564890372601849391656798155826066504423590993e+19), SC_(4.37779716000584398698990777213961810795783081592017743708184220804927904372994901189967649515009735172880623955419740420012315986576189119126543575566904578046919431809875380432523353206754900523923781714480384673715724050123132008911344423077801177226414264244221939888532288642522215169036955971731289164143691078284671577290431144790881842027973573671404137841858557411863925709522264346872510355435006440809714471312012017359301321832215804656521781996390042520886865485354409134425576656515292926e+01)}, + {SC_(2.03659828423951236444711457296286027940368512645363807678222656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(4.91014849486338795473190760759441444466067332010736115448451018358708701249483729445665603792278275962824915533363252447208992321271997558403209359068593642512124051171201458814565348168725868138337357097501234373545916690198371201406334166588453088443536369069022785451336023963788649872427573525422434996888534953599038755123121918868508030352785585630353270762249702292785344287764591129078367625041276697406774722135731348618936205273074423355634920869234376105907879152417604078132666329384170075e+18), SC_(4.30378358585949627123043266249905967962887816014864580030065149334627360311264625084269369929010885338331708629099405372167695832844306064622709950330533203706114565842728252858428991981732670460958718014399250740467134868328348527925344194855324451370921408502953554014065116467018777966799168200158046526847454556567370263163616973309536526429423014979421181142030669729325491143297954511079372608224911716501489196081860212695795268550473745083593808696175606006373300488827315794661965705208608074e+01)}, + {SC_(4.24897141467077741851980990372972257773653836920857429504394531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(2.35351077333026230535011839474240622219483000391146763132183509793076592234927888232167018165059965341889704087890201558410868910455786613836598080957397030633632176587127990393846747320588225351631383496860587423029556133907670877877103353918512797316094631873557226661613318816657601526325447094347483360340956738001270992373069448262826936645820092382649354305920636802353742283580922610354426889294090123859577447266696482951980426047140310287263459070317723770875069575962886935550805237786695897e+18), SC_(4.23024398333195918158408107850347603783326689000823856751331542763754852295008148151040641858229359628078469346471651904183328738913698501012488411862344210217630892036531716673830832847274975771154382165559196133886158282803537992484348196540541778850787109396622290227802667263982437869403228137310193502583531468534595730634902358307597504479659454456104333192503021970905139088727531342322319258852396765871179050698860655091930182032950808135395012770057668306527411218055974698533878804694897876e+01)}, + {SC_(6.52109697062557611797143503062912373025028500705957412719726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(1.53348432710711382412002595519912645825566648563457431696666953405839323663436385415540577078371909268498986232218717729843902408307671822735810898376099999002890492643837786599645083719969138547771263335859855947307816324679806209991631345545056461506588633853780283094320592719021248371654162004605737603691227969348135209903536561923025330689942523293801939078260739547166454712431551868620292198550625950525062132279655944219731109300227921932835486424569827867231613062088487239727349654985918115e+18), SC_(4.18740741580717877834749717580480872663444883214839906712612229928671353630872016793683491013573267754990828537497837278806841156933537456470785351876763297827295195430920851033552990997091396033417305252831735464754273359090537968713199905598504642031010880493394683204614779223808652364642055436096918311854372211100470681108894123216199490765448486492648497952880318710041148392364754006599729496266016887671960468648728381863442366793411335781696166403861745903446537097238299743376393803857573148e+01)}, + {SC_(1.43612616409619005828149362891110740747535601258277893066406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(6.96317653003236534270279684056230493480974635294387864151869876012762532284596734951082527306944183471677369290174280413996466386927811922535961306689638808619571896542664757715749540445967495026030505751974090250891098156207641193344218297448568461129691361732130086054347427579303927112472352548506572728853835019753327122688017454392580665395920292338033791221187069780092498336554008503930308658152705336554580268216215995514521220060257848935007955158452333523773525415852441445066559674435759662e+17), SC_(4.10845823491203750269417544215072791519132546542332718178996273127574536831489212657835589746442090649387167240256729528753922301781366890181149045548306041011402050938687552735678160032267437349278570868601663400661323803208330594908106678976157884754069206007117314370496433949931110672961261612716138604168632915180563247416747360388044256592175912181596271822746593829008506529828578871060187771282714872573721122505387176962208757179811399463372209857716091891885223526650002477848497475476979043e+01)}, + {SC_(3.11890848786895488590521774430186496829264797270298004150390625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(3.20624989123443732306466173906761681520397454797743411967171013836766623066090680547883575948261116875373758903768745835189573992875216085613141902692685511200847100457475304187579768628665984916839183891132515815084322285924840767805505007345562218865321739461777396150138788712581196262279033992571354092841083584810694368680835024576873243622929377079471785915486205112652151458409005461347986973352151531724888021213681531813870835307532278204228758832097427330025813162846791315218221029824619746e+17), SC_(4.03090485769127361541044518516749793558620098090648641127887094855827700200790074148846586717769702602507584916035694807696947856797493490000517122913319060871005295342371073736921330336059216945323871412710866077897955936403693279226005005938096644598230886353655584378890229552843787958464746461009779666997703222136831645152267985521755750444319743715297346010531544876992967622344263445129450448900510104730168827827208165554824488326702348994212535336245330092400863992833297810181409567228297843e+01)}, + {SC_(3.59334537282425688607678804231682079262100160121917724609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(2.78292203015829599261962546957895404990081417377702462561540550534248787923941627519770252374132972956048659251893293996353753189857684586454930049807693801282519389517382281037655102888634397511227508026612893186882009903794224845367685465254686600207247735925185218914216633415917812638411226987452749991767060400949519492513420696456926364234344734374551036206649868606958533670717760397382911283500570331443689754506095339881662222313057843468236763118633209815395160066394239858074758994028666204e+17), SC_(4.01674480465780156756373233991409013436821533054168506258895292628279818069729361806787595136076424384006316279954726598012824241067989855404179824808341722733810737973220122456049123599114093743744591167641745949850999579256815048452990723593892588637365211655957582808948217026490586121983724517543864781645178437196162666472151019598645107712434762601053469666360788143574729074809760313574145036322494425208379260483457212057388135008101922347976288102119321928476946075419079715204273847836843414e+01)}, + {SC_(9.44587319976354210931956956187605101149529218673706054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(1.05866337484292391877893553128199112698939570289224932065176817862141085135514836951586667720844659406770612439774968221124632789370844307001432545672057723464869417971709395799424259898055623912235791403741122929999123344770195973794864712554455288234558866684027599817096207096080284146412184004873522071048450897003367401937804000169854687400292647731549224669081176646068486188198521486876180228698061143311696077549270110157042874108852125353259990832498202645937700555218735068731041170828303378e+17), SC_(3.92009537262054234501302376900562352494457658036527151870180025479603504754753461578489644244060365462256407622755712594087048043074770735971508367302683895802466764533029159135853094442397091072625565603081572124195271332301215264596440920186443496183795483255217338464274566920054827464817577632394600445251335490560113043160121251415961773020418811680125283359994707443679440487631092951378592813529930845985123785509843786473207457924902332048362844352195749950987077358017799628118071730249025862e+01)}, + {SC_(2.56618226665795902841776809921725543972570449113845825195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-17), SC_(3.89683933597725175319881448875156329550959272329681834568395064472849695620233075370398121094999407832801079152543061082854904293375770342032999568194809723919167029207972483181872792071870253942805732212213696866676682551256652819376616818109748330084069432861352227832513280730680509108965375769828468563041117914052232128632742067003958206273566240057625865861463363448156974487157530828513033287570098452135060842470250942593681513427150841818546592619926264067908663369379108875730639326268033636e+16), SC_(3.82015272857946013868972828269190565241603203009525306048316289669090329472938769874388002268858503344601957377991550737380331618410528604493034595400009144511968159360478428151102928583235292537366903749091753601878616080067370420318789469929376398084229926120334276674083850290518652741873258037928908447880487108384710647297029037281429246371294923692866791630607779476698503708578625544511474622147702976005586821125679388687458018308507924009603884965657863077894756124074217763436492364278673196e+01)}, + {SC_(3.36376503340485928823799799403104771045036613941192626953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-17), SC_(2.97285925166949974807457128035170450066477816399282150074283633548132630228050480206101334146278178930908294908408020515338238795065654546119508961075437640461050424638007401351047794124504871288463863754584673855954961126297232599340503171861121561195226942325267400079715661257042576124244835504300757726324585566034800400383463784278686607598194278053396410834529186953102975415973744957865023871122361396135152717126955846865152882110803343610508752652208729776608990800704842038078247817331994336e+16), SC_(3.79308856886101391007069400688611715241306412481945391925641124503755302287114347811486474630031114965526460388140834253480812330063540612899960732864833037424012896192727400080411399823034435528040797825742848919090423377514889994050050630539014368288480412226524143513889592088827662068166527198378253824506638864160188289159987241034610535720713030553745641299836235130444127236622529535246872710565897403446713078126446643276414792539312938432098757656839684732673029434047131943526266196279957187e+01)}, + {SC_(1.07358170281591559259981583096532631316222250461578369140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(9.31461478317936154583885573605068314152782065589549609469914565023926800351906893630628413577057329177994311163956620701142336185063877418787239256892852873445087920365235403253490262027044753883469508398410847328265673193194742911647138928314816775890233439455542433156942108387193099894695833914145431402964584546919313488937598696841459038400110037727145266204533694824059513121510339268845269654240403127274651877792927116000049616797253148390354717608718094465314742868903581139626551889300905460e+15), SC_(3.67703610436463545495026752764732073257799710462679383878926040687745483770759737595879677884882603573698864133418997486425012617679062865326383978427075714145698038560113831222027110705069239786335016603569169352428328537042962202684139397465453620032063627325258874434348407817356371726695939425687202245573310859195697100566991928320499898224427193219018938684548326483374310145227660772699544688722421474069378038779652620437195668034097533124429018646466024438627728567972649112787843740899791573e+01)}, + {SC_(1.86668379762073861211080227917591400910168886184692382812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(5.35709369350391592768923477986863641641041386670021657907817556703006517389988705389283232109982968543641719672782632683446951123770688487043526051583297000240895361108843806299619059970226545428273207896350988541869699991627107327834801493033331216553070688928465855987579410298857315865277432779893119738942981339000319483447360246902762847090996239733181691824983861438010137642268593931536986215723688557791478609307628514091675490387977196067334917940938095685385256768892170730058270859880636462e+15), SC_(3.62171980015770238529644276256304909762841122755715670454530535932119577983920286373688488828352754734406931597030396464476356557398010697414611460815730595598795724461987357764438028481679345185347219185863071734495762170385287950687445842789959555195963125019478348258106691677467080954410031938373216500393153641016722276609946656713555540444591568662264332738289295169018430812414467670389834383152578763719731976746966496898676584798648716600235148412802550386858248891110592564164992629404214083e+01)}, + {SC_(3.72754000856436763788881449954715208150446414947509765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(2.68273445141408911283723006239656257697803268441537091833578995823631479637870109372542433045823942500493538309772882061158620811239346747126416414725632220522897904212689367685374427993307715937071521329955922919964121115209128646024026140952716125111524982773348304152867310039303794124441877617403751368109200025144399966053076218345391645919809571229742549148501577352386134954357696287153144345459858333574657639646117466158790728579741367905998417341437163124394832747783463050305056098538914629e+15), SC_(3.55256129869549746469129190589446112611374971235422325441661743173441106581270111685559740007254639646094495493656624168305177527459509052071035691146800720852814665759057328973021867643432657506024722624096544711014523774399719873932689274731995051138325881077303537458836774065049783694018259907349665329693554519542391840301112676185833713188657051332369184515962004392542293913181461136174541586330573388317276739077974633782704129881107851360100845571979416524943258965369577672126496148058574581e+01)}, + {SC_(6.21164623847126305677956992212784825824201107025146484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(1.60987918759215724473296955164050711825489618287045866202801823414693239227582877689612642201828742154418687355121973966292505959901391806799139653809838745188340881684515162988792007848468674612998319858187092531693899932814139414825926557323551114672169822158423992839458703436196401791797911936673436838394240815852947047828174796753313307757136143684480285017719542768808602568057397749873573409112484432828327014784464583830481102656394268086123846746418699465072883104433293290933010401885509252e+15), SC_(3.50149355323288728364329861732880324176031638041336862139807052588032519007018091239566004053112678380594715791614694015553568082314922840573501903934526205826219301106252291108123590770428192799388536288175283950076110976661476116388877098281744244826032674245791119891143171701318333066266192173031544331503256176982628055047348808467609466555103556740155332807731035093879658546200419663988682878676527720256158920797662450751878684463077317141864229153842444817407043542613272320106476743924054420e+01)}, + {SC_(1.56118675387513505814496284074266441166400909423828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(6.40538358090616930572199615451805628548811466548124866767301580454193836914688527258945904249400930128393597483821093345931465125659040391786350941651021513731158934861793952123651760083410251936794620985570172329548344492841407057052025958565132036658866728905612768400532182293158835054332981413662202889397861806043910747692211323788804394256779409295771295572821408075298471507736651155422104110473872767486593110874188436686541654282655355161458124621196612875076129336425440541282095043450040255e+14), SC_(3.40933301232014391150868421636533958473440302585740860260848018138238167947147035645125756954671750855391887535317009444065956767921064677968618219945959053639513910191608207857335901642663150813785332414376802057893921745648267995098117737459621623133122851171303514865520860577135966638142992592890484973123904068963085394166183181897269113986078489578835681632904743027489067147409257807141797115092583680460450147123180586018335936955745723770866230963621347586888357455203043177396972833240851176e+01)}, + {SC_(3.09201076472299246633568259312596637755632400512695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(3.23414139242036684276083130604740555332102742732209059379463888241652420546423273086068775293720523823200670849046209509059992046513896037709874652313295779648822248664308086223556376242106158616999836997344265976872160860155284371645823226486628544951807381517275685383124474248733832833490965510634823019355780090367489336590037228205353144842183317855983909606680484114170019756574079014702848036194935144988337541633047521822526159654693197431239667075331189787015556708335276605238049315835810949e+14), SC_(3.34099547827158268511113993446903871609732924567423972328264466707266472778778891404558763137098605651259421135963813833515578889335972791280638276638644224502835075692963388704588416382084250235467716489647590712743538560386421899270208473311755340209188808173381086345830251825944994715547816456415714427114514915312552192521665876486824893423925556696142108780583640085356427710300777015891910118866224225325727148526583301327987132946111378409333344173151219474323631718818017607572968466884244881e+01)}, + {SC_(6.19284930682226925080513524335401598364114761352539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(1.61476559569818671077849756616782395312094395613347467750921722608840205796460277758977185598066368612152647586355409621867085587660898402276437610012628993258471020827684469653607635220589425130797599931290173046110225841248699388265771294084712117371892010203190259471067461983539407831393871011826817832470708029300694095843415136560615706146315580504139342457709693423001976894072748271524278429319146224988993773668626131510931741784139122901762820252013439990701483599226194926428639331692995557e+14), SC_(3.27153811060745956545208526189697911818865513720855207755872098602864684374322696355123670952633924436258610666907170222209394190047290120323927472415081513666370900738289979879690186626743145600004271927253949261836286290740269610628605968254208476768024418971702204779288095032341257084062060344264304671198009573892376055095018771428144517163652189210316706374200046878577151824403617693596267098982951994663722671034852406566911866665007273958508147641802996795125455444652177198364896323298304893e+01)}, + {SC_(1.04787902801498772342725374073779676109552383422851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(9.54308630352406516205359046743618128166013090307817797340778789274961654822225673440177258174542900560867351268330833966280245668620838918829357035489275755644143090680060808839976435761676367940523185523095340333253908768554277364428691654262043043572182784073217355994150549491589487440011307430494117507959296987864631992522761541545646638217243232172299176577840404366061062966572185707442372468239516417574982507870328724871909524033211780972857372209413324807897530256218888609923492076544192109e+13), SC_(3.21894231539638950907826379599187842092021268441575923627069258871771854433853115415782489861480221176798825589829782195888976062477106413518596068053420790907345073056114458972152822792634568125668736336221600151997074169590195016728096593357645536460894160204159094589833050074995328566868137793424194031239361538971519366809470194032401330140171321878243915169056979387038234600397250254904913143463342791005518801681322155705188385276179554739337515081187784957575036642842343229436475007253920317e+01)}, + {SC_(1.97847313076864039782520876542548649013042449951171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(5.05440273334157824610291274505331299112537682918356644294065782874967080760819218369358842344722889119059120852563533630957034017900977677765645163762768638444925755118980175905552516718603988596151136262505942788287639943511325025291684945629253287336400993651018048078421763736114277036323128197654243217402405771923455474402297884519301843406468653715197789031889941921922213353229037615872818479641755520825402977352044532728989288131318994792635273076684794348019858198888846251883682434856709647e+13), SC_(3.15538659007727107880083686193998563292533754784239638473546230158371409841656726541189075805403753304475273768163410631304837122301201804069146565821080380728613439679856624459579438773909638520997068262009983521806344833780047975686836856408178527940530668908592418922849294084163218999836168907185916907686225093493625442584462427634364163510373475305542575946640596319788825084236461508223200924347550008190319412896325544644970319132017408695512459624713558941710455539829411743008273160922182276e+01)}, + {SC_(4.04181625234673047586397842678707093000411987304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(2.47413523417687237626963417481472433633575119288276766917889956829706449387149542182869256245700252809127224187392299344118680726955621980608527311106641981758457137155249257019959311787800175161249767547732906304767784662313938188488954622233749014151216322402541870100691842879966764316542106877672313850010047940125563794655250325383293007679879162113741747550152520179452876634080967834990748405544440060405645105251924641229465383899510724315835256818990916050429842286719722149892359257192546334e+13), SC_(3.08394971435561524360142991538131117539701549235963414268474100167564253338933446140757694701064289726364423973157455283907856938737731484242330760047331965651566581163412758979346661233941073287719334494551282734269681696866274532457888490449760451692621607033690773687251984208887286450445309681513684821963475136058108812225796383611583847994569380161340863673936288863658102647041572372692358955984131110815821568036946097843162296614207222964877061568985465748411171374575442815448828159106229063e+01)}, + {SC_(9.41030023002276116983466636156663298606872558593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(1.06266535132378760631643358293084561511832251368430794866564956367470040705018915409688083875482366263429632275039193240775766717077873313852950906600022896494221965573665971241663302310175858585575545771211409213274114706303571146331076743944647262144373083858176045960978072697190078745416271470663047735107459899716848754352570868678111151112812595107266326009187517941163620835723085933282061532789859285423369697118361841235177506549712822803071392540857286208956514811198187808084053916061721078e+13), SC_(2.99943864434060791143172217492896937207257949517184549417827064206979752588254776175589324103489335524950979308405249931740158481930226889556381324738413768244210883195345624061540768169879851570810583307354423589854007192927945909045754243680609798014063800551099760224902076469760607675735491720932918729762150703739803896371534094356260646920621664361156701208773746212016161641743802207607892411338748745704600883232903687017902944301007840250864179183844517526006505109173025929076962406537777920e+01)}, + {SC_(1.33452981738307885350991455197799950838088989257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(7.49327581125803664353332686794462735456476172634230287246141345112050937168008380331979244951518303168542851471161625212402617638944763054689499203513298470645263374349226143689692949458761027910602397479322818253915367494622615901121203986244743934212301062374794036609817418728998513819624985002827010279122684636930340188704487616825826188496239163860134394337564212301369114736279077734733982238018672531979578933946521870429264290190811162244158436887004878920183732188673299621097892176296159380e+12), SC_(2.96450271758229288403252112889839343046264919348997051677770807143229064321698759490104407092173470549790770910195143510892421208124871524048537452270859140340894574198474275240976869613246364719079574395550342755224793264452868148741241005212364301594685738976292681945703335226563931912049610406775300176036592141685864992725787902308843717762037673700674556235606932116716568288702687427879873000484350347814943416258390061621054988463397497969887685774955472977153237799356556556812974507905534520e+01)}, + {SC_(2.66296967116330662861400924157351255416870117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(3.75520611754846112229083118399808749001360022124058715474727790108499144051750552773043606887072948591733873717619240063080087438143083644198452449978587541745540668164534368081538836999426749485182722608937514052626546048690634099712339264714521629742112776070046990915446381417847222407042913672916714141265208789710907662269976047802795103569149539665396634565491541483384838198541813267661606162894493363675144867700571511618283433250754834401268934080145757542080423149459099357971487063044420798e+12), SC_(2.89541642911290985674935632628817900504134143476583578690835555153792464486843214230770681727568219370418454410176940082705556788379939494096559518415200599813788233053457422119145514230226273454974164747119856647988194000419844395517976877127785947700998789158949025802776791456070546132318867880519233401001419907844937725860998778948766916982532697956516048925274592479471863457959002692582148207882530569385026392064968869404325018522967272680481727974672171879554684614564347484171235619314903696e+01)}, + {SC_(5.92041389871345025142090889858081936836242675781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(1.68907109723691052070486525865106261806854966699127027205669176277569218965909678349600366028971380180385906687809738819931361084816519280585711566815674289584306704539214723315643204060952677418896085153747819431781526018839209148072775102167053932355256696250635369168809087728146494200909522760193515069230982932008136433426818311186461001454876401671432451216807114751593214297322118984996051173573813270457915363615668883625006270008577595200337542985666436051094151406486548468223963306159654578e+12), SC_(2.81551998471470821921826157320225318779020697755817987877133780395168679457427671788226434299866659405041732712114375208646597948004797119550767305131975984686358907282376546079646237181336488345676458337148909817110936069601773500181081630094896836955048561619175391708439600263872860209454397931673667257880817059574772661504631368432527966353704558439825785368252610502124484964110156251032299215447175710893508980200682712137982588485989277355873023709479206867181641268659311575364569507471812106e+01)}, + {SC_(1.55163989296047688526414276566356420516967773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(6.44479434007808281945668171737631984460126338755716050528259636607558935755206412545315633066199139062007451090068421786440803136845169038776735288556927740762250530813003376363047126561006457621447061946747652004313806111815894201357327059916054202470401783612662229031472185476081051007630444791825977198318692478573405964267879544376662236850355227144275165845837654094265233204518939903809979157878239002505955765874635670880773744972151920549504126507544870672637337239076996374024550050298288969e+11), SC_(2.71917087488208757956302942278577362295215807788263157065483843364066663844154423713634751254760580365655956711675975357428722671276630188824680533146797115053517339275254913516196328098442855098750314098697115490375504499318013291671780934170480957119848910233193628612157277168981731443947541882834369189186964256514844948997973976691949465374841958954223300229207473839330998856617233994716915993252606356782819485709994926845524965543217686418000523044509663205570777926153154778574864020540675905e+01)}, + {SC_(3.26923297461201300961874949280172586441040039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(3.05882146596417234835994602981634843704750827288294119670156575398858570365036581738681250292878619132939544196249745147762777975788702902641322452264655661985803387949475536433707633244000288147225470160054689577928543581745112442814412566861665723976043265302978007164309180647034560028702203990421924922013355345598647705169919067111687823219992429534585941737923695475857355829185398287550483537377689480938908547889512997031717082903798346740384480735275300567744061225303803147502571461670451282e+11), SC_(2.64464657228708503007839379797814889383468623408632356045883940239707796706335741648601257561033703735027993923522266991510795865405348473785708794241059879719326704776023245036986519209326809690606573999809271632372481993912245549990143970731534224585709349233224063569517537604626541649377460349869609607539997644367673174479433895486942986943532920284602864941975113981089301869678030658716662693056171364402660992019175343646111063211321804943853171822947415008191403169872733872982066844706145490e+01)}, + {SC_(3.75378547690097263966890750452876091003417968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(2.66397748659682909756214887858083229415894420716762742064573472682474490462580859011373564363428084801314649404922305948134943734902447416261381967458044712729517464413747608514517893451473086812036842641949289328614680708631437977491656865094490800485832412388703509802032685663024816128140980278111665016584380476090092190662589280675294498094956505172465951855876751666393436168631795516138382681944895276698624547918025170510095147475386547606289130297220119860631615057432119740644819489077420394e+11), SC_(2.63082563245997692641649751900943291907691027144583704549442551016776634450412688273893462505301287777070668295183514819852524997814713408510699214857155819476853930204939748762743648482032606225357989833787868484607162940507880034914693458466251230146443827109590823773695084631603391774312246852917983179238312233575917758149911819562050473544307597831316353986629032971639235492193044250270704422734560896220909594598818102479338461828126613160467017936891031331993774585288966541820231566991439324e+01)}, + {SC_(9.57916385102564049702777992933988571166992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(1.04393245125189169486027570038996582173487482590748586089822808469387431328301377618370442742826265541497232306444964659164242474807185782150761610210632289940820474500560688335407912085585699972502466458135697942977731536099335360050363930102587739596997254053324420001037812190352819577308953150566568369925711308080252617427664868786203872471901268803117970363715521670230414288279696940737544931751291247921012323221444842194521436843824624549899340782748610804764503134909942955283466392480149356e+11), SC_(2.53714308084356893528465928314436682427710311763825598345994023050258622398573852312837852231659309845437520988033941711696041489046002537658504340143627120828392418786708213179671375739089890154011798708971619878833013355845921783147827319762987629911070090390377141442166911300222465040042045659314267308680084418840737558155857306825315728369486845594480625849530184371295514707954989360252541560432094681464308036399339395096989260992294394578271133139088324006323139537103026881509515892094815868e+01)}, + {SC_(1.85816709241670707797311479225754737854003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(5.38164734522710681215600336061308853120702404775145741709026396178823245553137666800524126297374217114724680251167541929241182261687949418995565335029486872157125343290612171119880530101193916858921432756965877000509299499604733026401192518432472807166016347864511370369708185703119315683513347311705471142373926510862090059777086621231383651397623524522666406326397488408425070093854590097402718270173248647652565267172176040569249429679757503140285383909390206192507646517253731439123746131624249013e+10), SC_(2.47088454552427137429056329064109142188843906165891475774275743679190025685194554734484595319669509903930259457820499849598199214676908400721919316015322380864769811197623330485316164544963476410844338145101962702064276881579255860088713997116411562209654938575284162991827148200313426345555058188280286970644756612598695826995893568264874467159345854674115312282747039761533926261402464939091487342073450254851176994505068182111978970672752958497500861843350592146405041615401662481907234472878121134e+01)}, + {SC_(5.44948530745159587240777909755706787109375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(1.83503568419782742444110740345485123635192662508026305449822064127200895495506522518300606061885236080150004638907060784485796894919202236803140073697331043211992951972609347054589798075100998594256645375390103519596787348845827032192905773076186985280977236935203223950666348048814013595501435907216666387351197442286860869056417192384391638213785809676518670680508710566800590437787611079311407075165452999495406849472529410938337431736830657048795062807787119744804484928614047453144586034805245789e+10), SC_(2.36329148576872448249942821605627674186499356266069319715954487992643662294411738158241119885349703763796404853789880585762925019414200620292460678339262214588413946187958058256382025002391673480147145270388456894043662461018854194828668215962270960439151474188647474425625494775601112078253792726530286137717752752768842949012627953324732331371323991302860241330919243809216358651674628647197448697291367713884619010229075199219840636262767574903350571262368220355179436844196791555671752462351869046e+01)}, + {SC_(6.08951777891775236639659851789474487304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(1.64216615546621064803013134062087811673092748693572885955291086615453038443965746918527089670359832467884627804869657509889650026751673783619206954153041104516844408513248895106916772556394041551875119284869088037479657980868966602129588687470062451815693221099315162782276653334393329494895424621430603591057616248637305903296178334745144236325653690117993496869421243789046117391168563934190450243201956497156633468278725255215744464020504309074023652187498470935365081369407764705200742909320431349e+10), SC_(2.35218671267563612353348723043202312786307472491656736789362170809010927853268720372089773533365322636476747355137070858356044677376510322713056628921780389307345874508065375269999253671352912911300789233090646288480277336399214203824400746311370034317659741344301244189548926906452691866457683693618594716563727782265819613630587556878361391532959913004915741915512858017425295944874612540863724007947904388532017360454437916475157224516660170429346394565018134649549162182163834378038354896787534841e+01)}, + {SC_(1.33774435973066374572226777672767639160156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(7.47526979014226168376384951063540791218306464061986362930576004822937035170826747587219778713265013490356876945166420253260555381329073438163483115746514774479474424515084780051629598601133421867960470830504667887885069909772744114866067292970878487141283092292728452415775921280918070442774133326301037901061816917727478717520084018487350667522549017129986542118147485610067262541496627719604571748937052892434485040545825983818735788800698893594461092076293536724104072562332257956291083818308956413e+09), SC_(2.27348660478985728986052090691869895050374367468815674115675413846437487991638874436688243456130558073290283141742095678859644590259358965534318423720133246933305572030632400606313806383078380531211317966778435095299543494045005476053336526881142479116347292899023673200509584071082808986065746925389076777580052558272824153282309889654575678844049352349892755868036262512082925318962285347555701091174821628709528237217604386997327214614368590642701672876321992143952181847423729490477577346381853522e+01)}, + {SC_(2.55445886665484067634679377079010009765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(3.91472343871439978910477041965245474686465180195914637204067931155807421046773613195218014343443213281482963786749317221809432998053890797111065514873743303968835421350089217250012183258566393346818055392099509447667423810046789872014606508233744159464480197460174056765333167633380035505451716049617734818251233366973419386831337618966097682993067804646577065386307800044732627324473412332158334409508167829825644048453099756316314804390039245419754866540656073700840066868100898153281112806338309714e+09), SC_(2.20880105224416920895025375311224309333191291243380788898883223848745359017136539357506857766099404650529030796456169266293876522646879739438348110747941991215095622332304227939069152729572485470267183483067041403067149639760009599374303521571969473311055242104395748819301709770976566775902041342531942700926010496460878831692942101086740124837297933734304244538829304784415560885582162795113502131933398817811477963855514503427658668565459402914411004137540469053418634046916829095623083037368147796e+01)}, + {SC_(9.28560339730211126152426004409790039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(1.07693593693067459739313196967983697014168456746735348950919376991901134647895921249473783820425440748624729046805302065147100445478576472841997876556348031552956847123213018659344562570860704628256642731968975802662512832765217693879980226435177749884163278536128229784803704747100947313765909472695150172294912887298258373307813501549625979139710091181006478520754982671108876330020574992387977252845102120807513897028338524143351916484881826006078361700760820994355807138708960301667204359286421020e+09), SC_(2.07973857504644610716889395527737992585186849324495128250619250061479886870375850394426233184821495976670242716899017325165163154088869376465418506805353926143256480084118576294761652581847352892907919904429997475140686105674530141840068766707330442895114253613073589774120006201302061827279282589546526093188104157655815622515958409221402489609226382619746450223058090686879130896414033263620750912064412230268748715901437966406012423491677890763788052175548531716952413812038430090387475416035911166e+01)}, + {SC_(1.69822733653290924848988652229309082031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(5.88849312166503329222804086517709611102504992551929827158983260288274819355761666131361350403874753215463840071495318131961262300000765445973666229487031598720857498492987143522791355463828265864402139432350575863919550830036469565606199591470156705446960446045999559624084043933730929837654285300895855904989248038146101301631557036491570331704774925320131536014567404874489691389486251736352515404220755516488822817333832143329345542864773188420965679770154373216348702981384689050349014346637868895e+08), SC_(2.01936808721548656388079701232333621990292234406195324994727476802362692900192163204786445631523775797240087658142441617001290954758379696663986806394767773157322284307849876524904682586819191449092688119556710946373436273820321044371035628264815659393916459198676972087410240894826301225696379803232794401251838170344674786562306664018746217590477957014229341960304890117884805982875916303367067026067301211977791816334606548169972461693412588611268696560770810948724317758861874065303224659055768486e+01)}, + {SC_(3.39355921141759608872234821319580078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(2.94675865585811635298905545790724556951261971511817324192800337091966952557433897238486040563146326422690127775802629136506732120683355613677456114065442582606140614028294138747202403264952788642284199088873893000648208374234647107722407968127897446593386208233249293959770393729136064523101800224883878867516495924927666979551417108620059324211868720429514373406034762486902686884221653802832710722135064601777922572822590724018314669731551707502644268987523794807797201345037498713836837200106117859e+08), SC_(1.95013865494979315748313424975857460473634359955171433398912789707630274299619009224156325830001463741355320932191136639198272143513408963597746842884554261062767061011794862873805897207009188860568189846504131852234332017714959090717508237726771666011207787732265446873884001434343930063513478218717017119608818828926407280580928774522312004033748177516159660878382197007027146156778530958492741043073137226561947610796232234756201323918090842542134154240717765908943925443129110964257210652469765459e+01)}, + {SC_(6.31372820691922242986038327217102050781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(1.58385024439239560678029793644762724145694760750936270448787476917426742365312993416495445258066935770102073399067933673940787592468244489319355965681748597844017136875830896374444946819887498943387605128932905916683614722179628126645099686007619813917603450327015203485661027618036158569766302078449406310364340890783600576522072882996092981719203190666518838669113707153191547698768060884224247649696478290695897698814564809558453790895608263410530264953882534568878304886285345294246575653964394933e+08), SC_(1.88805394901935901312944434284350951219368630628612582497798500377213575430066187911538214347407247506592302835814578379074942968724063304830478545485499104982891564902834873083552388009367885301931886283108030732695152751848460305522542720948518365374089606446212603641365595987395773574687901369258435992285754676676444454303083046616673187875296372440378443356862117485368511965690403951383780793178907009178840322578791980487361471021699988380686049660994558986894513487250480575078814977194988926e+01)}, + {SC_(8.38326386087828723248094320297241210937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(1.19285282171266658145508408138097534262559562256796179239060845011847752757742744827549809320449524476525678489254530873060639064343374370418109877624082104111867971537796336728658937487311009651740723155108598523574089439636001946998412481579157288344084972946019075804904453746381170904188301113624111553121632985948929138222683651820769143181173655246038790436308561376021389687302205902619878055292692238813786176438899128455354260304627671521514620334784061653162359203841812596820283636012413155e+08), SC_(1.85970285112369275360019811510798597407616819997535534540861800006130065438481930599974368466408856952940619414764119222982234819668925719824207934180803628792362844837237434872443976991587061436543189016693448298778560625710296335004224090879870402508253963121606317871340026351185428422401899631577649568952634738322641017608299843257260519480390161519206689676784551329384425137071265909687534307017746909409303177372383274507940067443301831530926380849233752290042798372825621637792458149510367158e+01)}, + {SC_(1.96263059137891104910522699356079101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(5.09520229157747964001427996680084687728519220880694851417761451758485922028137797926986558108081161647424335273935443009450702693139660492793598652472042922321455560347329476289740970225980232132484721944368298424652675989140325777048780846103353145589579610596228532659731472516752040401388614999099106605361023985232754174754462689599358275454662950394291313192314924154309854807338240568480536882437606662081858664976471783856993462009295129472122922430204094632485111706729685334953903001928515306e+07), SC_(1.77463950207854514067971232064740260529105197804463559048243833216868226570768682518176721601656061733151204368405143742619830734756623431664082017620746152360142944331261018871625099695179564716131664620296596142717865215783930311250469461067216865839155669595131410277575494071155624571181890018520530487012085131270472606584209551187422858235247484254934923176063127943828270477251954203313710078679176167435792694591424828856084830989589146231865386331847539580708042557229489148910726228436273224e+01)}, + {SC_(5.25638483850343618541955947875976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(1.90244816615071042976912611629696763144346541035766078085764029503997602581877792049646577520911176605141052583156884910047229341218903573541592559499518194959491983325368765455962448031602893719065828910665027882587968020448370625205459497212847547686522514510967372971354497619542701997056077016761039101147586700231467014866991293439747219121625945505887139948909731139184864350248915445653527417884819966623498522753330295654416087777162453609622667919905235926258921853904509270133969132116091634e+07), SC_(1.67612372162164061692861843009343434771981611053111621976184895674270615702556422861104711239670932942032636331270126587785220494849967705136661812539736970981197905984513517678832773229865521494702028014410160745047515210657408196793002836449416485413273544305012535544219297954738314917704098327165656062964601614781986549238030592926364895039476594734612878189916934277091367272748422762481586851408931992506671596123378100473697510918014617091780151806715692586329303065621890707562029937748330347e+01)}, + {SC_(1.16242290459922514855861663818359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(8.60272048104487229772270370408991565622146793420283748432283683850487109590703567341512208842888206543920002357186841608997218745333833023455975206855307233940669287790010316749659645433998894151744284846749708391642403854115820092354766734491127892363620549380243024276736218478701060023730673432191670156499018218581472049008969127266351163613795232939963359099049229223643932353224706265523448130695355903869011220522517153184148351405100515798526771128492374949302429712428995265054565616102236743e+06), SC_(1.59675890462055852493050785354007861019565072353741022812627104322063156529086182292122548245675963093183064733327338722657905893984234890223568744516553902070973717709098500393275533107035456906906513737015232252328472020431774422782634447132083994791646502267731048214337727523605199382839002174372325259458602525164508779404945196242777027746479829450292065967587035499960957349740151867689420397814665735654733186029950552962743110042418202174503847771730953250698037145722977227920266313544340773e+01)}, + {SC_(1.77692015768116107210516929626464843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(5.62771429605701866811138968820040581688116632816625983330513767541698354176855994730746674759831971880240445767320154220938966723002674804699555553392464572752062447887107572218019828318385760764849719115812290395527218248512835468451576239683644796014696087840260231260544768733299352553787968817182380161518794267110224517746786086312897558884287582163631755473909091469973820008996113444080900207916568204012349110621060594004089234828356435145317529589017309777517404825895108564229825972606783182e+06), SC_(1.55432139311902849557388986039946494987126573050313531526481779205905405668433477095198392052135320177727361621658987782230848885023817861314864082631463951648319984960611870632532168113895900910854247521399554895529781550582806849790523833389893084518536060834832685622097231090397585685502199395551134545521290924266861842592714224402073494637426674029193910125176587896815977374475577011900752678646424642579248726361363336678870110288587035477510896039630197401429009658705999914443878600811574386e+01)}, + {SC_(2.46631088884896598756313323974609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(4.05463829463703525078122574940316185372614216769109157708814571443486612751575690613250765783963915311892809190311521636840848682833365271859823541200911649626456985869205183744879031447905297712068866428485718280809470026817621417084457752394310317819688996380906775828413109847499866410583703740515922882544138759737755727432557079831161548511524423498124090291597806689974390433799904149419080022622021024787189417104421660109962432297064272955004064700460013960135399781819403593602459160459413744e+06), SC_(1.52153720417102064745346523708311080286908527069304380979659806362345202173276520946568894036685196482196087450838867175344344468238318814384356738850916294525418838439245756796795747454256238522398060373267581786207971837564233417365834530177830732568954115312718140425486929049831566682146227958628349055286920128285911779848078583664754564964840731594796819254368142311552040020238959735263159278838020281187709608149004880883080370901523357618622591286058941009526205756711994702121770949864546654e+01)}, + {SC_(7.93268782217637635767459869384765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(1.26060619619731797608818932503181830260823421781213048732665695327420696362898453758226660591820476065756957020975520019667707610555894768703507485484222106076869765708337512029685375685746413643372605490449629888194538976635668689248136807099122488332322328884163089485410632245588395068264245821725494222737390864654038651030533750522546976123471768082838483346923830312776214845895208472603705758787692650064498899060550013054720470762070785663552346599987591854146837595704246331651813008524383209e+06), SC_(1.40471032713253781161105456090844398310531699761588801858703943827256004083339187938282688922859386138059958746496554270966644869917724313173459469024731217872312313939028706531208267916779711847875755923115508248648357114981186732018707140167984280398904591328254471708347734049112217021783628832842204199345747439816740684385414946326168177179946882060522211697405823017982624446938981152321786117064296988318870088712395225819402305299983569779003430897690524415945397318576782524369949353588329616e+01)}, + {SC_(1.37209326567244715988636016845703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(7.28812853343498664144152447838008783938567673932162819960961771256950384002603126229351335533069556913916892568138616531409143041501189818980704581213281032710490015194970354870756213476299773879811898004568190420013714451336012132400839252929052511244586664386695283946540013669687700896185000308463082744375107020456438967956604931415578634631979274913179204735917911437772705149748195582640430894253267806733655964881188471383295076887111769104559648198985229120804501321038598800302786397869897490e+05), SC_(1.34991722610834251544478254617081208033887846401310469427406095478843346196811171297685073308928006301987164377413398299284980888737753603655332120887310757344649691900092227409561455158414895169100825749492101027579480515522441587439428668126217470515921622120380597586481272803721815179676865176168002630196740690339996435287953994766447951272834237454248437077301244123733043940406921792054573656410299063798548540972124521498460570764799509713656084726107747894221393929095901305152701667831232883e+01)}, + {SC_(2.14747706195339560508728027343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(4.65662138219785513456021194162659715040199784495451432714692244736381873142785567562103911931072664389018733512973345980123097086105957143181830422993307222537024789466998094044967709540947345569548881850284232773624903802613550469100983177752083220734207267969462805084427281822878812239074581148461697210298236933264855944662677760069483003826859992395504506972326467470916808301997979437414794764181083226857845955214583704416618979717374942753521670200061935257869925639843860532949699488119920342e+05), SC_(1.30512156248704163419310858052987283807885073935136057758898979845218818037254859855534477451394234492262573113912574193529039772507620648887073103288733240844530015624769737072016655692043999870453260213995786982745953810791105720212177103030589518066961157830316056921435994370920505014296960653565850275264051276660243817416894060431159237063418800675904538400890810373846318565995207426410477915174816465069935340231044180571276528013572674914197376905082237182062279095158542604714638986206139428e+01)}, + {SC_(5.27022712049074470996856689453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(1.89744566051396948131191467613435700133438193946287587593391216386661306606335409546369520065981423905125657400592597211211243004697254375450734895459592300815375383152751165081305823627983584181411284526182204207394660389795419887200792166308617327974051439608467092227533174890458055752767205733534348342642249333065058210492219904013467166773249090089125094303714125962392590340230759838587590812261282901800275368686907652321958606428003570401793590415297039558116943719793472143796722363193257473e+05), SC_(1.21534340574375251331797866321470805050072336943670368507800133643376730773790413820040384632351349786576361785072435541887797662530053082201097185957785332034829965887731383605989153147309401665061094744509328906214042555919268939030387813798149437192066156894881989347180491920144816757302805182042339614005936728867964872372329336770418426254156892181076908397406972043893748829677877785432144800417604037445100468162760543750235752313608369165085076555511055641440400557644122506521106201156828000e+01)}, + {SC_(9.23316110856831073760986328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(1.08304692055151174435645853312702433563445401245428008062158172231455734708917727233248309622995416103476130730859783426082812474016241501932511000475901840984624284970956268938241100845148302704104227692202374326021995429710412190789499517501742831968214505026085727217377064048749586381949765702833484753838333062317642259075801944397863616645673756838251985742411639158567796696629295388664024665052813892150438181549706074897778508926078559131307287669070666914378154990685310194791830936012072137e+05), SC_(1.15927037566595656608676333962593457748246358442149722307760213653329691390266732585232312633218072213780520674080290918004260905060501441987250389989879522599564165926295894900973356709358185982833184287889198682185728270473692925487109895376481633969407425746209783983216649854424136095892698254944537841867507179483097032287978923877995255955010604613196178590571391372314231476100820183230223610979878398116965034513157331357185817159093437732287357107176531525209785815749703666087413492601638367e+01)}, + {SC_(2.69396477960981428623199462890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-05), SC_(3.71194329747660700872822240489096533346970414462319130943332437727673026086395871555354923534426796329307758684090756605125926441079955027284505526484660084516570689496028558153640491596899194314856682287855875398764204347089952167700379787578451809878965118618325856981967306344605010950402177172875745453986482790033650570205353879618538529832262937125092859324209602202715647865832427287280809938499032165592488069349477641753571240221659642079940920995507104949485325593819265961739532385927724001e+04), SC_(1.05218959113191896554438255983392789165506636604484179691160873065455025312686246355084294414971498650330801965012760611510148977404541413264372006775938011586906419749948493205342928656222439747335580984568333324076988203103506297440002347920779866410520674190113274847777131783052870610390167794377546520034787355528411508314922975386358933134353197222922919703716998581882764082601589614612452860504022521256961901296746671426803571353232525264162049239730237299766785596779287518475633276054504511e+01)}, + {SC_(3.20805702358484268188476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-05), SC_(3.11709385543515572081573476743918797729420381355450382111209778511181152310932055956563749014637508036076666934504020805229942252077588670358362288265495735084797052807569608353528679336352612738901337701163849825424516929631780124984065988054242480080427910793718686499912898841019187210679705723175454260477745636077694212098776697591722777186050104731968499613418884068268352388977472866805105290135328421979342194632200989741338926428484922875461512185439530419888158628103661380037688089459246622e+04), SC_(1.03472414831310176380983520126166183229500641071994253195046291587080019387137512979227110645263077621786969120878177843284129518960337795398690432074360786303100938249647682482133908324719023468000441189614849101558514019884444875606114225203976467536402967505115161687406889548187118481920055496926584251660690334337239079454029278564608943116880634267663164371010715252754735624250229428238157024613942707533924518433208364222285625505553939009603522382189325666940210790483815089523032160326727186e+01)}, + {SC_(1.09570304630324244499206542968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(9.12598326298792575871376208892941821597249145712355235734553245112275791184424920173192390958809327836147088440453600847272070731838167459383457734633274396531286746571484131371295317801711910499009978655927962435202345802991303378916715764960222274468063689080593822570418178751973369105720490378352700618930760845476121115398840126230586994459640874070111920630086235547729480577307390280974311106356863825358553687848655142111054663297488417064528607271372924608147255338609518866735822561855075808e+03), SC_(9.11888092749354750131942804760198365932951387446607940153090806005643231331865994203153064090907668937081238831422255569214073300853117391260189906213547756795578339461193047601491906417607295384073771562974969006175586199307941274383550444330451406419535665500372152406327606813356895490483840883903495107538235046324827393471368712595702254706807119781085992818405020677615041495700125639064504392716280328536528527483253025798036974151336021910553259995244874029242300562997202783539503321465074836e+00)}, + {SC_(1.26518658362329006195068359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(7.90339543765010940777148884430598859351624539666986011225276345158776246884141569590179807044935540608336020073420198831987509235879831098864207174778508378299183243304945942399124179383363140239127129852788889394591268763142954004803973096640508764838455634334250452217575170092021719528520780979702520546195516521766092522673675677114507991883621135632426293262864552958004567105759441872777690805227017885582718414531016665919775279511441635073252680404200996526347257159690831721716257307386634020e+03), SC_(8.97504774835078092356190417460687731975039635483901022943615671319109149737911055314981699026784930674690670230372344603892513366502197739637264654321535008940079734351022352120615821558964314283413690614455978052538154196046662526310741944191671468287266268233426532630706431678673817316378735628183210777142361433016716451904550644715844194615744623549079746505429283121123624192521206839116751685248416746623025501661583164546510521555172172770363313019918383836960358393888517833715726142629204114e+00)}, + {SC_(2.89763789623975753784179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(3.45050990712494949775484002402506388638080961096441424786111616212629018401813163185537287870628332365611975002748252281954445942791824089759407952360045363041729854235263163931426111990963272192916849625697623347007557637621285946168372199998129262208030995630954149379608985182807987421083472125798154110350638801183057973882308932482367706263206585063709642030346439272821014392389727598715876907984410099739266841331289003132310293615533755248496236332102731721832627511713932767473667701783430362e+03), SC_(8.14627729827083672260241473795882251685177893472958167349605915118977814410015333417694750657030461729339257490528025119250178359084774998230863794007053582161693347623694527222996422723379100574685447013068079638620883177928422256598825247182208799316990898594977407941592694581625618281858646634334423979133024372486968759491378328948502691422577116400902205623065242117642679484587995259074059369354113787583549754706589392229130887348557036144422650603292395363687531902954386667400975083172345586e+00)}, + {SC_(6.87856925651431083679199218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(1.45321416213776341402172643653824290406246448625953718991061156275374559371473926240159189562530897642663657874824554509667432592596502028111498876987731731419103181077902550647076830258178738399692656235388664685636163262176946409182939329754572681632034342895691385894677553479890654931971482605617255828759487638944296672758417176666979192400085893856817992255670426756593975946191143479418145211492672337177829308430717007395722848329062849814785306945348487702248579633088084778151184300309266488e+03), SC_(7.28153304578384526584740309475807940366672770326761440940762897710596740030873024930437245041126693802972723766820782336184883357255905701949197956259485841269939774864827721578724722429879285781856120681590534300373112907042521537083714436074932198957147919504117058586652251820950663673303273139893930539087144915014830401325006614936376974832764368207617357592682985463417492708094036271644356036769127411668259712404556319653473155967703044648299583649315831983842605529260138729644416212347308063e+00)}, + {SC_(1.45484786480665206909179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(6.86781314954593160454464618092638855307877715120008177395736462810782174656198499987155564941616352195397978189958626591964468149122014404578158273793351109200213113242205214101044790656181720304965625629108123017569222776687767520209813381764274910480897470251188192687862750700740524066029998775711155906709369717589842957496547022861611550070495006016302488665795132883296840140179617961235225362018556687105202197899534545930741979641738181687774160395997039192122337171298869606024764194152572205e+02), SC_(6.53201592270476536860947401963790763923758464656367263306060046607497918271178641252338567185849747672002776634506076650648391589820323978592182449435073300185043423125573525602447945355905816656067022917255389590808978616355532501271604376496797233681175875074422547652589334792206541712331187984801333409296389423652916811105854094159227253078778899017652515577545872921594094374282044642163199705253838209075554053916667166971670921667204169860545673190811176573623732640765103804713524763978549642e+00)}, + {SC_(2.84763518720865249633789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(3.50594171696151285909745151539060148090670100756598276592118180115987704129717344737175536146838467429650509880933261757536214809892173281876006961922839017349368918016715871059899525030941759609599269441898890931160728866049789584876193014773218548509654645319159561127258379771324092719966908675957131318483541799312767747733138961436119057779331859641695772856381662725815794379091863942494612270061680368205577445870953007609987741104005991805804886967384188275707554716979388087267636532946282078e+02), SC_(5.85962934855018738649587312234013861000302129002387515656848684744945876545003674583879202077964721098762835565299861962310916008066036172236976819930438289116464091969366411037592261252848982404206750088667969180754458945474285474601066663817491557087065960821804732948417813401515198784400105833419751461696325694087766748324802786184900101367488656974546138080516802723177843393752642666700380479419135279302308967786036757719890914724222867842139605213115580195304952037597706912460432334234902066e+00)}, + {SC_(5.64682111144065856933593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(1.76519128540056304742831997519877820920857036914650901573270747956845477500889430697791487592196803258689553507495813881022776480777925700182036665576971280072328890974816214386062388950744611023401725987258039815422475168276086738701705000544747226989884474035058273612828243108186586517112777510088124111564539998697510264649032558567739799755678748844961531931104024399830344324164790517360715481533255431541118846660346844535860168147964486866047359898493337601385827325615954944742621429321977581e+02), SC_(5.17342924749847509395382677345036844101386697468349132677587382453025545597250597832024586312263039851038054560204026648849897213226041789143731646890157430242670947732858306884595312712256217331938275330011909939145523867716578226550295227412107943048043687400262298491544402458520241247144003660180386212975533604735504214749965015720884534279252951041120761999648196048357797420424505106730015081309075580772224806827744896280719587243764810430249896719753220866678503719199010381856204558124856374e+00)}, + {SC_(1.16216316819190979003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(8.54805948781229923149687641890635273041975417474905882859150516565590298743474220866223427847397219829369000787365484657820972691183108360605393331283145369982954735683172978957406283752717555211684709068397614268169647182606579192285035162851360588278393626951222557182654523459375034429014293356095258118240324502965413852124342360304922331374659768398497859177287801543512494826720289510820485846755824343228251545178145676407581591245429045649416349044250416913523846071033825128926490142637555209e+01), SC_(4.44828938969349535148810997617139307954227933026998994112515594555692200779333843464356653807921936992867624497189566489714896857491962316363828135293928928346656864064617647335878702422430142925101126291391714324130882393175364831612313548374438381832325779808261417954388871727651255253232705020856911750794487479982819966152311932156460627180969788906322678826909888730809759061812987798687444590362138599953149339329603462078768122099122835718866740346965377935783016681741937074820082041620821229e+00)}, + {SC_(2.57236361503601074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(3.83223951967113693849122890317251581426967564682796089915964456835265948178547033943047557579841168870426481105111239555909984888566219617456297725026211199966229821867396896637673047846203677720619527001090874122989539262164276823985235279052457210386157561812538654504918195664295917949283586772716395811634553989103419541323834554767430044867416405158430381076975887538013410973782203585237740277871442626129687031933867672020721719964459784999936157127453790515452253439903564787419239743591953735e+01), SC_(3.64603445628268180815228446194149337645492864618317199432418684416543018270226503511460400594569703029802101239399103310482691389005692181097074338257638671907992807691192922059620682440896513659224462009722394389581858799601911686718694851673895425167333370010580684144797968600958815062396012803331103402562839775473490687537808011575400396372112998895944651405677171661590755009935769417687641381092691734206386019166963834756183746889477962328743513839292774321043859834004242466174346299715639715e+00)}, + {SC_(5.60617148876190185546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(1.73130292072055181332528155290397626567590041507263494389423293518332512065213706248091156839903121576423171826799183870730052420390377795841699975327731506894205043429718237598549528618024309783147598930694013249097703503193128875785371460887670941110426110649033031522216424367225466117889459621951853207485923846568405880011044669040489333426682118087888525374235517821551139711223601978742628388427488194084278925710136997272334148684152483989197734051109512385005918855581117719442233374533422244e+01), SC_(2.85145935140559624069624461061073352033685732756820805957005838077186103003354080673737557189099925222021795696661665853518636804085091657285841456607737476426645592333146127781631727888953940992284927928306043552361916447918323282469427741999878319265371284600734940623454427339491501614225992065340251283593925141296480332996912477863604005197249766568111289688786686315245507596213806311552005867021049188904470043625006815633642348871266026153738589428518712450395800127807049373655934687568417331e+00)}, + {SC_(1.06835305690765380859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.87937594300137280222785178504237281981439562279757747352051112017636683902262772265882567787341933727313653229652916122291506572903276244906764087817565322262562231578119198439889397172690818865294208195973086367244330613132729788244977350056887782304089958939338325229445338626076593013444094664859749521861056733116710043733177675852597199662862200321171291806334222056142568553511466136167881100235172294895254202442503636358257078278759840849425123630124694068082847314610010282369584001586261853e+00), SC_(2.18373127784552189022885498465497378725174602502279874257568947818012110655570669710383812275007248898023855011570363491375778330408026208369307534619406033795714421333845585977938683598593439353594844370348254064282219915588151065915494297324923171198525509198152675095787497882326067723426000070832410772860559971251231892379783042570498001965458465779101525970184734775905368402518886395167646368847252388395330389342197997105657677203248240392695509386526846047757896615797092836470002490643633298e+00)}, + {SC_(2.40109324455261230468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.78368178711231748572573525384921992043324039087841552984182765916536616511007182819817947529256026069114281603423250421784805149083154700929567018507486497721146897268173695523381988008996518312445075106405346666217454765991551115606292938365849946881660425346595554991194890984373406939193890782449870111966141693907909130927359458596551510644771454460052235072482166749519660613764899466155251273563930908045243468567615852308986288038858920350451375815061357930111117157254756816152463843436327128e+00), SC_(1.33069755333858002682528355594543980693815080830370533083954040140260195653398211600745407909514068964724602269394591033304236792153229295793542951189322400050827513942267588200591266599249018149995398100320469707929205615364581942070307474177593988947465298790510611575030618715531455462387945757223905207989659084961839714183952763698696758176669305915307247150797661417783641740176782212774158911335502133645542871042818603699326206692704757081405565700275666335072274515905630940653959113015557377e+00)}, + {SC_(4.38671588897705078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.01934827098895240866291564717148470275669350790670181518067930385460960037293047713749104474976545378311550134726627432493246281473486566445456021631400427110536255673815460084692784908956829653495993998690913162566451452325878295142067599750666467140637626487570692754761019581563191008018345327025821296654609413196999811589162106157757140856559879383490075416647663882482288743311346454343684899228300598158351924220896203043721869605613557353107864698167995101951259722097491579350956902970931209e+00), SC_(7.02774821229955033201098872522145702309892877930122696222989524936496725944203147163698086529296544937631736479740341375762633221927065058166212697662139823190263516531129117388895917944769456807118372772711996458078531822620766199003175648806790195767357047125727581511679389676806235768985317112567081989787111582319607295781808387339568984936622732251106484870203126608862728541660239102098528893658125927049289362506476736744933084082880129995438327280953236300426644368771292926944860776376107631e-01)}, + {SC_(9.03765439987182617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.06560979056544150631486646775654894531497351725167706096010663906438214437064541280383121734941160110013742022603852718722974043716489921274151432075110987277321452784597219287693334742039128758201596461554834254278304725176897557872665236905185284924160764990132078376209152960730546416782338895816056903193589945923357184438008243261009964597638527688093732813264760840562843021362962398437652711368023143234727399617697596268517882044297733794559710970166806228215768323696486824556471166719059683e+00), SC_(6.35472086047240242476850173653964968094401254249645125812894399696989269072611985147350175386979540001317320432048487161687158377836798760540253238342535989944288732501843277339124525960211590046211344621131449288110335040489171975921179119993706307712533585084502959793358884082738581504049157966802149956240785900918636177358262658800443458403672205227617798438927337432399221706666884340845929646445623501901592486353757974256947960849040821025145345264978638085227457220184701989027155986122840831e-02)}, + {SC_(1.27602481842041015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.01414888950966447256741553037802701136914837769904660661341552878720993180981144638082955030623611082112991817736220467858881713541188940021200281798722356747839343824757865378792288085582653852666354963604237824428091058309940381345419447968927454656100213071087794811710211906454576989399445912084143541816722735712338070767965545035059458937634367561872704858664652199384243134873698614575689341524672508628895265595278960478185603597994851716518887234426980755563401446357574835173394489257258389e-01), SC_(-1.03789651277172193944086098338852746711453874554494751358201389145763256548191333008529778141620308270050982442005582738919672606157209775679357946534464297204946198894138476752722800806070647736840953123760641090828638676777046197081472678594658653029924350948826762779384389037531016067478554113108266601116041196944329962447909678357418268110606803095785064013479379529072212712584934963239795181858596438347804510477316820666489360204187718259096876068752105120502150744520502695973277633725886243e-01)}}}; +//#undef SC_ diff --git a/src/boost/libs/multiprecision/test/math/high_prec/gamma_1_2.ipp b/src/boost/libs/multiprecision/test/math/high_prec/gamma_1_2.ipp new file mode 100644 index 00000000..9b59f040 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/high_prec/gamma_1_2.ipp @@ -0,0 +1,47 @@ +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +static const boost::array<boost::array<typename table_type<T>::type, 3>, 42> gamma_1_2 = {{{SC_(1.00000143051147460937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99999174288391999092757871949960760944599692334161113632612001448234829888352099654097074654344285708898686038400924243326257000995473599459860412189476206535957778861551088462375468578938240500307167618043731787467573306745319965463132052615688418631316435531309275145303892395341676733095522386701856522207240447267708668301329563326443831046210450368179263405643106444973478994275343456845976754204700528622443064906871609264433329448562184863557194334628845647631027980086626707202034219860132039e-01), SC_(-8.25711948900924692597299306183832574130326734078524848537366321722804959189414089321374321487571322916700881394838168937675017756067526027059906924659380618507813551107141661082752510377407448366888067712646753094821383103251070103298799663269077425948810538745741157050557462080083874347930605957984000258314264095908394093097201357665227991167061298266665567091332898437498972810629979744483195488186797207794753595348181654435055140261537588799716884603608921499148980999953580901141143177940912987e-07)}, + {SC_(1.00000190734863281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99998899052088870556298015139749114669312651159953142848295392815303317500016029969635974482718991700497816055817263571292901954688370348906253549005287861083171410201406647883485474421222649893000205148346129113166971062186410799748091336730057656052509954292585979817626028277775407407112537788176094920236533009104994139384430523864665582176691381647483160502797293814016280767994802120063648051546796192887146643586658388925305855542153022171696856252158767172309183370455258068376853535216362470e-01), SC_(-1.10094851717304002712268894099127595921487972573933586334689334527229248323934919014638550108524145553527405840273344353639000207218741487766297554573091476469480049905558271838458052416000410785954618163762239772914309942293307957081996934083616872743593791436745000684254951241300456576383726667911197040993317728453157236842228209877681100498209542136619826560930165076125847234456840374995616717759747291279589613997037378064178672114262185168274084948288257929977168303768505416039428474173888808e-06)}, + {SC_(1.00000715255737304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99995871482439030123562974470516145713394424812766636877383802416011979320279049083203112581733456099995683282738209665836532102308697025612534875128891666457345958520964130243018916433692201391748875528601051438277602513487355536872792386028259758535373151611332556663150738220804194424251848920431250539383936484964316068698893034940814586752406503829065074575875145977149630424770495659102034695665964258237898580634499483188073724936730054003089085359012125236558137262535083336056587140852800456e-01), SC_(-4.12852608332195851691203735959218082583309360270436920767851544796916430110170536266576060329474456009336058048427569309546294249770163912414335808655484082224000396074276450271816190829739395101572464054265620776265007334847480163917450671956548131916218767194273440313568874946498741895154818277265159531908173961864655218297464043731661102093299016819229971909322404880656592327408588191219928932127624518196151869557514361114934732089059682453199895851884381325844177861206907545771018319777526395e-06)}, + {SC_(1.00001382827758789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99992018290683797846000226935056171185859936503128820835471750919976663152444739936675800355406606711512157240239127384452319098942674657017897817468120805836926848121657068423652761200611382709254842088377275403963217241357409925817025690122325186353402737193791739281574809393066322820848698863824029214072384456058169355314312772713088236719681578106869264305967664276510843791749709913005299240434221449190581606080546735845029507633743966156522363875224608869485434247381577247694136841387337506e-01), SC_(-7.98174117021345792583197715106148864099769997469814968659586924923411082051309399423820083379003398574828706106026847702771900443355053076333928564661934959347977543844422372354610528704694194514369673005031394800075820697954595056265037686466809758696282814462959586452027325510485481129596043614869818722579861830854885232173045580402917981131629803571485201158990471407846736365894690896340575434314344665619486163529114866521238533471912104264466874277993839991170047144881087379199096956344930374e-06)}, + {SC_(1.00001716613769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99990091727863163325242222177264151557699017886575216984231288977651535626638346381310234072695038675659981791249420691007156006802164340387989178169488325851634552002703894997675940814211199538881805758913622490627980631399097588920415763179341948229307099650348008989816592713813726915109074989891788978965796994913538811183413860908256492363372407238104866387595665466503765367010396538799223340678265221385147175632220501459281016668716802117533163355282958056372905167080533658897792045054410079e-01), SC_(-9.90832122408929040408559547336655735086172539547473819642814546268213452104179698046816192544343649213516276050992499286077179633065711247130052986266586612792198019407011580703718749973206816410430099598884696898621732263753199017370635170322352068229418089019905571698341346767171969043521773124763386169098538786284978144876183616053588253360709161373130687567240750392131068350600396793696828309634567406848106245558829741030294161625454805367042624975175240236006902139797188269658688359388850604e-06)}, + {SC_(1.00006008148193359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99965323597539602107075328547761587261019813359390369760751109252264732839906671037031518875134968012136696641174447037803904262082887969976109296285684390252157866836780186592932702237009167943025982890755934376143300721600433843080584322613515975251145176495194038059333781579482810573482380992838639055654464946705171224947543458455875016762570976299577906723146773198425090625559656009265422616400519050536628957500842705209930585910280037352659669895054043861427070231539351464283935980884908931e-01), SC_(-3.46770037007409655757667178857746223190711811787178225776104706289662004501688838200316229177747817138199803885280303413474034927454764780105040241282675413678168958627420206298519414644689489796825217807297340862467260672318740929958999360584422503219415448595860007050952381087378585257254009183598634422465183290108846220184440918709834134414756286915640039850168914802758353098152897222212865686814139570252607648258247174783738621351343846323154823824135361645528936757373238593936453258830559626e-05)}, + {SC_(1.00011682510375976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99932580217349322111022028953617401331744333751403970060804097152155125562795257245209990189244390955065622803586974115564775452579165277800679992202499294033532574731584142945934294435673450155960678373595954883991435191422966953073303251361033522456325375489064785213746192226948204738894305982149533115149748405385850564842587242123139516721576059297438931817529512643270863422808208534475683331512001048644854819051058927620674300198483640232556173168539289960682363209643255386743487137951435608e-01), SC_(-6.74220554663799556877310402772443112760157761571902023463311635516217433897770295691084680383277023834238210219871774978089885153707718168224025213708002539939323526485458159206065857983075309830686070983216968357999309570523171700990741684698946763301064392077432210536224126429808942160450023453639044757019826692163047432599057748754815292572362647469482812022241942671262055942485364235176211540596083535537009938706493439634976520904423708619194103147768525477352233702757523202626115873106021273e-05)}, + {SC_(1.00014877319335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99914147670522157119990095816051182525869285752191570299986635498915136588896493248365257759438213001482731183963093196649233881218040818957792374396660936598196305684819148527571896894670840843075654286835564773000594859074473690225403830688350354252139596396883469105131902182804954743787255215002586550458745855022390733700033552487189754708762505434494766042941772545691183075216127229908050031032252997777058211897547918467712668931901682746348165792889219319764070713850889628242784768424868130e-01), SC_(-8.58560150000232182840017338970199207015444462387386607649752923794156356753324749863484023674482826368894211048585691962413851546114269579480065761062341760434702534740992077291531596054368583871596159082563812571726762650773153069310637429285445540476388286200085615639301380104059851185751956992083481298692217441089203287067778907940777696367340030092049574459913524572177529000648022805010658269187678613395820117311947653348295570171839424515238720298923295035866057993641637438770886487510361427e-05)}, + {SC_(1.00039815902709960937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99770333110831492808746107899166135280142203963707103455559351498353730379622819894763111240763432539056047936359580766442659319921652358936987966214938950939435663301222127947502411131332209082447717639899925306161185533504539560696196046757852273728024849898337683541947420067193081937907625447769106391972105734465495304033409391663299515305873457058683377675271966433428080840182451133769485259668772279477913835172938605800816170644204743795319739336290349933820409636830617776722200662226423410e-01), SC_(-2.29693266647263659905267506634368150483626461773464138564883162577609178712280408452312056570476352591647966867985753773286072034838577415545063255615155600715276129983764450847384254995243544335451212874166249277514712689608517250431900213708104149683916395785770433269863454207362975420101202621074988088246180747303492773111501326915687144736749558273211568644678725198708337441028102186739131006289732732451411357227579446820937346539059417079097069904499656657749370706773592719032343614925133271e-04)}, + {SC_(1.00063848495483398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99631859447795538102193086350466626797653070729794205440800520055636280763885061673862015030796869853893789243475736071832934110880676018608126876844999256516872278028164486551902037327521458584687257382213309438429801326762332746780555937892390377489762791671064874927604230957617846733925263989858598196284959978561705689127705026814246454264077811405090206416845460825762177518652427086599576814868159221508338773364149774888148314871107526895227752545125757315695610947566263171638714842858738272e-01), SC_(-3.68208332573195956331210081624594239749394416803950908768685933543093626633451555793231113756331335425963182990684777112954271367958172970283738601921956301734980965046021109384234366447704543598220974149455699644080458292345192792596261425685403086325921370880394538207189224801004010561669507034655239854624541613368723129243328830529900319847443342058489559670277958326928917863667680577628031005468470452675568722782294683578292536699572826364160501920571986429433940804663506127245264105983664301e-04)}, + {SC_(1.00107145309448242187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.99382674822601667403239575382618951458893199251301947146215993352196283762341237298698231312941265613694903447679790369281559605314211409159830913156190622044924254885952656386521417492543976139615818498174187287133742132249380106828717540300112779917059538337849851096305151233791188029858916028445980753589436609863762082166374840070247490176396648225666182221677814131865874707658977935654371728304366144253753158711600380365080650129423678311958337349802342329016782920332415801360758065052764693e-01), SC_(-6.17515801040877325131151232919778004462797029509263756439665376295049986314719517615619416044020139941656219729463770419342221308377598718445537314327839397064675755119235423378203363475348607407689849591829201234719170773126477412940229835868424119423489707620954508876185462076594438172323119672045609009061662915362180538360149343723949200326445809001654182581777638480231628275052706847821672195497723988024572921599072175197242142212195116944762930191378376328084045634116582617540525060723552551e-04)}, + {SC_(1.00302171707153320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.98264823461931536749416512755660281120989924865707625229833257960645264035500100250336898184907448998921042036230368188091708046504522273427794078979113111960829807534456665305177251159579747032678402428834297225115471239166750815621846487365110340243197886307308000837905364975250652215207125797086578339200177075082274308974522430592585814094736901318362632618659922741288815306432900856791717414156527945120488582581537806945315376665198216838443054961618230007143995001406730984367520071959292714e-01), SC_(-1.73668370059196286526539979196054130140895376467504060472269120641199689896392717833308713991174930707390895685228964418616313569936348016118980224344687827465558226448493405115419933128303920683280943663247672453726972961437611838482173177548854889388730797437720783444466661451141517724151590371105457213113919681710114442333257409145438562709571297072489258507270738823389529512161726965101165499837215710030502282466952003769887407843034316530688055949633407900696533642354006548208448645662316917e-03)}, + {SC_(1.00499391555786132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.97141987555054340304313176463811884706264975589409907711234106560058609393271957307055082872891129410102083699500728283618347812653629468281551207846668700643470399586576624117253612700605418076832930868289087002572928070786756405137053359765443944765968271908912062956518242691227870162853819197340367908118996679846253679049356114011183750259927716203480089987629318935061831663652778532993830636783378403442682358220843386678860533265544542528384278621171051277427390347574579492853577100128619407e-01), SC_(-2.86210436087086001219787203735569562421372152373863548640068045829675888249714024869717239721994061219165785957749026372538378678509251738859065487118286167323424304865392614274250231752411862994497835172325480685039413276552426722185380374001250774890081771218253381634489468447683838615323458562556132390816770034833055105238636360789783990787873918822664133911201583322251908688863597569845687382260426660773087641598696053109034352095877056488917071635782120160167491767030736813586543030924751972e-03)}, + {SC_(1.00928401947021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.94725649294890404479691100544964299212951704478613530903971822806017329877156708018465369324189948798034254635780503202894085998084733850371417658768318005687261606936611555053869547658745148804444802910439708812910773154353420286199364712053375318222724588767021914345493933709903167527793547413249855259854089366858866896664154070656991436736886582807429735741274943744190439486793177574882112810679231693943021915551996830675255244876341153517755183653646041518858296397522796201891082052630011680e-01), SC_(-5.28830919574000394857298213309555217277552558169501942679144421480630307191430194474561267421233056506945756642955882873960771251210761377932729055199230933294031635221988391115425824318672303823777879654381369427266345995275947337336618588685415927144581932003652590401257458835032565848265828024191566846037511249492915676767412627621261275712261144003161259984311425096376028822716363239133708904326402490271273591177695515131973061269294472455115171077929366425109455097808718265759636660823511773e-03)}, + {SC_(1.02416992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.86614048062602117123406311118908657526377765145590897833523630975503363209176138538389943023236553603567032030295329814866052858161398959719488439602760043127493599629647790910368650401083097710387444443112945732297448026376057799816375936299971289892260452026548899140129220485002888583419955984239574912694509374491745016651528016606029396150839935179771239942510295480902170767514068781705260053508993213902538634255145495226403542335065511017877104815179205392647102946016289317357707173178319778e-01), SC_(-1.34763514204995372109520288412048333775377813106008243000148150918296004262962726414132914028794577353429614250975299694173700835973336120904901398475019010957711015087496744076484212085372674226997687893794106127390983166014459284671204531469581065659308636723155764096816681418792159648003075197102825097837643825841085478699904544782275291790410274144152650577672862729352423481593131480537858719681819399045310180592496365519546516973520373011933766484977458014591739445077700073769103597250567667e-02)}, + {SC_(1.06227731704711914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.67683284737636217813685234156898327768051602711302285901829303009936564635927633847791905521633600182260778451883080067109265151115529992925211612926715722203426431025001128565716170432011945340670439807499803976561841973814640123513684707855300283766826345586152363103902831064307590922557520983011890727883861293257299222429489009382052966333548186633019471937742818976913809802674997409468133243009640443196713199007760299064535991343883139271256226294904557987948005599961383926203112142304751891e-01), SC_(-3.28504304307040642219585079239267415655387519327605107558648615710409468862569859227455978653146395616102834823083140570843368962391564290326611187884817002376245922067354288141538130729190429210727139841839276253448391616940778575204647813069308428390814330462539441519296405032309130029624726521666062066510420118474939973861641972779471516623719555431865569868101377367606319715633947259100590108593611531959008242872074641637498065015954588974509068119809908143583335322131919999217251753951186048e-02)}, + {SC_(1.12234401702880859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.42719540443721868609002739661970901317374072285768379447466866954674796223379001999201565264677947553367307391082852503202607769289913522567688887058955685132616165787742839855998640874824219137049123198709821760747886535404924436193564823937315970827009692703009325365564932429177420389197235892443670127598813072041078050012898789236697316107241881629714345634175264626532960435557492555881063944965513891366901261370042103809394595612230568364837051250994297966981292812529454999511053648268266764e-01), SC_(-5.89864526271249351144556212579822618917436335049065095559579674127451726947716815647990915471041353567929075619948343725717548053442557223884779131419367919157584133387553223567375506176942960614314964694763936598785587324632686320182733715386907383114749720665798633555874573366724394801004742262541189978425319883592782254726978670759080718710838718774274176068877873338044184550009341943947599806101348846632287258040041525848381664958987160401558865553412301389282414760154376012162803848258086080e-02)}, + {SC_(1.24955749511718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.06493816701717652070796129681189279368155581078682075820670134311300664131805878872586560909347774849547077856785642913530318887990663829885598997306430503539463747760384445798729628986584285556511189918203631381512642237968267976800749340764140551780790213440489556072013302545763169764814551474864925015186841329299201026352946069132722200522135595378262960918915145172163243476478068099324456198209609874843860356636542021486098870105783313973496928190246231924822313645766881423162228482926452743e-01), SC_(-9.81710698786497220376429335539270291577202696321668505055577023289661137227566055993679749549766918458699591847594920910105255828822634290141131935936546209147240316032812525952523382179180640249028818445846744545617651819215028796677831516376847157547306218459444490819966549093798582410582121073841724280247709105859157726125972512495037490263556773941212263105105345816502885995240534301400324958919560073963596185728670816181963867297997989630900958703732881856633201726987832993395543288655355655e-02)}, + {SC_(1.49122190475463867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.85975092788991742528041047924561577192733154188411771443460511494016648390575001890695683272836236515321056943442804539359597265274910084710921603660396269156598507728775879061867953195401830327778287272821941688982147004473011352892866957493463356307424660232522691594801771101120466915823926551028340522696126815833575982012695964065305355745762363170848885276046624884963565926602220756773747996380869706730672003309814235399043910590132770511920234964269726502103389367669862235505150898557966263e-01), SC_(-1.21066440748512404475024426968054339220139475801816468185017851452260119203818813132939295220966959576860336864073002283446059920152906043012149024456589573987061299654713751597706989918988719559690035557918832819457973675159107009641096292984585286590294204090882255710857113184702854471283701290417226824298947728969222795981705252849942735333352549341821313583386938754136637061655567217513693143381971281132686015952311886746414259153818520215140430872206179626007079632596580406780773162650910071e-01)}, + {SC_(1.98384714126586914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.93277940863746060094197659735027757230706286917741917762496289768909973927152319136925826790987137836060306879047113080832050742214997883337058606749529722735374603438145977294427160833784267011312076909076550541477208463886596934763667375400780519791449104728834334555489059974684968690493160617288828111978728838786866301310864555490911074901146366512699766804528603943358823947495513863982273895087758009700096077066283343694119497087163296220588369077116759749556165607389286281631813045097817428e-01), SC_(-6.74475393680727792069762024270330812537700489703053013284255062343350182439674474578730149516053038676811013704009948324320350047574120923780989626605300836004879573275984536698779115493092794651554687907372115587742289911340235342079018983733618420038276859524379547071361323963477361912857826074181438032171394433343549277630241247535256024056315554535944762558500606719649195939605908602554320144187923405070267451743300647279690038646110638038235596246122379284569329673191480466839566772904937236e-03)}, + {SC_(2.00000095367431640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000040319893632897083396218235250442687645120641744558071205705190318147242371991332042156751805833852697631957330509506196708584945266641045457660989815172203541816266426236940069173585211589763128871697578680808418618594108833421417980995744773022193915847912330485683365230207586357094671604272787550530903600224806658987408719323099820976084511227529072261830260642708557524072773978716369615012122132057589880483944058104433222796365791263393617076632690550955298233611068528870707089364095396e+00), SC_(4.03198855044301554816172072614225033788691505795611432584438613689610292824028384688095043674471559124897800612350231064864096087718457160639337450525089464591496773979407785076356708014174129536539640532615095723967138046302232419186403372347709059543748470408896810291291180015648613156670374402027509167511951650054983758492567575324143010258003034809361205157135224850913835714293416750775594448006015222943082316111780423579293934013166760093499975251633169677773646504254854198727344120013504365e-07)}, + {SC_(2.00000190734863281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000080639862179156320749294205460277721263993072638189466465607403289991143399112081618390192080963070354362886119327646176199516603660937826302901159928779494258019082124712407057933583908441496121322063683259318008058781175829274964725273678817450354460034581300882836023853249853243649983467946063352515390711748246817082161654458328562433974332388415775058145731044093471875681157457108697886142238279184839101146584613813640533770816777389788965810315717293167650115988276824457403595566759389e+00), SC_(8.06398296652369388346753570212806293434617232720966725801587802276808064585926804588184187043135604602686396171466242066554348032404711308797270594130241494161534533864038783147874657175104558077883552634080070849598914179245766012967264457383839298001666035383180768607693646745391307544328709128695266429891189065277448225084990453870685304089249021637700855765025758836941010684469612390178013299005220982859478280091515998345131481699299506763765052696832472588629108234998520472751599705762862356e-07)}, + {SC_(2.00000667572021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000282240828612370720432797341957422445599590783120191598452050016192718431252156475433521025107815241299689727688190713762804692078252171442580070457989886811171740362147708150897847246521021353648087384510766114323922511042794780794963611368596831842470145084109206592297151053427050373627219979831633894688588291555439270912595000568295516884494034186513041322990336045552200687704404122041643387206167556427413751475495475766262400293533115355573835729416036577460770575506761724680166442542205e+00), SC_(2.82240430313693482259741002317161344692584090816350421570061439040390205793534184180679012494641343828056263558002807243971560338327014657463162594242259880851334402250020991610342925766542062329630756367550321323211687945637272726042075205149190416983911272664024992320980212857811481896974987286244636574782770763547904245074167747630014211411345847779432353677900379896876560812240587252030790328354166673314806061716097732347525218908223708776924400221206951936181129323023407095316462578683205523e-06)}, + {SC_(2.00001335144042968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000564485327991968668594609717588743187620334387669560320925683608138323706505379186671848228233776630265493443006782405469373155950681711638198173774648872464328767774535861493087995322216857536320454566762040450313550698727293463258463329821616727965930447601219959984721044168618580561296210950745646574464740623985999575897298077649444083254875738139464502197343599936704712558359823411346914202036213419554769879303409746624911821501582952260886957328885985322110392828234082593263639947413253e+00), SC_(5.64483734779536708386785894934199777725964876845433467264447717112994234556972534192218656188108493669337126323346525968019986211081211701648787471584545174938623855070199540574827647819065018548603418529971801560701167562341186495748315805711171811817613909853725214174720409287402657526024192981129576773427177060556261477821785713896316233730786535929598718603282821984633658641971448620591249698834069603542821378964494629888597814475264502798958300823972230397309547512496385402948011659018612308e-06)}, + {SC_(2.00001716613769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000725769547171200167564651655781339501747509170098598324110434935716090095444696937906607363088739878177923814143661505313658313437339243393242291780132442290199415466622168654728458608339173247740576549746614640956566066866430011407322576072587095409588704181386960856222173704985729295910394663867051373449414642750484101682727247737150988891422843497594286426018641870789465070238089390338211030500873713792516468514692736358005370399134292567498197113950550095013629986729155685259947938135536e+00), SC_(7.25766913476765189195943994441059059063931591396766321180095950635741905767289274108973144158196620893048522962182368196336453133307209215602635345230143943859407773807168277575281927389367146545537872394784276831689726825577222687305283368915549011001823219543451522711095115473870948208010149514574062931974517483036146556187182145659391171551431216570623340783643192270760300569668149898941633206468627648411118821538870638769588745778143031469232973340074226512043471253590740081694584319298530296e-06)}, + {SC_(2.00006008148193359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00002540299606354791065346284198395071392875295770431323580196614759982793856324349365396015329614421966458647642567726829113804005273586077478149065754298525775201160607751664030681223021989523182566039331380106760457489528499350049417578075515249135149538682436349952364131677792289256760214855379993211811298605656429676833893492196246177835739676095563228276086226377489403591966271602430351591781580342925613408409569377283919944732510580834336822851093251943664838933995360754027866586976925851e+00), SC_(2.54026734129075920683292497513548989135470818393407385853298137294395173713099726839012404342665592243399085416582332060628801690208097983739002406025934607527022791719818585971188300777024910785735796519500643466487320162076429378768121348997496169212590642570240123161578934167744566979249172495862343250947755453958462282871032707952094614466497359897253881671158104674131343402296124478766617373684005972841762744006880609634714505140811507944847363892081962397928329908133631675224301028449247209e-05)}, + {SC_(2.00011634826660156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00004919579971274987085172264051528477688620257556098733179199797634993006055608473993509011423580085655400431431748032522949606654990020016568322885459038549486931421278268572942503971061688380325649937281598614721987287749832098883394446271542552887155227649358981358083752285904573279825696370210973258395291081843521899210367510309139360759318429085870041933795710719739751402675370645882893834096485696907489845929951714564265042472412399767903286958066978690375487334358793398429830456561541246e+00), SC_(4.91945896390820475195370970645602094808037804377590418877034537519903014145963070050094790711325337883992554088808760086026030902259009588513453547405813184039270067427528313371078524967343062809805890477343634441228005677940570227333130604677886144106807165848097649545352137718974323948752964644308680893166137837610910555163484988859334163045674658729040392892717423042002979632823737182738830808717162341432139261825185824243512121766256143995598535133134723195587750262495436621336439795174387835e-05)}, + {SC_(2.00014877319335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00006290809135631836010117832694910884162897852465378752121504232411219503893527713522395467812648391482447399141309991293749270126109922804569579351974393592882118993134665992128136689581102395919839579729236175109716400885285467347857304588838104602389799424028052742153471950528851108394765447248467693160600801279958904164762839085292385657809249863560539720701829052485256749042278246123879349245502162062142354267095491755531429549626456789964981518584088969769936886585070722733145919395422821e+00), SC_(6.29061127253201440487758474836373805783136286628744476010931129298030354555338078339617930326707541807536724443762505067268693291418747671368044733699672217831004599282343529717810773460926922006823045900978640697730593796486796292597553994448182322203424673613673826679553245785071474823905571747970217285633939851724732886368648977212490174113663820136503886232944614523399811332727124466745548877384069974675038479667681516039717424797860050660126927295087191793263665124491531011381265079322510497e-05)}, + {SC_(2.00039863586425781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00016860244976056265274104250042339264795490885298408767683185991260848173515982048063530097499917171148194931029349352640670782785724424106239359449491337847227802622585196405678868931956700176591838250468804948749651418462210706999940223229935053155558688743886448270973803464416218977188135288871521807292536522613240793899596571718868959233786678163988748880988951672966050324443415049581691737548496916730217092347107982502603129665491416261845625192330758149843287258281523770384959803934715742e+00), SC_(1.68588237964936617725573866192084801300187025488573449723958905292528558677560307939136401071488780012664616755906250008647359831845341046315862971508236868311850624153598433932470170707220423511352555441028287147256686322654153696151693628355062766009121440388562309459578300783864351215367098079641124426125653492611009828966768679542829405019789539978282261729619815161598550862768014752088779305148355628992689441225448919902699678811993936710593983239834116001627961033784077675665187451904779153e-04)}, + {SC_(2.00063800811767578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00026990750041852421765366910628431973474865306478493810159708621323870871973118744454114814939325483626647062327232431721609165735997428833979053416183622439983621245874940645789317173396881439394408015656296494647112371565895925809887772690783846745411149877139730876519000006744104903586271269698152110744658555649922874109964207178521955852588404483178141111968812445948355284551749269795546643581115097967186393797452722030686805063649653415569480391265099835897962993260240130068971271304727487e+00), SC_(2.69871081942065723897833099470995487800158997999008998347813401241773943654131765184972285158614214641749498196406392645505184508075530625363890023930226819460655785021303840797155528371522530911358371088155260193772440453024087940353600470087063993834537412713544819005646799581180031366714889866852653659503836096784982086654775806436187485934147132190078275537650223336741258760920441829149880313735373118931133566363904035798043218143706480154098407247747391184674434380504850962356703140842776482e-04)}, + {SC_(2.00107192993164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00045366850244676328437925811291073214721976041570836260525501664695528715250408575145931378349350227688837316676868254719113597414318217870885844613229100808084497215923555968306851384139377823756137707740468543389970979577970623128733809962698992633941000918916641725087330663136277097326315490132382010503633074057199260098276330149620295467434128041592429716319985644497132929559777710003514847010029779221896564946779046395621309674719671941599041158491221996485551059405243097093577110261783446e+00), SC_(4.53565626005065278926467940737642886605249081041802313480807335050258790272115953359716522668419818080599307266053631904431521057302273515725629853746800638510488383571198722159231860540917028344994514956013946808052183595119710018510329469789737703176433796292351366450813161229871010564403903786056927568689158871830933860651600507487702193264045530383700007441066684051740039536729108634765214756819077820262508689114004651424406631533658945395417870161936749479421943272531385382088836918042945083e-04)}, + {SC_(2.00302124023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00128109453382675805173992936811235013623574400347864620287586318438309294296665771775467445713658191501098042317502832687005143325478326763307131985706554101553485442510186534211913551363194311510651662998641180078528045675828899947117843797072061127185592558360128674206812796658575963285754372198258684165702376177309610909388042634428491075001412861942564107042409560615729123629146679339990196142809886924437774615022430018387187232103447017447004392918496134872896723476265006537164632595098140e+00), SC_(1.28027463239724483573557591805281156031783786455407331932724556092523281693077215723336812242738030575971419315597244134798471470509239217931886729204522846233287533744777134652447761428596469288172600899533917013300359587696649805109934740082670700437170661671201465552822434017620867488841178011239797068554314139917114166483646378072990776989847016014395621598620280894638628718729791912651882959514839837935385891368255358441348171707916587078365790333842092452342852422428006539026507499595286123e-03)}, + {SC_(2.00499343872070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00212142687656938141755270267953218765354768440933747494815728726712151222070491619095448970333895393102444381708475627275738580419453523195048052196379247915358684398503757315017141406139047336197575310525733968756298578987992499076885165365084990221306522699178292450185978338864665272953117267614937180452725496381985816195572219564378217691076292404788320272952577105820443381455242824711291502490670740124425205103598528630778954594116895950873773335330424825150256890064566932046528756803850377e+00), SC_(2.11917982797806522188180583003778103974751450356379656023292543359724208118117325946572388778921904109959311356271811647949638546545148491244584564070484155125952798837608461639766227062066344856863585936876232794773824375120613111140413086769458486596098060127417623954442102532030333552359584958516332878683424121585275505850970921650425493840174528373209639623509936585019571702003296293023302489480387225826279840718692043287032926120545307827287470013099533025763093667172429225118318113870786208e-03)}, + {SC_(2.00928401947021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00396070159046626935511242705234690901218236095282169771624882103505993499719962388966570231900481119384425168785810482517055802032380367843668498408199062053383972024792891639768193707683013646734312421126399867391625714088146455431741320398132294311867702699910710257806208656164296257925674148222338444701332204049088886668733363978488089027829282411338212114532892893682282276507146315808397645071291768383839937827086383616329198213608310939839268318908099732004589321018099591371493619747249631e+00), SC_(3.95287866131048848362949332955482809813076597121930182265468445712788358294143596058339399774748227605315495370143056461809371109597058293347314059761260952541527829461615326949940335043617147241318395774085607956500413456369858807011840974780701301554326183297359957043339930077882451930283804249507686065739672454172144114535956579235090987261573105806998672929894099870037590014574603650514557889886665766715585784345883317933151789624097968432728774013964196082834709374955951419821387012151249400e-03)}, + {SC_(2.02416992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.01046043252505270540348864139253462361405144648089692783487100389214760953674167508997700463439388241380949691579319056966872356933278042871661474710292440940425675059725890695043859580872646359743050035128388851244819200943544005620842213202597157253369936431918277145821339842153005800963054574069458416961754561181466561153641602286677082930975916212869637489229264881405874178948279261212245261827886389949246815690926156066278390139052729949218614616691327310111196212366658537263564003698316686e+00), SC_(1.04061007614633015888506552864890187300424291776713882118559537231037896435738358627458345297202553217351350725032661791909644351751312758522401030616953479527240248501544067448116919217029247318494741938200819289498451100715539693480677760858450468487286554749460935161181430847180062573510341370004226635188701720062386639582275639420676796347377428587899902624464686139266483219004395187251433297865892676882328269889806653848707748007936999905330214536016979834048012739320965030439429057045382243e-02)}, + {SC_(2.06227684020996093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.02794777691629049193504390235516903904685488713247685582519603512105260522463735818554622361453962807292107231999993865443863636016422482468073136921333975898098163990514820931936483699455271677262446764306240533746033838338608816064501896947661274923124993994172638131485369377970739578593544353021087099305294127230319375266951896578913720592622847270176439826888386290790930789539393963150979413129440604185373077854075465693083153485136923946684182484672155068069363826098702103238635420489190320e+00), SC_(2.75643650774888061670685649048190767794082581488473953554589507676339470495854150371718710075080407758280379482617006492575884521367017539656756513515621826253686899723946040513136318257344014516389163303047441444416452076515352022257721695414093144578314213761291012013465662826539298879963192579050341577937021219782512691210616431141692894047421455586943199613536641000412200192791271919535732465144076608722082755046949411524847483821817449723308031951964499163351930528842227963221257503313906453e-02)}, + {SC_(2.12234401702880859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.05805563595315918870620421524696928104121094020123122438591403908241219015868614428499827547272175158643580386943048386142399843901618528166730694455229164550039869186159172224183094834887338162067894198894809433633712767764687117266852119387945316827334128187517324798364147479381468438290770208748715873468048281517169879643662462978121501305190754179038096804244270749490304891307019935778794914003748853181431342998479066888373904416656160676722262062683000801879454155276475143345792496648973201e+00), SC_(5.64329180205833189457202528539405980451202615961305194101203405759309850646470129298871261850384869366086721140086742612879750402334731484485411214841852903126716872739314918112243534983931682696927881636448720345394093622904476579243712320772347374338360965150249665935072437073635189766843122322561564241771470220052390739248148539657800012921462649571509627481171784835330155295559197243566391110694212531989990104509951797406602267883991910533467933935868541283958081404580151382316102798202818663e-02)}, + {SC_(2.15761280059814453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.07723244020951674736879024409015567278674737427280181790958191485280131080304291237276361807466338094341891840492656978367711727637106416679804070829852978008261215431888758036898775633940482292123134601737585845696200859486998264872046143555878009818620345847733547045237356831681855942609725505498410349738410778577001739079204840229118046714852909334644202624686546361760524439047857738766396297664386891608925813105226195741601654256704110771917895237804372499638318366040599062738662549672075233e+00), SC_(7.43951968096078567450169038225671190608692238403345259369787919244023060889967195591743644105668461468324843850667686453041016494846928923754334711387649093526562013857192333261291836182288952913133602463831698851059598556266445835039363674561701274012167017363825904055449988055678519606988903967580415182626339877700624724471311093486364881415001248271337139615419880940596287705173710534987910042007765327377593821618312773836917297573770845920102032310648380234431643136775836112724418122395944148e-02)}, + {SC_(2.24955749511718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.13271614293701721566359811181216844599514203933890310472153469801157718942898125040824868865093076523138824085647633489733751440515813372334536113721345367989120827892830875626989392162079427686322414937731343959752581459822783558484176886389947866708191972913902481439656435178795000816666303153729497641630043980861878770826826639629131704289181832948488360798051269765157501482440590629153105228466160831086484632057682895937375064959461519416204280008586813626946447886299889658545193561852005221e+00), SC_(1.24618414855135508767735862376307617769086138922393052111180412177914174153912067255243690888418634491489827308484772844885839836965633854624454396599801250844003229947321063187141240211496575790700669319652484948080298117038544086335592701606904389673878974576502676541776966818151447737115996064285788233106715666059725339111146196422616638378704568975707438135210898185649605602870819709122240260077954056652903506653003017718439923455933787418857732758136503190158208436673133318059105277181156412e-01)}, + {SC_(2.49122142791748046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.32118502516972019933515927336103098702121708295751105812488772605156911772365536897112612268098693177769841152502858397420026350114877465933729535497144281541135352932345376700618048099509451546579901663817269885709441847417283354768740949858195062449544534092668839707066796039624277249009376670869597887289998728613927141880549915613031747586675073174707758681855414360545031137199348021318900766417674431763100410455529404359261909164635053011626589643775277596465694320978005200845792741119134923e+00), SC_(2.78529080205747320956767680429427836727030590567393648909624132802498276501643152789574992070355469843620486053404278844738924735963376178005736900575827387449444173046088740850247064273970170875025909159212947254188496477090539228691270466260135938060766950587422809929080227478886503787218528163783429861153888831422036541043806448191088131552215464050108120064521772377215109248113444727286949161594653754349157193957064235785340374457082073732189833403792835120283596916983131946632783704229344885e-01)}, + {SC_(2.98384761810302734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.97051246451251004874297221651138180345200782932645719112022459091787403373578707385755420465767533219748291242620211816297976513805852385613057268665258624866786329786770605380611756547438670824706673187364215059858745216541250405466404493859927324923837716320256664591098922123313952256060988714854976076730317786737382453301647556986241140930376187251202917157565110807687607281314119017889615728891326998507934487463676042713528408643485678529499707961566325046935529271977875583020481735625488347e+00), SC_(6.78293643191154116848661827621536468687319156088981302335984034354394098918670578514850294622645014725444282962568987918377119334481020922962448682614893199281184250591877900628340274535241952010329002672245246619180248418868815716112830856589649442068135409054374901175591316255625024021080534714749685122924217144697864262275559713954426478414234946523413370091910838172379349297462696560662622315457938241067416843354716162216438293199111251634403925999902117392283474387998693379008921611473955473e-01)}, + {SC_(3.15761280059814453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.32425050221562870893368319780797394502817705273594528358155653513258895338852991948442481762704658601512028960856664174705178007652730881053103452425905994757107112196568675848578038090243587386920465763852835375409931606980737782869414814138253290988781796906638316383011766510477539256606138027072161714425587703780135013131440824352265816084541543950839110895486794382401092016139119485089882925184402328205831095706309275623235851502520342823708778821762663111690734745040834591026561416904111976e+00), SC_(8.43397622430231011639234819630572061422916186592913090140786438989872494587211928954110495101933895495925703033051008272776118939841084357793355479541145156028164488321529335753503026225753481617089830803055726056893347536445132561599214506486246671154145383768011338983825577386537992051530467922693326426358214921270214143368096532528712261953843791787651479311894578525584043960413997661258765749538291326432123667367635267757124285917821294505087615185252902658005357658301585065221283038946577912e-01)}}}; +//#undef SC_ diff --git a/src/boost/libs/multiprecision/test/math/high_prec/gamma_neg.ipp b/src/boost/libs/multiprecision/test/math/high_prec/gamma_neg.ipp new file mode 100644 index 00000000..ca2a0ae2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/high_prec/gamma_neg.ipp @@ -0,0 +1,42 @@ +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +static const boost::array<boost::array<typename table_type<T>::type, 3>, 37> gamma_neg = {{{SC_(-1.99999923706054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.38759967029644469616560016595808625878165115132471799422204595092834392971724800295938555800538579100535589193822651301525500332693249993444773179507605929981356967101597471714913951503842754010685235605590797063810809157738833492835143542871035345598564520502417261905785944669205716043072390494373490322257034881967960644010974493437512042261352756680026670684484992045553462469360277775982744564680091587106757967345008672070319207656022615608926133979854875552214891487061214012912806431933345947e-14), SC_(-3.05520913463708585014455473559668296916495608452525817143535406097314334283489713736687704477991497991743275712369308074041840740834063476031830765479882984731724892451179592298597321676916458283977757781247413334326383052593649852562076019260959425621178055912343813003433354826966649421695320908213626776555336215272482327946648668250227228003910957432402159538084527454011770143934418513330640797665570919946502860682207966694798401992754387345165102379010439953671041677549784758078058910327404016e+01)}, + {SC_(-1.99999847412109375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.69386191462138420561447561038626224725117398415048907272463757295904788742894427112020961644079599036497975583044564125160703746233180407160915929733564532906838635276687410781434210968261046929963453818364947812836593421630201317463294954608503146564867836821695405794382366118304227852763276692341615826262038036617817133464411475558985554970017557556048465581312483241407482874644374899521475569917118996299966475968950890235428728201297431223495619259559376314387803604742172470399752300894010086e-14), SC_(-3.12452154818785908505194845842029487392648620731103347207456198557211206269365761877112968634636619292832400844203780475198066901590319174974134489763347121929467737468999532787760555110439805900327811331337512388862249634034030061740800094556846919604832510099987981577497784616554033244322463034054231121064946938163159446958559684540678853656682058592193991149452718861454400627271395975031543423753488544502623725092389101829686729006797143129176563509552320320921307398500613227697762154498835511e+01)}, + {SC_(-1.99999389648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.73558608044741627613413161420894656660058244124013446415180740530561515977792519827786858298784888263741224694297801215204067458618582387642758104711087267937066115855571693609659647797364715279501851796768712301165273782031584039675949865273825182234792801200308929645339256017900697087444360181691659499183064954028133244891427139092630423281589186925295403769367835997750592932795632852612041064703694287432540499377174363368787259684826128422805916075141721701587432972834880653382078107215883569e-15), SC_(-3.26313715687234132229989418098489729669001773722991796067366352789851953766781785355780461541281354995935763718291948133987534108182481755843147601008349939129025054962326064655846767144347454369030917012611615739585725945726636841524124521503115786360787497866575048827515382394272660988449740261822693490509884264357425735902873622582534393835987530480698916877954377750564674591032227255165999311213894591898118964168841058394282558238633558154941771511534821685892908044060408931199226908086343943e+01)}, + {SC_(-1.99998855590820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.59289216564568867632702480652600850125829511549703922062266320158421424945544656850160568897182121831684617893475524325850864891292297653913606807975675975259957804287451864251597624292500430910033064835076068306145275196971245113751174694351289752436653598202952240666859873317646170787625375676127677093291213853982061950730506074442529379206213215500763520379868910898060124741913721352876983505985493576120693388339647532467182999015385778276273816304969530871418809352985232191692793886546790925e-15), SC_(-3.32598188995743285208683140963089026685291890297515664542182571526269358171760131460685426882247943951266520599997842598239034632786604956930951026409905645612178203533000816237119225706763979794277386461267856071615237308870990401079821797917297401362178969714385727645391303737983992056296555425202777558250602185647615246086261095852465123851993283123459088339560080939847486920372910054110601643702914129947575674545524987272553810415588957364532956825624756792802124871830851169286718730345076044e+01)}, + {SC_(-1.99998550415039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(2.83675532880791262845798274405227695235033818177720368767405099886788298502720505506737073601491437069052878767318115279839599543294975971086469127221299768974331834475248890837021523371368669625126416159480047062370540379650501227130334801934061779388454285066925574880229903013006356948564197074783512804183686582041834740914665869149472027830410017522882553274815242510011488283003509522030509719207159703981174448399923693748764711596103978889294945567655009609890761231551879773894045537823223462e-15), SC_(-3.34961154857329925541635513497050400332662351138593933473844965073376184380974825540094827220199831836256601695304595681236351737563191092937057976123211083578736440989629133694878674815811112503347936133530329173329879480671346713361169216781015612727459739168481942328351139199093627019073630639474288952641525920120137291224330266952104831972482144790213202830122960682344010877454347229224834877045631606844170259520138732358563629137082590241957714093961736983665819824994290029280116463796880875e+01)}, + {SC_(-1.99996032714843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.03729552375196358164740823460318662026973060198107914419372487099372162041568590539256488351737294708523272012421089326748220291729909853186126389486113602638037464798917737352578675188372501828555604004282598929675982180626022680345741303618408192247021657568663913526028145211755475939928912712220082787359546364322306724776665922707491021987748181730488961439404139976335171257397123062907938178893465064874123590923110807357554574554643393980484325533171785555026546386123991644766170357635345163e-15), SC_(-3.45021595267521522639899367590843824281454294119481346405490171556502599486260615042880032833991036355745335331680454463826120830401167139969159200447111666769627258035766487364251085432525590308678370165837088127339748301089081077402924517920562849507307652504302081878680928064486340213487200592331694635202674901052848664744765324810044662367009830275349486690000382804760826758049268567991748597475549641935103602495852342532731294563801468186295906896930304103397585963644636392968366808491056441e+01)}, + {SC_(-1.99993667602539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(6.50336577581735374471539264511018136719038458490199957731403809327992936679603463170316969907154025316626545553077722739733428346351928958003365080018329659007527067598438140087551150592925781388041096628034671302288112794755460098741102335498879716538819752808264418019802651491433352739354961564539598747849748848117392060902676118393565211519914525721009406620287609767915697521527717887383428629878372324308027451918296365023086525610451863304311902094773107178133171972202267956223000573838315409e-16), SC_(-3.49690416333571289161141805470911904438937037541235254693432508247352990157294679615675082059562226915476749521015549982260241269072669817183369963155899076472793137757186516087976809566510969597392117692900885107874333937105112403653596700299504956687509734290164995796117059729520144653593975744039317354321263755199656661265000435813191510872148915404528536453962323659146004419193306903056331043177656069646402815420399785981092446542074041177156746147470483132801996220688719111352348233653928675e+01)}, + {SC_(-1.99989318847656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.86063929638686016500929938628120959904067448411287969196392885063559322770495366475727319122352450102372852768514367925813022215988708482806225319665665321959515984729363297544833258326504479048316249972543983343692720159781733035015676131873586475183939930321798151919207267354975040689004986327902522486381765817411164156193416250909025739418186991916936533719895706334810544577545675978353778516293280116029537817342097826395833368093844428397016931704389447997220570933235918212908707219681481974e-16), SC_(-3.54905286973159947948750002420348464584768884030695883466932404080114006756721010835426851676572950604843679049664249591827700119156571903610687481690319310894243129467281993060943865782714232253365668805576757241352750911798706606877038236096410062796907424004941101804850412041415612888889142024699971409528765711806754586271162013403266475016725698526855443238047897496154800538159403234101936140209280775009365332436270880758824408358848375439036589335337097474868865637374358575703628226606450184e+01)}, + {SC_(-1.99969787597656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.37296605913515361209346540202645177501313411989850196817831068108372375868698241625156022771492511583367533337112524747137376096188024626936865639985676068925111095711404844373506733964319467852524083811984784373381226532512835075887454516237755489043135364608775170190200412813090698924043357984126479176586376756159697557036152924657642856869840911463747408646106382428964892168730182978444090514519785431129789029809068157041005541390960262548429023375641881292147792481840988867797477893326322641e-16), SC_(-3.65243880816464760868506252402030899768537444817173639067626077224643410635383857951770206143048299455767678092911959462194958237349255784440281069736923951115195900525720970672659685445864634967211738574969728491522452441232876494313586792230920291557195541800208355430057608697033133628867008170699978894609223080268842824992876510398676587888102517619145854012111900360196844437532665850195258458365957831131118671029406298076244722381387187475421481983813869442681219469329754750417755896370948969e+01)}, + {SC_(-1.99950103759765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.36316098020149180336594485727979876737128531049589362065952907061128596733355987994139338062282819185131032168871304103838446925611937887286709237542280460889870514607319873770051359260602656881815374243469950002986395095763327646299989180128548271795696996616366271013899283537815894308994710220989138890689498075406940349870190603536266322693466386629525658624153938658038587233321888072480206909717393660016512978949214008003450101524012340915085779176171569261451020905517736412363755791242890699e-17), SC_(-3.70201101175872571127612018877735829289966222633530480008790833909574728125746598013668396826018331577307207372571982536533375670475766159667463037138088770336085182557008789072830655187964737898150055547782089485266963996311464860472366058905616323822767606450565779266186426287478141325974133538136797321588449900712817576885367547610257758543776619302254787853687553904258173810544999430721010167498949352803124945816205122693480879826249820387852287044996010468333861760347726199104230160743408478e+01)}, + {SC_(-1.99907150268554687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.55339584071212341970474422785353660335901128887742233122439875862920707194709937014271143578039223357371625602683087493114976678579159611028025254056758984409396564016410385502091566184046478439774591236752200564488173276514562388115552233268886746457616005677169443947968693409313673715975716502229752528058290122345523747766183736578870392873680550485661565438774444289782054502237465714943954936280012187025428899218172715554379144501923864512768311526035511226614602973765215151761547340902268370e-17), SC_(-3.76280732876900368843995872688914724614766154503743721290613036628252140382589938365197204680237191190001881516350171816957619447557143555943272967301450033805129891032664320382026387520989511492279683113722987258147580642668261454744731897953576935131567781599631138897409307262073904306157094335890447418596502741921164480836998465436241085557109219685455546928104579025472976271631871646590293559539692930387307698947995638166323978942065107209641441448364860473477127717748096251490511457991615810e+01)}, + {SC_(-1.99758300781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(1.83112246049503080122237146768131561239165952861593764069083980656816133071712600960126755835070573344294099663480500749234277531625134201523458774258146034706967637818193536687702316522518109967144083177724938390732877090353677111923631003890839246683408350813534760772908633353691555931803914631321008476959514080214886540068969482875815279211161969636081606072812897989696761978145941506005215530706064321986891160384968334289256503133484325711859503334368481471089648442036399714132070514073271488e-17), SC_(-3.85390174356869999540631662416944424563343017686448585510542768258924935140650334849245812809797936619220558584447129061161041883006839073990822052685785409771053711522282916161209407932769517709141272339612700282656114462228083301569573087217876966524822852660405655108177399957462906307133994832931312250720150198781043931995519887737824647670514087352012661228211226654083530423287061165013493196255071502175665757791125308633317577890200630453290697760723342257941341060738612939219142306627366078e+01)}, + {SC_(-1.99377288818359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(8.01693535144367134273026553716785218082557806877438069452199116781270088995242302917025486913792901625954351735018669523044519100879209643963924846343671760259128187972279606679894790449933954614431176061448363551333157736564270069025829703781191430082548068512059881337098970687760711178849491103179947661198372103494820622922005592888312013696994032759249871346260932504701246018860440581729582268067100718234234048848838644129619402845961461869654578671179269984398862736189203756380345464201767839e-18), SC_(-3.93649754507982034381210646062863889826566407396586975519455023065492015354853815571908666749309967422373602978936644556653681367138699578243570034459145777728357737438098138773965351146277352775387753534175672639907881178942069832564535372795578198481177342329606823641171271987457158600793352179440621485289920354571261729043734932851097530391769255629080894457549056652983860155757537030310811891415672594623748985942179579702560080484257706177836201715188778902120252813872548170570887000653852548e+01)}, + {SC_(-1.98776550292968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.98159560642572769471679705760108836819553955845800653128274010665601005987113492561900144703140593263012810898767831966112217178821909223692669428149071863352847858293401245228236222196431038944392838651399436151035061048674526100274807374332221465652597940640163828271896168262085854120463603484811367456030167748780453221643535013315782836700239386693513547142120678068170315881364584464800999707226761493522115272499655210215888713274077764088440307774404249258692132112421830220308351144796995272e-18), SC_(-3.98407814312775750632655948505759119176224779884004606328890064673378552554757525193686835579511255181447342618200748378512699382992907049291693727164093761074261774488881410349964002706401261019405532796610313343889643193242858329740583589555489079186864603705090245097892687910273553815861117241007098888369393865117288758351588015571301443677764852078943272158047284630193828321764955315198313162218460948366246394905166119336122793138255072000587630491211601554256892640021898219920359539490157396e+01)}, + {SC_(-1.97504425048828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(3.88017517014452933045956819481950900807442551001110048857097121388844647225043963352097526055371187772211576037491223350763235789821957483113201097090187557142479511185822625644332601233189362904562543687030267056348820314236473401764915276126764508190793356448802422301055179132213830892895126747969022229207179654266700452361663827823698960959744143211716265805526259617770857043895851450506769945022455533546585246809998963177901672080828114457141550881049970982949788268111495485160913989116636720e-18), SC_(-4.00906513743322665419511458996323201349225723259180576722869519970546509690314650847321858066902702770000558036920171548448588183887422509784019051198560190291912395148953616433361398321514302827291262158546114298443380391432156907120792226017162472101359939072979047805376875854177883215361737326229238270663527682112094510414417814556366321261289112288963812063166466882072152697607360930495102462227364399384308239732395749233273524462963918739611835992415189220703065178811224998580501294593845387e+01)}, + {SC_(-1.95087814331054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(5.66230758491304665147102795245257419168217425592069799711487549608018624231364246953680468305752531986636297376301769325469502322471851593437159783231444403919853087066138399456497488977163427187775150730353446247259557640310543636216009045448281263625535378734382579698241218759759321642473879630568556532741823005839076245488105531230805809097403229237856626425257554186031699591598706644445689476274304227074824189207132578864764869307517588437106652581485851204451182521307598680869063344876248827e-18), SC_(-3.97127001642503306431018368868510822813077871040576980406279757790165788671386554429152492910562270875591570029751557166531867479172532187313780163974363901193188247687564696358109292582669997918861573399693339019987764495770565847958538474202672366615977739249614693866637380917451450693278590366704600806358477108821780498846825219688755857579333418703501660820620185048127256366395207162761266299559089783037567994540506596565789573094137658844891091983842233401459345063120752104143501754444023158e+01)}, + {SC_(-1.90161590576171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+01), SC_(4.85094648700543313219398847352478326318965185964013459447512351308953428156330384712645652203197410950029142959888065828019087576686061648451263295485805361576784764261272652852562003088603485865016423910075013225407371024651921073341767205327719612880437487232429260544546978675694647337189003765337117000483128461838798268376650578166160655894616540371072755498153305326101649796044091099125863886705708174964952292493207651779512080603498273845117371411314850322040626713326460161210144724561957487e-16), SC_(-3.52621876500351226734458234233118143948269880088724578239971352285058450102495101628806600063576867220760570143096935930387888839883871325947380486391444764415658337923993597824917478464190608223034931307344415287605970181326241463624079727938746083914284903273883746077127195587651357194104990693139512263661207224321519387943330426769205283325696095926588091655231810133980594401096500720257700076361998811811146688344672735928725322254167146864192016693678802172165337148496655031068154755053397560e+01)}, + {SC_(-1.99999856948852539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(3.49525794726840724332770531742533210760949030939150064838849016603929268240158079420646351018919870494992130816864538525681906800880110432809969608373357971562835031734463223617852856504288206717678633312929264358647621602816062958926953223434105587532619209946310434142604470287978627247076447003701407698280595109919257213101058520954002976857547124960200649769434010243812418865367203197435757976365462214320598427713582886554278342144196536549039933080774089051881208606675782058795172014506845303e+05), SC_(1.27643326425873384881093285872508179452498455083997386123791846098069683786954557724381755242107237737456425334403752138877081887262366450587882895441315426542862717610214957783062806011631463216155577579618174650591505415429230334239897241979183736600447839459322334682781809803931591656670137078437915218993972869573877667878499135915127684776967501369254905929674054441263057139938370034060614992097975121503535832913846498802397038787145978975145932851219785278838191467481268690078676805417976721e+01)}, + {SC_(-1.99999809265136718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.62144461393954005576677083959081224922682116942680784382663786554477354091505652256089930582387034905082987123783686147384272776233357697778646519293202177088216260442953567427598742176128969392234701519966700913406593927278601397437655998843292257685500339055591109815077998948276221540695712670281137196054397511966305435012680590384519239723484669607888029902896624532963675465522555566371306498097745971066287647001776895938202191310694024225146378391339368362904975412072348405920930457524036247e+05), SC_(1.24766510101557213545766721136410453138493641946701292802442833827425797129904704540382723544412893379170946550873814658598452156889382215401141401793226256683432769439816435341614070628592950211106046360463620980685141352456520751056501335577860424890706166122786273183690252206928481409437290040107105400612762800109051739183939915165333256045614229952868762702587943061762211192907487015355715364832639902186783136127312606318416615322477883301125855361137217733810005631030743897129203961853211027e+01)}, + {SC_(-1.99999284744262695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(6.99055280655334542175930436122069761290133983548532006796388549146348861014908087320598296301346411160370998401799938159888581866029751709088497185296824652466348119973211092989927709171600849203078010491110192497753213703526766239773066725748253740735453992439234492136465118555665575916337934823367953504368600730298086700097339519387123179747593007744532120692065230765100349251170948099553510882642363863764989129016733554206631919332143211983726526321979280034119468474152360465290561460889421071e+04), SC_(1.11549000104386469310318581217378978404108798637142623264790614654551465860165613766525338763896231086889849040052677873804922746038702465326123925324974167767546597691474395687144765863502639894309407960627926456751853434942337376342500635127429736502870706249417725219963966572260543383329779151091348926626121712222870254056682569389363695658167304526644142491795103808689641219761812209725779841832246666770063334779395069189440602891823050244930124977284293529931332541390700588598213343893338842e+01)}, + {SC_(-1.99998617172241210937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(3.61582545085677523556564265061789275558420085423109560412225366655176897025562182547560897903508146991920512133842894068247188574004266983236166092320549776589666149301791876532193556310533756455744076037828943414924970515395338284159141116848403267093343282623079098773385537741681300833604756206687517267176183543188779918320955585390478066609031999902486182302841138297064961474034093076746888050514577947727440163188133886399891285573031624715880708476160240564600719219019397480953999125929120509e+04), SC_(1.04956605420071580634032606781744741643474075940276116906157128451763874787833226406335746586932167180819392693617547623661699198379679879472241104399115810710557215037397886139363442663864810170688720344252581932587162490590864881208800226527734817497087958248051970771681187067072798822926758914302554781620566550310313780069405270970525254314192982629980655282219306257104525199495277176758155346742765033720532454849549319731995469240561404515682193542797042174160374339788351958917688789360771947e+01)}, + {SC_(-1.99998283386230468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.91275725193569561590016689655794168420228620966571368298273980157450738791800185120799393755360245105069027560472999937324445108650485939272745440145190606819951995859593113790682980972371233653642538147083802660603411711601177697879434359991996803571036009274557243778779042479466989793965641132673409423494548458675468354610730403558385953326702507473607969684599828544980277541551562751143225934516347787042819331835666113193607653180381361180597983599271660349253323506245247421653025229085236314e+04), SC_(1.02794405138122896402314881940604738282900129600289077017952090146533317079696982995762083502539714627487177044864707417428225158512882028105664966645423607544687065459887843793363464574058076111354667801476050818320352369918049033162304956069323775352811046342871920615690769829844887402721730480175673536482624050186765972164860620055019128295545319689415291206842391403816794856743485445184092820235173998625164635470678238711809067512302214434889317749801451335300035481668507468143889828201299775e+01)}, + {SC_(-1.99993991851806640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.32249319447518855598944610753617854039292256296476311990145714296558036998458656918821506365009251364959904572811137153770442631195626341569236149478584546737152245266768341432912467447854655346609375771648779530400158279627455200777370366845760135645185689952161850401675559394594343764985201521321411485981589624799291023082308588711466604815036184548423850387050145798777986608977987885716993412252737556898589674064937119199668191811649392150573408930676461291127997714867381873466120503286044037e+03), SC_(9.02671715172282446918804818996023162518571481778646046484772732956317384828370353304559181558297863222891421673682259823646868763561090354017312583652702865410886724466141311870458212107420735691179628014825875988413082971512446430075718596153929353099382259317366492027748573322899645753821024940590770562279794986846425203365367429895656694890464472785718353612966631247824841684093739368884029310135508998603813321714361278534324740132357271577747825991014287136486456695451934992266661402277777663e+00)}, + {SC_(-1.99988317489624023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(4.28036354241400130058705381882725999046241639116013619551075255606826877452636644604651341982568405913848090528825454016811852979966987414441609765953883845437810285948143114055346163368138808620153511140821913074294970274338981459461780195745846293255296962943905772921194262962996046024179304101202489373713805917724003109833450915814218273799360011692079574105261349340456724888786747274634828459793848677285899074058389948313476620716037763888535835434918698233782953812196563303570201525502018082e+03), SC_(8.36179322478501597977292274589283139518886305065425844964868164614874617907207649168636165810357009938065944927926474292133794500748914040902098872429767836976820558374914415660195744428422875053172805157494295734822572067475458679220611073040292089429138135583549225532487580813118021701211972393905414957119675165616825504727370662519623020660471291479495592691629449894598588052845768596631451491242905371300688736178966934044620811224456695685298401168269691120168797520928268746534849598073563811e+00)}, + {SC_(-1.99985122680664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(3.36128204434740291283107770354586378346283439595679593594949210524489234356178902618762378562267535666175904129785120747651662911412143665104975016955458793784393118196269263025523335076889406349897444787005159277370437761470788599663401819981999218853086656741435415793526095051182679856992784435195588655487630156922150016378044927741531191682364126255096178922384753868717405690697258379485738398999670904341069842876887589302579704145040802034099243873580319117957884661068510923385025291814370594e+03), SC_(8.12007774099911224077674031582939293407072268410283120160248139177467352236787950741709327449661204101627452104848400096463204118967596688892445723941631704314577678297562783209606807172475052038356749473705814057932311825150329963969840788980156891988724759699083494912402524105501158989635979848925608920814051135828808581751025198832642962437007614912625066655215144555621135720046502168379860877317008493966281141249674566270190908231807924116067930262174250983880414789548679270954647569186496750e+00)}, + {SC_(-1.99960184097290039062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.25624140592261575267278271940484289518480075580483297157581531914241110338376984136137853209559376401394082718883689331623249516193255900664815163812238640876028719844395892650957249605235281921292365169610839189461985220288383617439943753120747512365782707225814583627987391209031475228703173867481353781649110067039019107568342750599488417067674630339554122732514191362032832650736326962969325600194583793133488118555116227453949453195477751278597776714609414190745942394922450934781953398450326125e+03), SC_(7.13587953072736147036355816528887639826802159553598947589664831543550103506708350908036736344560077734555208589346657689427289222767237531129789832460866479029748071799264780934688947071994838969349226996016594353993409065278399027492505780692124331908601902223025677408337501345388598227277841303952412480274312085114055529429662028907729170169955023222056216936933071019581969634258689455594667577889504726170140818995305538107515921870405332546135662650561723462419727826606351956874268372077877037e+00)}, + {SC_(-1.99936151504516601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(7.83565799289483280163155191361710148301806473769761421399736971707242043580137349085685963832290398889029922835758280315794977396758526824072817586429369366819702994429539223254414178932724794214207553405219491444239189835949198854269913836625506190203997818880282941522759814620371563416612371995530706016140699823029408579568047443293909880799984307203726160291494410696322200124464725600048565966565754337103788411893096012339982460843838115831744031219115508893136183317751243764313795428254149897e+02), SC_(6.66385503949446161490964353057404700759932498170314993855319685951519772420415762755612421329517512507401754140021735737698406265001504947108209652508027151273513300798240944398325824766620559433751144975606238110713670040924420573411292751049952618117581043972629261655204241979398389497786642517477127879747879911916212390205737871315629451177077435383637605445069483064166519416309498119797004666497875239844370204211268529236996878715800888282012049095445736065307218750923128759227529173184642168e+00)}, + {SC_(-1.99892854690551757812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(4.67118382295204743401937254501573767480943199671434360254938823190850915833403801934586371844867967744091651336925376675907730238237282784349607890778234013193475547292318213052077228166933141756756427422908924797442949317616023112830726410939123632261991571101547351409931185486745127483145748880375700113736466217793925966792127947533799373560028173512435035840471258751889735357702600083584858668192495922189397869660685532274994141154462611707405745124099969669821149028958221777027109971294922745e+02), SC_(6.14658272082320896011483535569679739810604213770036400800091715689086571577772544734146180493197362913239895242960038327988879986011628251613934969785754160387923144866290327766088039955675828649148829131779854684483641828507579815539643578858903851037091320577884007201080127451064224748179877998328836094513147205379315186158274591836586471728654183660074243464409077906266941964012223839770573446137342312495426534839819825875176576557071861399281398737582929236303062411601392244029488439456818833e+00)}, + {SC_(-1.99697828292846679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.65933062799030026499031857286439573057825979180067481887402769956172122065685585045807000188347841407446707061639560625027426711596987076073907063407152889853367716469339236825757603750989741418798526629185714446971058613215430702718134769670033959677353759278619689100985901866594875380700877023837639752859867845590036857634241490796985154991724793857881301211565140606814321931538215083761281490341050122521686748462324199594599613474854498378317283969209955088313651411879706436345504630018044507e+02), SC_(5.11158447088456327285300991228539833660960693481988131847235078680072149045886373239208411487942182624090802533750571463998951400823698957276812111506615598974444394407002484070136921088302169422280429906757027574361223644628984594464458979582031307353205737054490228551750014379346366992651980878945818669148232194215084018810484639556344683423385036117630305071212095451395510462976995162898640449446072737496747538413155936339856232998187919840618112609672401660774998188565640799563785241420846260e+00)}, + {SC_(-1.99500608444213867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00587924761262775169663795112260658037813947243467846497585581476114421955317726749299731893226976937786324525582979731451343618075158212147675841143631582133466673077443893912530929063915059519648906249109279163465361129828794671469604941649949503326733151583929465567177496741612440164389015649600945687108836677050341799638872055874936125676513217903248696451648905457756723999758260862431168673835335778352509374833228745218167089341287526408377545911888789543737719512886725946916517409332708090e+02), SC_(4.61103221826699148685639421692714907149023874354715583149540785712901180479986015308857435216493645251391475968763231392296253595822154704197625561993779495939587815270692703284985173572898009432860996066960256782260922905962033845140459253829997088395227562256155357408928027795042056851131597625916921613972564329947415717361332777224365352001281348486892227555044666198023818913069027420599174805373709297093151673659228558391608953421210854147088652563286506485526491116085429363408683935355806458e+00)}, + {SC_(-1.99071598052978515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(5.43261342855207683321471367667634298993130164657395652940698347263805738244409299534274904253386808889723658245910828689572671872488701248351438198079823607168177338643148221671730425380866440723755055782205029208883973464213226966927488613575887327563514670858991324649773947981306614998043425095910306427769091089568418431383074642514512607267342885724246706884212512928162866598488111182269355360471107723126753986315318461572934230251910391906053447975979536562592026495313363254270083774897227910e+01), SC_(3.99500540554754084783116320755550040070795432896218051460244050016027307080516706025452328930707372122940539374531280006067457432152053795595498975958414099013978454227666236747637245745994127339007567514632056680017225765921602312064993984668132176623992913227625767485150934657465772535770444759472966423694768064411036564532278372406920442580119572879366391149796455805306682150702485604169317571816315397840571826029052197640137590412415034348881647261441103457141167021267904530044433362633611162e+00)}, + {SC_(-1.97583007812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.11713355568508717186749430619455765829944389572953926593387890142986425079118903228956466586034785656323975993009534744183681179572261067731704233666473752088214892713750726737578557299700556027748703489229191099881534356383060180175679305951211955138626254129859879913269047628471637484062282241878647186202424197930824531409890981709923645213793111935481046064792058678430210190296837963826587771101718103456760424093803975964255040042094700470767798212710711395227541566115973718114167151353452363e+01), SC_(3.05264817039591626862655099057939465179986667409005989715731859835690744704141548649122835851318344963701626601849114047531501048253619307346542776757184996977322377721381903566522822193104272396856042012430952816660726199339620731273536703263596123187839602228525400866664014760527003573811641632152035485360466326099946891663139486579902585522603531845013464113857010883947455000566195208734139820203755841940384563874720751791136755270346532812155352274399187564800218881502549907841988304120114349e+00)}, + {SC_(-1.93772268295288085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.55140154989742563031795592761223740222933037369091117707548701719417324436043594149148839366125866753441846926747757961691743831816447266296249525417689639205635396869873026915817137619485725479365301425493165818599553310689074177762635654066147134250624424695555873412452228602918989020578249224991765324833399206904878229623160267226643725994540540538379700800744103037352863243040436490709462020440501244109441318942868408148457761252155085028567393589233216009163593304138395619387918531501329911e+00), SC_(2.14609519347921503734928390248919269700812373570607862587046702400866080506820226775324131591047922770564148385412775051426850391054709262710094222461322018730704436853657999982086234982157335335068267734765087205570600956372991002414990208544840151216306267557887490905482009859533035497930769422922408290206507773022866238259045914192630771754449840812003788665755318698278462898424482576176640522119386371054173657148616621611488616395440426423349037282231697273048104290956235560812518904511850199e+00)}, + {SC_(-1.87765598297119140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(4.67583771863249529055109655612510730374992827217946078088186977344497390855781646691754105222138655257893095020731116355227986362966515780707698772485437094967536468214023834308178727836619801089569663047174119105167664428805441275112046007267349102582601522528843355129981789218535438305077043911372259440397637216382121093112527069891468207241109974792875017384778909045872929763491293848256218126413836287410323590383274638262206213949333260073094188650218883981854689988805258114662583813833446691e+00), SC_(1.54240833783916950711674299830094269420860989032914842380787685725906602802135415488922671751862561471742098321629469719633973418191421678612807986946832211852615654801599794257019902991588352013561017386475372562025192264722784055215705770996735617454145764311884033826035333514369114597097399498198288990985692089872458755227609611715846210608700162484829844243005353297597437263446897165946773288544966416662536713250022257470084584378142797370192831228494237130188132449079088561127554388813866227e+00)}, + {SC_(-1.75044250488281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.76521531383342777536096826241083426988946791885237328153143902257712477146935957758546160579910756476446412711524400835410428680030114368815367047441732692355740342646344258723284625720868992172797296604448481954562244959416221336611138303608751397924213759395368298472950576084573813186054133277598316804445815058268350200019426078774535372726241320430678110500166163408536083013133803069777977592233712273587393272238129354441223170323562228826009632634564393605136023563596897017566916161568373558e+00), SC_(1.01711850312999107612643679883702069406371231132721256058245671646048087783154950748443714431866884713764648019078645174991892339907448517840206497874509210723364252694864538940590777681188468426542254545822716725767597072139557232884783690928384523253232018333698447015173227162147433007643510931963840890536915692608769823429517486692530853117073535699778387722764300165446366925590821938117578815481931433033378039640398390812437572623525032416583644099198377439870409387433496490925947152048515148e+00)}, + {SC_(-1.50877809524536132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(2.34957878792805622220208627908796604209022753669777984013397021521718672847364045384997126602247009262704209508441637059874646258845906595804811471172246490386367479387582395386750422304786391974080908751447734295954413870878215699818713260911166524456609372522274214548306662348939976667197188998712694834713732786481840430018084860503372392470155335279086088777016531440557532208724574181694106222640898095734633283023280509442132397047312680409203121903723018562056868440028789425492262012646158458e+00), SC_(8.54236072911255595134717828491113927004144370403410251865930440928741075566141261658507132665592617412770458712290479329578412453713534343230061302053867333849975384386984877754318709543893927568366266399879554366360287159464342728205089795418872839137202008820491949662117655143235966641935511312425859340479786978199551078742416307594623543083605438644209653394275575880139888266125377643794668219915008503333812637400462494313054948847229967539105158899413449126349909264243755409897303557758406009e-01)}, + {SC_(-1.01615285873413085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(6.15084416829118046468452991400544498224185271615854347433260694549800043224355246574675466376373859960529333306270890955207636581369067853640476864447701152058770453365710243687329890852220965032159894431838134171173269029343559984826337258962443251204686313483188492817659715061679938111171826115917411885607899751127343441029695150225474485591386587193176839356863531438827218409852706526496642971237672335817246193209499962435510622872455796720812217398126074771344905297363577965377107684959317397e+01), SC_(4.11917442852952711543741507530337656290736016465506639741742101611014731373074855727222493539896474697110498858504643770565949929474195415135105179617700802945752394424643368615173443852328593935472829240359653696116395379824510508393155403134258111311673599669939241747207061523079182632547737365431783702760141194142731371171480274286029170854076168498596924110170468837240766315428782766656743993971526078852137464960957958084824518999844115962290565276220206898969535823972967013864671556923956906e+00)}}}; +//#undef SC_ diff --git a/src/boost/libs/multiprecision/test/math/high_prec/readme.txt b/src/boost/libs/multiprecision/test/math/high_prec/readme.txt new file mode 100644 index 00000000..3343727b --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/high_prec/readme.txt @@ -0,0 +1,7 @@ +These tests are designed to test Boost.Math's code at really rather high precision - 500 decimal digits or so. + +As such they use their own test data, and take rather a long time to run. + +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/src/boost/libs/multiprecision/test/math/high_prec/test_gamma.cpp b/src/boost/libs/multiprecision/test/math/high_prec/test_gamma.cpp new file mode 100644 index 00000000..75ec1a63 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/high_prec/test_gamma.cpp @@ -0,0 +1,76 @@ +// (C) Copyright John Maddock 2006. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include "test_gamma.hpp" +#ifdef TEST_MPFR +#include <boost/multiprecision/mpfr.hpp> +#else +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + const char* largest_type; +#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS + if (boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >()) + { + largest_type = "(long\\s+)?double"; + } + else + { + largest_type = "long double"; + } +#else + largest_type = "(long\\s+)?double"; +#endif + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*near 1.*", // test data group + ".*lgamma.*", 100000000000LL, 100000000000LL); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*near 0.*", // test data group + ".*lgamma.*", 300000, 100000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 110000, 50000); // test function + + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + expected_results(); + BOOST_MATH_CONTROL_FP; + +#ifdef TEST_MPFR + typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<450> > mp_type; + const char* name = "number<mpfr_float_backend<450> >"; +#else + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<450> > mp_type; + const char* name = "number<cpp_bin_float<450> >"; +#endif + + test_gamma(mp_type(0), name); +} diff --git a/src/boost/libs/multiprecision/test/math/high_prec/test_gamma.hpp b/src/boost/libs/multiprecision/test/math/high_prec/test_gamma.hpp new file mode 100644 index 00000000..fe1c356f --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/high_prec/test_gamma.hpp @@ -0,0 +1,89 @@ +// Copyright John Maddock 2006. +// Copyright Paul A. Bristow 2007, 2009 +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#define BOOST_MATH_OVERFLOW_ERROR_POLICY ignore_error + +#include <boost/math/special_functions/gamma.hpp> +#define BOOST_TEST_MAIN +#include <boost/test/unit_test.hpp> +#include <boost/test/floating_point_comparison.hpp> +#include <boost/math/tools/stats.hpp> +#include <boost/math/tools/test.hpp> +#include <boost/math/constants/constants.hpp> +#include <boost/type_traits/is_floating_point.hpp> +#include <boost/array.hpp> +#include "libs/math/test/functor.hpp" + +#include "libs/math/test/handle_test_result.hpp" +#include "../table_type.hpp" + +#ifndef SC_ +#define SC_(x) static_cast<typename table_type<T>::type>(BOOST_JOIN(x, L)) +#endif + +template <class Real, class T> +void do_test_gamma(const T& data, const char* type_name, const char* test_name) +{ + typedef typename T::value_type row_type; + typedef Real value_type; + + typedef value_type (*pg)(value_type); +#if defined(BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS) + pg funcp = boost::math::tgamma<value_type>; +#else + pg funcp = boost::math::tgamma; +#endif + + boost::math::tools::test_result<value_type> result; + + std::cout << "Testing " << test_name << " with type " << type_name + << "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"; + + // + // test tgamma against data: + // + result = boost::math::tools::test_hetero<Real>( + data, + bind_func<Real>(funcp, 0), + extract_result<Real>(1)); + handle_test_result(result, data[result.worst()], result.worst(), type_name, "boost::math::tgamma", test_name); + + // + // test lgamma against data: + // +#if defined(BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS) + funcp = boost::math::lgamma<value_type>; +#else + funcp = boost::math::lgamma; +#endif + result = boost::math::tools::test_hetero<Real>( + data, + bind_func<Real>(funcp, 0), + extract_result<Real>(2)); + handle_test_result(result, data[result.worst()], result.worst(), type_name, "boost::math::lgamma", test_name); + + std::cout << std::endl; +} + +template <class T> +void test_gamma(T, const char* name) +{ +#include "gamma.ipp" + + do_test_gamma<T>(gamma, name, "random values"); + +#include "gamma_1_2.ipp" + + do_test_gamma<T>(gamma_1_2, name, "Values near 1 and 2"); + +#include "gamma_0.ipp" + + do_test_gamma<T>(gamma_0, name, "Values near 0"); + +#include "gamma_neg.ipp" + + do_test_gamma<T>(gamma_neg, name, "Negative arguments"); +} diff --git a/src/boost/libs/multiprecision/test/math/instances/Jamfile.v2 b/src/boost/libs/multiprecision/test/math/instances/Jamfile.v2 new file mode 100644 index 00000000..4c66a907 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/instances/Jamfile.v2 @@ -0,0 +1,82 @@ +# copyright John Maddock 2013 +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt. + +import modules ; +import path ; + +local ntl-path = [ modules.peek : NTL_PATH ] ; +local gmp_path = [ modules.peek : GMP_PATH ] ; +local mpfr_path = [ modules.peek : MPFR_PATH ] ; +local mpfi_path = [ modules.peek : MPFI_PATH ] ; +local tommath_path = [ modules.peek : TOMMATH_PATH ] ; + +project : requirements + <include>$(gmp_path) + <include>$(gmp_path)/mpfr + <include>$(gmp_path)/gmpfrxx + <include>$(mpfr_path) + <include>$(mpfi_path) + <include>$(mpfi_path)/src + <include>$(tommath_path) + <include>../../.. + # We set these to make it easier to set up and test GMP and MPFR under Win32: + #<toolset>msvc:<runtime-link>static + #<toolset>msvc:<link>static + #<toolset>msvc:<warnings>all + #<toolset>intel-win:<runtime-link>static + #<toolset>intel-win:<link>static + # Speed up compiles: + #<toolset>msvc:<debug-symbols>off + #<toolset>intel:<debug-symbols>off + <toolset>gcc:<cxxflags>-Wall + <toolset>gcc:<cxxflags>-Wextra + <toolset>intel:<define>SLOW_COMPILER + <define>BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE + ; + +lib gmp : : <search>$(gmp_path) ; +lib mpfr : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug ; +lib mpfi : : <search>$(gmp_path) <search>$(mpfr_path) <search>$(mpfr_path)/build.vc10/lib/Win32/Debug <search>$(mpfi_path) <search>$(mpfi_path)/src ; +lib quadmath ; + +rule generate_objs ( suffix : variant_count : build_opts * ) +{ + local result ; + switch $(variant_count) + { + case "1" : variant_list = 1 ; + case "2" : variant_list = 1 2 ; + case "3" : variant_list = 1 2 3 ; + case "4" : variant_list = 1 2 3 4 ; + case "5" : variant_list = 1 2 3 4 5 ; + case "6" : variant_list = 1 2 3 4 5 6 ; + } + + for group_id in 1 2 3 4 5 6 7 8 9 10 + { + for variant_id in $(variant_list) + { + name = "test_instances$(suffix)_$(group_id)_$(variant_id)" ; + obj $(name) : instances.cpp : release <define>BOOST_MATH_TEST_TYPE=test_type_$(variant_id) <define>TEST_GROUP_$(group_id) $(build_opts) ; + result += $(name) ; + } + } + return $(result) ; +} + +lib test_instances_mpf : [ generate_objs "_mpf" : 5 : <define>TEST_MPF_50 ] : [ check-target-builds ../../../config//has_gmp : : <build>no ] ; +lib test_instances_mpfr : [ generate_objs "_mpfr" : 4 : <define>TEST_MPFR_50 ] : [ check-target-builds ../../../config//has_mpfr : : <build>no ] ; +lib test_instances_cpp_dec_float : [ generate_objs "_cpp_dec_float" : 3 : <define>TEST_CPP_DEC_FLOAT ] : ; +lib test_instances_cpp_bin_float : [ generate_objs "_cpp_bin_float" : 1 : <define>TEST_CPP_BIN_FLOAT ] : ; +lib test_instances_float128 : [ generate_objs "_float128" : 1 : <define>TEST_FLOAT128 ] : [ check-target-builds ../../../config//has_float128 : : <build>no ] ; +lib test_instances_intel_quad : [ generate_objs "_intel_quad" : 1 : <define>TEST_FLOAT128 <cxxflags>-Qoption,cpp,--extended_float_type ] : [ check-target-builds ../../../config//has_intel_quad : <cxxflags>-Qoption,cpp,--extended_float_type : <build>no ] ; + +explicit test_instances_mpf ; +explicit test_instances_mpfr ; +explicit test_instances_cpp_dec_float ; +explicit test_instances_cpp_bin_float ; +explicit test_instances_float128 ; +explicit test_instances_intel_quad ; + diff --git a/src/boost/libs/multiprecision/test/math/instances/instances.cpp b/src/boost/libs/multiprecision/test/math/instances/instances.cpp new file mode 100644 index 00000000..919be586 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/instances/instances.cpp @@ -0,0 +1,13 @@ +// Copyright John Maddock 2013. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#define BOOST_MATH_OVERFLOW_ERROR_POLICY ignore_error +#include <boost/math/special_functions.hpp> + +#include "../setup.hpp" + +//#define BOOST_MATH_TEST_TYPE double +//#define TEST_GROUP_1 +#include "../../../../math/test/test_instances/test_instances.hpp" diff --git a/src/boost/libs/multiprecision/test/math/log1p_expm1_test.cpp b/src/boost/libs/multiprecision/test/math/log1p_expm1_test.cpp new file mode 100644 index 00000000..3a4cbb10 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/log1p_expm1_test.cpp @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#include "setup.hpp" +//#include <boost/math/special_functions/log1p.hpp> +//#include <boost/math/special_functions/expm1.hpp> +#define BOOST_TEST_MAIN +#include <boost/test/unit_test.hpp> +#include <boost/test/floating_point_comparison.hpp> +#include <boost/math/special_functions/math_fwd.hpp> + +#include "table_type.hpp" + +#include "libs/math/test/log1p_expm1_test.hpp" + +// +// DESCRIPTION: +// ~~~~~~~~~~~~ +// +// This file tests the functions log1p and expm1. The accuracy tests +// use values generated with NTL::RR at 1000-bit precision +// and our generic versions of these functions. +// +// Note that when this file is first run on a new platform many of +// these tests will fail: the default accuracy is 1 epsilon which +// is too tight for most platforms. In this situation you will +// need to cast a human eye over the error rates reported and make +// a judgement as to whether they are acceptable. Either way please +// report the results to the Boost mailing list. Acceptable rates of +// error are marked up below as a series of regular expressions that +// identify the compiler/stdlib/platform/data-type/test-data/test-function +// along with the maximum expected peek and RMS mean errors for that +// test. +// + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + + // + // Catch all cases come last: + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<18>.*", // test type(s) + ".*", // test data group + ".*", // test function + 500, // Max Peek error + 100); // Max mean error + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*", // test data group + ".*", // test function + 500, // Max Peek error + 100); // Max mean error + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", // test function + 8, // Max Peek error + 5); // Max mean error + + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/powm1_sqrtp1m1_test.cpp b/src/boost/libs/multiprecision/test/math/powm1_sqrtp1m1_test.cpp new file mode 100644 index 00000000..54970906 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/powm1_sqrtp1m1_test.cpp @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#include "setup.hpp" +#define BOOST_TEST_MAIN +#include <boost/test/unit_test.hpp> +#include <boost/test/floating_point_comparison.hpp> +#include <boost/math/special_functions/math_fwd.hpp> + +#include "table_type.hpp" + +#include "libs/math/test/powm1_sqrtp1m1_test.hpp" + +// +// DESCRIPTION: +// ~~~~~~~~~~~~ +// +// This file tests the functions log1p and expm1. The accuracy tests +// use values generated with NTL::RR at 1000-bit precision +// and our generic versions of these functions. +// +// Note that when this file is first run on a new platform many of +// these tests will fail: the default accuracy is 1 epsilon which +// is too tight for most platforms. In this situation you will +// need to cast a human eye over the error rates reported and make +// a judgement as to whether they are acceptable. Either way please +// report the results to the Boost mailing list. Acceptable rates of +// error are marked up below as a series of regular expressions that +// identify the compiler/stdlib/platform/data-type/test-data/test-function +// along with the maximum expected peek and RMS mean errors for that +// test. +// + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + + // + // Catch all cases come last: + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*", // test data group + ".*", // test function + 300, // Max Peek error + 50); // Max mean error + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", // test function + 15, // Max Peek error + 5); // Max mean error + + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_powm1_sqrtp1m1(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // We test two different precisions: + // 18 decimal digits triggers Boost.Math's 64-bit long double support. + // 30 decimal digits triggers Boost.Math's 128-bit long double support. + // 35 decimal digits triggers true arbitrary precision support. + // + ALL_SMALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/readme.txt b/src/boost/libs/multiprecision/test/math/readme.txt new file mode 100644 index 00000000..7ea64a59 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/readme.txt @@ -0,0 +1,12 @@ +These tests verify that the multiprecision types can interoperate with Boost.Math. + +We use Boost.Math's own test data for these and test at various precisions which trigger +different code inside the Math lib. We don't test at very high precision here as +Boost.Math's test data doesn't go much beyond 35 digits (for good reason, some compilers +choke when attempting to parse higher precision numbers as double's). + + +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + diff --git a/src/boost/libs/multiprecision/test/math/setup.hpp b/src/boost/libs/multiprecision/test/math/setup.hpp new file mode 100644 index 00000000..4ee46c58 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/setup.hpp @@ -0,0 +1,162 @@ +// Copyright 2013 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifndef BOOST_MP_MATH_SETUP_HPP +#define BOOST_MP_MATH_SETUP_HPP + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#define BOOST_MATH_OVERFLOW_ERROR_POLICY ignore_error +#undef BOOST_MATH_SMALL_CONSTANT +#define BOOST_MATH_SMALL_CONSTANT(x) x + +#if !defined(TEST_MPF_50) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_MPFR_50 +#define TEST_CPP_DEC_FLOAT +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#include <boost/multiprecision/debug_adaptor.hpp> + +#define MPF_TESTS /*test(number<gmp_float<18> >(), "number<gmp_float<18> >");*/ \ + mpf_float::default_precision(20); \ + test(mpf_float(), "number<gmp_float<0> > (20 digit precision)"); \ + mpf_float::default_precision(35); \ + test(mpf_float(), "number<gmp_float<0> > (35 digit precision)"); \ + test(number<gmp_float<30> >(), "number<gmp_float<30> >"); \ + test(number<gmp_float<35> >(), "number<gmp_float<35> >"); \ + /* there should be at least one test with expression templates off: */ \ + test(number<gmp_float<35>, et_off>(), "number<gmp_float<35>, et_off>"); +#define MPF_SMALL_TESTS /*test(number<gmp_float<18> >(), "number<gmp_float<18> >");*/ \ + test(number<gmp_float<30> >(), "number<gmp_float<30> >"); \ + test(number<gmp_float<35> >(), "number<gmp_float<35> >"); \ + /* there should be at least one test with expression templates off: */ \ + test(number<gmp_float<35>, et_off>(), "number<gmp_float<35>, et_off>"); \ + mpf_float::default_precision(20); \ + test(mpf_float(), "number<gmp_float<0> > (20 digit precision)"); \ + mpf_float::default_precision(35); \ + test(mpf_float(), "number<gmp_float<0> > (35 digit precision)"); + +typedef boost::multiprecision::number<boost::multiprecision::gmp_float<18> > test_type_1; +typedef boost::multiprecision::number<boost::multiprecision::gmp_float<30> > test_type_2; +typedef boost::multiprecision::number<boost::multiprecision::gmp_float<35> > test_type_3; +typedef boost::multiprecision::number<boost::multiprecision::gmp_float<35>, boost::multiprecision::et_off> test_type_4; +typedef boost::multiprecision::mpf_float test_type_5; + +#else + +#define MPF_TESTS +#define MPF_SMALL_TESTS + +#endif + +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> + +#define MPFR_TESTS \ + test(number<mpfr_float_backend<18> >(), "number<mpfr_float_backend<18> >"); \ + test(number<mpfr_float_backend<30> >(), "number<mpfr_float_backend<30> >"); \ + test(number<mpfr_float_backend<35> >(), "number<mpfr_float_backend<35> >"); \ + /* Test variable precision at 2 different precisions - checks our ability to handle dynamic changes in precision */ \ + mpfr_float::default_precision(20); \ + test(mpfr_float(), "number<mpfr_float_backend<0> > (20-digit precision)"); \ + mpfr_float::default_precision(35); \ + test(mpfr_float(), "number<mpfr_float_backend<0> > (35-digit precision)"); + +typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<18> > test_type_1; +typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<30> > test_type_2; +typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<35> > test_type_3; +typedef boost::multiprecision::mpfr_float test_type_4; + +#else + +#define MPFR_TESTS + +#endif + +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> + +#define CPP_DEC_FLOAT_TESTS \ + test(number<cpp_dec_float<18> >(), "number<cpp_dec_float<18> >"); \ + test(number<cpp_dec_float<30> >(), "number<cpp_dec_float<30> >"); \ + test(number<cpp_dec_float<35, long long, std::allocator<char> > >(), "number<cpp_dec_float<35, long long, std::allocator<char> > >"); + +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > test_type_1; +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<30> > test_type_2; +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<35, long long, std::allocator<char> > > test_type_3; + +#else + +#define CPP_DEC_FLOAT_TESTS + +#endif + +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/debug_adaptor.hpp> + +//#define CPP_BIN_FLOAT_TESTS test(number<debug_adaptor<cpp_bin_float_quad::backend_type>, et_off>(), "cpp_bin_float_quad"); +#define CPP_BIN_FLOAT_TESTS test(cpp_bin_float_quad(), "cpp_bin_float_quad"); + +//typedef boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::cpp_bin_float_quad::backend_type>, boost::multiprecision::et_off> test_type_1; +typedef boost::multiprecision::cpp_bin_float_quad test_type_1; + +#else + +#define CPP_BIN_FLOAT_TESTS + +#endif + +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> + +#define FLOAT128_TESTS test(float128(), "float128"); + +typedef boost::multiprecision::float128 test_type_1; + +#else + +#define FLOAT128_TESTS + +#endif + +#ifndef BOOST_MATH_TEST_TYPE +#define BOOST_TEST_MAIN +#include <boost/test/unit_test.hpp> +#include <boost/test/floating_point_comparison.hpp> +#endif + +#define ALL_TESTS \ + MPF_TESTS \ + MPFR_TESTS \ + CPP_DEC_FLOAT_TESTS \ + FLOAT128_TESTS \ + CPP_BIN_FLOAT_TESTS + +#define ALL_SMALL_TESTS \ + MPF_SMALL_TESTS \ + MPFR_TESTS \ + CPP_DEC_FLOAT_TESTS \ + FLOAT128_TESTS \ + CPP_BIN_FLOAT_TESTS + +#endif diff --git a/src/boost/libs/multiprecision/test/math/table_type.hpp b/src/boost/libs/multiprecision/test/math/table_type.hpp new file mode 100644 index 00000000..26229745 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/table_type.hpp @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifndef BOOST_MP_TABLE_TYPE +#define BOOST_MP_TABLE_TYPE + +#include <libs/math/test/table_type.hpp> +#include <boost/multiprecision/number.hpp> + +struct string_table_entry +{ + private: + const char* m_data; + + public: + string_table_entry(const char* p) : m_data(p) {} + + template <class T> + operator T() const + { + return static_cast<T>(m_data); + } +}; + +inline std::ostream& operator<<(std::ostream& os, string_table_entry const& what) +{ + return os << static_cast<const char*>(what); +} + +template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates> +struct table_type<boost::multiprecision::number<Backend, ExpressionTemplates> > +{ + typedef string_table_entry type; +}; + +#define SC_(x) string_table_entry(BOOST_STRINGIZE(x)) + +#endif diff --git a/src/boost/libs/multiprecision/test/math/test_bessel_i.cpp b/src/boost/libs/multiprecision/test/math/test_bessel_i.cpp new file mode 100644 index 00000000..0d9176b8 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_bessel_i.cpp @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#include "setup.hpp" +#include "table_type.hpp" + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_bessel_i.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + + // + // Catch all cases come last: + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", // test function + 500, // Max Peek error + 200); // Max mean error + + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_bessel(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 9 decimal digits: tests the least wide arbitrary precision code + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_SMALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_bessel_j.cpp b/src/boost/libs/multiprecision/test/math/test_bessel_j.cpp new file mode 100644 index 00000000..d322c371 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_bessel_j.cpp @@ -0,0 +1,119 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#include "setup.hpp" +#include "table_type.hpp" + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_bessel_j.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*J0.*Tricky.*", // test data group + ".*", 10000000000L, 5000000000L); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*J0.*Tricky.*", // test data group + ".*", 400000000, 400000000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*J1.*Tricky.*", // test data group + ".*", 1000000000L, 500000000L); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*J1.*Tricky.*", // test data group + ".*", 10000000, 5000000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_bin_float.*", // test type(s) + ".*JN.*Integer.*", // test data group + ".*", 500000, 150000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*JN.*Integer.*", // test data group + ".*", 50000, 15000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*(JN|j).*|.*Tricky.*", // test data group + ".*", 70000, 7000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_bin_float.*", // test type(s) + ".*(JN|j).*|.*Tricky.*", // test data group + ".*", 500000, 200000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*(JN|j).*|.*Tricky.*", // test data group + ".*", 7000, 3000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 40, 20); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_bessel(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_bessel_k.cpp b/src/boost/libs/multiprecision/test/math/test_bessel_k.cpp new file mode 100644 index 00000000..6d883a1d --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_bessel_k.cpp @@ -0,0 +1,99 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#include "setup.hpp" +#include "table_type.hpp" + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_bessel_k.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp.*", // test type(s) + ".*", // test data group + ".*", 2000, 1500); // test function +#ifdef BOOST_INTEL + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*float128.*", // test type(s) + ".*", // test data group + ".*", 300, 100); // test function +#endif + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*", // test data group + ".*", 3000, 1000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<0>.*", // test type(s) + ".*", // test data group + ".*", 300, 150); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*large.*", // test data group + ".*", 80, 50); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_bin_float.*", // test type(s) + ".*", // test data group + ".*", 300, 150); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 50, 15); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_bessel(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_bessel_y.cpp b/src/boost/libs/multiprecision/test/math/test_bessel_y.cpp new file mode 100644 index 00000000..6734651f --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_bessel_y.cpp @@ -0,0 +1,139 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#include "setup.hpp" +#include "table_type.hpp" + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_bessel_y.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*(Y[nv]|y).*Random.*", // test data group + ".*", 200000, 10000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_bin_float.*", // test type(s) + ".*(Y[nv]|y).*Random.*", // test data group + ".*", 2000000, 1000000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<0>.*", // test type(s) + ".*(Y[nv]|y).*Random.*", // test data group + ".*", 150000, 15000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*(Y[nv]|y).*Random.*", // test data group + ".*", 70000, 4000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*Y0.*", // test data group + ".*", 3000, 2000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_bin_float.*", // test type(s) + ".*Y0.*", // test data group + ".*", 40000, 20000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*Y0.*", // test data group + ".*", 800, 400); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*Yn.*", // test data group + ".*", 400000, 70000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_bin_float.*", // test type(s) + ".*Yn.*", // test data group + ".*", 400000, 200000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*Yn.*", // test data group + ".*", 1700, 600); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*", // test data group + ".*", 15000, 4000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_bin_float.*", // test type(s) + ".*", // test data group + ".*", 50000, 20000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 150, 60); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_bessel(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_SMALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_beta.cpp b/src/boost/libs/multiprecision/test/math/test_beta.cpp new file mode 100644 index 00000000..efa8aa1f --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_beta.cpp @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#include "setup.hpp" +#include "table_type.hpp" + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_beta.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp.*", // test type(s) + "Beta Function: Medium.*", // test data group + "beta", 2300, 1000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp.*", // test type(s) + "Beta Function: Divergent.*", // test data group + "beta", 2200, 1000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend\\<18\\>.*", // test type(s) + "Beta Function: Small.*", // test data group + "beta", 1000, 750); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "Beta Function: Small.*", // test data group + "beta", 8, 5); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "Beta Function: Medium.*", // test data group + "beta", 1000, 750); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "Beta Function: Divergent.*", // test data group + "beta", 1000, 700); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_beta(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_binomial_coeff.cpp b/src/boost/libs/multiprecision/test/math/test_binomial_coeff.cpp new file mode 100644 index 00000000..c12e90ca --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_binomial_coeff.cpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#include "setup.hpp" +#include "table_type.hpp" + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_binomial_coeff.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp.*", // test type(s) + ".*", // test data group + ".*", 3000, 1500); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*", // test data group + ".*", 750, 150); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<0>.*", // test type(s) + ".*", // test data group + ".*", 150, 100); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 100, 20); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_binomial(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_carlson_1.cpp b/src/boost/libs/multiprecision/test/math/test_carlson_1.cpp new file mode 100644 index 00000000..b66a4f11 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_carlson_1.cpp @@ -0,0 +1,81 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT +#define TEST1 + +#include <boost/math/special_functions/math_fwd.hpp> +#include <boost/math/special_functions/ellint_rf.hpp> +#include "libs/math/test/test_carlson.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<0>.*", // test type(s) + ".*RJ.*", // test data group + ".*", 40000, 4000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*RJ.*", // test data group + ".*", 2700, 250); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<0>.*", // test type(s) + ".*RC.*", // test data group + ".*", 7000, 1000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<0>.*", // test type(s) + ".*RF.*", // test data group + ".*", 12000, 700); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 40, 20); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_spots(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_carlson_2.cpp b/src/boost/libs/multiprecision/test/math/test_carlson_2.cpp new file mode 100644 index 00000000..302f92cf --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_carlson_2.cpp @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT +#define TEST2 + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_carlson.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<0>.*", // test type(s) + ".*RJ.*", // test data group + ".*", 40000, 4000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<0>.*", // test type(s) + ".*RC.*", // test data group + ".*", 7000, 1000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*RJ.*", // test data group + ".*", 2700, 250); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 40, 20); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_spots(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_carlson_3.cpp b/src/boost/libs/multiprecision/test/math/test_carlson_3.cpp new file mode 100644 index 00000000..89d14f82 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_carlson_3.cpp @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT +#define TEST3 + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_carlson.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*RJ.*", // test data group + ".*", 2700, 250); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*RD: y = z", // test data group + ".*", 120, 30); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 40, 20); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_spots(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_carlson_4.cpp b/src/boost/libs/multiprecision/test/math/test_carlson_4.cpp new file mode 100644 index 00000000..40457e75 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_carlson_4.cpp @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT +#define TEST4 + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_carlson.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "RG: two values the same", // test data group + ".*", 10000, 700); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*RJ.*", // test data group + ".*", 2700, 250); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 40, 20); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_spots(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_cbrt.cpp b/src/boost/libs/multiprecision/test/math/test_cbrt.cpp new file mode 100644 index 00000000..62850871 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_cbrt.cpp @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_cbrt.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 5, 3); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_cbrt(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_digamma.cpp b/src/boost/libs/multiprecision/test/math/test_digamma.cpp new file mode 100644 index 00000000..3ac7b283 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_digamma.cpp @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_digamma.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*Negative.*", // test data group + ".*", 20000, 2000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*Negative.*", // test data group + ".*", 550, 40); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_dec_float.*", // test type(s) + ".*Near the Positive Root.*", // test data group + ".*", 2500, 200); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<0>.*", // test type(s) + ".*Near the Positive Root.*", // test data group + ".*", 30000, 2000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*Near the Positive Root.*", // test data group + ".*", 6000, 1000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 80, 30); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_digamma(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_ellint_1.cpp b/src/boost/libs/multiprecision/test/math/test_ellint_1.cpp new file mode 100644 index 00000000..5f997d4b --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_ellint_1.cpp @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_ellint_1.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*", // test data group + ".*", 1000, 200); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 70, 20); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_spots(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_ellint_2.cpp b/src/boost/libs/multiprecision/test/math/test_ellint_2.cpp new file mode 100644 index 00000000..38c5a2c9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_ellint_2.cpp @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_ellint_2.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 300, 200); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_spots(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_ellint_3.cpp b/src/boost/libs/multiprecision/test/math/test_ellint_3.cpp new file mode 100644 index 00000000..20ddf004 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_ellint_3.cpp @@ -0,0 +1,109 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_ellint_3.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<18>.*", // test type(s) + ".*", // test data group + ".*", 3000, 500); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*", // test data group + ".*", 10000, 3000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<0>.*", // test type(s) + ".*Mathworld.*", // test data group + ".*", 10000, 3000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<0>.*", // test type(s) + ".*", // test data group + ".*", 10000, 1200); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*Large.*", // test data group + ".*", 75, 40); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_bin_float_quad.*", // test type(s) + ".*Mathworld.*", // test data group + ".*", 500, 100); // test function +#ifdef BOOST_INTEL + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*float128.*", // test type(s) + ".*", // test data group + ".*", 200, 30); // test function +#endif + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*Mathworld.*", // test data group + ".*", 600, 300); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 60, 30); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_spots(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_erf.cpp b/src/boost/libs/multiprecision/test/math/test_erf.cpp new file mode 100644 index 00000000..419a3783 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_erf.cpp @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_erf.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<18>.*", // test type(s) + "Erf Function:.*", // test data group + "erfc?", 2200, 1500); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<18>.*", // test type(s) + "Inverse Erf.*", // test data group + "erfc?_inv", 2200, 1500); // test function +#ifdef BOOST_INTEL + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + "float128", // test type(s) + "Erf Function:.*", // test data group + "erfc?", 15000, 1000); // test function +#endif + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_bin_float.*", // test type(s) + "Erf Function:.*", // test data group + "erfc?", 3000, 1000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<0>.*", // test type(s) + ".*", // test data group + ".*", 600, 100); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "Erf Function:.*", // test data group + "erfc?", 300, 200); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "Inverse Erf.*", // test data group + "erfc?_inv", 60, 20); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_erf(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_expint.cpp b/src/boost/libs/multiprecision/test/math/test_expint.cpp new file mode 100644 index 00000000..062dc675 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_expint.cpp @@ -0,0 +1,88 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_expint.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<18>.*", // test type(s) + ".*", // test data group + ".*", 2500, 1500); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*", // test data group + ".*", 1000, 500); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float.*", // test type(s) + ".*", // test data group + ".*", 250, 100); // test function +#ifdef BOOST_INTEL + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + "float128", // test type(s) + ".*", // test data group + ".*", 4500, 1000); // test function +#endif + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*cpp_bin_float.*", // test type(s) + ".*", // test data group + ".*", 5000, 2000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 250, 50); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_expint(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_gamma.cpp b/src/boost/libs/multiprecision/test/math/test_gamma.cpp new file mode 100644 index 00000000..473efd03 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_gamma.cpp @@ -0,0 +1,102 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_gamma.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<18>.*", // test type(s) + ".*", // test data group + "tgamma", 4000, 2500); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<0>.*", // test type(s) + "factorials", // test data group + "tgamma", 400, 100); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "factorials", // test data group + "tgamma", 170, 70); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "factorials", // test data group + "lgamma", 750, 100); // test function +#ifdef BOOST_INTEL + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + "float128", // test type(s) + ".*near -.*", // test data group + ".*", 150000L, 30000L); // test function +#endif + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "near.*", // test data group + "tgamma", 250, 120); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "near.*", // test data group + "lgamma", 1400, 250); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + "tgamma1pm1.*", // test data group + "tgamma1pm1", 1500, 400); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_gamma(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_hermite.cpp b/src/boost/libs/multiprecision/test/math/test_hermite.cpp new file mode 100644 index 00000000..361da399 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_hermite.cpp @@ -0,0 +1,60 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_hermite.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // +#ifdef BOOST_INTEL + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + "float128", // test type(s) + ".*", // test data group + "hermite", 70, 25); // test function +#endif + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + "hermite", 10, 5); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_hermite(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_ibeta.cpp b/src/boost/libs/multiprecision/test/math/test_ibeta.cpp new file mode 100644 index 00000000..7ac0338f --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_ibeta.cpp @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#define TEST_DATA 1 + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_ibeta.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*gmp_float<18>.*", // test type(s) + "(?i).*small.*", // test data group + ".*", 3000, 1000); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + "(?i).*small.*", // test data group + ".*", 2000, 500); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*mpfr_float_backend<0>.*", // test type(s) + "(?i).*small.*", // test data group + ".*", 1000, 100); // test function +#ifdef BOOST_INTEL + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + "float128", // test type(s) + "(?i).*small.*", // test data group + ".*", 500, 100); // test function +#endif + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*small.*", // test data group + ".*", 90, 25); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*medium.*", // test data group + ".*", 150, 50); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*large.*", // test data group + ".*", 5000, 500); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_beta(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_ibeta_2.cpp b/src/boost/libs/multiprecision/test/math/test_ibeta_2.cpp new file mode 100644 index 00000000..4e6bdafb --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_ibeta_2.cpp @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#define TEST_DATA 2 + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_ibeta.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*gmp_float<18>.*", // test type(s) + "(?i).*medium.*", // test data group + ".*", 4000, 1000); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + "(?i).*medium.*", // test data group + ".*", 20000, 1000); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*mpfr_float_backend<0>.*", // test type(s) + "(?i).*medium.*", // test data group + ".*", 400, 100); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*small.*", // test data group + ".*", 90, 25); // test function +#ifdef BOOST_INTEL + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + "float128", // test type(s) + "(?i).*medium.*", // test data group + ".*", 5000, 500); // test function +#endif + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*medium.*", // test data group + ".*", 220, 50); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*large.*", // test data group + ".*", 5000, 500); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_beta(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_ibeta_3.cpp b/src/boost/libs/multiprecision/test/math/test_ibeta_3.cpp new file mode 100644 index 00000000..57d15c2e --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_ibeta_3.cpp @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#define TEST_DATA 3 + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_ibeta.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*small.*", // test data group + ".*", 90, 25); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*medium.*", // test data group + ".*", 200, 50); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*large.*", // test data group + ".*", 6000000, 500000); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_beta(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_ibeta_4.cpp b/src/boost/libs/multiprecision/test/math/test_ibeta_4.cpp new file mode 100644 index 00000000..a2818bf7 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_ibeta_4.cpp @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#define TEST_DATA 4 + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_ibeta.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*small.*", // test data group + ".*", 4000, 1000); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*small.*", // test data group + ".*", 90, 25); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*medium.*", // test data group + ".*", 200, 50); // test function + add_expected_result( + "[^|]*", // compiler + "[^|]*", // stdlib + "[^|]*", // platform + ".*", // test type(s) + "(?i).*large.*", // test data group + ".*", 5000, 500); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_beta(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_ibeta_inv_1.cpp b/src/boost/libs/multiprecision/test/math/test_ibeta_inv_1.cpp new file mode 100644 index 00000000..603f303b --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_ibeta_inv_1.cpp @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#define TEST_DATA 4 + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_ibeta_inv.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<0>.*", // test type(s) + ".*", // test data group + ".*", 20000000, 1000000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<0>.*", // test type(s) + ".*", // test data group + ".*", 20000000, 1000000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*", // test data group + ".*", 50000000, 7000000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 1000000, 100000); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_beta(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_SMALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_ibeta_inv_ab_4.cpp b/src/boost/libs/multiprecision/test/math/test_ibeta_inv_ab_4.cpp new file mode 100644 index 00000000..f49c85c5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_ibeta_inv_ab_4.cpp @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#define TEST_DATA 4 +#define FULL_TEST + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_ibeta_inv_ab.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 10000, 1000); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_beta(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_igamma.cpp b/src/boost/libs/multiprecision/test/math/test_igamma.cpp new file mode 100644 index 00000000..562d3372 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_igamma.cpp @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_igamma.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*large.*", // test data group + ".*", 20000000L, 1000000L); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 7000, 2000); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_gamma(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_igamma_inv.cpp b/src/boost/libs/multiprecision/test/math/test_igamma_inv.cpp new file mode 100644 index 00000000..82bc88d5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_igamma_inv.cpp @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_igamma_inv.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<18>.*", // test type(s) + ".*small.*", // test data group + ".*", 2000000000L, 300000000L); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*small.*", // test data group + ".*", 30000000L, 20000000L); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*small.*", // test data group + ".*", 10000000L, 2500000L); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 7000, 2000); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_gamma(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_igamma_inva.cpp b/src/boost/libs/multiprecision/test/math/test_igamma_inva.cpp new file mode 100644 index 00000000..7b6db27d --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_igamma_inva.cpp @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_igamma_inva.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 7000, 2000); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_gamma(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_laguerre.cpp b/src/boost/libs/multiprecision/test/math/test_laguerre.cpp new file mode 100644 index 00000000..7bf6ea7a --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_laguerre.cpp @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_laguerre.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 7500, 500); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_laguerre(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_legendre.cpp b/src/boost/libs/multiprecision/test/math/test_legendre.cpp new file mode 100644 index 00000000..351f947c --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_legendre.cpp @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_legendre.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 6000, 500); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_legendre_p(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_tgamma_ratio.cpp b/src/boost/libs/multiprecision/test/math/test_tgamma_ratio.cpp new file mode 100644 index 00000000..3295f663 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_tgamma_ratio.cpp @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_tgamma_ratio.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*gmp_float<18>.*", // test type(s) + ".*", // test data group + ".*", 4000, 2000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*mpfr_float_backend<18>.*", // test type(s) + ".*", // test data group + ".*", 20000, 7000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 2000, 500); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_tgamma_ratio(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/math/test_zeta.cpp b/src/boost/libs/multiprecision/test/math/test_zeta.cpp new file mode 100644 index 00000000..cc42bbb3 --- /dev/null +++ b/src/boost/libs/multiprecision/test/math/test_zeta.cpp @@ -0,0 +1,68 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include "setup.hpp" +#include "table_type.hpp" +#define TEST_UDT + +#include <boost/math/special_functions/math_fwd.hpp> +#include "libs/math/test/test_zeta.hpp" + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*Random values less than 1", // test data group + ".*", 6000, 3000); // test function +#ifdef BOOST_INTEL + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + "float128", // test type(s) + ".*close to and less than 1.*", // test data group + ".*", 10000000L, 2000000L); // test function +#endif + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + ".*", 1000, 200); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +template <class T> +void test(T t, const char* p) +{ + test_zeta(t, p); +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + using namespace boost::multiprecision; + expected_results(); + // + // Test at: + // 9 decimal digits: tests the least wide arbitrary precision code + // 18 decimal digits: tests 80-bit long double approximations + // 30 decimal digits: tests 128-bit long double approximations + // 35 decimal digits: tests arbitrary precision code + // + ALL_TESTS +} diff --git a/src/boost/libs/multiprecision/test/no_eh_test_support.cpp b/src/boost/libs/multiprecision/test/no_eh_test_support.cpp new file mode 100644 index 00000000..23595073 --- /dev/null +++ b/src/boost/libs/multiprecision/test/no_eh_test_support.cpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2016 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/throw_exception.hpp> +#include <boost/config.hpp> + +#ifdef BOOST_NO_EXCEPTIONS + +#include <iostream> +#include <iomanip> + +namespace boost { + +void throw_exception(std::exception const& e) +{ + std::cerr << "Terminating with exception: " << e.what() << std::endl; +} + +} // namespace boost + +#else + +namespace boost { namespace detail { +void dummy_proc() {} +}} // namespace boost::detail + +#endif diff --git a/src/boost/libs/multiprecision/test/serial_txts/boost-no-inspect b/src/boost/libs/multiprecision/test/serial_txts/boost-no-inspect new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/boost/libs/multiprecision/test/serial_txts/boost-no-inspect diff --git a/src/boost/libs/multiprecision/test/serial_txts/cpp_int1024_serial32.txt b/src/boost/libs/multiprecision/test/serial_txts/cpp_int1024_serial32.txt new file mode 100644 index 00000000..d9e8452c --- /dev/null +++ b/src/boost/libs/multiprecision/test/serial_txts/cpp_int1024_serial32.txt @@ -0,0 +1 @@ +22 serialization::archive 10 0 0 0 0 0 108 240 216 207 212 25 178 183 244 196 236 95 147 174 198 156 135 30 192 249 71 150 58 81 90 83 157 31 192 97 218 61 242 6 92 59 181 100 93 130 250 188 246 144 44 168 35 244 193 47 12 158 190 153 204 174 128 206 100 236 32 18 126 89 123 194 22 35 211 231 76 148 27 235 109 5 183 33 227 88 207 58 215 251 252 155 139 128 94 102 109 67 113 84 50 31 117 129 72 215 77 164 152 225 243 6 0 0 0 1 108 240 216 207 212 25 178 183 244 196 236 95 147 174 198 156 135 30 192 249 71 150 58 81 90 83 157 31 192 97 218 61 242 6 92 59 181 100 93 130 250 188 246 144 44 168 35 244 193 47 12 158 190 153 204 174 128 206 100 236 32 18 126 89 123 194 22 35 211 231 76 148 27 235 109 5 183 33 227 88 207 58 215 251 252 155 139 128 94 102 109 67 113 84 50 31 117 129 72 215 77 164 152 225 243 6 0 0 0 0 20 233 110 98 40 22 77 153 193 59 146 80 175 250 132 156 155 86 10 0 0 1 20 233 110 98 40 22 77 153 193 59 146 80 175 250 132 156 155 86 10 0 0 0 116 195 197 234 211 167 46 136 167 128 33 88 13 108 237 91 62 12 92 69 154 204 29 67 225 108 76 250 33 86 106 195 35 211 56 231 162 75 128 234 92 136 184 82 7 210 243 108 153 53 77 201 114 146 101 203 238 16 127 62 157 89 147 7 159 33 49 73 121 45 71 184 101 48 57 231 136 53 32 117 91 72 53 49 149 132 120 220 38 202 141 199 61 152 225 162 88 241 96 97 235 194 95 106 102 77 171 141 79 25 171 118 0 150 152 162 225 1 116 195 197 234 211 167 46 136 167 128 33 88 13 108 237 91 62 12 92 69 154 204 29 67 225 108 76 250 33 86 106 195 35 211 56 231 162 75 128 234 92 136 184 82 7 210 243 108 153 53 77 201 114 146 101 203 238 16 127 62 157 89 147 7 159 33 49 73 121 45 71 184 101 48 57 231 136 53 32 117 91 72 53 49 149 132 120 220 38 202 141 199 61 152 225 162 88 241 96 97 235 194 95 106 102 77 171 141 79 25 171 118 0 150 152 162 225 0 108 52 251 142 48 154 38 230 245 135 197 116 187 16 93 121 73 166 67 73 14 108 247 153 173 155 1 1 27 39 117 50 208 104 14 143 42 205 185 79 111 156 236 127 179 134 12 211 3 186 248 224 18 111 115 8 241 120 193 95 162 144 223 81 125 100 15 75 159 151 135 167 7 105 70 42 112 187 150 50 81 238 10 88 7 185 247 8 238 5 251 173 132 245 18 238 209 93 5 153 183 17 250 77 56 125 31 2 0 1 108 52 251 142 48 154 38 230 245 135 197 116 187 16 93 121 73 166 67 73 14 108 247 153 173 155 1 1 27 39 117 50 208 104 14 143 42 205 185 79 111 156 236 127 179 134 12 211 3 186 248 224 18 111 115 8 241 120 193 95 162 144 223 81 125 100 15 75 159 151 135 167 7 105 70 42 112 187 150 50 81 238 10 88 7 185 247 8 238 5 251 173 132 245 18 238 209 93 5 153 183 17 250 77 56 125 31 2 0 0 20 197 207 215 162 39 250 228 2 55 205 156 2 210 250 185 127 9 0 0 0 1 20 197 207 215 162 39 250 228 2 55 205 156 2 210 250 185 127 9 0 0 0 0 124 24 227 82 233 197 174 88 134 19 71 12 155 49 99 207 184 189 139 213 148 142 65 83 22 86 59 113 20 118 242 15 207 165 34 25 223 113 59 30 140 39 47 19 17 91 233 70 193 187 55 81 125 94 114 235 6 80 26 251 206 129 223 96 50 3 188 107 248 74 130 151 7 40 68 162 241 8 76 185 168 192 189 109 17 104 12 100 42 186 31 15 28 113 72 249 213 10 120 161 189 54 95 145 140 93 52 223 83 153 80 25 250 68 102 71 63 122 51 3 222 201 139 253 189 1 124 24 227 82 233 197 174 88 134 19 71 12 155 49 99 207 184 189 139 213 148 142 65 83 22 86 59 113 20 118 242 15 207 165 34 25 223 113 59 30 140 39 47 19 17 91 233 70 193 187 55 81 125 94 114 235 6 80 26 251 206 129 223 96 50 3 188 107 248 74 130 151 7 40 68 162 241 8 76 185 168 192 189 109 17 104 12 100 42 186 31 15 28 113 72 249 213 10 120 161 189 54 95 145 140 93 52 223 83 153 80 25 250 68 102 71 63 122 51 3 222 201 139 253 189 0 120 84 215 85 155 83 224 217 17 152 203 112 82 122 193 196 197 212 174 168 135 168 249 185 103 45 35 64 229 91 250 210 186 58 210 182 98 118 15 126 35 18 69 254 92 98 253 202 81 186 80 212 23 15 9 32 39 1 22 16 116 63 86 191 203 58 113 189 250 81 8 87 78 224 55 184 247 69 246 57 99 3 71 4 32 58 206 214 203 112 60 52 83 234 29 3 197 37 251 251 84 166 130 63 190 142 0 143 110 160 134 104 117 192 171 252 58 243 0 0 0 1 120 84 215 85 155 83 224 217 17 152 203 112 82 122 193 196 197 212 174 168 135 168 249 185 103 45 35 64 229 91 250 210 186 58 210 182 98 118 15 126 35 18 69 254 92 98 253 202 81 186 80 212 23 15 9 32 39 1 22 16 116 63 86 191 203 58 113 189 250 81 8 87 78 224 55 184 247 69 246 57 99 3 71 4 32 58 206 214 203 112 60 52 83 234 29 3 197 37 251 251 84 166 130 63 190 142 0 143 110 160 134 104 117 192 171 252 58 243 0 0 0 0 32 75 106 211 223 67 33 39 159 137 42 62 13 132 4 148 172 13 129 231 52 23 5 189 177 132 71 127 112 12 0 0 0 1 32 75 106 211 223 67 33 39 159 137 42 62 13 132 4 148 172 13 129 231 52 23 5 189 177 132 71 127 112 12 0 0 0 0 84 71 66 188 102 218 45 89 79 100 203 161 190 29 126 44 173 44 86 244 243 53 45 157 176 5 233 73 112 206 44 106 109 159 71 109 87 77 104 184 44 147 80 22 206 180 74 221 169 143 209 179 215 195 26 222 89 28 178 48 206 169 22 229 44 34 14 33 215 159 185 161 56 150 95 20 128 199 66 223 66 113 0 0 0 1 84 71 66 188 102 218 45 89 79 100 203 161 190 29 126 44 173 44 86 244 243 53 45 157 176 5 233 73 112 206 44 106 109 159 71 109 87 77 104 184 44 147 80 22 206 180 74 221 169 143 209 179 215 195 26 222 89 28 178 48 206 169 22 229 44 34 14 33 215 159 185 161 56 150 95 20 128 199 66 223 66 113 0 0 0 0 40 74 104 149 210 252 235 123 239 168 56 124 239 105 91 87 48 183 253 146 69 244 5 94 42 167 100 207 53 34 116 207 197 97 199 198 121 102 204 246 31 1 40 74 104 149 210 252 235 123 239 168 56 124 239 105 91 87 48 183 253 146 69 244 5 94 42 167 100 207 53 34 116 207 197 97 199 198 121 102 204 246 31 0 16 127 135 241 163 116 139 210 196 195 216 24 255 21 0 0 0 1 16 127 135 241 163 116 139 210 196 195 216 24 255 21 0 0 0 0 72 150 29 179 100 132 144 156 216 95 57 162 101 198 179 215 51 244 149 122 162 171 105 83 53 56 158 83 10 80 190 228 125 131 48 41 93 2 177 156 179 17 217 253 155 46 30 105 35 223 134 100 76 170 35 206 233 252 210 117 27 160 154 210 45 234 95 74 76 159 147 2 0 1 72 150 29 179 100 132 144 156 216 95 57 162 101 198 179 215 51 244 149 122 162 171 105 83 53 56 158 83 10 80 190 228 125 131 48 41 93 2 177 156 179 17 217 253 155 46 30 105 35 223 134 100 76 170 35 206 233 252 210 117 27 160 154 210 45 234 95 74 76 159 147 2 0 0 36 220 123 216 188 130 233 64 162 111 163 35 146 32 32 192 228 163 205 248 224 147 90 97 37 29 2 241 105 156 63 40 242 105 209 126 40 1 36 220 123 216 188 130 233 64 162 111 163 35 146 32 32 192 228 163 205 248 224 147 90 97 37 29 2 241 105 156 63 40 242 105 209 126 40 0 28 230 134 234 52 30 2 41 143 232 97 74 82 171 119 128 41 82 147 155 86 202 151 8 81 3 0 0 0 1 28 230 134 234 52 30 2 41 143 232 97 74 82 171 119 128 41 82 147 155 86 202 151 8 81 3 0 0 0 0 72 15 249 15 27 178 199 148 79 23 3 197 198 33 75 3 164 156 4 165 168 224 178 69 133 25 107 103 207 249 91 170 31 103 38 157 136 237 182 137 145 28 255 143 214 212 22 229 64 150 206 235 209 33 197 227 224 182 51 28 205 88 80 228 111 77 96 3 34 184 34 1 0 1 72 15 249 15 27 178 199 148 79 23 3 197 198 33 75 3 164 156 4 165 168 224 178 69 133 25 107 103 207 249 91 170 31 103 38 157 136 237 182 137 145 28 255 143 214 212 22 229 64 150 206 235 209 33 197 227 224 182 51 28 205 88 80 228 111 77 96 3 34 184 34 1 0 0 128 218 44 245 9 8 123 94 221 100 47 84 11 243 15 172 179 239 47 175 194 3 71 55 191 38 122 159 236 92 247 18 47 19 56 134 218 188 171 164 240 122 46 184 162 129 134 174 138 64 233 80 170 255 199 102 146 231 63 160 16 196 95 226 19 153 123 117 200 46 233 120 129 83 125 132 105 126 85 36 229 17 65 127 187 245 154 8 240 255 6 80 120 99 170 69 125 132 67 244 85 139 199 7 155 182 253 26 132 174 228 45 164 121 122 120 13 138 138 103 108 205 110 58 205 79 100 212 0 1 128 218 44 245 9 8 123 94 221 100 47 84 11 243 15 172 179 239 47 175 194 3 71 55 191 38 122 159 236 92 247 18 47 19 56 134 218 188 171 164 240 122 46 184 162 129 134 174 138 64 233 80 170 255 199 102 146 231 63 160 16 196 95 226 19 153 123 117 200 46 233 120 129 83 125 132 105 126 85 36 229 17 65 127 187 245 154 8 240 255 6 80 120 99 170 69 125 132 67 244 85 139 199 7 155 182 253 26 132 174 228 45 164 121 122 120 13 138 138 103 108 205 110 58 205 79 100 212 0 0 124 42 11 175 85 234 29 127 39 168 190 213 6 131 53 241 65 78 99 129 50 177 192 60 169 254 225 53 185 10 30 128 144 147 118 226 21 168 226 101 136 76 35 162 12 195 5 204 132 123 33 134 136 228 63 232 165 209 64 49 61 69 88 217 222 49 226 15 38 80 170 183 154 76 90 32 162 103 214 88 163 4 232 2 248 216 110 84 43 233 82 171 178 169 49 99 13 2 111 187 145 184 169 169 143 134 196 5 58 127 58 229 193 147 117 193 58 158 31 111 94 152 222 23 0 1 124 42 11 175 85 234 29 127 39 168 190 213 6 131 53 241 65 78 99 129 50 177 192 60 169 254 225 53 185 10 30 128 144 147 118 226 21 168 226 101 136 76 35 162 12 195 5 204 132 123 33 134 136 228 63 232 165 209 64 49 61 69 88 217 222 49 226 15 38 80 170 183 154 76 90 32 162 103 214 88 163 4 232 2 248 216 110 84 43 233 82 171 178 169 49 99 13 2 111 187 145 184 169 169 143 134 196 5 58 127 58 229 193 147 117 193 58 158 31 111 94 152 222 23 0 0 128 117 32 231 128 78 121 139 240 228 103 68 36 169 251 164 16 50 57 142 227 5 246 77 80 110 198 12 68 1 149 50 69 54 143 139 95 198 108 21 41 162 236 219 40 173 104 226 58 15 180 5 40 31 118 13 168 210 43 211 239 7 182 203 237 162 68 33 8 250 179 25 22 162 85 109 252 238 129 170 97 47 77 76 109 6 111 254 168 196 19 35 76 81 88 241 48 255 104 111 142 75 147 180 52 99 76 255 134 237 245 122 252 21 255 187 122 115 41 176 130 69 131 13 23 37 127 20 3 1 128 117 32 231 128 78 121 139 240 228 103 68 36 169 251 164 16 50 57 142 227 5 246 77 80 110 198 12 68 1 149 50 69 54 143 139 95 198 108 21 41 162 236 219 40 173 104 226 58 15 180 5 40 31 118 13 168 210 43 211 239 7 182 203 237 162 68 33 8 250 179 25 22 162 85 109 252 238 129 170 97 47 77 76 109 6 111 254 168 196 19 35 76 81 88 241 48 255 104 111 142 75 147 180 52 99 76 255 134 237 245 122 252 21 255 187 122 115 41 176 130 69 131 13 23 37 127 20 3 0 124 225 196 245 38 129 95 130 255 14 194 101 192 198 28 5 135 65 33 59 109 254 232 229 27 245 239 185 134 58 127 181 232 77 234 159 110 69 82 234 174 133 243 107 210 244 202 250 155 41 109 253 34 38 165 23 103 75 242 126 154 90 16 155 40 180 198 123 44 56 133 74 228 20 41 104 110 42 251 181 50 43 108 181 28 98 126 48 202 202 240 10 236 228 75 105 111 132 35 221 75 171 251 197 139 242 114 49 206 195 33 149 113 119 94 226 71 220 139 93 218 202 156 199 9 1 124 225 196 245 38 129 95 130 255 14 194 101 192 198 28 5 135 65 33 59 109 254 232 229 27 245 239 185 134 58 127 181 232 77 234 159 110 69 82 234 174 133 243 107 210 244 202 250 155 41 109 253 34 38 165 23 103 75 242 126 154 90 16 155 40 180 198 123 44 56 133 74 228 20 41 104 110 42 251 181 50 43 108 181 28 98 126 48 202 202 240 10 236 228 75 105 111 132 35 221 75 171 251 197 139 242 114 49 206 195 33 149 113 119 94 226 71 220 139 93 218 202 156 199 9 0 124 130 190 211 115 201 224 67 206 209 66 76 220 164 193 3 192 104 19 174 139 21 103 49 247 223 227 161 141 190 242 11 120 201 238 152 120 157 159 206 140 138 29 151 173 117 118 102 209 136 234 50 127 131 161 166 19 148 165 245 82 205 11 104 226 229 91 148 136 10 234 81 120 171 169 131 54 235 207 59 211 127 77 24 204 157 197 253 233 237 199 174 3 72 33 142 5 218 73 26 111 135 205 112 166 233 98 13 15 33 27 131 103 119 191 23 179 123 179 24 99 136 111 206 103 1 124 130 190 211 115 201 224 67 206 209 66 76 220 164 193 3 192 104 19 174 139 21 103 49 247 223 227 161 141 190 242 11 120 201 238 152 120 157 159 206 140 138 29 151 173 117 118 102 209 136 234 50 127 131 161 166 19 148 165 245 82 205 11 104 226 229 91 148 136 10 234 81 120 171 169 131 54 235 207 59 211 127 77 24 204 157 197 253 233 237 199 174 3 72 33 142 5 218 73 26 111 135 205 112 166 233 98 13 15 33 27 131 103 119 191 23 179 123 179 24 99 136 111 206 103 0 24 236 146 150 122 80 138 70 55 218 171 50 71 53 136 214 55 85 125 93 128 4 0 0 0 1 24 236 146 150 122 80 138 70 55 218 171 50 71 53 136 214 55 85 125 93 128 4 0 0 0 0 96 168 120 24 52 192 139 221 73 242 242 97 74 214 206 178 206 134 205 255 80 249 81 103 62 255 235 105 87 255 215 122 234 6 85 194 142 4 80 39 228 210 83 78 57 126 13 175 79 207 117 247 77 43 53 164 8 185 89 108 206 201 3 63 111 26 179 169 0 252 20 51 5 213 56 133 204 63 19 45 245 58 168 12 87 82 182 175 2 1 111 83 252 59 0 0 0 1 96 168 120 24 52 192 139 221 73 242 242 97 74 214 206 178 206 134 205 255 80 249 81 103 62 255 235 105 87 255 215 122 234 6 85 194 142 4 80 39 228 210 83 78 57 126 13 175 79 207 117 247 77 43 53 164 8 185 89 108 206 201 3 63 111 26 179 169 0 252 20 51 5 213 56 133 204 63 19 45 245 58 168 12 87 82 182 175 2 1 111 83 252 59 0 0 0 0 128 185 132 187 44 241 228 100 105 22 119 238 94 124 126 113 117 10 214 51 133 149 172 201 211 213 121 160 34 164 142 116 97 112 84 155 255 6 108 94 78 4 233 188 142 66 190 97 40 135 40 45 103 104 89 35 225 9 229 254 125 210 134 186 83 219 39 156 96 79 116 202 44 226 193 33 197 237 19 205 187 104 142 222 208 110 38 156 236 173 194 237 92 12 94 102 228 230 145 128 127 23 155 108 123 159 28 189 122 77 188 51 141 193 44 74 135 72 161 176 196 25 238 215 249 1 0 0 0 1 128 185 132 187 44 241 228 100 105 22 119 238 94 124 126 113 117 10 214 51 133 149 172 201 211 213 121 160 34 164 142 116 97 112 84 155 255 6 108 94 78 4 233 188 142 66 190 97 40 135 40 45 103 104 89 35 225 9 229 254 125 210 134 186 83 219 39 156 96 79 116 202 44 226 193 33 197 237 19 205 187 104 142 222 208 110 38 156 236 173 194 237 92 12 94 102 228 230 145 128 127 23 155 108 123 159 28 189 122 77 188 51 141 193 44 74 135 72 161 176 196 25 238 215 249 1 0 0 0 0 128 196 189 1 242 155 244 232 152 101 227 3 217 39 244 236 150 9 178 16 175 212 22 120 54 105 227 225 242 229 156 121 86 139 227 54 127 184 190 41 133 3 17 52 18 138 148 221 246 233 48 84 88 59 192 24 21 252 227 123 179 109 113 77 255 247 152 43 152 181 143 190 106 157 133 109 3 97 155 223 142 24 220 123 209 115 48 134 39 181 47 225 199 64 0 47 19 50 112 64 18 160 79 199 188 82 123 15 244 22 146 43 21 149 157 118 9 188 127 178 30 174 37 125 174 1 17 0 0 1 128 196 189 1 242 155 244 232 152 101 227 3 217 39 244 236 150 9 178 16 175 212 22 120 54 105 227 225 242 229 156 121 86 139 227 54 127 184 190 41 133 3 17 52 18 138 148 221 246 233 48 84 88 59 192 24 21 252 227 123 179 109 113 77 255 247 152 43 152 181 143 190 106 157 133 109 3 97 155 223 142 24 220 123 209 115 48 134 39 181 47 225 199 64 0 47 19 50 112 64 18 160 79 199 188 82 123 15 244 22 146 43 21 149 157 118 9 188 127 178 30 174 37 125 174 1 17 0 0 0 124 125 72 103 215 83 251 97 191 63 231 211 75 247 3 48 39 242 99 75 38 207 10 64 114 118 90 122 122 77 183 190 7 147 103 181 244 49 65 243 162 67 68 8 208 134 116 48 95 95 233 35 252 112 16 102 203 11 124 40 193 161 239 28 210 11 139 204 89 203 38 245 182 150 96 26 18 46 113 77 175 20 177 91 174 135 42 135 219 19 174 215 57 19 213 152 24 76 23 175 160 29 5 177 176 24 219 163 255 97 214 199 54 191 77 15 45 73 191 156 156 85 231 7 0 1 124 125 72 103 215 83 251 97 191 63 231 211 75 247 3 48 39 242 99 75 38 207 10 64 114 118 90 122 122 77 183 190 7 147 103 181 244 49 65 243 162 67 68 8 208 134 116 48 95 95 233 35 252 112 16 102 203 11 124 40 193 161 239 28 210 11 139 204 89 203 38 245 182 150 96 26 18 46 113 77 175 20 177 91 174 135 42 135 219 19 174 215 57 19 213 152 24 76 23 175 160 29 5 177 176 24 219 163 255 97 214 199 54 191 77 15 45 73 191 156 156 85 231 7 0 0 16 252 17 170 79 122 224 151 223 165 53 141 155 37 87 4 0 1 16 252 17 170 79 122 224 151 223 165 53 141 155 37 87 4 0 0 64 137 35 96 204 136 177 189 143 1 212 169 28 91 106 152 238 147 179 84 155 35 195 77 99 22 143 175 243 178 108 188 125 52 89 146 208 125 21 94 228 98 194 201 165 96 57 144 208 56 103 133 48 45 120 4 182 247 48 112 89 188 153 1 0 1 64 137 35 96 204 136 177 189 143 1 212 169 28 91 106 152 238 147 179 84 155 35 195 77 99 22 143 175 243 178 108 188 125 52 89 146 208 125 21 94 228 98 194 201 165 96 57 144 208 56 103 133 48 45 120 4 182 247 48 112 89 188 153 1 0 0 104 243 59 23 181 19 206 54 217 4 43 183 169 25 245 43 129 181 198 110 56 213 123 240 160 71 185 170 96 174 21 188 158 209 73 67 245 248 18 139 233 181 53 185 30 209 172 198 74 139 145 21 133 168 4 186 236 48 15 19 25 234 227 177 154 240 64 215 74 77 178 193 160 155 223 234 55 201 144 185 140 71 87 18 218 192 168 98 86 67 205 126 50 211 88 59 69 53 208 210 119 1 82 1 0 1 104 243 59 23 181 19 206 54 217 4 43 183 169 25 245 43 129 181 198 110 56 213 123 240 160 71 185 170 96 174 21 188 158 209 73 67 245 248 18 139 233 181 53 185 30 209 172 198 74 139 145 21 133 168 4 186 236 48 15 19 25 234 227 177 154 240 64 215 74 77 178 193 160 155 223 234 55 201 144 185 140 71 87 18 218 192 168 98 86 67 205 126 50 211 88 59 69 53 208 210 119 1 82 1 0 0 104 30 237 199 208 43 126 134 188 221 77 44 64 109 31 47 206 70 172 101 140 66 232 0 138 101 218 81 243 45 157 119 221 30 64 253 209 50 12 45 150 152 200 9 167 220 210 114 70 151 149 141 34 162 151 188 82 189 246 149 204 99 143 240 240 11 119 55 107 27 196 176 61 52 227 44 160 102 215 226 28 36 252 136 5 162 100 95 194 183 2 28 199 117 193 177 41 170 115 62 93 181 186 1 0 1 104 30 237 199 208 43 126 134 188 221 77 44 64 109 31 47 206 70 172 101 140 66 232 0 138 101 218 81 243 45 157 119 221 30 64 253 209 50 12 45 150 152 200 9 167 220 210 114 70 151 149 141 34 162 151 188 82 189 246 149 204 99 143 240 240 11 119 55 107 27 196 176 61 52 227 44 160 102 215 226 28 36 252 136 5 162 100 95 194 183 2 28 199 117 193 177 41 170 115 62 93 181 186 1 0 0 40 53 120 130 161 159 72 98 85 190 182 236 225 240 60 214 46 141 103 182 195 63 222 96 51 133 198 58 90 110 132 208 137 203 153 172 98 79 220 0 0 1 40 53 120 130 161 159 72 98 85 190 182 236 225 240 60 214 46 141 103 182 195 63 222 96 51 133 198 58 90 110 132 208 137 203 153 172 98 79 220 0 0 0 20 118 29 12 161 58 173 221 244 97 16 129 132 213 223 100 52 220 195 7 0 1 20 118 29 12 161 58 173 221 244 97 16 129 132 213 223 100 52 220 195 7 0 0 4 48 0 0 0 1 4 48 0 0 0 0 56 231 92 254 163 124 164 150 140 111 46 208 48 245 131 79 191 167 93 72 251 225 197 183 198 127 122 236 47 16 214 74 14 201 193 171 20 118 155 238 33 155 90 192 58 99 154 59 127 53 8 120 227 43 170 1 0 1 56 231 92 254 163 124 164 150 140 111 46 208 48 245 131 79 191 167 93 72 251 225 197 183 198 127 122 236 47 16 214 74 14 201 193 171 20 118 155 238 33 155 90 192 58 99 154 59 127 53 8 120 227 43 170 1 0 0 16 251 177 154 124 124 51 12 184 170 246 21 206 136 0 6 0 1 16 251 177 154 124 124 51 12 184 170 246 21 206 136 0 6 0 0 120 135 228 154 97 97 37 218 64 185 90 19 175 246 80 210 161 113 157 100 67 139 11 67 170 100 55 10 137 62 200 98 216 164 1 43 71 31 156 64 144 57 219 81 105 211 65 2 203 127 45 87 116 177 120 38 220 221 127 219 9 89 68 112 249 96 102 183 83 157 239 104 243 95 199 142 2 33 66 225 186 67 111 177 72 133 48 17 239 26 98 202 8 125 61 65 118 6 55 147 154 167 90 0 162 128 74 17 187 146 174 37 228 190 12 117 100 32 3 0 0 1 120 135 228 154 97 97 37 218 64 185 90 19 175 246 80 210 161 113 157 100 67 139 11 67 170 100 55 10 137 62 200 98 216 164 1 43 71 31 156 64 144 57 219 81 105 211 65 2 203 127 45 87 116 177 120 38 220 221 127 219 9 89 68 112 249 96 102 183 83 157 239 104 243 95 199 142 2 33 66 225 186 67 111 177 72 133 48 17 239 26 98 202 8 125 61 65 118 6 55 147 154 167 90 0 162 128 74 17 187 146 174 37 228 190 12 117 100 32 3 0 0 0 84 26 161 163 242 118 221 0 66 192 252 133 199 57 227 98 231 11 157 63 23 214 37 26 128 100 49 131 94 235 250 249 147 154 51 50 25 98 235 243 5 108 187 118 252 12 79 151 103 7 110 124 8 167 181 214 104 91 65 119 78 66 98 82 217 239 238 114 229 245 1 243 155 98 149 133 248 106 172 101 16 223 244 0 0 1 84 26 161 163 242 118 221 0 66 192 252 133 199 57 227 98 231 11 157 63 23 214 37 26 128 100 49 131 94 235 250 249 147 154 51 50 25 98 235 243 5 108 187 118 252 12 79 151 103 7 110 124 8 167 181 214 104 91 65 119 78 66 98 82 217 239 238 114 229 245 1 243 155 98 149 133 248 106 172 101 16 223 244 0 0 0 104 51 242 193 71 40 33 244 183 39 87 209 231 123 23 102 244 164 169 195 247 118 193 238 212 202 61 62 28 173 71 226 3 123 32 247 24 21 127 54 196 17 12 180 107 10 66 175 208 88 113 145 18 93 77 231 82 5 172 142 122 173 202 80 213 151 67 189 246 154 57 40 60 62 225 173 49 197 99 197 109 106 160 126 116 179 205 235 122 139 21 129 249 231 216 211 119 4 117 66 52 193 10 0 0 1 104 51 242 193 71 40 33 244 183 39 87 209 231 123 23 102 244 164 169 195 247 118 193 238 212 202 61 62 28 173 71 226 3 123 32 247 24 21 127 54 196 17 12 180 107 10 66 175 208 88 113 145 18 93 77 231 82 5 172 142 122 173 202 80 213 151 67 189 246 154 57 40 60 62 225 173 49 197 99 197 109 106 160 126 116 179 205 235 122 139 21 129 249 231 216 211 119 4 117 66 52 193 10 0 0 0 116 117 133 12 7 22 147 126 60 222 126 15 234 208 110 144 185 13 98 7 11 209 57 121 79 194 58 253 148 206 85 251 165 5 213 112 244 92 244 25 196 40 68 91 10 147 74 13 72 165 3 119 45 32 170 129 46 133 146 166 13 69 50 36 228 124 251 190 233 4 155 225 95 178 231 135 226 223 143 88 24 162 178 240 101 140 125 124 184 151 110 254 193 242 30 230 88 55 219 178 42 54 111 9 248 91 46 181 248 183 164 152 211 7 0 0 0 1 116 117 133 12 7 22 147 126 60 222 126 15 234 208 110 144 185 13 98 7 11 209 57 121 79 194 58 253 148 206 85 251 165 5 213 112 244 92 244 25 196 40 68 91 10 147 74 13 72 165 3 119 45 32 170 129 46 133 146 166 13 69 50 36 228 124 251 190 233 4 155 225 95 178 231 135 226 223 143 88 24 162 178 240 101 140 125 124 184 151 110 254 193 242 30 230 88 55 219 178 42 54 111 9 248 91 46 181 248 183 164 152 211 7 0 0 0 0 124 63 77 192 16 39 116 41 118 84 43 197 253 236 106 62 1 183 234 241 28 170 49 21 191 231 212 161 33 61 235 39 160 228 125 57 52 78 189 69 47 1 79 177 75 103 238 153 2 38 182 148 88 116 210 38 64 96 188 136 248 75 74 182 169 213 110 205 104 170 28 203 171 146 250 72 188 184 135 129 123 246 18 94 241 239 179 131 133 192 152 204 226 228 3 166 119 222 138 54 116 129 186 64 160 210 30 139 163 195 186 2 85 155 194 170 83 132 36 74 216 27 254 85 0 1 124 63 77 192 16 39 116 41 118 84 43 197 253 236 106 62 1 183 234 241 28 170 49 21 191 231 212 161 33 61 235 39 160 228 125 57 52 78 189 69 47 1 79 177 75 103 238 153 2 38 182 148 88 116 210 38 64 96 188 136 248 75 74 182 169 213 110 205 104 170 28 203 171 146 250 72 188 184 135 129 123 246 18 94 241 239 179 131 133 192 152 204 226 228 3 166 119 222 138 54 116 129 186 64 160 210 30 139 163 195 186 2 85 155 194 170 83 132 36 74 216 27 254 85 0 0 68 216 172 85 194 158 216 82 110 65 133 85 128 49 103 72 173 54 61 199 26 210 206 103 163 37 220 221 193 233 238 254 54 206 213 124 6 203 165 26 21 241 141 165 246 128 184 43 72 242 66 159 97 79 134 33 147 97 136 247 186 217 103 81 199 29 0 0 0 1 68 216 172 85 194 158 216 82 110 65 133 85 128 49 103 72 173 54 61 199 26 210 206 103 163 37 220 221 193 233 238 254 54 206 213 124 6 203 165 26 21 241 141 165 246 128 184 43 72 242 66 159 97 79 134 33 147 97 136 247 186 217 103 81 199 29 0 0 0 0 88 198 204 237 247 146 195 97 49 165 23 187 22 34 150 126 136 183 220 165 82 194 13 172 190 161 249 20 192 177 147 243 49 113 56 111 194 238 6 98 97 129 35 110 42 246 44 179 219 221 190 182 94 40 254 25 246 171 109 11 181 1 138 90 3 209 233 133 179 57 67 179 0 223 103 18 74 138 136 231 35 199 161 29 157 1 0 0 0 1 88 198 204 237 247 146 195 97 49 165 23 187 22 34 150 126 136 183 220 165 82 194 13 172 190 161 249 20 192 177 147 243 49 113 56 111 194 238 6 98 97 129 35 110 42 246 44 179 219 221 190 182 94 40 254 25 246 171 109 11 181 1 138 90 3 209 233 133 179 57 67 179 0 223 103 18 74 138 136 231 35 199 161 29 157 1 0 0 0 0 104 200 111 223 113 76 183 17 189 185 203 122 115 218 100 205 191 105 223 132 140 147 126 199 180 195 206 12 73 110 39 71 147 85 229 115 193 236 45 39 98 81 104 24 231 243 122 80 84 171 200 163 28 188 108 159 81 0 102 179 40 112 195 41 169 248 78 181 155 111 130 188 233 129 78 9 71 59 223 40 71 154 214 88 94 144 232 156 144 221 110 76 114 52 34 145 84 178 218 142 15 103 173 3 0 1 104 200 111 223 113 76 183 17 189 185 203 122 115 218 100 205 191 105 223 132 140 147 126 199 180 195 206 12 73 110 39 71 147 85 229 115 193 236 45 39 98 81 104 24 231 243 122 80 84 171 200 163 28 188 108 159 81 0 102 179 40 112 195 41 169 248 78 181 155 111 130 188 233 129 78 9 71 59 223 40 71 154 214 88 94 144 232 156 144 221 110 76 114 52 34 145 84 178 218 142 15 103 173 3 0 0 8 177 137 11 132 66 0 0 0 1 8 177 137 11 132 66 0 0 0 0 48 33 167 44 60 43 5 212 10 233 199 142 141 206 188 38 153 75 245 28 138 78 90 196 228 196 226 63 171 99 123 61 129 93 169 246 14 54 98 199 66 102 119 74 122 163 104 13 0 1 48 33 167 44 60 43 5 212 10 233 199 142 141 206 188 38 153 75 245 28 138 78 90 196 228 196 226 63 171 99 123 61 129 93 169 246 14 54 98 199 66 102 119 74 122 163 104 13 0 0 112 13 142 178 152 223 193 158 172 255 203 197 100 76 79 42 99 97 196 198 42 60 211 249 142 174 154 123 158 254 134 251 235 151 207 55 209 178 137 7 234 137 81 211 255 191 135 78 179 11 30 121 13 152 88 34 61 56 32 249 153 111 6 135 83 62 197 83 191 163 251 20 161 116 248 36 161 123 44 251 45 216 82 212 120 237 125 134 142 89 7 182 228 191 54 121 104 50 110 8 142 248 42 214 76 253 13 190 143 50 0 0 0 1 112 13 142 178 152 223 193 158 172 255 203 197 100 76 79 42 99 97 196 198 42 60 211 249 142 174 154 123 158 254 134 251 235 151 207 55 209 178 137 7 234 137 81 211 255 191 135 78 179 11 30 121 13 152 88 34 61 56 32 249 153 111 6 135 83 62 197 83 191 163 251 20 161 116 248 36 161 123 44 251 45 216 82 212 120 237 125 134 142 89 7 182 228 191 54 121 104 50 110 8 142 248 42 214 76 253 13 190 143 50 0 0 0 0 28 135 115 67 224 57 26 67 50 161 116 97 239 175 143 9 168 232 95 142 29 48 16 121 194 48 241 158 6 1 28 135 115 67 224 57 26 67 50 161 116 97 239 175 143 9 168 232 95 142 29 48 16 121 194 48 241 158 6 0 120 179 69 194 42 93 120 64 237 75 176 251 199 63 49 12 217 68 117 60 17 14 70 160 57 29 60 226 156 164 120 98 6 241 147 20 139 159 7 106 210 46 18 44 209 147 45 254 121 230 97 80 19 35 222 34 109 179 236 84 205 123 213 217 33 100 118 217 223 98 205 210 213 162 16 151 66 225 173 235 73 110 112 76 172 232 124 30 64 29 119 3 178 184 119 33 176 53 248 40 157 126 127 125 242 209 202 221 233 124 59 53 81 231 151 52 49 122 224 122 27 1 120 179 69 194 42 93 120 64 237 75 176 251 199 63 49 12 217 68 117 60 17 14 70 160 57 29 60 226 156 164 120 98 6 241 147 20 139 159 7 106 210 46 18 44 209 147 45 254 121 230 97 80 19 35 222 34 109 179 236 84 205 123 213 217 33 100 118 217 223 98 205 210 213 162 16 151 66 225 173 235 73 110 112 76 172 232 124 30 64 29 119 3 178 184 119 33 176 53 248 40 157 126 127 125 242 209 202 221 233 124 59 53 81 231 151 52 49 122 224 122 27 0 88 202 249 247 72 190 100 43 14 53 119 130 14 137 197 240 200 81 190 103 225 158 134 179 33 43 177 147 126 191 141 162 245 224 193 132 144 147 134 16 189 234 157 212 246 176 172 112 191 110 66 141 195 94 234 133 171 20 190 248 55 25 132 147 148 135 183 201 74 89 229 183 214 200 16 91 233 10 37 163 27 133 153 134 93 213 152 142 7 1 88 202 249 247 72 190 100 43 14 53 119 130 14 137 197 240 200 81 190 103 225 158 134 179 33 43 177 147 126 191 141 162 245 224 193 132 144 147 134 16 189 234 157 212 246 176 172 112 191 110 66 141 195 94 234 133 171 20 190 248 55 25 132 147 148 135 183 201 74 89 229 183 214 200 16 91 233 10 37 163 27 133 153 134 93 213 152 142 7 0 88 77 103 16 15 148 98 115 149 166 118 218 10 199 232 124 175 175 165 211 217 182 127 122 39 230 51 107 111 80 51 18 145 177 162 46 2 119 80 163 33 253 187 253 121 34 222 134 85 8 230 102 107 120 117 240 151 81 89 38 47 90 107 129 149 16 144 78 38 26 58 78 61 163 182 119 241 129 192 139 249 183 46 39 109 17 15 240 0 1 88 77 103 16 15 148 98 115 149 166 118 218 10 199 232 124 175 175 165 211 217 182 127 122 39 230 51 107 111 80 51 18 145 177 162 46 2 119 80 163 33 253 187 253 121 34 222 134 85 8 230 102 107 120 117 240 151 81 89 38 47 90 107 129 149 16 144 78 38 26 58 78 61 163 182 119 241 129 192 139 249 183 46 39 109 17 15 240 0 0 52 234 213 76 110 121 53 109 162 71 58 96 120 32 67 142 4 161 13 37 85 104 226 206 115 224 160 35 117 179 108 202 225 198 59 157 91 182 20 254 20 5 196 54 221 64 27 198 127 155 96 99 2 1 52 234 213 76 110 121 53 109 162 71 58 96 120 32 67 142 4 161 13 37 85 104 226 206 115 224 160 35 117 179 108 202 225 198 59 157 91 182 20 254 20 5 196 54 221 64 27 198 127 155 96 99 2 0 100 130 27 80 132 149 206 104 74 186 108 76 162 61 90 101 136 56 238 26 128 103 13 215 175 217 2 94 203 185 103 235 57 73 179 67 251 148 153 157 188 175 176 9 190 11 144 240 204 176 77 140 59 173 23 41 195 49 211 129 99 226 89 41 61 117 216 244 229 187 66 250 141 7 162 242 64 30 74 137 170 157 234 46 180 106 67 91 184 254 133 132 150 83 202 121 109 229 1 0 0 1 100 130 27 80 132 149 206 104 74 186 108 76 162 61 90 101 136 56 238 26 128 103 13 215 175 217 2 94 203 185 103 235 57 73 179 67 251 148 153 157 188 175 176 9 190 11 144 240 204 176 77 140 59 173 23 41 195 49 211 129 99 226 89 41 61 117 216 244 229 187 66 250 141 7 162 242 64 30 74 137 170 157 234 46 180 106 67 91 184 254 133 132 150 83 202 121 109 229 1 0 0 0 96 180 177 20 52 197 85 168 138 255 101 101 71 208 219 45 169 123 61 167 239 15 8 52 226 172 233 153 47 28 118 122 247 246 33 225 192 78 230 61 188 196 197 48 3 32 37 12 172 242 129 25 220 16 26 252 131 142 114 105 69 201 34 95 85 12 39 146 145 217 235 38 66 245 145 202 77 22 159 59 0 129 139 201 197 42 198 93 48 54 136 29 220 157 47 43 0 1 96 180 177 20 52 197 85 168 138 255 101 101 71 208 219 45 169 123 61 167 239 15 8 52 226 172 233 153 47 28 118 122 247 246 33 225 192 78 230 61 188 196 197 48 3 32 37 12 172 242 129 25 220 16 26 252 131 142 114 105 69 201 34 95 85 12 39 146 145 217 235 38 66 245 145 202 77 22 159 59 0 129 139 201 197 42 198 93 48 54 136 29 220 157 47 43 0 0 96 228 177 197 157 201 233 218 33 173 105 143 149 114 247 135 47 252 136 226 112 224 250 62 15 148 29 202 26 68 127 193 62 109 233 165 67 21 221 99 246 160 113 232 255 240 215 55 219 168 67 172 220 239 70 18 44 75 90 190 126 188 2 138 148 81 54 76 45 139 27 198 140 152 73 84 62 77 207 250 184 202 70 93 74 35 192 212 68 254 66 167 55 43 72 51 1 1 96 228 177 197 157 201 233 218 33 173 105 143 149 114 247 135 47 252 136 226 112 224 250 62 15 148 29 202 26 68 127 193 62 109 233 165 67 21 221 99 246 160 113 232 255 240 215 55 219 168 67 172 220 239 70 18 44 75 90 190 126 188 2 138 148 81 54 76 45 139 27 198 140 152 73 84 62 77 207 250 184 202 70 93 74 35 192 212 68 254 66 167 55 43 72 51 1 0 64 214 194 164 243 67 99 159 221 32 79 138 118 10 246 26 53 220 63 121 128 209 86 55 147 46 21 147 111 73 114 48 231 199 129 181 226 153 2 49 119 72 168 113 113 77 187 140 153 22 15 24 250 59 186 131 64 170 188 226 4 136 0 0 0 1 64 214 194 164 243 67 99 159 221 32 79 138 118 10 246 26 53 220 63 121 128 209 86 55 147 46 21 147 111 73 114 48 231 199 129 181 226 153 2 49 119 72 168 113 113 77 187 140 153 22 15 24 250 59 186 131 64 170 188 226 4 136 0 0 0 0 52 137 1 85 110 191 240 53 229 183 92 119 252 131 102 74 251 188 32 178 3 182 241 244 250 87 89 25 222 123 231 114 153 55 41 42 92 80 171 133 162 143 161 81 69 72 198 206 202 152 186 2 0 1 52 137 1 85 110 191 240 53 229 183 92 119 252 131 102 74 251 188 32 178 3 182 241 244 250 87 89 25 222 123 231 114 153 55 41 42 92 80 171 133 162 143 161 81 69 72 198 206 202 152 186 2 0 0 56 211 76 143 162 185 129 219 122 124 64 67 106 130 145 59 54 198 182 118 11 1 159 173 227 145 183 65 74 210 107 97 244 37 234 225 245 194 126 48 168 194 239 99 117 113 246 7 68 90 122 30 120 121 204 1 0 1 56 211 76 143 162 185 129 219 122 124 64 67 106 130 145 59 54 198 182 118 11 1 159 173 227 145 183 65 74 210 107 97 244 37 234 225 245 194 126 48 168 194 239 99 117 113 246 7 68 90 122 30 120 121 204 1 0 0 84 105 73 115 54 214 7 115 255 61 66 95 124 249 26 243 37 155 74 9 85 217 163 49 217 173 61 95 67 196 72 63 156 172 27 80 167 165 134 208 52 201 202 92 55 128 155 17 60 176 105 63 30 206 211 19 235 211 182 152 83 135 179 180 37 195 226 138 134 144 171 149 80 65 145 226 242 243 230 43 132 178 250 39 215 1 84 105 73 115 54 214 7 115 255 61 66 95 124 249 26 243 37 155 74 9 85 217 163 49 217 173 61 95 67 196 72 63 156 172 27 80 167 165 134 208 52 201 202 92 55 128 155 17 60 176 105 63 30 206 211 19 235 211 182 152 83 135 179 180 37 195 226 138 134 144 171 149 80 65 145 226 242 243 230 43 132 178 250 39 215 0 24 238 147 112 201 202 57 233 73 216 169 141 254 73 1 28 115 92 180 201 139 174 21 11 0 1 24 238 147 112 201 202 57 233 73 216 169 141 254 73 1 28 115 92 180 201 139 174 21 11 0 0 24 11 98 186 29 212 176 86 13 53 40 93 147 195 178 153 54 152 222 244 40 193 19 0 0 1 24 11 98 186 29 212 176 86 13 53 40 93 147 195 178 153 54 152 222 244 40 193 19 0 0 0 40 247 180 251 141 141 62 11 228 178 124 25 179 207 78 30 191 6 166 89 240 173 89 181 244 213 201 90 164 248 113 18 220 53 196 159 235 161 36 114 0 1 40 247 180 251 141 141 62 11 228 178 124 25 179 207 78 30 191 6 166 89 240 173 89 181 244 213 201 90 164 248 113 18 220 53 196 159 235 161 36 114 0 0 92 197 219 246 150 141 204 249 197 122 42 147 254 26 80 88 29 210 60 108 233 49 53 58 229 228 74 204 32 164 150 72 227 75 126 222 254 223 216 61 51 43 121 144 51 162 181 207 169 112 177 75 201 49 79 92 41 7 31 62 225 233 82 103 28 12 148 8 127 39 116 68 202 216 227 213 140 255 16 22 227 223 27 82 6 151 211 143 89 62 252 11 0 1 92 197 219 246 150 141 204 249 197 122 42 147 254 26 80 88 29 210 60 108 233 49 53 58 229 228 74 204 32 164 150 72 227 75 126 222 254 223 216 61 51 43 121 144 51 162 181 207 169 112 177 75 201 49 79 92 41 7 31 62 225 233 82 103 28 12 148 8 127 39 116 68 202 216 227 213 140 255 16 22 227 223 27 82 6 151 211 143 89 62 252 11 0 0 104 84 85 201 229 80 220 110 27 89 135 96 8 25 169 247 170 52 98 214 179 116 102 103 90 190 212 155 200 5 237 5 33 189 15 223 142 50 1 136 100 122 203 43 219 41 31 201 158 108 205 137 41 171 131 15 69 19 41 170 64 244 118 157 0 134 78 207 249 103 223 37 193 0 163 144 187 16 102 223 27 90 215 43 229 11 42 66 58 117 150 42 248 101 141 189 6 240 7 0 242 197 127 1 0 1 104 84 85 201 229 80 220 110 27 89 135 96 8 25 169 247 170 52 98 214 179 116 102 103 90 190 212 155 200 5 237 5 33 189 15 223 142 50 1 136 100 122 203 43 219 41 31 201 158 108 205 137 41 171 131 15 69 19 41 170 64 244 118 157 0 134 78 207 249 103 223 37 193 0 163 144 187 16 102 223 27 90 215 43 229 11 42 66 58 117 150 42 248 101 141 189 6 240 7 0 242 197 127 1 0 0 8 185 243 251 131 7 0 0 0 1 8 185 243 251 131 7 0 0 0 0 44 188 64 12 102 153 116 180 169 232 182 207 120 2 241 87 106 199 3 100 211 214 177 149 40 69 55 14 15 24 136 141 41 198 26 255 238 213 146 192 182 42 0 0 0 1 44 188 64 12 102 153 116 180 169 232 182 207 120 2 241 87 106 199 3 100 211 214 177 149 40 69 55 14 15 24 136 141 41 198 26 255 238 213 146 192 182 42 0 0 0 0 36 60 69 243 184 98 7 253 248 147 154 234 108 139 170 83 33 71 50 181 137 96 0 97 65 238 127 238 220 145 220 30 197 164 169 50 39 1 36 60 69 243 184 98 7 253 248 147 154 234 108 139 170 83 33 71 50 181 137 96 0 97 65 238 127 238 220 145 220 30 197 164 169 50 39 0 112 226 167 90 98 229 230 91 40 155 26 167 140 217 74 204 150 223 188 123 34 82 92 87 7 182 125 184 131 72 19 168 23 168 126 18 67 33 218 228 80 219 32 115 52 91 153 74 185 188 251 88 141 206 245 147 186 188 9 11 227 190 147 53 27 159 175 207 126 95 65 244 167 190 77 129 82 251 142 246 254 93 98 112 160 141 225 214 75 62 208 202 45 97 98 146 177 111 133 60 28 249 233 207 10 171 89 174 70 14 94 129 40 1 112 226 167 90 98 229 230 91 40 155 26 167 140 217 74 204 150 223 188 123 34 82 92 87 7 182 125 184 131 72 19 168 23 168 126 18 67 33 218 228 80 219 32 115 52 91 153 74 185 188 251 88 141 206 245 147 186 188 9 11 227 190 147 53 27 159 175 207 126 95 65 244 167 190 77 129 82 251 142 246 254 93 98 112 160 141 225 214 75 62 208 202 45 97 98 146 177 111 133 60 28 249 233 207 10 171 89 174 70 14 94 129 40 0 8 109 138 127 241 182 108 3 0 1 8 109 138 127 241 182 108 3 0 0 20 253 248 186 235 248 125 194 176 203 231 91 182 41 233 0 226 122 118 84 2 1 20 253 248 186 235 248 125 194 176 203 231 91 182 41 233 0 226 122 118 84 2 0 16 230 16 7 220 125 232 51 204 126 74 73 232 59 0 0 0 1 16 230 16 7 220 125 232 51 204 126 74 73 232 59 0 0 0 0 128 96 188 53 88 57 212 250 97 99 241 119 39 211 59 47 120 144 156 173 166 143 114 227 10 41 16 55 214 158 53 92 82 10 117 44 252 226 154 161 113 202 150 106 200 19 38 79 40 100 2 216 168 103 49 218 150 159 173 218 238 0 59 105 125 25 202 77 232 122 113 96 184 174 146 91 150 158 119 220 235 41 130 173 153 183 164 219 127 2 22 89 184 116 175 152 236 46 180 242 142 205 40 40 121 115 78 145 79 246 133 130 224 161 140 56 114 143 192 138 82 110 74 44 22 99 135 217 2 1 128 96 188 53 88 57 212 250 97 99 241 119 39 211 59 47 120 144 156 173 166 143 114 227 10 41 16 55 214 158 53 92 82 10 117 44 252 226 154 161 113 202 150 106 200 19 38 79 40 100 2 216 168 103 49 218 150 159 173 218 238 0 59 105 125 25 202 77 232 122 113 96 184 174 146 91 150 158 119 220 235 41 130 173 153 183 164 219 127 2 22 89 184 116 175 152 236 46 180 242 142 205 40 40 121 115 78 145 79 246 133 130 224 161 140 56 114 143 192 138 82 110 74 44 22 99 135 217 2 0 108 183 215 158 47 73 44 220 50 163 229 15 148 225 154 78 50 189 136 15 137 135 196 30 145 70 78 206 57 19 181 129 163 193 193 234 155 1 250 142 170 197 218 122 99 180 214 31 196 167 42 38 254 90 90 60 16 232 180 119 19 88 155 128 27 128 25 230 39 205 154 156 158 153 88 120 44 1 136 211 209 30 179 28 159 46 164 62 97 233 105 33 20 253 209 183 59 98 45 110 88 170 73 103 237 172 14 0 0 1 108 183 215 158 47 73 44 220 50 163 229 15 148 225 154 78 50 189 136 15 137 135 196 30 145 70 78 206 57 19 181 129 163 193 193 234 155 1 250 142 170 197 218 122 99 180 214 31 196 167 42 38 254 90 90 60 16 232 180 119 19 88 155 128 27 128 25 230 39 205 154 156 158 153 88 120 44 1 136 211 209 30 179 28 159 46 164 62 97 233 105 33 20 253 209 183 59 98 45 110 88 170 73 103 237 172 14 0 0 0 108 109 39 198 116 134 109 137 3 154 63 133 155 109 82 108 240 13 83 246 109 126 71 168 5 252 39 139 51 83 180 93 45 15 158 50 208 87 19 218 21 230 235 83 238 84 254 144 65 87 7 55 39 65 75 33 1 137 221 191 101 104 101 15 201 217 163 216 64 237 92 24 199 180 178 166 245 190 146 159 89 122 28 142 102 176 245 112 28 239 140 93 48 144 224 181 154 244 92 174 112 189 17 186 11 61 0 0 0 1 108 109 39 198 116 134 109 137 3 154 63 133 155 109 82 108 240 13 83 246 109 126 71 168 5 252 39 139 51 83 180 93 45 15 158 50 208 87 19 218 21 230 235 83 238 84 254 144 65 87 7 55 39 65 75 33 1 137 221 191 101 104 101 15 201 217 163 216 64 237 92 24 199 180 178 166 245 190 146 159 89 122 28 142 102 176 245 112 28 239 140 93 48 144 224 181 154 244 92 174 112 189 17 186 11 61 0 0 0 0 92 115 25 74 181 122 105 117 16 23 160 104 186 173 148 142 130 124 69 176 164 120 37 35 164 26 5 203 211 81 114 102 172 157 224 92 119 72 40 156 152 170 218 239 244 122 119 68 255 223 165 182 239 221 222 170 86 17 177 252 123 251 137 160 2 17 88 15 181 45 222 85 1 145 242 26 221 26 143 50 5 231 126 165 15 88 139 246 42 136 0 0 0 1 92 115 25 74 181 122 105 117 16 23 160 104 186 173 148 142 130 124 69 176 164 120 37 35 164 26 5 203 211 81 114 102 172 157 224 92 119 72 40 156 152 170 218 239 244 122 119 68 255 223 165 182 239 221 222 170 86 17 177 252 123 251 137 160 2 17 88 15 181 45 222 85 1 145 242 26 221 26 143 50 5 231 126 165 15 88 139 246 42 136 0 0 0 0 20 11 96 10 112 174 90 0 74 17 97 66 74 95 235 134 176 1 0 0 0 1 20 11 96 10 112 174 90 0 74 17 97 66 74 95 235 134 176 1 0 0 0 0 44 154 185 66 152 86 30 237 20 211 200 92 232 231 159 111 104 239 215 186 246 153 131 145 191 158 17 100 149 87 115 114 80 153 175 127 213 20 30 55 123 56 0 0 0 1 44 154 185 66 152 86 30 237 20 211 200 92 232 231 159 111 104 239 215 186 246 153 131 145 191 158 17 100 149 87 115 114 80 153 175 127 213 20 30 55 123 56 0 0 0 0 100 200 46 197 117 247 255 182 227 22 29 184 198 24 211 143 87 190 175 196 153 250 144 95 50 47 199 87 38 91 196 72 184 66 112 224 205 213 241 213 215 217 50 114 236 249 135 67 151 218 231 131 138 171 95 70 223 55 110 156 24 86 4 116 64 213 4 169 211 115 62 175 39 13 169 242 237 56 166 5 99 183 238 116 46 114 188 183 203 8 57 40 83 132 247 182 225 184 108 0 0 1 100 200 46 197 117 247 255 182 227 22 29 184 198 24 211 143 87 190 175 196 153 250 144 95 50 47 199 87 38 91 196 72 184 66 112 224 205 213 241 213 215 217 50 114 236 249 135 67 151 218 231 131 138 171 95 70 223 55 110 156 24 86 4 116 64 213 4 169 211 115 62 175 39 13 169 242 237 56 166 5 99 183 238 116 46 114 188 183 203 8 57 40 83 132 247 182 225 184 108 0 0 0 124 94 235 124 73 23 127 111 55 10 111 84 126 170 16 77 106 181 163 73 165 249 170 40 170 90 228 108 176 252 39 45 191 204 225 251 145 26 45 5 233 1 112 57 57 75 136 241 126 114 242 43 156 144 93 196 214 225 123 243 163 118 208 74 233 52 78 129 73 101 32 94 180 49 175 158 209 26 110 42 125 133 11 133 252 19 105 165 220 63 81 214 85 35 166 157 95 220 199 190 78 235 205 161 109 38 86 178 173 75 16 150 107 115 202 87 90 44 122 250 44 242 3 0 0 1 124 94 235 124 73 23 127 111 55 10 111 84 126 170 16 77 106 181 163 73 165 249 170 40 170 90 228 108 176 252 39 45 191 204 225 251 145 26 45 5 233 1 112 57 57 75 136 241 126 114 242 43 156 144 93 196 214 225 123 243 163 118 208 74 233 52 78 129 73 101 32 94 180 49 175 158 209 26 110 42 125 133 11 133 252 19 105 165 220 63 81 214 85 35 166 157 95 220 199 190 78 235 205 161 109 38 86 178 173 75 16 150 107 115 202 87 90 44 122 250 44 242 3 0 0 0 64 33 38 244 173 112 88 99 122 250 156 144 15 79 132 196 15 41 75 133 177 70 36 29 76 228 221 155 246 69 197 87 207 178 221 150 150 163 43 125 211 170 119 162 199 18 140 88 14 141 156 131 55 86 105 131 87 183 202 138 193 250 146 7 0 1 64 33 38 244 173 112 88 99 122 250 156 144 15 79 132 196 15 41 75 133 177 70 36 29 76 228 221 155 246 69 197 87 207 178 221 150 150 163 43 125 211 170 119 162 199 18 140 88 14 141 156 131 55 86 105 131 87 183 202 138 193 250 146 7 0 0 8 193 65 150 116 8 0 0 0 1 8 193 65 150 116 8 0 0 0 0 88 222 76 87 0 39 117 3 50 43 76 65 78 229 242 96 28 45 68 9 84 77 32 141 102 105 143 7 223 208 38 17 171 1 5 64 101 80 4 202 47 105 247 32 207 194 242 83 135 163 54 216 178 26 17 93 139 73 169 226 217 99 11 82 47 3 157 215 215 153 31 216 121 218 217 197 70 198 39 255 50 228 150 229 67 199 1 0 0 1 88 222 76 87 0 39 117 3 50 43 76 65 78 229 242 96 28 45 68 9 84 77 32 141 102 105 143 7 223 208 38 17 171 1 5 64 101 80 4 202 47 105 247 32 207 194 242 83 135 163 54 216 178 26 17 93 139 73 169 226 217 99 11 82 47 3 157 215 215 153 31 216 121 218 217 197 70 198 39 255 50 228 150 229 67 199 1 0 0 0 60 132 11 227 148 45 72 132 90 43 39 166 76 172 224 159 49 82 126 46 147 149 229 112 96 19 103 129 209 180 204 78 161 218 161 137 155 40 142 2 48 80 224 51 94 209 169 119 94 212 151 125 134 39 145 109 231 4 0 0 0 1 60 132 11 227 148 45 72 132 90 43 39 166 76 172 224 159 49 82 126 46 147 149 229 112 96 19 103 129 209 180 204 78 161 218 161 137 155 40 142 2 48 80 224 51 94 209 169 119 94 212 151 125 134 39 145 109 231 4 0 0 0 0 20 123 47 118 34 191 206 207 171 213 67 79 77 219 89 68 92 2 0 0 0 1 20 123 47 118 34 191 206 207 171 213 67 79 77 219 89 68 92 2 0 0 0 0 52 181 219 18 61 30 154 15 167 192 14 196 148 216 66 206 1 98 115 173 137 197 47 49 228 38 188 178 148 202 18 96 2 103 255 202 246 177 221 107 35 180 27 33 72 172 31 69 128 123 0 0 0 1 52 181 219 18 61 30 154 15 167 192 14 196 148 216 66 206 1 98 115 173 137 197 47 49 228 38 188 178 148 202 18 96 2 103 255 202 246 177 221 107 35 180 27 33 72 172 31 69 128 123 0 0 0 0 28 7 82 250 163 171 151 193 242 222 208 224 252 8 145 119 231 240 219 237 115 112 17 84 150 54 234 247 1 1 28 7 82 250 163 171 151 193 242 222 208 224 252 8 145 119 231 240 219 237 115 112 17 84 150 54 234 247 1 0 100 106 128 3 1 188 158 131 102 30 13 165 34 56 140 67 110 15 41 20 34 218 85 212 56 208 97 6 198 121 86 231 16 60 41 116 51 112 68 146 225 249 153 79 173 152 178 167 118 161 49 82 252 223 181 39 89 10 249 163 146 32 111 19 91 56 141 207 248 45 150 31 199 164 135 69 61 48 86 28 152 157 46 95 110 240 67 68 230 61 162 195 46 59 109 223 151 104 231 1 0 1 100 106 128 3 1 188 158 131 102 30 13 165 34 56 140 67 110 15 41 20 34 218 85 212 56 208 97 6 198 121 86 231 16 60 41 116 51 112 68 146 225 249 153 79 173 152 178 167 118 161 49 82 252 223 181 39 89 10 249 163 146 32 111 19 91 56 141 207 248 45 150 31 199 164 135 69 61 48 86 28 152 157 46 95 110 240 67 68 230 61 162 195 46 59 109 223 151 104 231 1 0 0 8 71 170 230 149 60 169 8 0 1 8 71 170 230 149 60 169 8 0 0 104 197 60 13 194 96 169 102 36 193 199 30 151 61 112 84 43 43 191 194 1 161 56 139 53 115 136 32 148 17 113 135 55 123 181 224 91 143 170 42 70 154 95 146 126 90 132 159 105 180 251 18 41 35 80 231 44 31 43 32 145 245 182 101 28 236 119 33 66 1 225 23 219 129 219 214 243 191 203 150 13 208 77 171 34 153 52 224 233 94 147 246 3 95 62 22 212 102 7 164 241 174 21 0 0 1 104 197 60 13 194 96 169 102 36 193 199 30 151 61 112 84 43 43 191 194 1 161 56 139 53 115 136 32 148 17 113 135 55 123 181 224 91 143 170 42 70 154 95 146 126 90 132 159 105 180 251 18 41 35 80 231 44 31 43 32 145 245 182 101 28 236 119 33 66 1 225 23 219 129 219 214 243 191 203 150 13 208 77 171 34 153 52 224 233 94 147 246 3 95 62 22 212 102 7 164 241 174 21 0 0 0 8 255 177 136 137 82 0 0 0 1 8 255 177 136 137 82 0 0 0 0 28 244 28 97 243 182 228 22 188 140 208 197 48 85 163 246 9 179 58 95 58 150 166 115 224 1 0 0 0 1 28 244 28 97 243 182 228 22 188 140 208 197 48 85 163 246 9 179 58 95 58 150 166 115 224 1 0 0 0 0 56 18 166 152 245 55 183 20 61 65 95 235 22 101 208 144 158 244 134 73 6 107 252 90 131 187 46 111 218 192 193 204 157 69 78 249 68 158 131 231 84 169 155 246 223 255 125 237 56 39 124 83 222 2 0 0 0 1 56 18 166 152 245 55 183 20 61 65 95 235 22 101 208 144 158 244 134 73 6 107 252 90 131 187 46 111 218 192 193 204 157 69 78 249 68 158 131 231 84 169 155 246 223 255 125 237 56 39 124 83 222 2 0 0 0 0 64 125 215 194 190 138 172 44 82 18 4 12 27 37 152 98 142 28 176 36 149 113 6 134 186 247 114 113 24 143 28 126 9 132 211 32 84 48 255 229 143 210 55 139 145 108 151 47 228 54 230 198 125 130 0 191 218 241 25 250 223 160 158 116 0 1 64 125 215 194 190 138 172 44 82 18 4 12 27 37 152 98 142 28 176 36 149 113 6 134 186 247 114 113 24 143 28 126 9 132 211 32 84 48 255 229 143 210 55 139 145 108 151 47 228 54 230 198 125 130 0 191 218 241 25 250 223 160 158 116 0 0 60 3 57 187 171 211 24 69 12 134 135 186 26 223 242 182 51 228 122 123 228 34 89 39 47 189 254 2 149 226 207 2 67 99 42 86 56 191 230 17 56 161 156 156 78 118 244 228 6 251 250 232 155 46 194 10 138 122 135 43 0 1 60 3 57 187 171 211 24 69 12 134 135 186 26 223 242 182 51 228 122 123 228 34 89 39 47 189 254 2 149 226 207 2 67 99 42 86 56 191 230 17 56 161 156 156 78 118 244 228 6 251 250 232 155 46 194 10 138 122 135 43 0 0 60 172 126 95 38 172 16 35 220 31 69 231 168 50 246 181 132 163 59 105 107 11 195 114 20 55 43 40 50 235 159 196 170 131 133 34 254 126 123 149 223 8 155 192 190 96 9 65 243 130 152 203 23 54 157 5 6 21 0 0 0 1 60 172 126 95 38 172 16 35 220 31 69 231 168 50 246 181 132 163 59 105 107 11 195 114 20 55 43 40 50 235 159 196 170 131 133 34 254 126 123 149 223 8 155 192 190 96 9 65 243 130 152 203 23 54 157 5 6 21 0 0 0 0 64 2 111 152 136 184 111 221 198 128 165 251 127 213 81 172 8 106 234 51 14 82 18 6 231 152 0 230 43 112 55 155 160 105 77 184 34 204 159 232 23 202 84 150 215 63 252 216 202 135 94 254 143 56 128 190 119 156 93 36 146 106 50 31 0 1 64 2 111 152 136 184 111 221 198 128 165 251 127 213 81 172 8 106 234 51 14 82 18 6 231 152 0 230 43 112 55 155 160 105 77 184 34 204 159 232 23 202 84 150 215 63 252 216 202 135 94 254 143 56 128 190 119 156 93 36 146 106 50 31 0 0 84 67 179 87 45 0 244 146 0 251 216 55 206 169 143 153 155 204 98 242 127 58 228 9 185 140 50 24 85 71 140 103 173 214 208 88 197 18 88 42 237 5 249 171 151 55 8 19 64 247 14 51 205 117 38 200 199 107 98 33 41 209 251 142 166 190 178 246 165 231 178 156 209 134 137 201 40 51 114 105 214 176 192 40 0 1 84 67 179 87 45 0 244 146 0 251 216 55 206 169 143 153 155 204 98 242 127 58 228 9 185 140 50 24 85 71 140 103 173 214 208 88 197 18 88 42 237 5 249 171 151 55 8 19 64 247 14 51 205 117 38 200 199 107 98 33 41 209 251 142 166 190 178 246 165 231 178 156 209 134 137 201 40 51 114 105 214 176 192 40 0 0 104 210 223 181 52 158 133 105 60 206 60 97 88 35 84 39 241 68 117 46 200 25 178 180 2 135 170 228 237 78 95 141 220 192 61 243 38 81 141 157 147 134 105 20 141 231 139 98 217 141 233 206 38 63 88 41 115 146 165 44 212 80 120 9 35 155 237 10 49 241 130 64 144 5 183 157 196 6 21 107 70 41 197 111 109 215 116 229 241 167 89 202 52 203 220 160 217 246 30 235 144 235 19 0 0 1 104 210 223 181 52 158 133 105 60 206 60 97 88 35 84 39 241 68 117 46 200 25 178 180 2 135 170 228 237 78 95 141 220 192 61 243 38 81 141 157 147 134 105 20 141 231 139 98 217 141 233 206 38 63 88 41 115 146 165 44 212 80 120 9 35 155 237 10 49 241 130 64 144 5 183 157 196 6 21 107 70 41 197 111 109 215 116 229 241 167 89 202 52 203 220 160 217 246 30 235 144 235 19 0 0 0 92 152 150 20 214 127 232 198 173 9 79 27 3 184 211 18 63 222 243 206 88 162 250 92 190 84 152 234 94 69 155 44 142 240 190 37 73 181 195 210 164 18 87 93 129 136 94 136 136 217 218 51 29 223 183 84 208 218 2 84 239 77 91 212 169 82 20 75 248 125 91 121 11 45 39 139 41 225 254 195 35 239 16 190 22 173 227 229 119 204 69 22 0 1 92 152 150 20 214 127 232 198 173 9 79 27 3 184 211 18 63 222 243 206 88 162 250 92 190 84 152 234 94 69 155 44 142 240 190 37 73 181 195 210 164 18 87 93 129 136 94 136 136 217 218 51 29 223 183 84 208 218 2 84 239 77 91 212 169 82 20 75 248 125 91 121 11 45 39 139 41 225 254 195 35 239 16 190 22 173 227 229 119 204 69 22 0 0 120 44 138 21 104 121 166 168 12 110 50 53 151 231 148 52 129 170 198 240 95 34 68 28 124 55 201 57 159 127 63 21 5 63 2 162 178 197 92 197 192 93 104 136 44 43 255 49 242 182 132 190 94 80 205 87 26 3 171 184 215 205 47 219 227 179 185 205 230 127 65 231 66 123 92 125 163 244 195 94 188 196 160 223 181 5 166 64 111 85 190 120 122 41 201 0 186 192 106 199 252 164 20 92 37 80 149 48 19 150 123 103 189 229 79 223 27 244 74 0 0 1 120 44 138 21 104 121 166 168 12 110 50 53 151 231 148 52 129 170 198 240 95 34 68 28 124 55 201 57 159 127 63 21 5 63 2 162 178 197 92 197 192 93 104 136 44 43 255 49 242 182 132 190 94 80 205 87 26 3 171 184 215 205 47 219 227 179 185 205 230 127 65 231 66 123 92 125 163 244 195 94 188 196 160 223 181 5 166 64 111 85 190 120 122 41 201 0 186 192 106 199 252 164 20 92 37 80 149 48 19 150 123 103 189 229 79 223 27 244 74 0 0 0 100 245 181 98 66 108 43 27 238 39 17 236 216 168 31 46 226 159 160 142 67 146 30 10 164 14 213 242 136 234 225 199 106 255 33 115 237 228 171 8 216 45 122 202 182 141 16 25 154 11 32 53 253 203 2 153 173 247 193 28 139 204 11 42 191 71 206 216 60 1 99 141 204 17 235 245 239 210 176 83 155 175 144 26 254 215 45 202 84 103 74 45 94 174 24 228 158 37 0 0 0 1 100 245 181 98 66 108 43 27 238 39 17 236 216 168 31 46 226 159 160 142 67 146 30 10 164 14 213 242 136 234 225 199 106 255 33 115 237 228 171 8 216 45 122 202 182 141 16 25 154 11 32 53 253 203 2 153 173 247 193 28 139 204 11 42 191 71 206 216 60 1 99 141 204 17 235 245 239 210 176 83 155 175 144 26 254 215 45 202 84 103 74 45 94 174 24 228 158 37 0 0 0 0 104 57 246 11 97 62 119 196 46 75 16 79 108 49 113 219 104 188 179 248 78 58 245 127 216 140 166 196 171 132 59 25 253 51 249 216 140 222 121 230 30 172 32 207 74 205 85 44 90 36 173 79 87 194 82 25 79 135 112 132 221 164 76 173 137 126 195 194 92 248 173 9 87 209 223 59 125 95 65 85 163 122 135 111 167 236 33 52 80 27 61 178 237 205 251 204 39 240 191 179 209 167 168 143 7 1 104 57 246 11 97 62 119 196 46 75 16 79 108 49 113 219 104 188 179 248 78 58 245 127 216 140 166 196 171 132 59 25 253 51 249 216 140 222 121 230 30 172 32 207 74 205 85 44 90 36 173 79 87 194 82 25 79 135 112 132 221 164 76 173 137 126 195 194 92 248 173 9 87 209 223 59 125 95 65 85 163 122 135 111 167 236 33 52 80 27 61 178 237 205 251 204 39 240 191 179 209 167 168 143 7 0 36 163 89 48 170 102 43 220 156 66 109 77 113 21 188 67 203 215 226 3 205 170 236 98 121 244 145 200 70 209 174 177 8 139 184 149 27 1 36 163 89 48 170 102 43 220 156 66 109 77 113 21 188 67 203 215 226 3 205 170 236 98 121 244 145 200 70 209 174 177 8 139 184 149 27 0 92 53 9 22 111 90 93 185 232 66 232 61 190 77 71 90 216 56 212 22 125 84 142 129 138 224 63 243 92 90 116 216 187 231 68 78 132 78 241 87 154 62 85 115 206 103 51 246 75 206 191 127 30 122 123 36 8 228 202 50 139 177 122 8 243 137 70 204 22 54 249 70 184 115 203 134 211 234 65 106 138 66 20 24 187 65 57 199 142 254 18 13 0 1 92 53 9 22 111 90 93 185 232 66 232 61 190 77 71 90 216 56 212 22 125 84 142 129 138 224 63 243 92 90 116 216 187 231 68 78 132 78 241 87 154 62 85 115 206 103 51 246 75 206 191 127 30 122 123 36 8 228 202 50 139 177 122 8 243 137 70 204 22 54 249 70 184 115 203 134 211 234 65 106 138 66 20 24 187 65 57 199 142 254 18 13 0 0 88 149 88 176 69 223 36 37 144 73 234 120 8 99 221 137 178 30 189 44 46 85 157 48 42 245 113 38 233 244 178 224 211 47 14 147 125 42 18 227 2 75 4 61 200 33 227 150 10 58 244 38 21 49 115 166 218 124 93 108 5 73 235 24 7 87 152 177 21 225 23 170 204 54 120 154 213 94 174 62 0 72 37 253 148 145 218 243 1 1 88 149 88 176 69 223 36 37 144 73 234 120 8 99 221 137 178 30 189 44 46 85 157 48 42 245 113 38 233 244 178 224 211 47 14 147 125 42 18 227 2 75 4 61 200 33 227 150 10 58 244 38 21 49 115 166 218 124 93 108 5 73 235 24 7 87 152 177 21 225 23 170 204 54 120 154 213 94 174 62 0 72 37 253 148 145 218 243 1 0 4 30 0 0 0 1 4 30 0 0 0 0 84 155 231 228 201 142 243 71 208 249 176 228 44 166 218 152 155 74 36 194 74 148 67 125 239 134 32 23 215 211 53 175 202 69 44 53 118 45 165 95 123 12 108 231 154 213 28 20 163 249 156 33 65 206 61 154 174 104 60 98 109 32 78 242 212 129 149 248 201 134 148 123 181 199 217 155 194 96 140 22 149 241 60 138 83 1 84 155 231 228 201 142 243 71 208 249 176 228 44 166 218 152 155 74 36 194 74 148 67 125 239 134 32 23 215 211 53 175 202 69 44 53 118 45 165 95 123 12 108 231 154 213 28 20 163 249 156 33 65 206 61 154 174 104 60 98 109 32 78 242 212 129 149 248 201 134 148 123 181 199 217 155 194 96 140 22 149 241 60 138 83 0 92 144 67 10 47 192 191 82 221 35 118 53 159 135 152 112 38 73 15 23 69 58 219 225 247 78 102 170 227 6 163 149 12 249 225 137 246 239 39 40 234 163 207 114 112 115 115 194 219 16 202 159 189 202 35 212 109 38 217 132 76 179 231 7 209 218 188 27 208 113 230 164 84 51 101 32 180 123 194 122 68 150 119 65 252 204 137 177 46 234 227 67 1 1 92 144 67 10 47 192 191 82 221 35 118 53 159 135 152 112 38 73 15 23 69 58 219 225 247 78 102 170 227 6 163 149 12 249 225 137 246 239 39 40 234 163 207 114 112 115 115 194 219 16 202 159 189 202 35 212 109 38 217 132 76 179 231 7 209 218 188 27 208 113 230 164 84 51 101 32 180 123 194 122 68 150 119 65 252 204 137 177 46 234 227 67 1 0 24 72 56 22 141 170 58 90 163 187 180 242 135 44 169 146 74 211 248 249 78 94 0 0 0 1 24 72 56 22 141 170 58 90 163 187 180 242 135 44 169 146 74 211 248 249 78 94 0 0 0 0 84 212 210 42 73 12 25 196 31 47 75 120 243 73 247 127 147 72 96 165 96 14 69 196 39 172 6 5 194 11 134 119 124 92 255 174 158 25 36 41 88 174 179 156 60 218 178 156 41 175 187 120 209 98 0 19 182 231 198 178 95 52 119 23 97 47 127 143 101 176 216 52 159 106 61 182 27 146 186 142 96 231 29 27 0 1 84 212 210 42 73 12 25 196 31 47 75 120 243 73 247 127 147 72 96 165 96 14 69 196 39 172 6 5 194 11 134 119 124 92 255 174 158 25 36 41 88 174 179 156 60 218 178 156 41 175 187 120 209 98 0 19 182 231 198 178 95 52 119 23 97 47 127 143 101 176 216 52 159 106 61 182 27 146 186 142 96 231 29 27 0 0 16 202 192 8 50 72 83 78 188 175 88 50 125 131 102 195 3 1 16 202 192 8 50 72 83 78 188 175 88 50 125 131 102 195 3 0 60 129 235 99 25 168 162 143 14 181 191 24 1 54 4 85 204 63 111 78 71 241 253 45 225 56 177 121 166 226 7 163 1 182 155 9 74 40 35 9 9 175 144 171 35 224 162 163 133 97 35 188 126 220 236 73 96 97 129 14 0 1 60 129 235 99 25 168 162 143 14 181 191 24 1 54 4 85 204 63 111 78 71 241 253 45 225 56 177 121 166 226 7 163 1 182 155 9 74 40 35 9 9 175 144 171 35 224 162 163 133 97 35 188 126 220 236 73 96 97 129 14 0 0 64 108 92 234 131 231 188 232 51 18 198 215 40 15 157 152 141 79 144 203 196 249 187 115 41 230 177 33 50 91 32 10 169 73 162 155 234 98 212 245 92 106 18 104 75 83 194 149 253 23 63 13 64 214 243 154 201 132 100 31 187 255 119 206 203 1 64 108 92 234 131 231 188 232 51 18 198 215 40 15 157 152 141 79 144 203 196 249 187 115 41 230 177 33 50 91 32 10 169 73 162 155 234 98 212 245 92 106 18 104 75 83 194 149 253 23 63 13 64 214 243 154 201 132 100 31 187 255 119 206 203 0 100 234 116 169 65 23 182 136 224 163 211 105 192 204 31 82 240 175 46 102 159 95 158 50 9 145 106 22 60 50 33 177 26 225 82 114 86 212 7 154 44 212 126 161 171 72 116 119 246 52 229 38 173 55 41 107 40 184 253 98 215 24 91 66 142 30 173 123 90 125 69 86 227 60 60 95 206 124 147 44 60 155 141 241 90 83 7 53 206 71 46 134 127 122 180 31 53 82 214 176 0 1 100 234 116 169 65 23 182 136 224 163 211 105 192 204 31 82 240 175 46 102 159 95 158 50 9 145 106 22 60 50 33 177 26 225 82 114 86 212 7 154 44 212 126 161 171 72 116 119 246 52 229 38 173 55 41 107 40 184 253 98 215 24 91 66 142 30 173 123 90 125 69 86 227 60 60 95 206 124 147 44 60 155 141 241 90 83 7 53 206 71 46 134 127 122 180 31 53 82 214 176 0 0 124 246 224 179 231 248 85 24 201 210 110 165 232 153 136 96 155 10 189 255 115 232 19 11 61 42 152 98 194 221 200 42 3 215 220 12 102 106 69 77 69 216 253 146 196 230 240 63 118 205 224 76 129 107 174 183 121 74 199 99 224 180 49 180 47 34 35 35 224 247 193 61 42 51 142 16 105 58 239 223 3 189 5 85 19 221 249 251 255 86 9 113 209 31 184 51 28 17 30 9 254 164 62 237 123 73 56 8 110 166 164 217 88 106 22 85 183 98 156 139 221 73 253 52 0 1 124 246 224 179 231 248 85 24 201 210 110 165 232 153 136 96 155 10 189 255 115 232 19 11 61 42 152 98 194 221 200 42 3 215 220 12 102 106 69 77 69 216 253 146 196 230 240 63 118 205 224 76 129 107 174 183 121 74 199 99 224 180 49 180 47 34 35 35 224 247 193 61 42 51 142 16 105 58 239 223 3 189 5 85 19 221 249 251 255 86 9 113 209 31 184 51 28 17 30 9 254 164 62 237 123 73 56 8 110 166 164 217 88 106 22 85 183 98 156 139 221 73 253 52 0 0 76 114 71 65 89 237 36 19 196 155 136 82 8 202 243 70 78 29 120 129 104 2 108 32 185 184 120 36 214 143 191 219 217 92 173 243 221 253 134 71 240 107 182 126 78 197 54 130 17 174 97 201 95 84 153 156 87 239 78 186 103 226 240 168 109 214 167 102 253 22 173 79 216 165 16 0 0 1 76 114 71 65 89 237 36 19 196 155 136 82 8 202 243 70 78 29 120 129 104 2 108 32 185 184 120 36 214 143 191 219 217 92 173 243 221 253 134 71 240 107 182 126 78 197 54 130 17 174 97 201 95 84 153 156 87 239 78 186 103 226 240 168 109 214 167 102 253 22 173 79 216 165 16 0 0 0 44 205 174 153 159 175 148 18 158 235 107 21 147 172 130 150 6 109 216 1 3 85 18 35 218 2 59 66 219 110 2 146 243 32 186 68 69 178 58 234 207 205 114 206 3 1 44 205 174 153 159 175 148 18 158 235 107 21 147 172 130 150 6 109 216 1 3 85 18 35 218 2 59 66 219 110 2 146 243 32 186 68 69 178 58 234 207 205 114 206 3 0 116 6 227 111 143 56 164 39 218 18 125 60 7 225 195 8 232 184 177 163 16 21 29 165 72 172 201 28 230 132 0 86 23 246 125 104 127 83 109 13 113 149 216 245 166 173 128 120 168 110 19 178 216 69 212 66 94 179 133 240 181 66 121 14 166 89 77 60 143 152 41 85 140 62 121 51 44 123 188 123 173 52 74 2 31 233 7 229 187 139 234 225 45 79 247 235 210 113 240 84 200 66 137 125 254 189 83 79 17 221 213 32 54 4 0 0 0 1 116 6 227 111 143 56 164 39 218 18 125 60 7 225 195 8 232 184 177 163 16 21 29 165 72 172 201 28 230 132 0 86 23 246 125 104 127 83 109 13 113 149 216 245 166 173 128 120 168 110 19 178 216 69 212 66 94 179 133 240 181 66 121 14 166 89 77 60 143 152 41 85 140 62 121 51 44 123 188 123 173 52 74 2 31 233 7 229 187 139 234 225 45 79 247 235 210 113 240 84 200 66 137 125 254 189 83 79 17 221 213 32 54 4 0 0 0 0 76 180 196 94 156 54 195 58 2 39 205 18 27 183 204 87 155 155 103 140 143 118 225 162 141 198 191 103 246 251 35 33 200 114 204 108 157 138 202 183 109 135 225 247 167 85 247 149 166 13 150 140 115 191 119 88 74 150 209 45 234 64 143 177 65 18 230 195 62 134 19 33 86 117 177 249 0 1 76 180 196 94 156 54 195 58 2 39 205 18 27 183 204 87 155 155 103 140 143 118 225 162 141 198 191 103 246 251 35 33 200 114 204 108 157 138 202 183 109 135 225 247 167 85 247 149 166 13 150 140 115 191 119 88 74 150 209 45 234 64 143 177 65 18 230 195 62 134 19 33 86 117 177 249 0 0 104 77 194 158 250 209 247 60 209 53 237 237 50 69 209 78 167 168 156 255 102 176 89 29 124 236 2 92 64 171 213 222 61 154 151 17 221 163 26 188 48 218 181 25 207 24 78 174 96 77 4 92 36 81 77 82 53 226 55 109 24 229 73 137 228 213 186 236 231 140 148 101 63 106 130 255 94 160 246 229 63 254 107 254 48 15 56 43 131 180 38 166 178 234 233 86 61 2 85 154 172 81 81 66 9 1 104 77 194 158 250 209 247 60 209 53 237 237 50 69 209 78 167 168 156 255 102 176 89 29 124 236 2 92 64 171 213 222 61 154 151 17 221 163 26 188 48 218 181 25 207 24 78 174 96 77 4 92 36 81 77 82 53 226 55 109 24 229 73 137 228 213 186 236 231 140 148 101 63 106 130 255 94 160 246 229 63 254 107 254 48 15 56 43 131 180 38 166 178 234 233 86 61 2 85 154 172 81 81 66 9 0 32 159 255 244 214 47 170 4 34 47 46 170 236 221 0 119 135 29 199 192 21 169 211 135 216 147 25 112 187 63 0 0 0 1 32 159 255 244 214 47 170 4 34 47 46 170 236 221 0 119 135 29 199 192 21 169 211 135 216 147 25 112 187 63 0 0 0 0 4 136 102 2 0 1 4 136 102 2 0 0 100 182 114 42 214 204 210 88 197 7 199 39 124 27 200 142 13 162 188 42 112 118 92 202 215 78 160 112 52 72 100 65 30 205 199 86 182 35 211 245 70 139 86 183 94 139 115 30 32 188 225 10 237 169 169 192 188 84 209 158 78 210 48 148 84 141 6 11 247 62 239 52 100 249 186 173 138 163 134 212 20 243 14 250 162 155 177 89 175 243 3 44 202 80 198 163 43 3 0 0 0 1 100 182 114 42 214 204 210 88 197 7 199 39 124 27 200 142 13 162 188 42 112 118 92 202 215 78 160 112 52 72 100 65 30 205 199 86 182 35 211 245 70 139 86 183 94 139 115 30 32 188 225 10 237 169 169 192 188 84 209 158 78 210 48 148 84 141 6 11 247 62 239 52 100 249 186 173 138 163 134 212 20 243 14 250 162 155 177 89 175 243 3 44 202 80 198 163 43 3 0 0 0 0 108 99 120 242 101 168 63 63 168 132 177 224 65 190 4 179 252 98 42 247 140 190 31 23 0 117 179 116 199 98 202 211 102 139 65 63 177 51 13 22 232 149 208 247 101 128 25 173 165 160 191 102 145 173 51 230 242 244 7 170 233 242 115 73 120 62 67 64 36 3 41 74 159 24 59 71 166 190 104 193 40 86 159 53 253 65 67 111 21 48 43 46 214 182 41 210 212 59 110 156 33 239 225 212 27 107 0 0 0 1 108 99 120 242 101 168 63 63 168 132 177 224 65 190 4 179 252 98 42 247 140 190 31 23 0 117 179 116 199 98 202 211 102 139 65 63 177 51 13 22 232 149 208 247 101 128 25 173 165 160 191 102 145 173 51 230 242 244 7 170 233 242 115 73 120 62 67 64 36 3 41 74 159 24 59 71 166 190 104 193 40 86 159 53 253 65 67 111 21 48 43 46 214 182 41 210 212 59 110 156 33 239 225 212 27 107 0 0 0 0 36 182 35 41 118 252 144 79 94 31 128 26 169 129 98 79 185 77 204 158 170 99 105 83 166 57 204 35 71 231 68 17 161 7 0 0 0 1 36 182 35 41 118 252 144 79 94 31 128 26 169 129 98 79 185 77 204 158 170 99 105 83 166 57 204 35 71 231 68 17 161 7 0 0 0 0 108 19 121 68 172 165 141 93 53 202 225 143 125 21 127 168 150 223 142 78 163 244 135 194 197 17 161 238 159 225 207 232 231 141 188 186 185 170 238 141 145 164 234 7 144 31 97 144 227 0 100 164 181 137 33 28 59 136 10 218 56 168 254 166 106 145 203 39 49 163 15 174 143 31 5 178 130 153 84 87 87 61 221 163 29 252 65 53 122 68 235 160 127 229 67 219 215 172 22 9 124 37 73 237 104 38 0 0 0 1 108 19 121 68 172 165 141 93 53 202 225 143 125 21 127 168 150 223 142 78 163 244 135 194 197 17 161 238 159 225 207 232 231 141 188 186 185 170 238 141 145 164 234 7 144 31 97 144 227 0 100 164 181 137 33 28 59 136 10 218 56 168 254 166 106 145 203 39 49 163 15 174 143 31 5 178 130 153 84 87 87 61 221 163 29 252 65 53 122 68 235 160 127 229 67 219 215 172 22 9 124 37 73 237 104 38 0 0 0 0 68 131 157 197 45 185 223 236 53 246 15 184 5 182 184 23 147 3 15 46 179 218 118 209 114 37 235 220 187 201 154 47 207 166 122 35 26 91 3 127 154 179 249 232 233 237 129 34 68 202 138 161 0 13 77 112 252 203 92 187 188 230 39 55 132 247 0 0 0 1 68 131 157 197 45 185 223 236 53 246 15 184 5 182 184 23 147 3 15 46 179 218 118 209 114 37 235 220 187 201 154 47 207 166 122 35 26 91 3 127 154 179 249 232 233 237 129 34 68 202 138 161 0 13 77 112 252 203 92 187 188 230 39 55 132 247 0 0 0 0 124 215 194 0 199 219 223 102 242 204 248 124 17 112 73 119 161 49 131 84 207 207 67 43 12 67 150 210 126 148 3 13 241 16 225 134 108 33 87 2 157 76 211 58 133 210 144 225 220 56 131 147 199 231 84 32 218 43 221 252 165 30 119 252 165 229 211 167 197 150 182 197 108 234 8 252 127 239 35 237 26 80 187 183 139 105 103 168 55 42 221 202 112 37 234 50 199 248 234 249 61 133 62 20 172 135 114 63 241 161 127 1 136 155 71 88 83 222 156 240 240 1 0 0 0 1 124 215 194 0 199 219 223 102 242 204 248 124 17 112 73 119 161 49 131 84 207 207 67 43 12 67 150 210 126 148 3 13 241 16 225 134 108 33 87 2 157 76 211 58 133 210 144 225 220 56 131 147 199 231 84 32 218 43 221 252 165 30 119 252 165 229 211 167 197 150 182 197 108 234 8 252 127 239 35 237 26 80 187 183 139 105 103 168 55 42 221 202 112 37 234 50 199 248 234 249 61 133 62 20 172 135 114 63 241 161 127 1 136 155 71 88 83 222 156 240 240 1 0 0 0 0 92 77 228 31 76 241 138 249 4 98 9 115 184 112 82 183 229 236 138 162 82 102 251 28 188 12 113 181 158 79 211 194 251 196 166 73 83 83 80 42 120 93 243 152 162 232 39 205 85 189 126 54 242 156 193 86 191 44 44 252 55 14 21 27 116 194 191 250 7 74 203 105 99 89 106 178 14 2 236 178 68 170 192 252 120 41 130 72 87 206 11 0 0 1 92 77 228 31 76 241 138 249 4 98 9 115 184 112 82 183 229 236 138 162 82 102 251 28 188 12 113 181 158 79 211 194 251 196 166 73 83 83 80 42 120 93 243 152 162 232 39 205 85 189 126 54 242 156 193 86 191 44 44 252 55 14 21 27 116 194 191 250 7 74 203 105 99 89 106 178 14 2 236 178 68 170 192 252 120 41 130 72 87 206 11 0 0 0 56 134 225 44 69 119 64 234 84 89 109 244 85 126 103 94 170 253 103 245 228 230 48 38 166 108 164 43 22 74 31 25 224 196 60 126 145 211 177 41 97 248 197 232 65 242 142 255 87 64 104 166 218 221 0 0 0 1 56 134 225 44 69 119 64 234 84 89 109 244 85 126 103 94 170 253 103 245 228 230 48 38 166 108 164 43 22 74 31 25 224 196 60 126 145 211 177 41 97 248 197 232 65 242 142 255 87 64 104 166 218 221 0 0 0 0 116 229 172 191 36 121 40 254 104 25 228 24 190 128 20 169 193 240 145 60 136 35 241 68 254 62 193 45 112 102 236 245 29 64 94 62 47 36 42 252 13 28 27 219 9 245 94 181 136 19 177 1 212 5 30 243 157 117 94 95 128 151 156 4 203 11 190 27 0 62 198 137 167 143 73 204 232 2 248 129 253 159 82 186 78 87 59 101 197 100 160 249 30 152 93 125 199 107 24 125 64 176 236 44 0 171 123 140 55 132 181 2 66 228 115 0 0 1 116 229 172 191 36 121 40 254 104 25 228 24 190 128 20 169 193 240 145 60 136 35 241 68 254 62 193 45 112 102 236 245 29 64 94 62 47 36 42 252 13 28 27 219 9 245 94 181 136 19 177 1 212 5 30 243 157 117 94 95 128 151 156 4 203 11 190 27 0 62 198 137 167 143 73 204 232 2 248 129 253 159 82 186 78 87 59 101 197 100 160 249 30 152 93 125 199 107 24 125 64 176 236 44 0 171 123 140 55 132 181 2 66 228 115 0 0 0 56 242 178 209 149 127 105 215 100 20 77 91 129 188 44 67 89 61 245 2 145 100 176 98 45 200 226 215 226 171 178 81 56 196 210 25 211 24 236 80 114 182 153 187 70 254 227 193 36 163 1 237 117 87 122 2 0 1 56 242 178 209 149 127 105 215 100 20 77 91 129 188 44 67 89 61 245 2 145 100 176 98 45 200 226 215 226 171 178 81 56 196 210 25 211 24 236 80 114 182 153 187 70 254 227 193 36 163 1 237 117 87 122 2 0 0 124 134 51 146 212 174 146 101 32 54 80 14 156 174 236 212 195 81 90 58 116 149 201 205 7 130 14 255 190 241 205 207 249 221 121 67 167 233 3 91 49 79 77 255 115 246 112 74 5 197 106 119 29 238 202 62 53 27 223 236 152 234 237 36 19 234 248 83 103 87 80 106 110 27 202 134 182 123 143 10 59 147 105 206 20 112 193 190 220 192 38 172 241 167 90 129 71 185 246 137 86 12 195 102 17 186 107 173 97 103 140 196 114 119 155 196 217 44 13 55 170 195 147 93 0 1 124 134 51 146 212 174 146 101 32 54 80 14 156 174 236 212 195 81 90 58 116 149 201 205 7 130 14 255 190 241 205 207 249 221 121 67 167 233 3 91 49 79 77 255 115 246 112 74 5 197 106 119 29 238 202 62 53 27 223 236 152 234 237 36 19 234 248 83 103 87 80 106 110 27 202 134 182 123 143 10 59 147 105 206 20 112 193 190 220 192 38 172 241 167 90 129 71 185 246 137 86 12 195 102 17 186 107 173 97 103 140 196 114 119 155 196 217 44 13 55 170 195 147 93 0 0 76 252 151 248 45 49 178 79 128 161 10 102 252 132 63 0 196 234 37 213 196 19 233 200 48 79 135 72 224 67 120 56 21 130 243 118 44 119 71 20 190 181 163 216 126 133 133 98 134 74 16 85 129 28 141 49 184 195 10 187 170 152 61 100 174 129 141 139 49 17 137 166 184 197 148 14 0 1 76 252 151 248 45 49 178 79 128 161 10 102 252 132 63 0 196 234 37 213 196 19 233 200 48 79 135 72 224 67 120 56 21 130 243 118 44 119 71 20 190 181 163 216 126 133 133 98 134 74 16 85 129 28 141 49 184 195 10 187 170 152 61 100 174 129 141 139 49 17 137 166 184 197 148 14 0 0 72 201 189 132 146 184 73 235 58 191 160 218 55 99 221 69 240 85 82 95 206 66 232 212 65 234 63 77 180 226 245 185 90 39 91 117 118 212 95 63 202 231 49 115 110 103 125 28 251 84 217 64 21 37 74 176 91 16 243 99 51 19 229 146 28 76 167 138 98 3 86 2 0 1 72 201 189 132 146 184 73 235 58 191 160 218 55 99 221 69 240 85 82 95 206 66 232 212 65 234 63 77 180 226 245 185 90 39 91 117 118 212 95 63 202 231 49 115 110 103 125 28 251 84 217 64 21 37 74 176 91 16 243 99 51 19 229 146 28 76 167 138 98 3 86 2 0 0 24 4 127 113 119 170 147 209 114 124 184 151 70 216 77 57 33 8 170 193 201 10 0 0 0 1 24 4 127 113 119 170 147 209 114 124 184 151 70 216 77 57 33 8 170 193 201 10 0 0 0 0 20 221 119 146 70 38 139 89 31 158 39 212 71 222 63 236 44 183 75 0 0 1 20 221 119 146 70 38 139 89 31 158 39 212 71 222 63 236 44 183 75 0 0 0 100 15 190 40 142 118 234 227 167 165 244 200 26 49 57 37 9 217 227 141 192 139 18 100 130 160 53 103 125 170 120 113 53 121 232 23 248 218 111 12 114 85 152 168 69 138 153 228 55 175 99 6 29 234 191 118 238 18 250 139 127 248 148 96 36 236 164 252 127 71 230 13 95 200 86 106 201 201 168 74 148 207 42 56 34 173 114 89 220 58 197 209 56 194 93 253 36 57 2 0 0 1 100 15 190 40 142 118 234 227 167 165 244 200 26 49 57 37 9 217 227 141 192 139 18 100 130 160 53 103 125 170 120 113 53 121 232 23 248 218 111 12 114 85 152 168 69 138 153 228 55 175 99 6 29 234 191 118 238 18 250 139 127 248 148 96 36 236 164 252 127 71 230 13 95 200 86 106 201 201 168 74 148 207 42 56 34 173 114 89 220 58 197 209 56 194 93 253 36 57 2 0 0 0 20 241 138 87 82 7 150 25 154 252 91 216 29 106 84 123 71 145 238 230 5 1 20 241 138 87 82 7 150 25 154 252 91 216 29 106 84 123 71 145 238 230 5 0 32 151 63 193 99 4 229 248 206 122 164 94 141 132 110 0 199 239 244 9 150 62 180 68 138 132 112 26 31 217 46 0 0 1 32 151 63 193 99 4 229 248 206 122 164 94 141 132 110 0 199 239 244 9 150 62 180 68 138 132 112 26 31 217 46 0 0 0 36 151 219 5 222 229 79 21 136 176 12 133 59 166 175 203 218 102 58 176 141 26 127 152 21 81 49 214 17 132 22 14 243 177 3 0 0 1 36 151 219 5 222 229 79 21 136 176 12 133 59 166 175 203 218 102 58 176 141 26 127 152 21 81 49 214 17 132 22 14 243 177 3 0 0 0 104 6 168 179 178 70 132 236 140 85 20 22 237 179 132 40 18 248 209 250 75 115 245 45 67 206 107 231 237 102 198 61 0 53 181 149 233 167 119 49 80 107 58 194 191 82 80 182 33 90 50 185 65 82 236 47 123 143 42 21 75 76 220 97 26 140 95 213 177 133 178 200 249 254 187 252 127 168 64 33 103 133 36 183 203 53 160 28 249 121 153 43 163 187 30 115 14 218 222 176 173 69 117 99 12 1 104 6 168 179 178 70 132 236 140 85 20 22 237 179 132 40 18 248 209 250 75 115 245 45 67 206 107 231 237 102 198 61 0 53 181 149 233 167 119 49 80 107 58 194 191 82 80 182 33 90 50 185 65 82 236 47 123 143 42 21 75 76 220 97 26 140 95 213 177 133 178 200 249 254 187 252 127 168 64 33 103 133 36 183 203 53 160 28 249 121 153 43 163 187 30 115 14 218 222 176 173 69 117 99 12 0 108 2 212 34 173 196 82 79 56 112 170 220 63 200 109 239 119 47 163 110 174 76 171 32 84 196 96 74 147 73 116 212 7 81 2 123 170 250 193 70 154 132 132 185 57 39 161 95 139 69 234 233 243 142 195 223 169 214 193 142 130 202 53 250 215 1 232 72 89 42 138 164 214 96 81 207 117 204 208 64 159 221 205 19 127 120 90 20 23 72 45 155 78 40 43 86 112 83 186 201 240 77 86 191 92 249 160 247 61 1 108 2 212 34 173 196 82 79 56 112 170 220 63 200 109 239 119 47 163 110 174 76 171 32 84 196 96 74 147 73 116 212 7 81 2 123 170 250 193 70 154 132 132 185 57 39 161 95 139 69 234 233 243 142 195 223 169 214 193 142 130 202 53 250 215 1 232 72 89 42 138 164 214 96 81 207 117 204 208 64 159 221 205 19 127 120 90 20 23 72 45 155 78 40 43 86 112 83 186 201 240 77 86 191 92 249 160 247 61 0 128 102 251 156 92 43 108 29 62 40 215 42 15 198 118 248 50 157 25 129 219 206 70 124 249 193 82 122 51 209 211 166 198 129 204 78 210 123 124 106 191 69 198 115 9 187 105 170 16 189 25 66 30 61 214 177 166 27 0 66 226 174 106 52 23 197 236 68 43 88 169 245 109 62 252 144 219 129 154 127 116 74 210 197 53 171 56 209 150 200 215 71 80 187 84 179 235 71 14 27 0 159 145 132 91 170 69 4 77 60 185 156 0 93 72 67 68 185 235 189 29 178 144 42 227 35 59 27 0 1 128 102 251 156 92 43 108 29 62 40 215 42 15 198 118 248 50 157 25 129 219 206 70 124 249 193 82 122 51 209 211 166 198 129 204 78 210 123 124 106 191 69 198 115 9 187 105 170 16 189 25 66 30 61 214 177 166 27 0 66 226 174 106 52 23 197 236 68 43 88 169 245 109 62 252 144 219 129 154 127 116 74 210 197 53 171 56 209 150 200 215 71 80 187 84 179 235 71 14 27 0 159 145 132 91 170 69 4 77 60 185 156 0 93 72 67 68 185 235 189 29 178 144 42 227 35 59 27 0 0 36 22 179 130 104 210 45 171 95 5 140 87 49 187 173 206 147 141 26 50 138 30 228 117 173 59 57 138 187 138 30 79 102 10 0 0 0 1 36 22 179 130 104 210 45 171 95 5 140 87 49 187 173 206 147 141 26 50 138 30 228 117 173 59 57 138 187 138 30 79 102 10 0 0 0 0 44 245 222 165 23 160 186 7 2 211 238 67 132 133 157 254 89 199 178 45 73 151 206 197 254 6 172 31 88 199 204 161 72 65 160 25 246 142 223 123 52 172 12 6 0 1 44 245 222 165 23 160 186 7 2 211 238 67 132 133 157 254 89 199 178 45 73 151 206 197 254 6 172 31 88 199 204 161 72 65 160 25 246 142 223 123 52 172 12 6 0 0 108 222 47 68 13 28 124 145 191 235 84 137 87 165 230 34 132 42 90 242 140 248 118 51 137 4 68 91 156 194 220 89 46 217 200 72 50 124 24 209 194 179 150 236 12 223 90 150 72 220 112 234 137 123 179 108 65 16 250 73 68 13 219 174 119 68 216 117 5 143 105 238 147 162 128 99 201 30 204 31 130 46 147 73 191 185 192 73 212 83 18 90 106 146 126 18 59 63 194 86 25 42 52 82 92 6 0 0 0 1 108 222 47 68 13 28 124 145 191 235 84 137 87 165 230 34 132 42 90 242 140 248 118 51 137 4 68 91 156 194 220 89 46 217 200 72 50 124 24 209 194 179 150 236 12 223 90 150 72 220 112 234 137 123 179 108 65 16 250 73 68 13 219 174 119 68 216 117 5 143 105 238 147 162 128 99 201 30 204 31 130 46 147 73 191 185 192 73 212 83 18 90 106 146 126 18 59 63 194 86 25 42 52 82 92 6 0 0 0 0 40 74 204 182 19 172 57 74 106 161 11 250 172 174 63 33 117 146 108 133 108 20 20 28 215 14 216 35 120 250 72 181 31 75 237 185 64 125 38 30 0 1 40 74 204 182 19 172 57 74 106 161 11 250 172 174 63 33 117 146 108 133 108 20 20 28 215 14 216 35 120 250 72 181 31 75 237 185 64 125 38 30 0 0 32 39 90 158 132 213 173 24 145 199 200 240 251 85 122 152 148 224 56 26 234 37 58 180 82 137 37 60 8 144 85 118 5 1 32 39 90 158 132 213 173 24 145 199 200 240 251 85 122 152 148 224 56 26 234 37 58 180 82 137 37 60 8 144 85 118 5 0 4 138 84 0 0 1 4 138 84 0 0 0 120 6 116 242 108 248 14 140 127 243 249 231 147 68 151 120 38 231 8 34 6 106 4 211 91 3 66 139 242 76 75 130 178 43 63 174 27 78 5 184 165 84 187 23 158 140 41 71 59 22 178 59 239 6 145 6 103 216 172 37 75 231 145 41 56 213 208 27 181 52 16 183 237 193 209 238 106 47 104 214 15 82 217 35 168 104 64 76 104 111 95 151 127 241 27 86 63 95 186 251 237 14 164 119 230 211 234 83 245 143 10 244 120 135 32 125 144 92 8 189 0 1 120 6 116 242 108 248 14 140 127 243 249 231 147 68 151 120 38 231 8 34 6 106 4 211 91 3 66 139 242 76 75 130 178 43 63 174 27 78 5 184 165 84 187 23 158 140 41 71 59 22 178 59 239 6 145 6 103 216 172 37 75 231 145 41 56 213 208 27 181 52 16 183 237 193 209 238 106 47 104 214 15 82 217 35 168 104 64 76 104 111 95 151 127 241 27 86 63 95 186 251 237 14 164 119 230 211 234 83 245 143 10 244 120 135 32 125 144 92 8 189 0 0 28 169 164 216 5 23 138 199 97 227 119 26 63 15 87 131 107 175 132 108 223 46 17 101 176 195 214 100 232 1 28 169 164 216 5 23 138 199 97 227 119 26 63 15 87 131 107 175 132 108 223 46 17 101 176 195 214 100 232 0 48 8 170 244 92 198 184 32 64 24 118 241 85 66 189 103 28 33 244 60 230 74 7 243 100 2 1 93 74 149 165 150 65 102 220 228 186 83 101 123 141 123 109 182 122 105 0 0 0 1 48 8 170 244 92 198 184 32 64 24 118 241 85 66 189 103 28 33 244 60 230 74 7 243 100 2 1 93 74 149 165 150 65 102 220 228 186 83 101 123 141 123 109 182 122 105 0 0 0 0 120 12 158 20 122 77 167 176 86 158 51 230 99 136 241 101 17 244 121 59 87 103 26 111 205 53 244 235 242 229 169 15 224 95 241 248 47 71 217 197 177 238 46 133 175 43 178 246 61 15 216 239 68 140 164 169 9 17 109 185 231 2 170 188 140 250 123 194 232 88 232 26 60 214 152 106 181 39 234 136 137 58 62 209 190 251 104 89 19 70 178 56 124 109 18 185 167 142 60 123 228 26 54 187 187 148 203 130 114 248 49 111 198 191 107 86 222 3 0 0 0 1 120 12 158 20 122 77 167 176 86 158 51 230 99 136 241 101 17 244 121 59 87 103 26 111 205 53 244 235 242 229 169 15 224 95 241 248 47 71 217 197 177 238 46 133 175 43 178 246 61 15 216 239 68 140 164 169 9 17 109 185 231 2 170 188 140 250 123 194 232 88 232 26 60 214 152 106 181 39 234 136 137 58 62 209 190 251 104 89 19 70 178 56 124 109 18 185 167 142 60 123 228 26 54 187 187 148 203 130 114 248 49 111 198 191 107 86 222 3 0 0 0 0 28 105 179 233 126 169 174 183 251 227 117 195 127 211 122 235 34 108 161 29 184 19 156 152 225 139 6 0 0 1 28 105 179 233 126 169 174 183 251 227 117 195 127 211 122 235 34 108 161 29 184 19 156 152 225 139 6 0 0 0 112 107 214 160 47 12 148 181 229 136 85 57 117 58 49 175 91 20 92 201 244 247 222 130 215 158 98 242 146 190 210 201 180 77 219 243 130 159 138 227 73 54 255 186 170 144 106 170 66 197 143 127 162 210 122 37 99 171 90 242 115 145 250 57 97 176 167 16 225 132 49 247 59 22 25 236 36 64 252 125 139 145 215 22 92 228 240 79 244 183 178 12 93 194 169 217 159 169 69 179 171 96 5 35 137 33 198 85 237 12 0 0 0 1 112 107 214 160 47 12 148 181 229 136 85 57 117 58 49 175 91 20 92 201 244 247 222 130 215 158 98 242 146 190 210 201 180 77 219 243 130 159 138 227 73 54 255 186 170 144 106 170 66 197 143 127 162 210 122 37 99 171 90 242 115 145 250 57 97 176 167 16 225 132 49 247 59 22 25 236 36 64 252 125 139 145 215 22 92 228 240 79 244 183 178 12 93 194 169 217 159 169 69 179 171 96 5 35 137 33 198 85 237 12 0 0 0 0 36 151 236 140 234 49 95 40 136 48 181 242 198 107 168 119 133 33 148 222 230 48 187 177 235 54 92 147 200 220 8 9 80 3 0 0 0 1 36 151 236 140 234 49 95 40 136 48 181 242 198 107 168 119 133 33 148 222 230 48 187 177 235 54 92 147 200 220 8 9 80 3 0 0 0 0 124 86 110 24 37 97 222 163 92 216 221 199 229 79 95 24 16 74 176 194 98 40 169 140 19 1 205 231 70 185 36 255 18 60 202 214 208 120 214 232 112 172 228 176 230 94 127 136 74 11 44 237 249 68 118 244 151 238 132 77 38 186 252 14 206 146 197 57 245 192 244 29 199 74 59 195 148 69 151 165 29 107 182 98 147 191 148 189 200 184 33 221 44 102 236 230 236 155 131 213 212 11 163 71 97 118 61 218 110 71 189 129 17 181 221 250 137 80 48 231 83 123 104 6 0 1 124 86 110 24 37 97 222 163 92 216 221 199 229 79 95 24 16 74 176 194 98 40 169 140 19 1 205 231 70 185 36 255 18 60 202 214 208 120 214 232 112 172 228 176 230 94 127 136 74 11 44 237 249 68 118 244 151 238 132 77 38 186 252 14 206 146 197 57 245 192 244 29 199 74 59 195 148 69 151 165 29 107 182 98 147 191 148 189 200 184 33 221 44 102 236 230 236 155 131 213 212 11 163 71 97 118 61 218 110 71 189 129 17 181 221 250 137 80 48 231 83 123 104 6 0 0 80 243 176 186 126 186 98 210 179 162 140 92 40 240 184 134 105 0 157 103 36 223 108 115 65 73 109 222 11 169 151 183 215 249 45 86 167 172 26 95 222 130 112 5 193 174 61 230 154 13 242 26 53 125 184 23 119 6 116 85 81 153 220 146 138 224 238 242 57 50 24 89 106 223 20 181 86 96 139 192 0 1 80 243 176 186 126 186 98 210 179 162 140 92 40 240 184 134 105 0 157 103 36 223 108 115 65 73 109 222 11 169 151 183 215 249 45 86 167 172 26 95 222 130 112 5 193 174 61 230 154 13 242 26 53 125 184 23 119 6 116 85 81 153 220 146 138 224 238 242 57 50 24 89 106 223 20 181 86 96 139 192 0 0 100 118 189 65 124 187 124 164 181 40 78 215 14 181 239 248 104 169 212 147 203 95 26 103 54 4 23 49 26 46 240 31 57 71 166 134 221 134 146 219 246 49 7 96 225 138 247 198 120 76 183 208 201 100 120 240 147 60 217 93 237 131 48 5 244 23 233 221 83 229 102 159 120 118 222 134 200 86 131 193 55 124 183 137 148 160 79 166 91 219 240 18 236 83 72 210 216 101 108 113 68 1 100 118 189 65 124 187 124 164 181 40 78 215 14 181 239 248 104 169 212 147 203 95 26 103 54 4 23 49 26 46 240 31 57 71 166 134 221 134 146 219 246 49 7 96 225 138 247 198 120 76 183 208 201 100 120 240 147 60 217 93 237 131 48 5 244 23 233 221 83 229 102 159 120 118 222 134 200 86 131 193 55 124 183 137 148 160 79 166 91 219 240 18 236 83 72 210 216 101 108 113 68 0 64 6 22 71 2 163 86 17 242 164 39 109 95 160 109 98 241 37 105 112 221 113 19 63 140 96 143 87 147 41 36 27 242 55 158 16 197 226 52 235 172 133 128 179 181 251 150 32 196 95 149 76 252 69 10 230 30 27 76 224 226 22 0 0 0 1 64 6 22 71 2 163 86 17 242 164 39 109 95 160 109 98 241 37 105 112 221 113 19 63 140 96 143 87 147 41 36 27 242 55 158 16 197 226 52 235 172 133 128 179 181 251 150 32 196 95 149 76 252 69 10 230 30 27 76 224 226 22 0 0 0 0 128 30 130 103 205 32 243 152 123 79 104 19 33 177 209 230 129 178 23 223 13 94 146 223 35 144 45 101 240 232 191 92 122 248 142 90 70 70 227 195 145 191 197 239 106 26 240 233 128 67 75 182 93 107 72 57 103 203 190 221 242 163 253 180 159 146 253 103 81 208 252 1 223 226 217 70 222 240 174 35 247 131 232 230 20 50 149 109 33 236 254 14 141 202 198 2 116 168 2 254 234 211 168 142 232 27 76 165 171 140 74 161 29 242 180 17 221 182 28 140 165 153 167 81 47 103 223 10 0 1 128 30 130 103 205 32 243 152 123 79 104 19 33 177 209 230 129 178 23 223 13 94 146 223 35 144 45 101 240 232 191 92 122 248 142 90 70 70 227 195 145 191 197 239 106 26 240 233 128 67 75 182 93 107 72 57 103 203 190 221 242 163 253 180 159 146 253 103 81 208 252 1 223 226 217 70 222 240 174 35 247 131 232 230 20 50 149 109 33 236 254 14 141 202 198 2 116 168 2 254 234 211 168 142 232 27 76 165 171 140 74 161 29 242 180 17 221 182 28 140 165 153 167 81 47 103 223 10 0 0 48 150 89 14 218 228 227 23 162 153 39 113 34 98 183 194 25 93 68 57 205 28 17 6 69 82 191 227 207 100 5 188 188 211 209 220 205 0 146 180 251 104 31 119 91 104 1 0 0 1 48 150 89 14 218 228 227 23 162 153 39 113 34 98 183 194 25 93 68 57 205 28 17 6 69 82 191 227 207 100 5 188 188 211 209 220 205 0 146 180 251 104 31 119 91 104 1 0 0 0 12 3 75 50 16 21 240 211 149 188 0 0 0 1 12 3 75 50 16 21 240 211 149 188 0 0 0 0 108 9 115 108 68 232 102 178 176 69 243 217 106 209 14 224 172 167 195 216 60 119 98 115 232 110 47 157 119 32 78 224 248 168 59 100 46 75 172 15 39 92 41 128 82 192 201 101 82 196 22 185 109 161 212 23 243 181 215 188 245 6 226 125 224 129 249 88 9 231 215 83 203 0 1 5 225 190 75 41 64 109 105 106 37 227 156 251 13 180 250 104 241 34 187 224 79 84 147 11 127 35 64 121 111 143 12 0 0 1 108 9 115 108 68 232 102 178 176 69 243 217 106 209 14 224 172 167 195 216 60 119 98 115 232 110 47 157 119 32 78 224 248 168 59 100 46 75 172 15 39 92 41 128 82 192 201 101 82 196 22 185 109 161 212 23 243 181 215 188 245 6 226 125 224 129 249 88 9 231 215 83 203 0 1 5 225 190 75 41 64 109 105 106 37 227 156 251 13 180 250 104 241 34 187 224 79 84 147 11 127 35 64 121 111 143 12 0 0 0 104 240 35 102 147 107 156 95 120 67 253 248 209 46 242 211 131 200 126 89 191 255 206 143 125 130 26 163 12 32 199 40 52 166 9 162 113 48 113 189 72 74 18 54 6 99 229 23 115 221 174 124 195 235 108 45 255 154 244 4 181 164 158 200 138 77 6 47 98 56 178 18 75 69 235 225 139 243 201 174 122 249 136 131 59 94 43 192 187 209 135 159 123 162 213 155 59 184 180 92 174 163 38 0 0 1 104 240 35 102 147 107 156 95 120 67 253 248 209 46 242 211 131 200 126 89 191 255 206 143 125 130 26 163 12 32 199 40 52 166 9 162 113 48 113 189 72 74 18 54 6 99 229 23 115 221 174 124 195 235 108 45 255 154 244 4 181 164 158 200 138 77 6 47 98 56 178 18 75 69 235 225 139 243 201 174 122 249 136 131 59 94 43 192 187 209 135 159 123 162 213 155 59 184 180 92 174 163 38 0 0 0 76 34 44 18 251 194 132 188 93 116 144 0 196 15 253 248 161 78 252 35 178 201 70 179 45 245 2 116 179 119 55 186 117 38 191 38 14 139 33 131 60 35 40 0 31 70 182 70 55 167 178 147 137 65 30 203 93 63 183 214 107 14 138 249 141 189 54 170 164 36 100 151 195 142 247 0 1 1 76 34 44 18 251 194 132 188 93 116 144 0 196 15 253 248 161 78 252 35 178 201 70 179 45 245 2 116 179 119 55 186 117 38 191 38 14 139 33 131 60 35 40 0 31 70 182 70 55 167 178 147 137 65 30 203 93 63 183 214 107 14 138 249 141 189 54 170 164 36 100 151 195 142 247 0 1 0 76 79 161 242 148 36 174 71 109 70 137 27 172 124 50 231 16 178 199 67 3 78 176 12 53 168 39 253 247 13 21 191 128 38 67 12 15 248 234 73 154 95 171 123 99 52 42 32 229 121 208 121 181 151 154 103 80 7 41 152 206 129 106 69 208 252 39 163 130 241 51 69 244 247 1 5 121 1 76 79 161 242 148 36 174 71 109 70 137 27 172 124 50 231 16 178 199 67 3 78 176 12 53 168 39 253 247 13 21 191 128 38 67 12 15 248 234 73 154 95 171 123 99 52 42 32 229 121 208 121 181 151 154 103 80 7 41 152 206 129 106 69 208 252 39 163 130 241 51 69 244 247 1 5 121 0 72 100 73 185 231 4 112 172 84 227 126 234 51 137 221 166 192 16 157 41 74 141 121 176 14 135 245 170 38 223 239 224 207 235 164 137 197 183 43 64 0 12 216 240 6 61 23 238 237 201 225 110 75 253 193 88 168 185 218 43 229 167 97 130 102 214 215 134 90 204 214 6 0 1 72 100 73 185 231 4 112 172 84 227 126 234 51 137 221 166 192 16 157 41 74 141 121 176 14 135 245 170 38 223 239 224 207 235 164 137 197 183 43 64 0 12 216 240 6 61 23 238 237 201 225 110 75 253 193 88 168 185 218 43 229 167 97 130 102 214 215 134 90 204 214 6 0 0 96 219 203 221 208 224 159 230 219 11 100 135 13 4 127 208 103 80 48 213 73 245 143 157 122 152 178 240 239 253 126 244 30 239 102 14 87 67 14 70 171 224 149 9 84 107 219 85 124 178 61 180 47 218 225 163 193 116 189 130 11 146 64 142 109 98 176 49 26 100 226 15 127 68 213 132 163 70 52 46 10 247 185 6 76 76 180 190 205 124 250 143 171 106 50 0 0 1 96 219 203 221 208 224 159 230 219 11 100 135 13 4 127 208 103 80 48 213 73 245 143 157 122 152 178 240 239 253 126 244 30 239 102 14 87 67 14 70 171 224 149 9 84 107 219 85 124 178 61 180 47 218 225 163 193 116 189 130 11 146 64 142 109 98 176 49 26 100 226 15 127 68 213 132 163 70 52 46 10 247 185 6 76 76 180 190 205 124 250 143 171 106 50 0 0 0 120 217 116 20 196 181 6 137 250 178 207 36 29 215 183 251 28 156 129 254 149 110 35 250 145 188 199 148 182 206 23 143 174 147 1 195 119 32 158 253 47 241 245 160 161 23 172 143 224 166 48 241 224 180 60 40 55 163 113 65 217 210 254 250 75 125 222 20 146 22 127 207 180 19 232 245 117 4 55 117 208 11 134 81 103 44 211 65 174 30 21 186 123 156 224 41 168 144 253 5 228 247 219 192 43 85 242 13 199 36 248 50 226 239 233 47 12 212 3 0 0 1 120 217 116 20 196 181 6 137 250 178 207 36 29 215 183 251 28 156 129 254 149 110 35 250 145 188 199 148 182 206 23 143 174 147 1 195 119 32 158 253 47 241 245 160 161 23 172 143 224 166 48 241 224 180 60 40 55 163 113 65 217 210 254 250 75 125 222 20 146 22 127 207 180 19 232 245 117 4 55 117 208 11 134 81 103 44 211 65 174 30 21 186 123 156 224 41 168 144 253 5 228 247 219 192 43 85 242 13 199 36 248 50 226 239 233 47 12 212 3 0 0 0 92 94 102 6 123 33 254 222 92 46 211 170 116 91 71 221 6 87 3 144 77 231 38 4 248 202 135 81 159 100 30 21 111 114 225 52 100 98 124 212 26 0 192 179 224 123 152 186 35 198 14 32 169 2 28 91 12 93 226 2 56 176 203 77 155 47 63 21 131 158 27 252 110 108 46 2 205 114 62 224 151 97 97 251 197 34 255 29 36 247 1 0 0 1 92 94 102 6 123 33 254 222 92 46 211 170 116 91 71 221 6 87 3 144 77 231 38 4 248 202 135 81 159 100 30 21 111 114 225 52 100 98 124 212 26 0 192 179 224 123 152 186 35 198 14 32 169 2 28 91 12 93 226 2 56 176 203 77 155 47 63 21 131 158 27 252 110 108 46 2 205 114 62 224 151 97 97 251 197 34 255 29 36 247 1 0 0 0 40 213 155 45 217 157 63 158 214 179 178 45 31 167 171 88 99 135 205 98 19 102 250 247 155 144 144 184 108 185 216 134 183 188 174 39 244 81 0 0 0 1 40 213 155 45 217 157 63 158 214 179 178 45 31 167 171 88 99 135 205 98 19 102 250 247 155 144 144 184 108 185 216 134 183 188 174 39 244 81 0 0 0 0 88 143 221 144 99 71 55 91 51 132 189 170 46 209 246 137 32 255 61 37 105 68 54 129 75 74 69 209 169 194 207 43 51 79 37 156 64 84 31 147 49 63 100 147 137 157 156 108 126 196 246 233 144 88 124 237 160 146 162 62 111 128 118 225 95 72 29 227 189 100 72 148 6 238 216 74 124 168 129 102 216 225 99 39 71 85 27 125 1 1 88 143 221 144 99 71 55 91 51 132 189 170 46 209 246 137 32 255 61 37 105 68 54 129 75 74 69 209 169 194 207 43 51 79 37 156 64 84 31 147 49 63 100 147 137 157 156 108 126 196 246 233 144 88 124 237 160 146 162 62 111 128 118 225 95 72 29 227 189 100 72 148 6 238 216 74 124 168 129 102 216 225 99 39 71 85 27 125 1 0 100 154 59 8 214 250 135 152 185 224 10 174 79 58 146 203 236 143 30 28 53 247 75 23 46 61 14 153 250 130 43 106 99 3 114 97 134 236 14 79 134 253 241 239 191 59 197 179 112 33 255 64 2 35 190 107 61 57 182 11 43 73 118 122 234 246 107 208 63 148 121 113 255 201 200 66 134 64 61 39 183 76 142 5 123 90 113 163 171 46 238 92 52 235 152 239 73 131 0 0 0 1 100 154 59 8 214 250 135 152 185 224 10 174 79 58 146 203 236 143 30 28 53 247 75 23 46 61 14 153 250 130 43 106 99 3 114 97 134 236 14 79 134 253 241 239 191 59 197 179 112 33 255 64 2 35 190 107 61 57 182 11 43 73 118 122 234 246 107 208 63 148 121 113 255 201 200 66 134 64 61 39 183 76 142 5 123 90 113 163 171 46 238 92 52 235 152 239 73 131 0 0 0 0 52 1 38 134 41 29 170 88 160 233 145 132 85 205 36 47 50 209 38 92 196 100 126 18 43 149 60 250 154 84 98 23 80 203 61 86 37 43 121 198 250 148 214 237 218 106 31 30 52 22 223 4 0 1 52 1 38 134 41 29 170 88 160 233 145 132 85 205 36 47 50 209 38 92 196 100 126 18 43 149 60 250 154 84 98 23 80 203 61 86 37 43 121 198 250 148 214 237 218 106 31 30 52 22 223 4 0 0 100 215 110 214 250 112 196 210 135 44 106 41 81 231 208 226 187 180 124 169 6 101 223 131 248 7 59 123 141 245 45 155 111 191 45 243 237 47 248 47 233 222 27 53 116 18 174 176 121 70 241 49 29 54 248 100 119 186 7 84 242 46 154 182 14 231 49 213 37 52 160 79 242 253 165 71 241 87 50 98 158 58 249 163 206 75 138 146 172 232 178 183 137 30 153 204 59 17 0 0 0 1 100 215 110 214 250 112 196 210 135 44 106 41 81 231 208 226 187 180 124 169 6 101 223 131 248 7 59 123 141 245 45 155 111 191 45 243 237 47 248 47 233 222 27 53 116 18 174 176 121 70 241 49 29 54 248 100 119 186 7 84 242 46 154 182 14 231 49 213 37 52 160 79 242 253 165 71 241 87 50 98 158 58 249 163 206 75 138 146 172 232 178 183 137 30 153 204 59 17 0 0 0 0 72 226 229 244 239 100 207 243 201 63 193 44 114 73 253 9 63 199 34 184 12 34 181 93 167 70 38 119 43 136 85 61 200 200 27 101 128 179 178 146 168 152 45 163 217 123 227 167 40 116 43 26 248 220 216 17 126 35 228 188 102 203 130 134 149 10 8 144 5 253 158 4 186 1 72 226 229 244 239 100 207 243 201 63 193 44 114 73 253 9 63 199 34 184 12 34 181 93 167 70 38 119 43 136 85 61 200 200 27 101 128 179 178 146 168 152 45 163 217 123 227 167 40 116 43 26 248 220 216 17 126 35 228 188 102 203 130 134 149 10 8 144 5 253 158 4 186 0 52 94 1 134 237 212 63 41 32 13 66 189 152 40 150 138 20 124 116 62 140 23 229 83 230 85 61 202 206 29 102 39 28 182 37 173 34 29 120 65 193 196 145 186 204 173 159 132 183 115 0 0 0 1 52 94 1 134 237 212 63 41 32 13 66 189 152 40 150 138 20 124 116 62 140 23 229 83 230 85 61 202 206 29 102 39 28 182 37 173 34 29 120 65 193 196 145 186 204 173 159 132 183 115 0 0 0 0 28 172 92 233 22 126 43 253 105 39 155 94 185 44 226 60 168 170 203 19 17 108 152 224 242 209 228 43 0 1 28 172 92 233 22 126 43 253 105 39 155 94 185 44 226 60 168 170 203 19 17 108 152 224 242 209 228 43 0 0 76 76 207 112 0 53 15 20 52 176 51 179 204 201 221 199 215 198 47 180 117 63 178 218 237 224 7 238 83 244 101 132 225 169 14 209 41 140 228 33 125 131 46 213 26 149 30 9 194 107 82 49 220 69 57 63 176 58 107 164 112 122 14 78 212 162 39 156 86 247 229 146 165 114 0 0 0 1 76 76 207 112 0 53 15 20 52 176 51 179 204 201 221 199 215 198 47 180 117 63 178 218 237 224 7 238 83 244 101 132 225 169 14 209 41 140 228 33 125 131 46 213 26 149 30 9 194 107 82 49 220 69 57 63 176 58 107 164 112 122 14 78 212 162 39 156 86 247 229 146 165 114 0 0 0 0 68 251 218 113 128 106 254 150 82 225 107 92 157 216 88 77 244 99 157 1 98 151 72 130 185 194 141 147 195 242 231 156 213 157 138 94 239 99 178 106 231 226 192 202 146 27 248 176 225 209 153 7 186 7 50 120 183 212 126 50 190 105 134 94 43 155 64 125 6 1 68 251 218 113 128 106 254 150 82 225 107 92 157 216 88 77 244 99 157 1 98 151 72 130 185 194 141 147 195 242 231 156 213 157 138 94 239 99 178 106 231 226 192 202 146 27 248 176 225 209 153 7 186 7 50 120 183 212 126 50 190 105 134 94 43 155 64 125 6 0 12 209 108 141 185 23 199 10 211 38 178 0 0 1 12 209 108 141 185 23 199 10 211 38 178 0 0 0 52 154 210 229 202 23 25 195 186 179 6 6 199 170 59 41 215 172 79 12 201 40 201 127 61 38 143 15 80 87 105 227 146 32 219 224 101 136 180 226 214 34 112 110 89 114 34 177 212 74 212 106 6 1 52 154 210 229 202 23 25 195 186 179 6 6 199 170 59 41 215 172 79 12 201 40 201 127 61 38 143 15 80 87 105 227 146 32 219 224 101 136 180 226 214 34 112 110 89 114 34 177 212 74 212 106 6 0 8 100 135 7 25 201 86 188 2 1 8 100 135 7 25 201 86 188 2 0 48 109 14 55 6 23 219 83 134 16 29 117 179 205 24 254 117 81 245 228 115 29 245 23 120 19 143 171 136 217 234 105 176 54 200 15 132 252 117 219 34 127 228 168 111 203 2 0 0 1 48 109 14 55 6 23 219 83 134 16 29 117 179 205 24 254 117 81 245 228 115 29 245 23 120 19 143 171 136 217 234 105 176 54 200 15 132 252 117 219 34 127 228 168 111 203 2 0 0 0 68 189 190 26 27 18 245 206 184 37 205 141 131 212 0 127 17 122 35 32 152 79 200 69 20 74 161 75 208 251 152 129 241 33 169 49 200 168 98 138 154 1 201 2 137 248 97 109 91 51 92 185 150 229 58 56 137 252 73 190 235 237 144 130 251 152 190 194 0 1 68 189 190 26 27 18 245 206 184 37 205 141 131 212 0 127 17 122 35 32 152 79 200 69 20 74 161 75 208 251 152 129 241 33 169 49 200 168 98 138 154 1 201 2 137 248 97 109 91 51 92 185 150 229 58 56 137 252 73 190 235 237 144 130 251 152 190 194 0 0 76 207 251 128 22 249 241 160 213 177 156 81 63 226 211 104 180 224 253 194 155 185 4 55 89 47 114 245 7 150 248 180 92 51 125 222 246 36 165 153 246 217 229 236 207 71 52 111 220 127 235 87 138 209 205 186 72 20 6 162 209 199 59 28 143 29 40 129 110 196 31 138 191 210 255 29 45 1 76 207 251 128 22 249 241 160 213 177 156 81 63 226 211 104 180 224 253 194 155 185 4 55 89 47 114 245 7 150 248 180 92 51 125 222 246 36 165 153 246 217 229 236 207 71 52 111 220 127 235 87 138 209 205 186 72 20 6 162 209 199 59 28 143 29 40 129 110 196 31 138 191 210 255 29 45 0 100 34 105 251 242 196 29 25 191 13 57 197 24 56 214 71 179 84 16 80 235 205 101 211 115 134 253 214 216 165 198 158 63 242 99 11 173 46 16 134 146 11 55 237 102 192 144 220 243 114 208 229 213 0 218 193 226 110 51 184 76 183 51 12 136 3 140 173 50 245 19 16 15 166 7 51 67 86 66 36 164 78 174 152 214 177 106 255 43 110 199 185 127 79 12 140 96 198 60 160 102 1 100 34 105 251 242 196 29 25 191 13 57 197 24 56 214 71 179 84 16 80 235 205 101 211 115 134 253 214 216 165 198 158 63 242 99 11 173 46 16 134 146 11 55 237 102 192 144 220 243 114 208 229 213 0 218 193 226 110 51 184 76 183 51 12 136 3 140 173 50 245 19 16 15 166 7 51 67 86 66 36 164 78 174 152 214 177 106 255 43 110 199 185 127 79 12 140 96 198 60 160 102 0 48 151 50 240 113 2 240 195 92 196 249 19 127 144 80 105 89 196 158 41 252 36 228 125 87 223 38 175 180 160 171 217 8 107 79 15 49 18 96 89 233 92 36 110 25 144 127 0 0 1 48 151 50 240 113 2 240 195 92 196 249 19 127 144 80 105 89 196 158 41 252 36 228 125 87 223 38 175 180 160 171 217 8 107 79 15 49 18 96 89 233 92 36 110 25 144 127 0 0 0 120 220 111 204 84 44 130 217 213 198 206 117 146 194 10 147 26 202 239 193 244 37 205 135 142 56 32 249 87 168 225 194 69 224 42 44 177 94 77 94 53 91 119 184 126 54 91 178 96 62 34 235 141 251 16 10 187 157 41 198 141 167 60 123 73 194 190 232 21 131 122 95 94 19 80 131 0 80 156 191 71 14 30 148 74 123 179 226 24 229 233 126 54 51 237 55 92 191 74 239 104 108 155 8 161 36 74 77 55 133 160 139 207 243 154 53 85 221 49 167 10 1 120 220 111 204 84 44 130 217 213 198 206 117 146 194 10 147 26 202 239 193 244 37 205 135 142 56 32 249 87 168 225 194 69 224 42 44 177 94 77 94 53 91 119 184 126 54 91 178 96 62 34 235 141 251 16 10 187 157 41 198 141 167 60 123 73 194 190 232 21 131 122 95 94 19 80 131 0 80 156 191 71 14 30 148 74 123 179 226 24 229 233 126 54 51 237 55 92 191 74 239 104 108 155 8 161 36 74 77 55 133 160 139 207 243 154 53 85 221 49 167 10 0 124 66 181 48 69 164 115 164 70 89 243 215 101 175 87 235 67 90 105 180 75 47 179 125 207 87 227 224 42 29 17 96 44 75 24 133 40 113 24 135 93 121 59 20 187 166 95 86 53 166 161 86 99 27 119 194 156 39 207 117 76 162 208 78 38 249 64 104 247 119 216 98 220 191 85 93 88 71 67 153 91 210 137 198 13 84 67 129 197 58 103 183 253 111 51 7 9 158 89 134 12 78 19 173 133 159 221 103 18 198 238 156 111 121 141 61 104 245 244 206 7 118 23 61 26 1 124 66 181 48 69 164 115 164 70 89 243 215 101 175 87 235 67 90 105 180 75 47 179 125 207 87 227 224 42 29 17 96 44 75 24 133 40 113 24 135 93 121 59 20 187 166 95 86 53 166 161 86 99 27 119 194 156 39 207 117 76 162 208 78 38 249 64 104 247 119 216 98 220 191 85 93 88 71 67 153 91 210 137 198 13 84 67 129 197 58 103 183 253 111 51 7 9 158 89 134 12 78 19 173 133 159 221 103 18 198 238 156 111 121 141 61 104 245 244 206 7 118 23 61 26 0 20 53 158 199 70 207 47 204 168 124 200 230 150 58 31 240 105 24 0 0 0 1 20 53 158 199 70 207 47 204 168 124 200 230 150 58 31 240 105 24 0 0 0 0 20 44 216 57 222 28 184 85 185 207 83 175 57 221 190 218 247 150 5 9 117 1 20 44 216 57 222 28 184 85 185 207 83 175 57 221 190 218 247 150 5 9 117 0 76 175 96 135 121 157 156 226 243 56 243 161 244 255 180 122 46 138 241 238 214 239 108 19 34 52 247 13 21 71 51 38 3 155 181 28 151 11 194 1 127 89 168 237 141 215 157 75 68 132 79 117 113 7 76 199 243 237 109 44 236 225 116 106 60 77 216 199 25 21 97 116 178 189 0 0 0 1 76 175 96 135 121 157 156 226 243 56 243 161 244 255 180 122 46 138 241 238 214 239 108 19 34 52 247 13 21 71 51 38 3 155 181 28 151 11 194 1 127 89 168 237 141 215 157 75 68 132 79 117 113 7 76 199 243 237 109 44 236 225 116 106 60 77 216 199 25 21 97 116 178 189 0 0 0 0 52 202 229 137 148 154 5 233 137 136 40 13 16 169 117 12 152 29 203 90 68 73 225 131 236 45 230 124 112 148 9 55 131 227 132 115 213 238 10 238 61 255 35 176 204 139 43 31 180 151 38 28 0 1 52 202 229 137 148 154 5 233 137 136 40 13 16 169 117 12 152 29 203 90 68 73 225 131 236 45 230 124 112 148 9 55 131 227 132 115 213 238 10 238 61 255 35 176 204 139 43 31 180 151 38 28 0 0 60 235 98 102 1 125 196 43 138 213 140 187 232 56 154 133 53 67 83 164 240 80 16 61 51 160 252 62 34 180 200 255 184 169 84 36 69 72 6 78 7 150 152 1 13 250 97 34 132 97 157 173 219 115 157 86 128 104 9 243 111 1 60 235 98 102 1 125 196 43 138 213 140 187 232 56 154 133 53 67 83 164 240 80 16 61 51 160 252 62 34 180 200 255 184 169 84 36 69 72 6 78 7 150 152 1 13 250 97 34 132 97 157 173 219 115 157 86 128 104 9 243 111 0 52 110 238 199 119 170 141 33 211 193 225 211 65 71 230 113 169 249 100 145 146 90 130 63 193 239 121 202 133 82 133 133 53 185 111 84 99 172 253 212 36 243 170 231 244 134 94 195 226 84 11 0 0 1 52 110 238 199 119 170 141 33 211 193 225 211 65 71 230 113 169 249 100 145 146 90 130 63 193 239 121 202 133 82 133 133 53 185 111 84 99 172 253 212 36 243 170 231 244 134 94 195 226 84 11 0 0 0 4 106 26 0 0 1 4 106 26 0 0 0 96 55 152 73 157 134 83 107 104 157 196 53 164 2 160 29 214 41 144 154 185 26 161 178 109 113 19 105 96 157 167 54 34 103 42 200 114 164 164 104 227 67 103 2 210 8 116 188 135 174 40 62 91 190 166 226 195 250 41 221 152 30 57 61 233 241 101 130 10 63 191 169 19 148 16 188 139 65 132 105 232 99 49 96 137 153 204 114 212 66 194 182 129 146 0 0 0 1 96 55 152 73 157 134 83 107 104 157 196 53 164 2 160 29 214 41 144 154 185 26 161 178 109 113 19 105 96 157 167 54 34 103 42 200 114 164 164 104 227 67 103 2 210 8 116 188 135 174 40 62 91 190 166 226 195 250 41 221 152 30 57 61 233 241 101 130 10 63 191 169 19 148 16 188 139 65 132 105 232 99 49 96 137 153 204 114 212 66 194 182 129 146 0 0 0 0 44 215 234 168 32 222 91 186 69 25 72 240 30 59 198 171 46 112 186 148 235 6 205 150 234 108 20 173 83 144 129 239 167 253 152 161 53 229 15 251 248 211 51 238 4 1 44 215 234 168 32 222 91 186 69 25 72 240 30 59 198 171 46 112 186 148 235 6 205 150 234 108 20 173 83 144 129 239 167 253 152 161 53 229 15 251 248 211 51 238 4 0 52 189 135 39 96 175 218 106 164 199 43 5 248 111 65 179 200 109 31 254 255 126 80 190 92 65 237 178 43 23 153 58 10 9 97 226 246 198 243 117 174 24 218 33 231 128 164 157 128 151 190 0 0 1 52 189 135 39 96 175 218 106 164 199 43 5 248 111 65 179 200 109 31 254 255 126 80 190 92 65 237 178 43 23 153 58 10 9 97 226 246 198 243 117 174 24 218 33 231 128 164 157 128 151 190 0 0 0 24 239 56 183 78 45 154 165 142 40 239 207 3 167 77 151 86 239 3 11 209 79 0 0 0 1 24 239 56 183 78 45 154 165 142 40 239 207 3 167 77 151 86 239 3 11 209 79 0 0 0 0 120 130 184 128 68 207 249 83 80 33 163 142 32 202 202 145 151 232 83 195 182 58 116 163 243 175 189 47 35 208 19 5 175 59 26 2 94 105 183 66 152 203 200 32 2 26 199 8 181 211 38 92 194 207 149 100 136 89 145 224 231 176 230 123 222 97 24 81 114 242 42 179 218 87 154 251 235 53 36 114 72 81 186 89 13 87 192 22 111 97 8 245 31 80 244 208 101 196 210 93 76 175 182 133 13 74 7 144 34 186 229 253 42 25 120 196 253 145 203 34 0 1 120 130 184 128 68 207 249 83 80 33 163 142 32 202 202 145 151 232 83 195 182 58 116 163 243 175 189 47 35 208 19 5 175 59 26 2 94 105 183 66 152 203 200 32 2 26 199 8 181 211 38 92 194 207 149 100 136 89 145 224 231 176 230 123 222 97 24 81 114 242 42 179 218 87 154 251 235 53 36 114 72 81 186 89 13 87 192 22 111 97 8 245 31 80 244 208 101 196 210 93 76 175 182 133 13 74 7 144 34 186 229 253 42 25 120 196 253 145 203 34 0 0 104 177 43 20 0 140 140 47 23 231 84 40 77 91 102 55 158 233 117 153 218 25 252 97 80 128 163 220 227 30 148 92 31 92 123 175 218 18 184 223 122 242 27 52 233 221 142 227 84 175 165 149 51 30 52 3 112 242 251 194 123 45 37 79 48 197 65 154 217 117 129 115 239 202 140 4 219 13 126 27 135 146 152 96 151 82 124 223 118 24 195 194 175 191 121 134 29 81 56 114 151 40 33 0 0 1 104 177 43 20 0 140 140 47 23 231 84 40 77 91 102 55 158 233 117 153 218 25 252 97 80 128 163 220 227 30 148 92 31 92 123 175 218 18 184 223 122 242 27 52 233 221 142 227 84 175 165 149 51 30 52 3 112 242 251 194 123 45 37 79 48 197 65 154 217 117 129 115 239 202 140 4 219 13 126 27 135 146 152 96 151 82 124 223 118 24 195 194 175 191 121 134 29 81 56 114 151 40 33 0 0 0 56 226 202 173 6 149 116 30 177 236 7 160 65 73 122 165 121 36 223 128 217 110 236 2 31 124 183 89 207 252 6 59 84 137 76 50 38 76 184 223 208 6 130 201 233 242 76 37 234 218 223 126 70 103 75 198 17 1 56 226 202 173 6 149 116 30 177 236 7 160 65 73 122 165 121 36 223 128 217 110 236 2 31 124 183 89 207 252 6 59 84 137 76 50 38 76 184 223 208 6 130 201 233 242 76 37 234 218 223 126 70 103 75 198 17 0 40 143 226 94 34 87 62 30 33 239 85 79 57 245 111 192 126 163 234 125 86 103 149 210 150 242 12 158 215 135 158 29 55 151 47 136 29 80 31 37 252 1 40 143 226 94 34 87 62 30 33 239 85 79 57 245 111 192 126 163 234 125 86 103 149 210 150 242 12 158 215 135 158 29 55 151 47 136 29 80 31 37 252 0 112 181 27 23 157 82 76 57 33 149 24 89 155 221 152 127 94 66 164 208 210 148 182 78 234 184 210 234 72 255 16 100 229 47 58 156 105 247 59 66 253 245 169 65 48 79 130 122 51 190 191 81 1 34 200 63 2 65 127 95 41 111 129 132 49 253 173 167 197 104 55 130 14 224 162 119 109 66 142 188 11 186 58 39 173 207 179 212 181 61 158 3 218 40 241 226 184 47 0 88 220 135 180 224 61 164 169 34 189 151 91 0 0 1 112 181 27 23 157 82 76 57 33 149 24 89 155 221 152 127 94 66 164 208 210 148 182 78 234 184 210 234 72 255 16 100 229 47 58 156 105 247 59 66 253 245 169 65 48 79 130 122 51 190 191 81 1 34 200 63 2 65 127 95 41 111 129 132 49 253 173 167 197 104 55 130 14 224 162 119 109 66 142 188 11 186 58 39 173 207 179 212 181 61 158 3 218 40 241 226 184 47 0 88 220 135 180 224 61 164 169 34 189 151 91 0 0 0 68 245 37 28 124 5 215 158 136 244 187 142 156 141 44 84 13 112 140 11 136 159 80 12 232 82 107 30 135 75 126 13 223 106 21 218 151 253 45 223 202 227 61 206 171 121 209 68 8 191 131 100 178 102 54 84 51 65 145 226 154 248 80 115 68 154 209 63 76 1 68 245 37 28 124 5 215 158 136 244 187 142 156 141 44 84 13 112 140 11 136 159 80 12 232 82 107 30 135 75 126 13 223 106 21 218 151 253 45 223 202 227 61 206 171 121 209 68 8 191 131 100 178 102 54 84 51 65 145 226 154 248 80 115 68 154 209 63 76 0 80 135 137 38 34 14 3 46 79 186 179 131 28 57 25 247 29 19 45 197 193 203 121 109 165 119 101 172 185 115 171 154 177 182 27 155 85 37 5 182 213 87 183 42 234 134 15 60 0 46 192 218 165 41 22 150 148 218 236 133 178 67 163 140 233 134 213 210 71 193 23 166 26 63 204 170 123 79 127 246 26 1 80 135 137 38 34 14 3 46 79 186 179 131 28 57 25 247 29 19 45 197 193 203 121 109 165 119 101 172 185 115 171 154 177 182 27 155 85 37 5 182 213 87 183 42 234 134 15 60 0 46 192 218 165 41 22 150 148 218 236 133 178 67 163 140 233 134 213 210 71 193 23 166 26 63 204 170 123 79 127 246 26 0 24 161 11 98 151 34 241 111 106 193 28 3 100 220 97 185 34 185 14 129 244 209 10 0 0 1 24 161 11 98 151 34 241 111 106 193 28 3 100 220 97 185 34 185 14 129 244 209 10 0 0 0 16 130 229 241 126 185 171 21 95 192 161 17 185 7 19 79 20 1 16 130 229 241 126 185 171 21 95 192 161 17 185 7 19 79 20 0 80 9 13 228 66 211 156 80 135 182 180 214 181 47 183 227 46 41 12 246 131 232 90 158 5 19 60 63 252 117 169 61 164 189 193 27 141 183 254 18 152 59 130 30 176 181 167 165 190 60 186 198 100 145 152 47 75 69 203 253 237 35 74 191 49 205 55 93 241 175 147 35 169 57 234 147 255 216 2 0 0 1 80 9 13 228 66 211 156 80 135 182 180 214 181 47 183 227 46 41 12 246 131 232 90 158 5 19 60 63 252 117 169 61 164 189 193 27 141 183 254 18 152 59 130 30 176 181 167 165 190 60 186 198 100 145 152 47 75 69 203 253 237 35 74 191 49 205 55 93 241 175 147 35 169 57 234 147 255 216 2 0 0 0 64 141 139 202 76 43 47 180 136 161 170 209 0 136 207 136 36 208 145 71 130 83 221 226 101 19 151 187 159 109 224 255 62 88 129 165 22 98 27 176 90 80 16 65 129 69 250 183 187 147 190 130 199 5 11 138 101 83 65 161 2 6 0 0 0 1 64 141 139 202 76 43 47 180 136 161 170 209 0 136 207 136 36 208 145 71 130 83 221 226 101 19 151 187 159 109 224 255 62 88 129 165 22 98 27 176 90 80 16 65 129 69 250 183 187 147 190 130 199 5 11 138 101 83 65 161 2 6 0 0 0 0 36 187 72 171 67 22 57 200 41 156 125 20 118 214 230 17 121 132 100 6 245 170 66 142 117 245 148 173 113 251 22 92 19 155 30 0 0 1 36 187 72 171 67 22 57 200 41 156 125 20 118 214 230 17 121 132 100 6 245 170 66 142 117 245 148 173 113 251 22 92 19 155 30 0 0 0 44 101 58 72 216 138 4 45 140 222 69 239 13 13 50 235 67 209 36 214 49 165 77 35 96 140 27 164 215 181 180 73 146 42 130 29 96 159 153 232 94 77 175 255 20 1 44 101 58 72 216 138 4 45 140 222 69 239 13 13 50 235 67 209 36 214 49 165 77 35 96 140 27 164 215 181 180 73 146 42 130 29 96 159 153 232 94 77 175 255 20 0 84 219 224 155 211 221 151 19 144 234 158 11 45 122 35 132 149 62 141 108 208 26 84 49 255 193 206 21 192 119 23 25 107 230 224 23 255 211 84 131 200 163 22 3 191 95 246 22 164 37 9 116 62 212 138 8 160 64 31 218 139 106 242 89 216 218 255 147 91 71 129 205 194 18 209 161 119 85 170 226 225 162 83 212 20 1 84 219 224 155 211 221 151 19 144 234 158 11 45 122 35 132 149 62 141 108 208 26 84 49 255 193 206 21 192 119 23 25 107 230 224 23 255 211 84 131 200 163 22 3 191 95 246 22 164 37 9 116 62 212 138 8 160 64 31 218 139 106 242 89 216 218 255 147 91 71 129 205 194 18 209 161 119 85 170 226 225 162 83 212 20 0 68 14 156 116 249 212 16 111 35 17 9 212 224 210 14 154 158 72 254 112 138 10 30 123 27 209 114 67 151 154 58 185 70 230 39 91 161 175 96 144 42 108 176 175 129 131 222 206 150 81 39 184 66 31 183 226 159 121 73 128 206 177 92 204 53 155 0 167 103 1 68 14 156 116 249 212 16 111 35 17 9 212 224 210 14 154 158 72 254 112 138 10 30 123 27 209 114 67 151 154 58 185 70 230 39 91 161 175 96 144 42 108 176 175 129 131 222 206 150 81 39 184 66 31 183 226 159 121 73 128 206 177 92 204 53 155 0 167 103 0 92 24 127 183 77 135 143 95 88 89 95 188 40 117 29 239 121 158 197 98 117 88 96 129 197 2 191 220 182 209 38 73 53 151 197 255 5 2 62 107 10 40 43 253 32 105 98 219 212 155 202 52 7 137 199 16 43 208 83 186 41 89 60 249 93 40 107 182 175 147 127 53 185 207 74 51 82 246 167 59 57 221 250 206 122 32 222 85 116 2 0 0 0 1 92 24 127 183 77 135 143 95 88 89 95 188 40 117 29 239 121 158 197 98 117 88 96 129 197 2 191 220 182 209 38 73 53 151 197 255 5 2 62 107 10 40 43 253 32 105 98 219 212 155 202 52 7 137 199 16 43 208 83 186 41 89 60 249 93 40 107 182 175 147 127 53 185 207 74 51 82 246 167 59 57 221 250 206 122 32 222 85 116 2 0 0 0 0 92 147 237 31 71 216 196 26 132 246 73 163 25 96 43 245 7 209 8 5 54 169 7 250 78 177 89 40 0 243 40 2 158 24 11 198 234 171 172 170 64 188 187 101 123 162 237 222 202 89 40 19 173 38 211 166 45 226 3 80 235 195 110 200 92 16 163 19 117 163 211 172 5 18 87 238 191 193 83 143 189 110 113 70 107 147 246 94 49 35 15 198 45 1 92 147 237 31 71 216 196 26 132 246 73 163 25 96 43 245 7 209 8 5 54 169 7 250 78 177 89 40 0 243 40 2 158 24 11 198 234 171 172 170 64 188 187 101 123 162 237 222 202 89 40 19 173 38 211 166 45 226 3 80 235 195 110 200 92 16 163 19 117 163 211 172 5 18 87 238 191 193 83 143 189 110 113 70 107 147 246 94 49 35 15 198 45 0 96 64 61 164 44 87 227 172 18 31 65 156 146 28 18 93 184 64 206 182 188 247 38 246 148 197 40 179 134 87 253 99 200 144 207 105 35 236 191 211 141 2 166 22 69 97 111 181 148 114 108 196 62 4 205 40 5 94 207 78 159 83 52 193 205 124 45 112 37 168 234 114 146 238 213 231 94 67 171 153 42 253 122 194 188 137 165 213 50 253 178 210 172 158 19 49 97 1 96 64 61 164 44 87 227 172 18 31 65 156 146 28 18 93 184 64 206 182 188 247 38 246 148 197 40 179 134 87 253 99 200 144 207 105 35 236 191 211 141 2 166 22 69 97 111 181 148 114 108 196 62 4 205 40 5 94 207 78 159 83 52 193 205 124 45 112 37 168 234 114 146 238 213 231 94 67 171 153 42 253 122 194 188 137 165 213 50 253 178 210 172 158 19 49 97 0 128 18 25 43 69 203 163 208 25 129 70 179 87 12 27 80 85 159 26 23 217 250 145 72 121 50 16 37 139 240 158 153 146 201 8 164 249 47 152 57 202 235 15 58 45 34 201 248 69 113 190 138 170 65 10 208 146 132 110 25 228 113 14 229 109 123 49 220 88 192 96 240 71 116 139 193 10 198 27 240 251 107 253 255 213 42 221 24 113 228 220 232 119 71 248 233 220 92 90 99 190 197 160 163 32 110 191 182 102 164 156 66 22 63 71 173 246 104 8 68 245 41 178 81 182 144 193 28 0 1 128 18 25 43 69 203 163 208 25 129 70 179 87 12 27 80 85 159 26 23 217 250 145 72 121 50 16 37 139 240 158 153 146 201 8 164 249 47 152 57 202 235 15 58 45 34 201 248 69 113 190 138 170 65 10 208 146 132 110 25 228 113 14 229 109 123 49 220 88 192 96 240 71 116 139 193 10 198 27 240 251 107 253 255 213 42 221 24 113 228 220 232 119 71 248 233 220 92 90 99 190 197 160 163 32 110 191 182 102 164 156 66 22 63 71 173 246 104 8 68 245 41 178 81 182 144 193 28 0 0 60 106 111 228 235 51 226 122 218 7 64 133 195 240 189 43 175 243 131 132 104 152 3 70 2 1 203 253 95 8 193 163 40 223 43 68 152 88 4 207 245 179 156 172 179 217 24 72 255 34 91 50 116 117 25 16 159 79 126 0 0 1 60 106 111 228 235 51 226 122 218 7 64 133 195 240 189 43 175 243 131 132 104 152 3 70 2 1 203 253 95 8 193 163 40 223 43 68 152 88 4 207 245 179 156 172 179 217 24 72 255 34 91 50 116 117 25 16 159 79 126 0 0 0 96 242 78 165 200 211 109 6 120 204 217 25 19 113 152 179 73 130 49 149 173 66 167 106 162 150 87 123 191 217 234 1 44 116 181 9 66 210 127 251 186 48 185 108 188 94 122 96 63 201 235 22 186 67 42 225 10 180 91 176 96 61 82 61 81 28 92 254 57 197 179 147 78 166 147 71 129 176 7 57 241 168 104 58 31 131 207 114 100 228 122 222 33 1 0 0 0 1 96 242 78 165 200 211 109 6 120 204 217 25 19 113 152 179 73 130 49 149 173 66 167 106 162 150 87 123 191 217 234 1 44 116 181 9 66 210 127 251 186 48 185 108 188 94 122 96 63 201 235 22 186 67 42 225 10 180 91 176 96 61 82 61 81 28 92 254 57 197 179 147 78 166 147 71 129 176 7 57 241 168 104 58 31 131 207 114 100 228 122 222 33 1 0 0 0 0 12 97 77 106 250 36 19 39 116 255 76 19 0 1 12 97 77 106 250 36 19 39 116 255 76 19 0 0 120 111 83 184 168 71 100 200 47 99 200 7 122 64 223 9 88 127 36 176 17 86 69 21 128 134 171 205 233 96 184 231 129 34 199 145 56 105 1 143 43 41 220 152 215 178 124 68 220 20 206 108 104 17 70 117 37 42 80 169 70 134 89 10 29 153 175 13 143 30 175 166 31 179 51 111 40 201 178 167 176 195 238 36 55 237 111 116 105 132 211 219 6 26 164 101 240 113 151 131 108 247 150 189 114 192 163 218 28 145 0 191 98 2 111 27 49 39 0 0 0 1 120 111 83 184 168 71 100 200 47 99 200 7 122 64 223 9 88 127 36 176 17 86 69 21 128 134 171 205 233 96 184 231 129 34 199 145 56 105 1 143 43 41 220 152 215 178 124 68 220 20 206 108 104 17 70 117 37 42 80 169 70 134 89 10 29 153 175 13 143 30 175 166 31 179 51 111 40 201 178 167 176 195 238 36 55 237 111 116 105 132 211 219 6 26 164 101 240 113 151 131 108 247 150 189 114 192 163 218 28 145 0 191 98 2 111 27 49 39 0 0 0 0 32 81 112 148 108 23 32 68 197 136 108 75 125 74 153 138 193 143 46 240 12 147 141 114 195 168 154 52 204 254 27 0 0 1 32 81 112 148 108 23 32 68 197 136 108 75 125 74 153 138 193 143 46 240 12 147 141 114 195 168 154 52 204 254 27 0 0 0 68 229 45 84 95 24 25 32 216 165 111 25 116 164 115 152 232 97 207 181 82 250 83 172 4 143 100 89 243 176 103 143 89 97 174 71 138 98 227 83 33 167 157 210 208 119 156 79 89 223 158 79 207 126 107 230 151 179 67 137 75 82 190 93 51 33 0 0 0 1 68 229 45 84 95 24 25 32 216 165 111 25 116 164 115 152 232 97 207 181 82 250 83 172 4 143 100 89 243 176 103 143 89 97 174 71 138 98 227 83 33 167 157 210 208 119 156 79 89 223 158 79 207 126 107 230 151 179 67 137 75 82 190 93 51 33 0 0 0 0 120 221 101 250 13 148 219 147 8 203 24 156 18 193 222 45 207 235 157 11 245 111 54 46 193 242 190 64 24 32 5 137 205 125 176 100 17 201 24 239 205 106 167 230 189 153 124 31 64 237 182 168 183 7 51 170 88 147 80 176 116 117 47 23 224 52 179 41 43 139 109 178 28 245 173 29 90 7 170 105 16 115 2 213 39 87 247 94 160 195 0 33 49 96 68 43 87 69 180 255 100 174 99 176 29 24 104 158 236 125 224 97 89 243 65 242 94 178 0 0 0 1 120 221 101 250 13 148 219 147 8 203 24 156 18 193 222 45 207 235 157 11 245 111 54 46 193 242 190 64 24 32 5 137 205 125 176 100 17 201 24 239 205 106 167 230 189 153 124 31 64 237 182 168 183 7 51 170 88 147 80 176 116 117 47 23 224 52 179 41 43 139 109 178 28 245 173 29 90 7 170 105 16 115 2 213 39 87 247 94 160 195 0 33 49 96 68 43 87 69 180 255 100 174 99 176 29 24 104 158 236 125 224 97 89 243 65 242 94 178 0 0 0 0 72 184 253 189 224 206 45 217 58 19 82 204 156 74 148 217 108 38 0 212 209 189 122 237 87 236 106 6 235 35 39 176 243 21 191 101 210 52 159 254 224 228 116 193 110 127 138 238 156 91 101 182 243 43 212 2 192 249 29 46 143 26 92 106 122 73 98 4 82 141 13 112 16 1 72 184 253 189 224 206 45 217 58 19 82 204 156 74 148 217 108 38 0 212 209 189 122 237 87 236 106 6 235 35 39 176 243 21 191 101 210 52 159 254 224 228 116 193 110 127 138 238 156 91 101 182 243 43 212 2 192 249 29 46 143 26 92 106 122 73 98 4 82 141 13 112 16 0 20 141 65 210 229 224 235 23 20 177 164 60 252 191 64 31 44 84 216 95 0 1 20 141 65 210 229 224 235 23 20 177 164 60 252 191 64 31 44 84 216 95 0 0 68 48 154 41 124 74 158 181 70 130 132 240 230 198 88 167 2 237 114 242 9 139 158 87 188 104 154 110 210 176 38 252 92 77 243 54 213 93 179 111 60 173 65 242 154 5 78 138 79 93 20 212 247 205 148 243 182 244 13 15 150 159 207 103 38 24 0 0 0 1 68 48 154 41 124 74 158 181 70 130 132 240 230 198 88 167 2 237 114 242 9 139 158 87 188 104 154 110 210 176 38 252 92 77 243 54 213 93 179 111 60 173 65 242 154 5 78 138 79 93 20 212 247 205 148 243 182 244 13 15 150 159 207 103 38 24 0 0 0 0 108 78 251 44 163 60 65 61 73 160 130 160 8 28 61 196 90 12 152 7 115 142 7 114 17 198 170 252 19 236 254 162 201 32 45 18 43 189 44 46 90 207 184 59 237 162 203 126 224 42 136 170 154 0 222 28 154 135 82 229 44 204 68 59 154 17 125 179 36 205 42 28 134 10 215 115 12 32 14 56 173 76 9 183 175 169 7 152 168 55 94 109 58 166 129 180 156 71 14 106 140 11 108 205 121 170 23 0 0 1 108 78 251 44 163 60 65 61 73 160 130 160 8 28 61 196 90 12 152 7 115 142 7 114 17 198 170 252 19 236 254 162 201 32 45 18 43 189 44 46 90 207 184 59 237 162 203 126 224 42 136 170 154 0 222 28 154 135 82 229 44 204 68 59 154 17 125 179 36 205 42 28 134 10 215 115 12 32 14 56 173 76 9 183 175 169 7 152 168 55 94 109 58 166 129 180 156 71 14 106 140 11 108 205 121 170 23 0 0 0 60 99 133 203 247 192 63 4 144 228 175 21 211 17 186 191 58 203 241 243 89 132 220 36 39 238 217 164 218 253 0 222 143 219 114 227 127 56 66 234 167 126 143 213 130 213 113 84 86 215 204 56 188 57 9 152 64 225 239 108 6 1 60 99 133 203 247 192 63 4 144 228 175 21 211 17 186 191 58 203 241 243 89 132 220 36 39 238 217 164 218 253 0 222 143 219 114 227 127 56 66 234 167 126 143 213 130 213 113 84 86 215 204 56 188 57 9 152 64 225 239 108 6 0 72 77 228 188 235 97 138 100 91 238 49 139 79 56 188 11 184 173 83 39 221 20 245 96 38 125 60 181 72 3 128 43 118 106 90 15 200 8 233 181 34 5 7 174 190 71 134 170 210 207 164 152 232 51 89 112 82 165 188 21 114 191 123 230 238 197 193 95 140 244 0 0 0 1 72 77 228 188 235 97 138 100 91 238 49 139 79 56 188 11 184 173 83 39 221 20 245 96 38 125 60 181 72 3 128 43 118 106 90 15 200 8 233 181 34 5 7 174 190 71 134 170 210 207 164 152 232 51 89 112 82 165 188 21 114 191 123 230 238 197 193 95 140 244 0 0 0 0 72 200 145 197 200 104 129 137 228 214 164 61 15 232 3 217 235 218 189 116 152 154 227 248 233 253 158 5 97 255 64 215 227 139 23 14 251 106 37 121 16 114 173 198 111 218 117 222 246 94 169 123 172 250 61 68 19 205 181 67 85 17 104 14 254 137 136 84 247 78 166 0 0 1 72 200 145 197 200 104 129 137 228 214 164 61 15 232 3 217 235 218 189 116 152 154 227 248 233 253 158 5 97 255 64 215 227 139 23 14 251 106 37 121 16 114 173 198 111 218 117 222 246 94 169 123 172 250 61 68 19 205 181 67 85 17 104 14 254 137 136 84 247 78 166 0 0 0 128 191 181 108 55 139 94 198 152 77 78 82 43 3 109 236 227 118 234 47 173 167 61 164 86 55 233 192 147 235 37 168 97 183 33 155 177 136 201 235 222 168 48 190 137 110 204 183 228 175 147 199 33 208 144 139 202 91 20 77 67 243 128 152 254 108 127 176 61 57 40 166 158 31 208 193 11 83 26 80 21 170 235 14 210 177 151 96 197 239 137 246 114 65 165 208 148 237 25 245 124 152 104 92 83 194 136 203 136 100 251 64 2 205 220 145 219 198 171 222 38 134 250 16 34 65 224 146 28 1 128 191 181 108 55 139 94 198 152 77 78 82 43 3 109 236 227 118 234 47 173 167 61 164 86 55 233 192 147 235 37 168 97 183 33 155 177 136 201 235 222 168 48 190 137 110 204 183 228 175 147 199 33 208 144 139 202 91 20 77 67 243 128 152 254 108 127 176 61 57 40 166 158 31 208 193 11 83 26 80 21 170 235 14 210 177 151 96 197 239 137 246 114 65 165 208 148 237 25 245 124 152 104 92 83 194 136 203 136 100 251 64 2 205 220 145 219 198 171 222 38 134 250 16 34 65 224 146 28 0 60 63 224 19 125 187 26 164 208 55 163 27 59 187 247 242 95 30 57 122 111 64 134 84 248 151 190 15 136 136 161 61 28 228 22 27 68 11 3 140 252 156 29 4 41 11 48 15 96 244 213 20 233 6 76 130 58 119 15 0 0 1 60 63 224 19 125 187 26 164 208 55 163 27 59 187 247 242 95 30 57 122 111 64 134 84 248 151 190 15 136 136 161 61 28 228 22 27 68 11 3 140 252 156 29 4 41 11 48 15 96 244 213 20 233 6 76 130 58 119 15 0 0 0 12 199 42 98 80 178 185 90 221 165 35 3 0 1 12 199 42 98 80 178 185 90 221 165 35 3 0 0 112 211 92 224 84 192 161 220 29 37 84 220 160 179 136 96 15 250 25 26 167 119 216 78 12 23 28 94 80 65 148 105 37 226 205 178 88 179 130 190 233 252 123 197 227 186 157 58 116 47 213 216 8 19 202 72 179 134 248 62 205 139 137 198 65 155 154 205 249 99 56 187 14 119 158 233 203 37 34 208 100 56 19 122 70 223 132 177 96 84 56 150 254 49 2 204 7 119 253 28 226 37 130 47 153 193 3 66 88 188 3 0 0 1 112 211 92 224 84 192 161 220 29 37 84 220 160 179 136 96 15 250 25 26 167 119 216 78 12 23 28 94 80 65 148 105 37 226 205 178 88 179 130 190 233 252 123 197 227 186 157 58 116 47 213 216 8 19 202 72 179 134 248 62 205 139 137 198 65 155 154 205 249 99 56 187 14 119 158 233 203 37 34 208 100 56 19 122 70 223 132 177 96 84 56 150 254 49 2 204 7 119 253 28 226 37 130 47 153 193 3 66 88 188 3 0 0 0 60 140 122 119 39 180 83 252 77 149 191 129 134 12 141 62 96 133 98 170 229 37 197 136 97 68 58 105 144 236 92 39 65 44 221 243 133 48 202 183 51 237 155 98 163 154 52 14 169 35 49 67 177 150 145 49 75 8 0 0 0 1 60 140 122 119 39 180 83 252 77 149 191 129 134 12 141 62 96 133 98 170 229 37 197 136 97 68 58 105 144 236 92 39 65 44 221 243 133 48 202 183 51 237 155 98 163 154 52 14 169 35 49 67 177 150 145 49 75 8 0 0 0 0 80 9 61 184 172 233 13 43 45 30 119 185 68 107 159 107 243 178 49 80 0 96 120 155 240 156 53 48 213 202 121 253 151 95 14 88 52 193 70 56 174 121 49 216 9 237 188 33 131 0 202 142 97 27 187 215 252 182 119 74 239 189 124 236 151 198 110 105 243 51 188 18 131 2 91 205 73 28 4 0 0 1 80 9 61 184 172 233 13 43 45 30 119 185 68 107 159 107 243 178 49 80 0 96 120 155 240 156 53 48 213 202 121 253 151 95 14 88 52 193 70 56 174 121 49 216 9 237 188 33 131 0 202 142 97 27 187 215 252 182 119 74 239 189 124 236 151 198 110 105 243 51 188 18 131 2 91 205 73 28 4 0 0 0 16 137 77 210 245 248 194 39 160 111 226 179 107 25 44 0 0 1 16 137 77 210 245 248 194 39 160 111 226 179 107 25 44 0 0 0 64 90 160 7 65 4 255 208 168 205 179 4 240 248 31 206 47 175 22 191 41 103 114 135 198 218 147 111 186 210 117 127 71 122 113 161 142 45 56 90 182 5 196 124 208 246 99 179 100 179 27 123 2 247 71 97 127 214 218 135 188 45 50 128 224 1 64 90 160 7 65 4 255 208 168 205 179 4 240 248 31 206 47 175 22 191 41 103 114 135 198 218 147 111 186 210 117 127 71 122 113 161 142 45 56 90 182 5 196 124 208 246 99 179 100 179 27 123 2 247 71 97 127 214 218 135 188 45 50 128 224 0 124 32 154 212 74 8 112 124 62 201 195 129 67 76 87 211 0 54 149 15 2 59 137 176 18 143 114 152 101 173 81 166 31 220 98 29 15 12 143 193 186 10 214 32 46 186 56 227 96 71 41 12 224 186 32 190 104 219 81 226 245 30 187 162 67 12 238 66 40 214 182 170 73 67 29 245 229 231 140 16 172 204 90 196 85 159 37 247 5 72 91 26 80 132 221 105 222 230 137 161 192 217 213 175 8 134 107 130 255 104 27 119 215 213 254 251 29 13 165 7 158 123 144 75 0 1 124 32 154 212 74 8 112 124 62 201 195 129 67 76 87 211 0 54 149 15 2 59 137 176 18 143 114 152 101 173 81 166 31 220 98 29 15 12 143 193 186 10 214 32 46 186 56 227 96 71 41 12 224 186 32 190 104 219 81 226 245 30 187 162 67 12 238 66 40 214 182 170 73 67 29 245 229 231 140 16 172 204 90 196 85 159 37 247 5 72 91 26 80 132 221 105 222 230 137 161 192 217 213 175 8 134 107 130 255 104 27 119 215 213 254 251 29 13 165 7 158 123 144 75 0 0 128 239 164 224 84 239 190 177 240 167 255 153 207 198 235 157 218 101 209 117 110 57 158 113 160 68 242 223 109 247 33 237 229 57 186 145 95 59 2 2 106 153 109 194 24 239 241 188 61 245 211 125 238 32 54 37 170 29 197 209 243 122 188 213 28 57 75 147 38 170 70 103 138 223 146 28 2 3 91 146 155 55 185 226 218 164 234 79 158 254 61 31 183 119 148 157 226 56 110 177 236 227 71 43 83 82 161 247 161 196 1 164 120 80 136 191 208 140 164 14 207 160 41 164 244 119 14 0 0 1 128 239 164 224 84 239 190 177 240 167 255 153 207 198 235 157 218 101 209 117 110 57 158 113 160 68 242 223 109 247 33 237 229 57 186 145 95 59 2 2 106 153 109 194 24 239 241 188 61 245 211 125 238 32 54 37 170 29 197 209 243 122 188 213 28 57 75 147 38 170 70 103 138 223 146 28 2 3 91 146 155 55 185 226 218 164 234 79 158 254 61 31 183 119 148 157 226 56 110 177 236 227 71 43 83 82 161 247 161 196 1 164 120 80 136 191 208 140 164 14 207 160 41 164 244 119 14 0 0 0 4 117 0 0 0 1 4 117 0 0 0 0 8 167 54 193 64 7 0 0 0 1 8 167 54 193 64 7 0 0 0 0 100 163 255 64 83 203 87 36 149 94 156 52 123 63 158 204 53 182 225 176 27 17 88 255 208 169 246 109 207 8 64 136 93 175 10 180 61 49 204 55 239 115 146 100 212 148 94 230 159 166 203 181 245 53 40 149 146 56 136 42 224 170 147 35 157 91 64 177 60 196 240 153 231 11 78 17 76 195 177 43 46 180 131 25 83 109 63 119 225 27 57 57 188 91 199 152 23 5 174 91 1 1 100 163 255 64 83 203 87 36 149 94 156 52 123 63 158 204 53 182 225 176 27 17 88 255 208 169 246 109 207 8 64 136 93 175 10 180 61 49 204 55 239 115 146 100 212 148 94 230 159 166 203 181 245 53 40 149 146 56 136 42 224 170 147 35 157 91 64 177 60 196 240 153 231 11 78 17 76 195 177 43 46 180 131 25 83 109 63 119 225 27 57 57 188 91 199 152 23 5 174 91 1 0 128 208 138 109 225 227 64 152 153 2 96 34 145 164 157 131 115 155 183 104 200 193 145 244 83 249 93 179 164 174 212 200 81 147 54 91 88 194 241 160 176 132 66 20 118 17 178 241 133 189 166 164 150 50 53 47 1 210 38 252 20 112 90 129 36 107 137 165 239 174 138 211 103 99 134 246 76 212 170 81 144 177 228 153 120 20 106 60 41 27 26 142 218 209 123 220 154 21 104 181 204 11 114 252 113 18 117 199 212 53 240 129 51 13 132 82 236 158 244 158 200 100 104 97 216 25 1 0 0 1 128 208 138 109 225 227 64 152 153 2 96 34 145 164 157 131 115 155 183 104 200 193 145 244 83 249 93 179 164 174 212 200 81 147 54 91 88 194 241 160 176 132 66 20 118 17 178 241 133 189 166 164 150 50 53 47 1 210 38 252 20 112 90 129 36 107 137 165 239 174 138 211 103 99 134 246 76 212 170 81 144 177 228 153 120 20 106 60 41 27 26 142 218 209 123 220 154 21 104 181 204 11 114 252 113 18 117 199 212 53 240 129 51 13 132 82 236 158 244 158 200 100 104 97 216 25 1 0 0 0 108 88 85 211 200 39 154 110 112 105 110 167 223 36 85 108 22 191 129 29 63 186 205 74 174 242 107 26 190 218 113 172 16 57 224 133 51 114 134 142 127 13 144 200 97 128 128 218 245 64 148 11 69 93 180 151 220 172 202 66 76 33 187 244 229 35 36 242 82 235 185 65 36 190 117 245 110 49 206 180 71 37 57 255 79 12 219 105 17 123 252 191 204 128 157 112 79 129 176 184 68 206 60 102 245 5 0 0 0 1 108 88 85 211 200 39 154 110 112 105 110 167 223 36 85 108 22 191 129 29 63 186 205 74 174 242 107 26 190 218 113 172 16 57 224 133 51 114 134 142 127 13 144 200 97 128 128 218 245 64 148 11 69 93 180 151 220 172 202 66 76 33 187 244 229 35 36 242 82 235 185 65 36 190 117 245 110 49 206 180 71 37 57 255 79 12 219 105 17 123 252 191 204 128 157 112 79 129 176 184 68 206 60 102 245 5 0 0 0 0 48 148 74 37 131 247 53 39 99 216 223 47 18 9 18 136 179 193 37 55 33 91 7 244 148 62 42 57 238 215 181 93 98 8 101 69 225 214 132 204 75 52 125 56 24 213 200 8 0 1 48 148 74 37 131 247 53 39 99 216 223 47 18 9 18 136 179 193 37 55 33 91 7 244 148 62 42 57 238 215 181 93 98 8 101 69 225 214 132 204 75 52 125 56 24 213 200 8 0 0 112 64 220 239 97 7 93 87 27 105 63 207 167 21 133 15 227 58 185 168 161 239 33 193 128 172 161 15 59 239 186 103 81 115 178 232 138 149 139 198 145 252 165 58 125 110 48 134 211 40 242 174 206 78 255 94 75 31 44 237 250 204 57 72 109 14 12 198 119 229 200 254 145 184 208 143 78 161 97 105 128 146 153 84 125 239 129 93 98 110 23 17 170 158 50 181 141 42 47 152 191 196 3 192 174 110 71 240 178 232 63 60 2 1 112 64 220 239 97 7 93 87 27 105 63 207 167 21 133 15 227 58 185 168 161 239 33 193 128 172 161 15 59 239 186 103 81 115 178 232 138 149 139 198 145 252 165 58 125 110 48 134 211 40 242 174 206 78 255 94 75 31 44 237 250 204 57 72 109 14 12 198 119 229 200 254 145 184 208 143 78 161 97 105 128 146 153 84 125 239 129 93 98 110 23 17 170 158 50 181 141 42 47 152 191 196 3 192 174 110 71 240 178 232 63 60 2 0 88 246 113 176 137 13 123 106 26 224 128 91 228 193 243 252 242 15 62 220 212 178 30 202 11 111 66 230 161 177 241 60 253 100 208 201 117 225 216 68 197 128 174 145 95 149 128 91 24 175 176 25 111 104 124 66 50 242 232 64 14 195 239 251 14 206 116 190 242 168 216 235 100 161 227 42 119 101 187 234 141 57 76 100 11 246 212 179 0 1 88 246 113 176 137 13 123 106 26 224 128 91 228 193 243 252 242 15 62 220 212 178 30 202 11 111 66 230 161 177 241 60 253 100 208 201 117 225 216 68 197 128 174 145 95 149 128 91 24 175 176 25 111 104 124 66 50 242 232 64 14 195 239 251 14 206 116 190 242 168 216 235 100 161 227 42 119 101 187 234 141 57 76 100 11 246 212 179 0 0 12 55 56 172 187 58 164 70 156 120 82 181 1 1 12 55 56 172 187 58 164 70 156 120 82 181 1 0 48 220 172 17 9 205 156 24 242 134 168 180 223 153 206 236 236 90 205 11 224 120 98 214 90 123 243 129 201 165 220 225 6 36 19 55 134 83 178 129 164 32 109 15 112 3 0 0 0 1 48 220 172 17 9 205 156 24 242 134 168 180 223 153 206 236 236 90 205 11 224 120 98 214 90 123 243 129 201 165 220 225 6 36 19 55 134 83 178 129 164 32 109 15 112 3 0 0 0 0 52 193 141 127 34 209 21 199 67 68 204 143 241 45 80 225 214 45 100 21 48 33 106 113 2 148 20 23 159 40 68 202 237 170 200 232 238 164 242 236 171 136 93 52 242 83 251 122 237 48 94 107 2 1 52 193 141 127 34 209 21 199 67 68 204 143 241 45 80 225 214 45 100 21 48 33 106 113 2 148 20 23 159 40 68 202 237 170 200 232 238 164 242 236 171 136 93 52 242 83 251 122 237 48 94 107 2 0 112 207 93 175 32 64 88 139 55 246 244 132 171 62 72 184 11 242 187 171 224 39 148 96 224 166 191 87 37 46 103 39 90 112 54 172 23 47 108 13 198 12 169 216 111 103 124 235 201 195 16 145 148 127 191 56 185 218 102 131 173 6 53 96 126 92 36 77 124 130 17 196 69 227 95 129 211 148 22 209 224 108 6 158 123 117 167 143 244 183 183 224 114 73 162 213 215 117 83 229 22 1 63 246 155 62 220 132 1 179 0 0 0 1 112 207 93 175 32 64 88 139 55 246 244 132 171 62 72 184 11 242 187 171 224 39 148 96 224 166 191 87 37 46 103 39 90 112 54 172 23 47 108 13 198 12 169 216 111 103 124 235 201 195 16 145 148 127 191 56 185 218 102 131 173 6 53 96 126 92 36 77 124 130 17 196 69 227 95 129 211 148 22 209 224 108 6 158 123 117 167 143 244 183 183 224 114 73 162 213 215 117 83 229 22 1 63 246 155 62 220 132 1 179 0 0 0 0 36 28 191 13 194 165 182 248 57 186 139 244 112 207 96 200 175 106 69 10 84 43 142 147 3 182 157 30 118 79 126 104 103 178 4 0 0 1 36 28 191 13 194 165 182 248 57 186 139 244 112 207 96 200 175 106 69 10 84 43 142 147 3 182 157 30 118 79 126 104 103 178 4 0 0 0 8 212 78 222 60 176 142 1 0 1 8 212 78 222 60 176 142 1 0 0 104 145 100 67 42 119 254 160 245 196 55 20 64 100 33 63 183 247 83 171 250 148 186 67 236 130 147 92 200 183 110 211 65 19 126 207 82 103 84 16 52 82 16 73 99 33 53 16 184 44 239 234 154 184 25 81 99 110 127 146 231 156 136 36 208 247 98 178 87 0 213 166 40 147 186 233 193 12 80 213 75 67 53 102 157 20 22 155 226 99 40 237 217 91 216 187 183 209 192 42 100 71 58 1 0 1 104 145 100 67 42 119 254 160 245 196 55 20 64 100 33 63 183 247 83 171 250 148 186 67 236 130 147 92 200 183 110 211 65 19 126 207 82 103 84 16 52 82 16 73 99 33 53 16 184 44 239 234 154 184 25 81 99 110 127 146 231 156 136 36 208 247 98 178 87 0 213 166 40 147 186 233 193 12 80 213 75 67 53 102 157 20 22 155 226 99 40 237 217 91 216 187 183 209 192 42 100 71 58 1 0 0 88 125 231 30 134 199 198 64 150 204 149 136 212 55 251 17 236 75 172 60 103 13 112 161 248 228 121 4 183 230 238 235 81 68 11 65 213 88 3 234 7 110 178 57 19 166 16 98 54 80 226 89 131 81 212 59 162 55 8 27 204 124 98 217 79 46 181 86 195 56 99 31 161 60 165 222 210 115 82 149 178 121 38 60 117 25 0 0 0 1 88 125 231 30 134 199 198 64 150 204 149 136 212 55 251 17 236 75 172 60 103 13 112 161 248 228 121 4 183 230 238 235 81 68 11 65 213 88 3 234 7 110 178 57 19 166 16 98 54 80 226 89 131 81 212 59 162 55 8 27 204 124 98 217 79 46 181 86 195 56 99 31 161 60 165 222 210 115 82 149 178 121 38 60 117 25 0 0 0 0 56 55 79 115 254 18 45 144 84 54 237 229 99 113 73 136 188 244 213 254 183 151 168 225 91 201 252 214 57 183 27 164 26 210 240 237 171 92 108 203 191 175 120 3 12 116 19 67 245 233 249 115 5 240 214 35 0 1 56 55 79 115 254 18 45 144 84 54 237 229 99 113 73 136 188 244 213 254 183 151 168 225 91 201 252 214 57 183 27 164 26 210 240 237 171 92 108 203 191 175 120 3 12 116 19 67 245 233 249 115 5 240 214 35 0 0 96 149 115 162 199 81 74 3 202 108 176 213 7 202 56 50 54 238 173 104 162 72 222 19 198 247 157 194 69 205 163 168 225 51 180 210 187 109 152 138 75 137 178 226 20 227 183 17 221 228 33 75 27 234 181 159 148 112 168 204 13 44 22 165 143 41 73 80 229 106 191 38 16 134 93 174 157 141 69 61 203 130 122 44 39 131 2 164 80 62 160 63 47 120 166 28 140 1 96 149 115 162 199 81 74 3 202 108 176 213 7 202 56 50 54 238 173 104 162 72 222 19 198 247 157 194 69 205 163 168 225 51 180 210 187 109 152 138 75 137 178 226 20 227 183 17 221 228 33 75 27 234 181 159 148 112 168 204 13 44 22 165 143 41 73 80 229 106 191 38 16 134 93 174 157 141 69 61 203 130 122 44 39 131 2 164 80 62 160 63 47 120 166 28 140 0 120 177 73 66 225 183 251 124 47 179 14 57 160 213 173 196 252 133 171 44 98 102 65 108 221 64 128 144 3 168 15 10 125 144 93 198 204 237 212 228 129 58 93 188 102 216 32 20 56 110 5 186 118 149 188 145 246 98 31 144 172 117 122 179 94 110 54 137 100 169 159 233 64 176 40 159 107 80 248 222 131 122 156 155 179 205 124 225 233 168 165 4 29 207 254 20 155 7 94 221 210 178 187 38 94 68 88 18 166 136 0 118 237 105 249 139 19 14 0 0 0 1 120 177 73 66 225 183 251 124 47 179 14 57 160 213 173 196 252 133 171 44 98 102 65 108 221 64 128 144 3 168 15 10 125 144 93 198 204 237 212 228 129 58 93 188 102 216 32 20 56 110 5 186 118 149 188 145 246 98 31 144 172 117 122 179 94 110 54 137 100 169 159 233 64 176 40 159 107 80 248 222 131 122 156 155 179 205 124 225 233 168 165 4 29 207 254 20 155 7 94 221 210 178 187 38 94 68 88 18 166 136 0 118 237 105 249 139 19 14 0 0 0 0 20 144 98 85 217 149 150 223 122 8 206 59 47 131 103 65 155 173 0 0 0 1 20 144 98 85 217 149 150 223 122 8 206 59 47 131 103 65 155 173 0 0 0 0 24 220 124 42 149 85 78 138 33 185 250 196 15 48 72 171 163 134 2 88 6 85 142 130 2 1 24 220 124 42 149 85 78 138 33 185 250 196 15 48 72 171 163 134 2 88 6 85 142 130 2 0 128 212 122 169 156 54 138 107 16 121 38 59 69 203 193 117 75 63 180 179 47 63 118 224 1 181 147 133 85 37 60 119 246 102 174 58 174 167 181 225 245 128 208 200 176 210 149 71 173 107 114 230 170 178 95 214 144 188 159 164 164 189 64 23 6 49 14 195 137 72 104 1 156 208 120 58 123 105 78 15 149 254 83 83 82 154 175 59 38 12 161 82 182 68 227 130 172 160 38 178 36 70 164 50 135 65 11 243 87 239 25 151 184 247 104 210 135 241 219 1 53 174 119 60 149 230 43 0 0 1 128 212 122 169 156 54 138 107 16 121 38 59 69 203 193 117 75 63 180 179 47 63 118 224 1 181 147 133 85 37 60 119 246 102 174 58 174 167 181 225 245 128 208 200 176 210 149 71 173 107 114 230 170 178 95 214 144 188 159 164 164 189 64 23 6 49 14 195 137 72 104 1 156 208 120 58 123 105 78 15 149 254 83 83 82 154 175 59 38 12 161 82 182 68 227 130 172 160 38 178 36 70 164 50 135 65 11 243 87 239 25 151 184 247 104 210 135 241 219 1 53 174 119 60 149 230 43 0 0 0 36 100 188 84 92 121 120 255 45 117 214 25 143 9 160 32 125 250 37 133 240 255 252 20 126 29 171 3 237 205 240 235 36 208 143 0 0 1 36 100 188 84 92 121 120 255 45 117 214 25 143 9 160 32 125 250 37 133 240 255 252 20 126 29 171 3 237 205 240 235 36 208 143 0 0 0 16 204 130 239 246 187 158 93 86 47 108 73 1 13 0 0 0 1 16 204 130 239 246 187 158 93 86 47 108 73 1 13 0 0 0 0 20 202 131 231 76 126 186 127 132 23 187 208 204 73 5 178 40 150 139 35 0 1 20 202 131 231 76 126 186 127 132 23 187 208 204 73 5 178 40 150 139 35 0 0 40 107 133 121 0 139 12 135 132 162 235 102 36 43 184 250 87 59 67 137 202 96 199 100 109 243 118 70 114 158 224 173 101 40 37 48 74 1 0 0 0 1 40 107 133 121 0 139 12 135 132 162 235 102 36 43 184 250 87 59 67 137 202 96 199 100 109 243 118 70 114 158 224 173 101 40 37 48 74 1 0 0 0 0 20 102 233 199 173 120 192 172 230 96 54 194 151 124 92 161 206 20 63 0 0 1 20 102 233 199 173 120 192 172 230 96 54 194 151 124 92 161 206 20 63 0 0 0 104 100 11 95 76 33 185 232 209 233 63 34 185 176 109 189 253 110 207 211 238 172 100 29 184 164 214 167 6 238 105 2 20 159 93 77 69 163 157 21 207 95 133 129 211 104 170 34 230 70 233 190 110 110 143 167 140 190 151 103 146 32 227 27 255 248 240 157 241 20 32 236 100 44 139 162 28 213 191 101 140 119 176 40 84 199 138 241 56 14 243 128 9 9 244 235 30 65 225 224 112 146 250 26 0 1 104 100 11 95 76 33 185 232 209 233 63 34 185 176 109 189 253 110 207 211 238 172 100 29 184 164 214 167 6 238 105 2 20 159 93 77 69 163 157 21 207 95 133 129 211 104 170 34 230 70 233 190 110 110 143 167 140 190 151 103 146 32 227 27 255 248 240 157 241 20 32 236 100 44 139 162 28 213 191 101 140 119 176 40 84 199 138 241 56 14 243 128 9 9 244 235 30 65 225 224 112 146 250 26 0 0 112 182 231 30 134 177 100 37 122 104 11 71 195 133 25 28 169 0 181 147 130 44 177 101 57 112 42 199 21 101 103 140 223 42 216 201 189 53 195 100 237 238 71 248 113 40 44 240 38 199 64 195 184 81 25 41 68 92 218 4 53 122 241 204 51 58 42 144 93 242 88 103 109 196 188 0 52 79 84 246 121 89 177 54 12 27 96 80 73 210 243 157 157 69 16 99 156 41 206 86 47 228 138 204 240 83 60 157 254 252 73 192 5 1 112 182 231 30 134 177 100 37 122 104 11 71 195 133 25 28 169 0 181 147 130 44 177 101 57 112 42 199 21 101 103 140 223 42 216 201 189 53 195 100 237 238 71 248 113 40 44 240 38 199 64 195 184 81 25 41 68 92 218 4 53 122 241 204 51 58 42 144 93 242 88 103 109 196 188 0 52 79 84 246 121 89 177 54 12 27 96 80 73 210 243 157 157 69 16 99 156 41 206 86 47 228 138 204 240 83 60 157 254 252 73 192 5 0 12 197 213 123 115 98 52 254 70 238 15 1 0 1 12 197 213 123 115 98 52 254 70 238 15 1 0 0 76 210 145 122 99 89 37 131 47 52 147 113 130 64 191 58 127 124 89 27 75 1 37 219 223 7 191 140 168 223 254 58 21 31 33 247 253 167 137 36 155 41 0 231 239 197 12 2 35 195 249 194 240 216 58 92 5 213 221 245 127 195 161 21 118 66 85 175 221 8 222 64 201 103 150 0 0 1 76 210 145 122 99 89 37 131 47 52 147 113 130 64 191 58 127 124 89 27 75 1 37 219 223 7 191 140 168 223 254 58 21 31 33 247 253 167 137 36 155 41 0 231 239 197 12 2 35 195 249 194 240 216 58 92 5 213 221 245 127 195 161 21 118 66 85 175 221 8 222 64 201 103 150 0 0 0 84 102 17 96 82 154 52 112 87 18 167 167 218 54 218 124 208 194 201 83 97 231 176 221 100 220 46 62 248 6 192 115 8 87 141 125 98 123 239 88 101 67 173 98 197 3 232 107 94 225 39 234 38 220 115 81 68 201 24 107 126 207 211 147 102 232 111 120 175 151 194 198 220 102 170 182 69 63 31 181 226 6 0 0 0 1 84 102 17 96 82 154 52 112 87 18 167 167 218 54 218 124 208 194 201 83 97 231 176 221 100 220 46 62 248 6 192 115 8 87 141 125 98 123 239 88 101 67 173 98 197 3 232 107 94 225 39 234 38 220 115 81 68 201 24 107 126 207 211 147 102 232 111 120 175 151 194 198 220 102 170 182 69 63 31 181 226 6 0 0 0 0 72 145 142 130 152 168 95 187 252 167 72 111 60 173 234 4 233 25 77 201 212 221 165 137 12 169 149 226 137 232 12 31 136 171 31 255 243 138 160 179 185 30 246 120 97 97 100 77 175 51 130 43 32 46 143 163 120 150 96 104 169 233 159 139 198 126 120 21 227 79 54 10 0 1 72 145 142 130 152 168 95 187 252 167 72 111 60 173 234 4 233 25 77 201 212 221 165 137 12 169 149 226 137 232 12 31 136 171 31 255 243 138 160 179 185 30 246 120 97 97 100 77 175 51 130 43 32 46 143 163 120 150 96 104 169 233 159 139 198 126 120 21 227 79 54 10 0 0 4 209 5 0 0 1 4 209 5 0 0 0 20 69 29 214 123 179 196 196 154 251 96 42 73 71 146 179 99 47 210 101 0 1 20 69 29 214 123 179 196 196 154 251 96 42 73 71 146 179 99 47 210 101 0 0 88 205 231 92 64 63 136 90 54 204 92 82 240 111 88 87 211 205 64 177 174 111 246 250 90 188 132 108 77 132 226 209 192 221 34 204 124 101 65 183 13 73 28 188 123 178 61 12 115 7 113 85 201 249 122 39 164 5 195 152 12 24 213 221 225 91 183 40 236 164 234 105 15 207 109 160 192 144 206 42 56 17 71 51 153 182 149 229 1 1 88 205 231 92 64 63 136 90 54 204 92 82 240 111 88 87 211 205 64 177 174 111 246 250 90 188 132 108 77 132 226 209 192 221 34 204 124 101 65 183 13 73 28 188 123 178 61 12 115 7 113 85 201 249 122 39 164 5 195 152 12 24 213 221 225 91 183 40 236 164 234 105 15 207 109 160 192 144 206 42 56 17 71 51 153 182 149 229 1 0 112 75 185 2 45 158 234 42 220 77 129 40 207 111 250 118 209 102 233 123 133 227 197 44 57 196 23 50 237 189 56 114 42 117 188 70 201 140 176 85 119 26 80 196 78 38 152 73 81 60 72 29 44 30 96 127 77 209 43 84 19 238 161 199 121 222 254 69 226 80 194 175 85 135 165 209 175 199 237 223 219 141 82 63 115 118 194 96 58 8 45 138 219 118 118 250 164 228 179 178 255 210 12 129 255 206 164 214 156 233 1 0 0 1 112 75 185 2 45 158 234 42 220 77 129 40 207 111 250 118 209 102 233 123 133 227 197 44 57 196 23 50 237 189 56 114 42 117 188 70 201 140 176 85 119 26 80 196 78 38 152 73 81 60 72 29 44 30 96 127 77 209 43 84 19 238 161 199 121 222 254 69 226 80 194 175 85 135 165 209 175 199 237 223 219 141 82 63 115 118 194 96 58 8 45 138 219 118 118 250 164 228 179 178 255 210 12 129 255 206 164 214 156 233 1 0 0 0 72 170 113 192 138 104 174 124 39 73 93 28 193 169 216 164 220 91 84 152 21 86 210 138 141 248 203 166 85 144 162 254 201 183 85 193 224 116 40 113 190 178 244 129 164 250 249 19 14 209 96 142 161 190 213 129 69 159 67 19 1 205 41 215 144 51 30 49 29 6 0 0 0 1 72 170 113 192 138 104 174 124 39 73 93 28 193 169 216 164 220 91 84 152 21 86 210 138 141 248 203 166 85 144 162 254 201 183 85 193 224 116 40 113 190 178 244 129 164 250 249 19 14 209 96 142 161 190 213 129 69 159 67 19 1 205 41 215 144 51 30 49 29 6 0 0 0 0 80 187 125 249 0 237 185 92 151 185 34 111 175 129 204 191 155 242 60 103 220 201 34 29 144 204 63 230 124 192 11 86 89 46 248 84 65 216 118 216 186 101 34 52 12 183 171 200 31 196 236 206 37 26 50 4 49 58 103 122 211 219 34 244 124 191 195 111 184 185 248 253 224 239 127 121 202 148 98 106 14 1 80 187 125 249 0 237 185 92 151 185 34 111 175 129 204 191 155 242 60 103 220 201 34 29 144 204 63 230 124 192 11 86 89 46 248 84 65 216 118 216 186 101 34 52 12 183 171 200 31 196 236 206 37 26 50 4 49 58 103 122 211 219 34 244 124 191 195 111 184 185 248 253 224 239 127 121 202 148 98 106 14 0 60 139 102 172 114 149 72 104 165 114 58 106 15 225 235 97 205 254 36 224 45 49 116 146 137 86 251 107 88 136 139 83 17 137 15 7 72 222 67 112 165 159 252 189 213 77 46 142 192 37 63 205 124 221 187 30 104 5 0 0 0 1 60 139 102 172 114 149 72 104 165 114 58 106 15 225 235 97 205 254 36 224 45 49 116 146 137 86 251 107 88 136 139 83 17 137 15 7 72 222 67 112 165 159 252 189 213 77 46 142 192 37 63 205 124 221 187 30 104 5 0 0 0 0 48 193 117 186 128 69 247 91 107 62 131 175 40 131 137 103 76 253 5 75 34 122 71 127 130 217 242 2 7 156 145 247 63 191 243 59 172 98 22 239 18 159 250 155 96 146 0 0 0 1 48 193 117 186 128 69 247 91 107 62 131 175 40 131 137 103 76 253 5 75 34 122 71 127 130 217 242 2 7 156 145 247 63 191 243 59 172 98 22 239 18 159 250 155 96 146 0 0 0 0 28 47 51 76 163 249 78 98 148 84 63 232 105 55 224 47 211 142 180 28 84 89 211 77 14 249 46 0 0 1 28 47 51 76 163 249 78 98 148 84 63 232 105 55 224 47 211 142 180 28 84 89 211 77 14 249 46 0 0 0 68 201 214 155 246 50 22 166 239 223 78 244 233 195 105 89 119 99 157 184 116 51 233 12 83 167 255 76 111 102 220 89 20 93 143 234 73 99 250 59 120 26 217 181 201 39 66 23 209 115 214 70 225 241 60 167 247 136 252 1 227 55 151 13 131 195 45 0 0 1 68 201 214 155 246 50 22 166 239 223 78 244 233 195 105 89 119 99 157 184 116 51 233 12 83 167 255 76 111 102 220 89 20 93 143 234 73 99 250 59 120 26 217 181 201 39 66 23 209 115 214 70 225 241 60 167 247 136 252 1 227 55 151 13 131 195 45 0 0 0 20 23 30 33 8 157 238 224 164 246 31 43 191 176 252 7 205 45 242 0 0 1 20 23 30 33 8 157 238 224 164 246 31 43 191 176 252 7 205 45 242 0 0 0 52 54 228 32 91 115 93 129 151 246 253 217 44 135 61 82 191 178 138 66 53 138 127 124 132 49 110 155 83 6 68 149 49 137 123 196 184 39 167 125 47 74 249 193 203 43 79 83 101 134 133 9 11 1 52 54 228 32 91 115 93 129 151 246 253 217 44 135 61 82 191 178 138 66 53 138 127 124 132 49 110 155 83 6 68 149 49 137 123 196 184 39 167 125 47 74 249 193 203 43 79 83 101 134 133 9 11 0 52 77 188 100 119 111 50 9 100 13 63 121 125 142 166 34 201 103 64 166 45 83 205 159 233 137 246 116 27 220 206 160 89 216 10 52 203 22 78 211 51 23 240 179 183 83 170 242 111 240 0 0 0 1 52 77 188 100 119 111 50 9 100 13 63 121 125 142 166 34 201 103 64 166 45 83 205 159 233 137 246 116 27 220 206 160 89 216 10 52 203 22 78 211 51 23 240 179 183 83 170 242 111 240 0 0 0 0 12 183 62 167 189 129 14 105 162 209 89 0 0 1 12 183 62 167 189 129 14 105 162 209 89 0 0 0 100 118 204 239 47 128 120 188 223 1 55 39 227 110 234 226 46 9 49 105 96 118 213 142 45 148 25 46 222 99 148 85 221 31 128 11 140 49 253 179 116 86 166 9 89 85 77 43 213 244 104 94 141 180 94 152 53 231 238 203 17 49 2 219 158 139 90 32 173 163 68 117 8 23 52 205 75 107 41 4 131 110 118 52 89 83 200 125 45 226 180 48 90 244 16 175 35 209 5 0 0 1 100 118 204 239 47 128 120 188 223 1 55 39 227 110 234 226 46 9 49 105 96 118 213 142 45 148 25 46 222 99 148 85 221 31 128 11 140 49 253 179 116 86 166 9 89 85 77 43 213 244 104 94 141 180 94 152 53 231 238 203 17 49 2 219 158 139 90 32 173 163 68 117 8 23 52 205 75 107 41 4 131 110 118 52 89 83 200 125 45 226 180 48 90 244 16 175 35 209 5 0 0 0 32 141 129 3 16 248 10 239 222 142 76 62 151 42 178 39 242 64 15 167 154 168 11 249 175 85 5 12 3 103 49 42 0 1 32 141 129 3 16 248 10 239 222 142 76 62 151 42 178 39 242 64 15 167 154 168 11 249 175 85 5 12 3 103 49 42 0 0 8 123 78 196 123 153 10 0 0 1 8 123 78 196 123 153 10 0 0 0 16 144 212 195 123 171 191 34 243 189 164 67 38 150 212 224 39 1 16 144 212 195 123 171 191 34 243 189 164 67 38 150 212 224 39 0 32 187 134 178 60 106 197 246 170 105 173 38 215 230 126 251 232 114 84 137 220 128 251 54 111 198 172 1 114 19 30 189 175 1 32 187 134 178 60 106 197 246 170 105 173 38 215 230 126 251 232 114 84 137 220 128 251 54 111 198 172 1 114 19 30 189 175 0 24 143 215 216 189 149 84 197 67 202 64 106 120 162 162 86 42 64 51 134 144 124 43 171 16 1 24 143 215 216 189 149 84 197 67 202 64 106 120 162 162 86 42 64 51 134 144 124 43 171 16 0 68 139 212 65 201 234 213 89 222 141 127 253 158 87 57 57 116 99 73 197 165 146 10 238 243 162 67 87 231 145 147 216 148 210 201 209 126 220 255 168 121 230 233 9 201 51 185 90 86 120 23 45 86 96 77 163 130 157 206 192 50 201 33 37 54 59 0 0 0 1 68 139 212 65 201 234 213 89 222 141 127 253 158 87 57 57 116 99 73 197 165 146 10 238 243 162 67 87 231 145 147 216 148 210 201 209 126 220 255 168 121 230 233 9 201 51 185 90 86 120 23 45 86 96 77 163 130 157 206 192 50 201 33 37 54 59 0 0 0 0 32 23 231 42 113 193 81 226 51 220 131 214 166 146 8 75 191 48 0 176 34 36 39 225 46 186 62 45 29 56 240 98 0 1 32 23 231 42 113 193 81 226 51 220 131 214 166 146 8 75 191 48 0 176 34 36 39 225 46 186 62 45 29 56 240 98 0 0 108 227 163 90 90 118 151 96 241 208 91 153 230 68 148 109 36 156 59 108 3 56 117 211 213 19 39 240 123 158 82 0 37 126 14 223 103 223 22 131 216 204 69 250 101 220 238 12 18 77 151 114 103 62 43 207 60 13 44 63 145 155 196 15 104 68 124 226 214 9 255 2 209 143 177 56 5 128 66 245 24 171 251 123 103 175 179 158 169 79 76 238 144 42 92 164 86 181 59 182 45 185 118 125 221 29 2 0 0 1 108 227 163 90 90 118 151 96 241 208 91 153 230 68 148 109 36 156 59 108 3 56 117 211 213 19 39 240 123 158 82 0 37 126 14 223 103 223 22 131 216 204 69 250 101 220 238 12 18 77 151 114 103 62 43 207 60 13 44 63 145 155 196 15 104 68 124 226 214 9 255 2 209 143 177 56 5 128 66 245 24 171 251 123 103 175 179 158 169 79 76 238 144 42 92 164 86 181 59 182 45 185 118 125 221 29 2 0 0 0 56 21 205 7 125 176 60 227 180 194 177 238 254 236 214 253 45 120 92 88 238 119 13 43 164 250 120 212 254 127 151 28 105 87 83 93 136 139 49 151 198 102 118 229 122 40 245 156 201 162 113 68 119 67 16 0 0 1 56 21 205 7 125 176 60 227 180 194 177 238 254 236 214 253 45 120 92 88 238 119 13 43 164 250 120 212 254 127 151 28 105 87 83 93 136 139 49 151 198 102 118 229 122 40 245 156 201 162 113 68 119 67 16 0 0 0 128 109 98 40 183 212 31 133 44 220 177 117 246 95 158 65 148 190 211 252 136 162 225 177 247 115 56 178 10 194 128 11 57 161 119 91 128 227 125 160 201 170 74 199 20 117 57 205 164 167 39 140 51 104 152 111 244 236 125 79 209 50 96 221 6 70 174 222 210 141 0 0 38 91 25 23 175 171 151 185 223 189 29 181 4 186 136 186 187 211 92 240 132 239 86 157 142 233 42 105 221 144 98 224 139 152 138 40 2 75 65 232 64 78 37 25 85 43 247 17 170 71 235 54 68 95 61 0 0 1 128 109 98 40 183 212 31 133 44 220 177 117 246 95 158 65 148 190 211 252 136 162 225 177 247 115 56 178 10 194 128 11 57 161 119 91 128 227 125 160 201 170 74 199 20 117 57 205 164 167 39 140 51 104 152 111 244 236 125 79 209 50 96 221 6 70 174 222 210 141 0 0 38 91 25 23 175 171 151 185 223 189 29 181 4 186 136 186 187 211 92 240 132 239 86 157 142 233 42 105 221 144 98 224 139 152 138 40 2 75 65 232 64 78 37 25 85 43 247 17 170 71 235 54 68 95 61 0 0 0 8 84 104 15 69 62 160 26 0 1 8 84 104 15 69 62 160 26 0 0 108 219 65 187 13 190 48 46 122 32 188 62 55 54 62 116 201 244 243 89 151 14 43 21 29 19 142 33 75 56 94 48 19 170 145 179 161 25 76 133 125 215 133 4 159 74 89 201 157 226 92 172 10 213 88 179 123 109 36 223 242 66 12 21 230 200 219 144 151 19 8 235 54 85 254 74 95 63 248 92 164 209 97 251 119 65 142 10 170 247 216 222 98 38 21 72 54 73 122 224 248 221 198 101 236 254 0 0 0 1 108 219 65 187 13 190 48 46 122 32 188 62 55 54 62 116 201 244 243 89 151 14 43 21 29 19 142 33 75 56 94 48 19 170 145 179 161 25 76 133 125 215 133 4 159 74 89 201 157 226 92 172 10 213 88 179 123 109 36 223 242 66 12 21 230 200 219 144 151 19 8 235 54 85 254 74 95 63 248 92 164 209 97 251 119 65 142 10 170 247 216 222 98 38 21 72 54 73 122 224 248 221 198 101 236 254 0 0 0 0 116 173 131 100 228 57 121 99 67 36 188 26 116 195 11 33 238 99 149 244 192 69 122 152 142 206 32 93 57 158 59 204 109 129 133 85 46 84 246 35 199 170 91 5 153 166 135 136 100 219 159 177 96 71 252 20 164 194 225 242 95 219 102 176 247 177 135 49 219 166 200 159 163 69 215 174 34 15 87 114 111 202 124 88 204 39 19 12 146 233 34 22 85 241 111 63 103 250 222 19 62 55 235 240 190 151 122 115 229 120 69 13 175 97 196 211 28 1 116 173 131 100 228 57 121 99 67 36 188 26 116 195 11 33 238 99 149 244 192 69 122 152 142 206 32 93 57 158 59 204 109 129 133 85 46 84 246 35 199 170 91 5 153 166 135 136 100 219 159 177 96 71 252 20 164 194 225 242 95 219 102 176 247 177 135 49 219 166 200 159 163 69 215 174 34 15 87 114 111 202 124 88 204 39 19 12 146 233 34 22 85 241 111 63 103 250 222 19 62 55 235 240 190 151 122 115 229 120 69 13 175 97 196 211 28 0 40 243 42 248 54 150 57 118 223 89 213 123 0 145 11 121 246 65 78 171 9 235 26 93 69 20 253 245 14 109 46 33 35 29 254 140 52 122 13 60 0 1 40 243 42 248 54 150 57 118 223 89 213 123 0 145 11 121 246 65 78 171 9 235 26 93 69 20 253 245 14 109 46 33 35 29 254 140 52 122 13 60 0 0 124 203 79 238 32 121 29 119 220 119 105 16 43 194 81 73 221 217 2 148 227 212 111 94 30 4 186 210 125 205 136 245 32 214 39 108 83 11 185 216 199 221 176 13 218 150 42 152 40 224 210 120 250 254 120 131 79 250 21 126 178 2 237 252 78 209 43 98 114 190 99 82 138 216 142 31 167 59 58 104 199 119 105 205 151 40 188 42 120 215 171 111 159 24 71 230 74 3 175 149 59 28 47 26 232 212 124 173 155 1 51 182 82 59 115 81 68 151 198 197 107 41 0 0 0 1 124 203 79 238 32 121 29 119 220 119 105 16 43 194 81 73 221 217 2 148 227 212 111 94 30 4 186 210 125 205 136 245 32 214 39 108 83 11 185 216 199 221 176 13 218 150 42 152 40 224 210 120 250 254 120 131 79 250 21 126 178 2 237 252 78 209 43 98 114 190 99 82 138 216 142 31 167 59 58 104 199 119 105 205 151 40 188 42 120 215 171 111 159 24 71 230 74 3 175 149 59 28 47 26 232 212 124 173 155 1 51 182 82 59 115 81 68 151 198 197 107 41 0 0 0 0 8 70 47 94 78 85 213 4 0 1 8 70 47 94 78 85 213 4 0 0 64 168 239 3 109 249 109 253 64 147 102 173 10 159 193 47 134 235 24 116 111 234 17 218 47 133 118 130 4 234 130 216 79 86 7 158 19 179 226 92 28 11 213 95 197 165 161 196 126 158 172 83 45 60 0 243 82 11 125 51 88 204 253 201 0 1 64 168 239 3 109 249 109 253 64 147 102 173 10 159 193 47 134 235 24 116 111 234 17 218 47 133 118 130 4 234 130 216 79 86 7 158 19 179 226 92 28 11 213 95 197 165 161 196 126 158 172 83 45 60 0 243 82 11 125 51 88 204 253 201 0 0 32 91 8 155 0 244 185 150 213 21 51 193 238 33 114 252 243 203 63 197 56 17 152 0 158 202 81 224 155 176 168 48 8 1 32 91 8 155 0 244 185 150 213 21 51 193 238 33 114 252 243 203 63 197 56 17 152 0 158 202 81 224 155 176 168 48 8 0 64 237 110 141 244 234 81 71 9 84 235 128 228 166 210 171 84 207 172 13 18 245 134 71 141 15 168 153 177 38 185 201 244 241 170 222 1 133 147 146 102 43 229 200 175 199 75 172 190 162 84 189 67 156 147 154 31 13 207 129 50 200 231 74 0 1 64 237 110 141 244 234 81 71 9 84 235 128 228 166 210 171 84 207 172 13 18 245 134 71 141 15 168 153 177 38 185 201 244 241 170 222 1 133 147 146 102 43 229 200 175 199 75 172 190 162 84 189 67 156 147 154 31 13 207 129 50 200 231 74 0 0 72 87 52 91 18 47 239 64 167 1 198 52 25 230 164 41 73 76 171 61 96 213 30 252 201 4 21 212 155 40 229 150 154 204 69 5 231 234 118 236 96 115 165 148 146 43 62 108 172 9 72 82 112 145 170 221 58 127 30 73 27 88 182 208 159 212 102 122 105 69 67 0 0 1 72 87 52 91 18 47 239 64 167 1 198 52 25 230 164 41 73 76 171 61 96 213 30 252 201 4 21 212 155 40 229 150 154 204 69 5 231 234 118 236 96 115 165 148 146 43 62 108 172 9 72 82 112 145 170 221 58 127 30 73 27 88 182 208 159 212 102 122 105 69 67 0 0 0 44 64 172 114 48 214 193 164 216 67 60 29 158 200 157 119 130 148 115 28 173 33 19 100 127 6 67 27 159 246 211 0 250 103 226 195 106 155 248 97 202 123 209 221 13 1 44 64 172 114 48 214 193 164 216 67 60 29 158 200 157 119 130 148 115 28 173 33 19 100 127 6 67 27 159 246 211 0 250 103 226 195 106 155 248 97 202 123 209 221 13 0 116 81 252 110 197 13 166 231 72 130 41 106 65 232 254 107 124 243 255 107 207 47 194 183 40 150 50 4 210 204 224 43 196 247 122 120 215 166 135 245 209 137 61 188 138 187 74 103 184 183 141 129 116 149 165 53 145 106 74 23 238 142 63 216 57 144 68 13 165 129 66 25 38 206 230 110 91 93 226 41 154 75 235 92 163 186 140 230 191 218 201 127 59 108 139 3 252 44 100 3 234 46 162 34 110 218 167 38 61 218 67 214 231 20 40 0 0 1 116 81 252 110 197 13 166 231 72 130 41 106 65 232 254 107 124 243 255 107 207 47 194 183 40 150 50 4 210 204 224 43 196 247 122 120 215 166 135 245 209 137 61 188 138 187 74 103 184 183 141 129 116 149 165 53 145 106 74 23 238 142 63 216 57 144 68 13 165 129 66 25 38 206 230 110 91 93 226 41 154 75 235 92 163 186 140 230 191 218 201 127 59 108 139 3 252 44 100 3 234 46 162 34 110 218 167 38 61 218 67 214 231 20 40 0 0 0 116 243 247 18 11 29 244 71 100 171 9 7 235 135 165 185 174 82 125 144 46 101 141 39 25 219 161 166 142 138 73 193 151 231 217 184 5 47 234 106 36 39 20 133 77 81 241 34 12 59 55 212 158 163 139 77 54 232 111 133 109 11 226 82 170 77 232 17 218 114 50 113 152 83 202 219 168 218 132 34 241 173 58 247 200 6 151 173 6 185 4 118 166 131 92 255 162 247 111 148 166 68 56 169 253 254 48 168 30 109 251 179 213 140 46 219 3 1 116 243 247 18 11 29 244 71 100 171 9 7 235 135 165 185 174 82 125 144 46 101 141 39 25 219 161 166 142 138 73 193 151 231 217 184 5 47 234 106 36 39 20 133 77 81 241 34 12 59 55 212 158 163 139 77 54 232 111 133 109 11 226 82 170 77 232 17 218 114 50 113 152 83 202 219 168 218 132 34 241 173 58 247 200 6 151 173 6 185 4 118 166 131 92 255 162 247 111 148 166 68 56 169 253 254 48 168 30 109 251 179 213 140 46 219 3 0 48 170 134 196 251 187 25 104 34 95 69 85 184 199 0 89 253 150 101 212 7 202 243 18 178 248 98 105 134 18 215 189 22 99 238 235 78 124 3 142 134 188 8 188 178 2 0 0 0 1 48 170 134 196 251 187 25 104 34 95 69 85 184 199 0 89 253 150 101 212 7 202 243 18 178 248 98 105 134 18 215 189 22 99 238 235 78 124 3 142 134 188 8 188 178 2 0 0 0 0 48 200 105 57 90 124 53 229 14 158 143 66 34 150 228 210 143 188 213 175 175 21 92 123 213 52 223 97 128 64 234 169 31 165 1 230 126 33 17 32 28 25 238 131 159 125 84 120 8 1 48 200 105 57 90 124 53 229 14 158 143 66 34 150 228 210 143 188 213 175 175 21 92 123 213 52 223 97 128 64 234 169 31 165 1 230 126 33 17 32 28 25 238 131 159 125 84 120 8 0 8 236 26 245 49 19 0 0 0 1 8 236 26 245 49 19 0 0 0 0 16 134 207 199 26 175 188 103 160 76 140 48 55 30 189 7 0 1 16 134 207 199 26 175 188 103 160 76 140 48 55 30 189 7 0 0 24 7 216 8 30 195 251 90 24 198 179 171 59 27 243 102 163 205 126 247 84 4 0 0 0 1 24 7 216 8 30 195 251 90 24 198 179 171 59 27 243 102 163 205 126 247 84 4 0 0 0 0 100 89 190 73 217 127 252 160 134 16 114 94 182 255 223 176 58 217 71 107 33 21 118 140 226 166 128 254 219 248 19 33 93 9 225 89 44 103 188 91 203 146 155 17 20 40 125 153 23 87 125 86 166 25 181 17 220 165 143 13 245 94 144 64 231 41 17 165 224 79 44 34 246 169 187 130 155 57 121 213 161 21 178 163 44 75 169 37 6 67 200 63 171 50 214 213 230 10 148 179 25 1 100 89 190 73 217 127 252 160 134 16 114 94 182 255 223 176 58 217 71 107 33 21 118 140 226 166 128 254 219 248 19 33 93 9 225 89 44 103 188 91 203 146 155 17 20 40 125 153 23 87 125 86 166 25 181 17 220 165 143 13 245 94 144 64 231 41 17 165 224 79 44 34 246 169 187 130 155 57 121 213 161 21 178 163 44 75 169 37 6 67 200 63 171 50 214 213 230 10 148 179 25 0 116 239 141 241 165 45 224 229 17 155 67 37 181 127 150 115 133 137 72 239 12 3 103 142 204 53 108 13 4 11 96 213 15 192 155 67 147 30 66 19 222 160 17 202 156 77 143 151 241 100 236 128 33 207 105 116 196 68 142 109 237 94 29 86 196 190 96 158 51 78 107 53 2 158 62 195 101 125 181 245 191 185 105 37 77 113 109 85 110 93 152 188 115 136 136 93 10 235 225 51 77 110 7 74 32 118 44 157 117 193 127 80 54 2 0 0 0 1 116 239 141 241 165 45 224 229 17 155 67 37 181 127 150 115 133 137 72 239 12 3 103 142 204 53 108 13 4 11 96 213 15 192 155 67 147 30 66 19 222 160 17 202 156 77 143 151 241 100 236 128 33 207 105 116 196 68 142 109 237 94 29 86 196 190 96 158 51 78 107 53 2 158 62 195 101 125 181 245 191 185 105 37 77 113 109 85 110 93 152 188 115 136 136 93 10 235 225 51 77 110 7 74 32 118 44 157 117 193 127 80 54 2 0 0 0 0 52 161 103 132 41 228 199 245 93 101 166 142 168 205 96 95 52 143 127 100 173 175 132 102 181 237 4 42 52 30 10 219 202 27 68 79 23 201 116 89 53 50 85 239 183 254 11 165 100 129 247 0 0 1 52 161 103 132 41 228 199 245 93 101 166 142 168 205 96 95 52 143 127 100 173 175 132 102 181 237 4 42 52 30 10 219 202 27 68 79 23 201 116 89 53 50 85 239 183 254 11 165 100 129 247 0 0 0 28 255 251 221 115 146 46 163 229 176 14 203 138 27 28 41 62 22 109 49 16 185 119 54 172 191 85 184 0 1 28 255 251 221 115 146 46 163 229 176 14 203 138 27 28 41 62 22 109 49 16 185 119 54 172 191 85 184 0 0 32 247 33 196 253 43 205 187 127 110 212 213 12 214 143 22 252 209 96 90 89 50 103 47 68 146 216 72 215 61 226 134 3 1 32 247 33 196 253 43 205 187 127 110 212 213 12 214 143 22 252 209 96 90 89 50 103 47 68 146 216 72 215 61 226 134 3 0 36 59 97 19 31 78 83 69 133 60 42 103 67 71 156 83 145 176 67 103 93 114 176 15 117 43 90 82 152 45 121 12 17 76 244 53 1 1 36 59 97 19 31 78 83 69 133 60 42 103 67 71 156 83 145 176 67 103 93 114 176 15 117 43 90 82 152 45 121 12 17 76 244 53 1 0 52 219 241 133 51 75 86 155 36 83 56 69 111 93 54 193 19 54 88 242 30 144 132 66 61 131 189 217 126 87 64 134 162 139 199 3 85 234 160 230 114 164 25 154 94 87 76 241 251 243 147 109 83 1 52 219 241 133 51 75 86 155 36 83 56 69 111 93 54 193 19 54 88 242 30 144 132 66 61 131 189 217 126 87 64 134 162 139 199 3 85 234 160 230 114 164 25 154 94 87 76 241 251 243 147 109 83 0 64 43 137 16 132 202 104 91 201 107 180 196 200 93 138 129 13 78 33 73 134 236 116 150 83 184 197 132 23 82 3 247 20 140 181 22 152 27 60 63 98 254 172 152 20 58 101 176 236 139 225 217 61 37 39 22 240 147 101 158 189 117 172 129 3 1 64 43 137 16 132 202 104 91 201 107 180 196 200 93 138 129 13 78 33 73 134 236 116 150 83 184 197 132 23 82 3 247 20 140 181 22 152 27 60 63 98 254 172 152 20 58 101 176 236 139 225 217 61 37 39 22 240 147 101 158 189 117 172 129 3 0 16 174 250 80 27 225 76 117 105 139 6 48 23 21 0 0 0 1 16 174 250 80 27 225 76 117 105 139 6 48 23 21 0 0 0 0 32 79 208 51 133 78 86 8 203 246 180 251 28 21 185 125 159 144 112 64 104 31 37 123 126 115 170 223 1 66 0 0 0 1 32 79 208 51 133 78 86 8 203 246 180 251 28 21 185 125 159 144 112 64 104 31 37 123 126 115 170 223 1 66 0 0 0 0 20 59 170 196 192 162 161 183 242 120 40 171 157 254 236 242 64 223 1 0 0 1 20 59 170 196 192 162 161 183 242 120 40 171 157 254 236 242 64 223 1 0 0 0 64 158 138 13 99 212 72 79 220 230 16 119 150 64 148 121 100 5 104 182 189 57 158 100 143 129 122 146 11 169 192 52 74 169 74 4 0 229 160 168 226 62 202 182 250 171 51 251 90 159 122 13 111 16 28 141 139 1 41 229 97 17 73 120 0 1 64 158 138 13 99 212 72 79 220 230 16 119 150 64 148 121 100 5 104 182 189 57 158 100 143 129 122 146 11 169 192 52 74 169 74 4 0 229 160 168 226 62 202 182 250 171 51 251 90 159 122 13 111 16 28 141 139 1 41 229 97 17 73 120 0 0 124 54 211 84 85 147 162 152 160 127 96 156 128 144 183 140 26 170 242 255 112 211 16 24 233 93 177 189 62 26 230 8 18 162 102 53 79 255 93 127 37 173 116 119 61 21 221 30 71 51 18 217 197 225 89 208 228 54 16 14 158 40 254 222 6 144 144 95 30 116 51 208 187 221 207 73 40 215 178 180 184 67 243 230 235 85 174 4 118 231 32 148 73 211 37 140 151 196 184 12 41 14 98 78 190 103 107 141 66 52 100 222 58 141 135 84 85 90 76 97 21 18 0 0 0 1 124 54 211 84 85 147 162 152 160 127 96 156 128 144 183 140 26 170 242 255 112 211 16 24 233 93 177 189 62 26 230 8 18 162 102 53 79 255 93 127 37 173 116 119 61 21 221 30 71 51 18 217 197 225 89 208 228 54 16 14 158 40 254 222 6 144 144 95 30 116 51 208 187 221 207 73 40 215 178 180 184 67 243 230 235 85 174 4 118 231 32 148 73 211 37 140 151 196 184 12 41 14 98 78 190 103 107 141 66 52 100 222 58 141 135 84 85 90 76 97 21 18 0 0 0 0 124 94 236 109 194 205 86 41 192 155 21 79 52 203 207 37 42 40 126 224 32 228 152 22 204 190 205 68 99 253 159 127 249 241 8 5 27 151 203 115 75 236 216 195 28 184 201 166 85 152 106 8 201 248 148 93 54 156 87 135 56 251 121 202 96 173 198 190 134 110 223 180 127 230 136 159 180 9 44 207 255 43 80 213 238 43 117 135 78 121 149 22 24 198 179 157 59 238 245 168 85 45 36 70 88 161 109 52 49 133 96 74 209 106 244 99 200 247 185 127 197 240 97 2 0 1 124 94 236 109 194 205 86 41 192 155 21 79 52 203 207 37 42 40 126 224 32 228 152 22 204 190 205 68 99 253 159 127 249 241 8 5 27 151 203 115 75 236 216 195 28 184 201 166 85 152 106 8 201 248 148 93 54 156 87 135 56 251 121 202 96 173 198 190 134 110 223 180 127 230 136 159 180 9 44 207 255 43 80 213 238 43 117 135 78 121 149 22 24 198 179 157 59 238 245 168 85 45 36 70 88 161 109 52 49 133 96 74 209 106 244 99 200 247 185 127 197 240 97 2 0 0 124 14 202 151 114 198 177 79 116 173 42 198 179 37 189 161 34 90 109 151 134 15 53 12 218 203 186 227 104 124 114 146 230 193 76 40 120 134 85 85 179 206 122 201 169 68 255 199 58 19 184 117 183 58 105 131 49 120 224 207 113 249 249 52 245 213 117 133 240 15 235 167 111 253 250 71 98 115 41 241 120 23 72 80 150 152 182 145 130 4 69 103 219 252 177 172 87 76 137 67 198 105 98 131 12 8 87 204 104 138 42 101 155 161 225 254 112 96 164 148 113 139 130 6 0 1 124 14 202 151 114 198 177 79 116 173 42 198 179 37 189 161 34 90 109 151 134 15 53 12 218 203 186 227 104 124 114 146 230 193 76 40 120 134 85 85 179 206 122 201 169 68 255 199 58 19 184 117 183 58 105 131 49 120 224 207 113 249 249 52 245 213 117 133 240 15 235 167 111 253 250 71 98 115 41 241 120 23 72 80 150 152 182 145 130 4 69 103 219 252 177 172 87 76 137 67 198 105 98 131 12 8 87 204 104 138 42 101 155 161 225 254 112 96 164 148 113 139 130 6 0 0 84 222 236 36 90 191 241 183 85 110 108 88 240 111 232 78 103 27 70 144 224 71 76 230 109 75 89 21 251 126 142 18 121 105 170 253 72 64 73 2 238 74 157 109 22 80 12 236 206 45 90 23 64 23 14 190 116 110 37 81 228 238 254 84 202 140 111 243 20 88 246 161 13 249 31 162 155 221 13 64 215 171 161 29 14 1 84 222 236 36 90 191 241 183 85 110 108 88 240 111 232 78 103 27 70 144 224 71 76 230 109 75 89 21 251 126 142 18 121 105 170 253 72 64 73 2 238 74 157 109 22 80 12 236 206 45 90 23 64 23 14 190 116 110 37 81 228 238 254 84 202 140 111 243 20 88 246 161 13 249 31 162 155 221 13 64 215 171 161 29 14 0 76 69 2 96 19 137 241 75 149 54 240 119 4 53 193 106 38 190 90 56 134 205 201 129 251 62 99 112 152 118 97 184 216 164 110 226 53 156 74 62 42 32 199 114 107 27 36 188 14 59 253 131 97 129 87 74 48 164 130 23 116 217 134 169 80 29 241 90 26 86 7 137 144 117 50 0 0 1 76 69 2 96 19 137 241 75 149 54 240 119 4 53 193 106 38 190 90 56 134 205 201 129 251 62 99 112 152 118 97 184 216 164 110 226 53 156 74 62 42 32 199 114 107 27 36 188 14 59 253 131 97 129 87 74 48 164 130 23 116 217 134 169 80 29 241 90 26 86 7 137 144 117 50 0 0 0 100 60 2 183 139 129 88 99 244 170 89 0 177 28 40 203 18 239 70 82 138 113 96 148 242 156 70 22 152 221 31 149 38 127 107 45 254 28 166 210 227 215 191 161 12 230 95 230 64 209 16 253 82 63 212 15 119 73 178 25 88 182 249 227 148 207 62 209 192 72 37 56 62 203 161 110 196 250 228 14 19 181 87 35 11 15 255 155 107 206 61 54 223 191 92 51 188 42 0 0 0 1 100 60 2 183 139 129 88 99 244 170 89 0 177 28 40 203 18 239 70 82 138 113 96 148 242 156 70 22 152 221 31 149 38 127 107 45 254 28 166 210 227 215 191 161 12 230 95 230 64 209 16 253 82 63 212 15 119 73 178 25 88 182 249 227 148 207 62 209 192 72 37 56 62 203 161 110 196 250 228 14 19 181 87 35 11 15 255 155 107 206 61 54 223 191 92 51 188 42 0 0 0 0 8 161 145 84 161 51 102 34 163 1 8 161 145 84 161 51 102 34 163 0 56 160 51 60 244 243 228 49 105 198 184 5 130 241 114 177 248 245 101 241 141 249 87 160 252 119 173 82 11 10 104 49 95 69 254 101 134 79 46 129 192 118 64 243 147 3 51 61 70 176 159 167 235 86 145 44 55 1 56 160 51 60 244 243 228 49 105 198 184 5 130 241 114 177 248 245 101 241 141 249 87 160 252 119 173 82 11 10 104 49 95 69 254 101 134 79 46 129 192 118 64 243 147 3 51 61 70 176 159 167 235 86 145 44 55 0 32 180 181 48 71 211 35 86 174 153 231 246 211 154 205 97 74 237 0 199 183 8 131 127 228 121 26 229 18 39 183 3 0 1 32 180 181 48 71 211 35 86 174 153 231 246 211 154 205 97 74 237 0 199 183 8 131 127 228 121 26 229 18 39 183 3 0 0 72 235 208 249 69 198 27 28 175 48 201 165 210 55 86 150 90 198 36 230 165 54 20 213 19 85 189 110 233 79 254 190 153 19 131 115 116 152 36 49 241 5 53 57 191 108 36 43 245 224 105 242 219 194 163 217 52 122 224 205 161 21 47 142 100 254 80 178 115 134 181 158 0 1 72 235 208 249 69 198 27 28 175 48 201 165 210 55 86 150 90 198 36 230 165 54 20 213 19 85 189 110 233 79 254 190 153 19 131 115 116 152 36 49 241 5 53 57 191 108 36 43 245 224 105 242 219 194 163 217 52 122 224 205 161 21 47 142 100 254 80 178 115 134 181 158 0 0 48 24 216 31 31 121 32 6 35 230 132 116 1 93 231 239 114 29 239 68 226 187 220 209 191 89 111 162 77 90 222 196 5 16 190 98 88 179 228 211 83 191 201 156 101 38 6 0 0 1 48 24 216 31 31 121 32 6 35 230 132 116 1 93 231 239 114 29 239 68 226 187 220 209 191 89 111 162 77 90 222 196 5 16 190 98 88 179 228 211 83 191 201 156 101 38 6 0 0 0 8 120 9 155 198 227 119 139 0 1 8 120 9 155 198 227 119 139 0 0 108 67 233 173 239 2 147 31 164 67 28 157 14 181 143 121 205 94 47 18 212 89 86 192 240 97 248 17 119 22 163 109 127 226 138 109 233 234 45 230 169 33 186 2 126 255 20 183 106 178 83 140 195 205 223 184 177 109 237 177 147 165 5 252 192 192 124 61 142 140 69 133 239 214 170 94 162 222 231 95 68 100 116 183 60 109 34 233 105 48 238 47 153 181 219 232 176 110 180 54 190 173 160 203 79 0 3 0 0 1 108 67 233 173 239 2 147 31 164 67 28 157 14 181 143 121 205 94 47 18 212 89 86 192 240 97 248 17 119 22 163 109 127 226 138 109 233 234 45 230 169 33 186 2 126 255 20 183 106 178 83 140 195 205 223 184 177 109 237 177 147 165 5 252 192 192 124 61 142 140 69 133 239 214 170 94 162 222 231 95 68 100 116 183 60 109 34 233 105 48 238 47 153 181 219 232 176 110 180 54 190 173 160 203 79 0 3 0 0 0 44 113 179 208 89 229 97 41 83 34 181 248 69 45 117 67 182 227 176 114 161 166 167 142 142 47 25 191 4 182 213 77 37 61 119 165 249 59 176 118 228 161 1 0 0 1 44 113 179 208 89 229 97 41 83 34 181 248 69 45 117 67 182 227 176 114 161 166 167 142 142 47 25 191 4 182 213 77 37 61 119 165 249 59 176 118 228 161 1 0 0 0 4 205 230 1 0 1 4 205 230 1 0 0 52 77 166 237 60 159 113 214 225 225 196 126 16 105 189 104 42 252 167 15 186 63 111 11 23 250 53 128 208 225 81 238 136 75 225 4 178 227 11 107 243 121 83 238 164 31 105 2 177 163 135 105 60 1 52 77 166 237 60 159 113 214 225 225 196 126 16 105 189 104 42 252 167 15 186 63 111 11 23 250 53 128 208 225 81 238 136 75 225 4 178 227 11 107 243 121 83 238 164 31 105 2 177 163 135 105 60 0 8 7 177 200 9 87 48 0 0 1 8 7 177 200 9 87 48 0 0 0 120 95 0 17 198 196 3 168 29 232 224 109 67 23 135 235 50 52 214 192 80 146 255 65 119 139 83 153 210 130 123 45 5 148 58 19 42 240 226 164 159 61 91 236 215 59 183 160 255 155 79 104 47 81 69 79 205 46 250 193 179 14 221 169 205 128 237 109 128 36 7 21 98 118 172 243 166 158 151 127 232 156 225 22 108 82 127 8 238 182 238 200 235 199 229 34 2 128 5 166 74 164 159 85 41 32 254 62 100 188 86 40 138 142 240 122 56 2 0 0 0 1 120 95 0 17 198 196 3 168 29 232 224 109 67 23 135 235 50 52 214 192 80 146 255 65 119 139 83 153 210 130 123 45 5 148 58 19 42 240 226 164 159 61 91 236 215 59 183 160 255 155 79 104 47 81 69 79 205 46 250 193 179 14 221 169 205 128 237 109 128 36 7 21 98 118 172 243 166 158 151 127 232 156 225 22 108 82 127 8 238 182 238 200 235 199 229 34 2 128 5 166 74 164 159 85 41 32 254 62 100 188 86 40 138 142 240 122 56 2 0 0 0 0 24 52 171 120 247 245 238 38 189 200 10 21 246 79 73 111 224 107 101 199 80 238 49 0 0 1 24 52 171 120 247 245 238 38 189 200 10 21 246 79 73 111 224 107 101 199 80 238 49 0 0 0 104 57 158 161 115 39 26 101 249 18 39 40 1 93 199 25 128 79 244 212 44 60 231 196 18 52 157 210 236 197 32 195 30 224 115 47 62 183 108 27 196 234 161 196 225 103 21 202 150 178 236 60 175 217 66 254 151 71 126 230 34 45 143 24 111 88 165 51 57 138 241 251 139 79 160 192 71 182 96 28 48 193 182 46 229 150 230 46 13 249 26 35 98 104 138 125 230 36 173 131 138 29 153 37 15 1 104 57 158 161 115 39 26 101 249 18 39 40 1 93 199 25 128 79 244 212 44 60 231 196 18 52 157 210 236 197 32 195 30 224 115 47 62 183 108 27 196 234 161 196 225 103 21 202 150 178 236 60 175 217 66 254 151 71 126 230 34 45 143 24 111 88 165 51 57 138 241 251 139 79 160 192 71 182 96 28 48 193 182 46 229 150 230 46 13 249 26 35 98 104 138 125 230 36 173 131 138 29 153 37 15 0 84 201 67 176 170 12 214 223 113 151 240 121 127 115 67 246 173 119 207 202 219 102 176 87 124 64 46 160 253 231 56 131 2 167 194 119 80 227 152 34 209 118 189 9 5 175 115 207 20 15 201 85 82 139 3 122 200 232 151 18 106 251 0 202 255 146 176 226 219 69 250 238 111 233 251 3 57 189 253 30 108 224 253 116 0 1 84 201 67 176 170 12 214 223 113 151 240 121 127 115 67 246 173 119 207 202 219 102 176 87 124 64 46 160 253 231 56 131 2 167 194 119 80 227 152 34 209 118 189 9 5 175 115 207 20 15 201 85 82 139 3 122 200 232 151 18 106 251 0 202 255 146 176 226 219 69 250 238 111 233 251 3 57 189 253 30 108 224 253 116 0 0 36 216 207 22 26 220 111 75 102 80 113 167 57 132 171 148 110 197 33 103 213 177 123 206 218 242 178 9 228 125 117 218 221 76 2 0 0 1 36 216 207 22 26 220 111 75 102 80 113 167 57 132 171 148 110 197 33 103 213 177 123 206 218 242 178 9 228 125 117 218 221 76 2 0 0 0 96 209 38 226 122 66 37 110 32 0 244 215 135 36 169 50 93 130 191 147 142 209 240 154 14 39 115 83 99 104 166 126 171 89 95 133 0 168 235 114 121 112 237 201 242 105 25 68 88 53 63 4 70 8 16 14 139 78 16 28 216 131 240 108 136 129 244 99 100 247 236 64 222 120 6 100 242 25 164 196 251 190 21 202 16 243 72 23 21 27 253 232 129 65 12 0 0 1 96 209 38 226 122 66 37 110 32 0 244 215 135 36 169 50 93 130 191 147 142 209 240 154 14 39 115 83 99 104 166 126 171 89 95 133 0 168 235 114 121 112 237 201 242 105 25 68 88 53 63 4 70 8 16 14 139 78 16 28 216 131 240 108 136 129 244 99 100 247 236 64 222 120 6 100 242 25 164 196 251 190 21 202 16 243 72 23 21 27 253 232 129 65 12 0 0 0 20 137 7 71 104 123 1 230 162 84 85 84 78 76 1 146 149 3 0 0 0 1 20 137 7 71 104 123 1 230 162 84 85 84 78 76 1 146 149 3 0 0 0 0 84 17 135 189 91 189 22 119 161 7 236 246 162 42 137 207 149 58 10 147 68 241 83 242 92 176 9 168 195 250 98 204 19 131 82 40 2 115 30 134 119 85 234 171 51 248 6 232 13 126 100 100 208 191 92 68 52 56 79 102 83 41 100 249 214 204 9 147 69 246 254 24 120 21 121 111 194 137 125 190 39 201 58 31 0 1 84 17 135 189 91 189 22 119 161 7 236 246 162 42 137 207 149 58 10 147 68 241 83 242 92 176 9 168 195 250 98 204 19 131 82 40 2 115 30 134 119 85 234 171 51 248 6 232 13 126 100 100 208 191 92 68 52 56 79 102 83 41 100 249 214 204 9 147 69 246 254 24 120 21 121 111 194 137 125 190 39 201 58 31 0 0 64 174 140 149 163 3 107 111 4 34 250 106 21 208 102 247 217 125 106 201 189 50 165 180 247 173 193 91 219 22 221 135 48 75 167 217 77 123 120 130 238 30 6 129 157 63 162 58 79 199 175 93 130 164 195 209 241 206 111 166 90 218 65 223 2 1 64 174 140 149 163 3 107 111 4 34 250 106 21 208 102 247 217 125 106 201 189 50 165 180 247 173 193 91 219 22 221 135 48 75 167 217 77 123 120 130 238 30 6 129 157 63 162 58 79 199 175 93 130 164 195 209 241 206 111 166 90 218 65 223 2 0 60 94 39 245 99 17 252 182 140 162 112 156 230 137 46 180 2 25 35 78 204 212 30 138 67 63 147 188 132 251 223 228 122 221 52 247 47 60 130 213 221 67 57 251 17 236 100 5 136 157 85 85 137 180 82 210 206 141 57 0 0 1 60 94 39 245 99 17 252 182 140 162 112 156 230 137 46 180 2 25 35 78 204 212 30 138 67 63 147 188 132 251 223 228 122 221 52 247 47 60 130 213 221 67 57 251 17 236 100 5 136 157 85 85 137 180 82 210 206 141 57 0 0 0 52 130 153 165 204 195 100 32 242 200 177 22 23 48 222 90 173 238 62 11 195 207 31 94 106 111 19 23 102 123 154 11 25 69 140 143 38 27 47 211 73 199 58 157 241 52 98 114 254 14 0 0 0 1 52 130 153 165 204 195 100 32 242 200 177 22 23 48 222 90 173 238 62 11 195 207 31 94 106 111 19 23 102 123 154 11 25 69 140 143 38 27 47 211 73 199 58 157 241 52 98 114 254 14 0 0 0 0 72 242 139 53 248 243 242 47 139 119 188 176 74 227 81 33 108 130 169 69 136 245 21 31 87 103 135 189 216 110 191 185 187 15 111 235 113 59 97 210 163 3 82 39 248 57 165 173 26 7 64 153 147 109 165 237 85 23 91 144 96 82 212 163 110 172 233 196 20 189 194 1 0 1 72 242 139 53 248 243 242 47 139 119 188 176 74 227 81 33 108 130 169 69 136 245 21 31 87 103 135 189 216 110 191 185 187 15 111 235 113 59 97 210 163 3 82 39 248 57 165 173 26 7 64 153 147 109 165 237 85 23 91 144 96 82 212 163 110 172 233 196 20 189 194 1 0 0 92 63 196 195 103 33 69 53 0 35 106 115 86 145 225 79 206 13 41 97 138 221 49 15 101 120 43 207 2 164 87 76 203 63 18 204 117 208 102 150 11 45 65 74 88 87 11 31 221 40 244 204 108 35 1 221 236 192 33 114 34 255 16 27 102 160 251 229 204 178 67 44 210 45 249 116 212 232 9 246 165 134 232 228 248 94 170 234 243 13 232 1 125 1 92 63 196 195 103 33 69 53 0 35 106 115 86 145 225 79 206 13 41 97 138 221 49 15 101 120 43 207 2 164 87 76 203 63 18 204 117 208 102 150 11 45 65 74 88 87 11 31 221 40 244 204 108 35 1 221 236 192 33 114 34 255 16 27 102 160 251 229 204 178 67 44 210 45 249 116 212 232 9 246 165 134 232 228 248 94 170 234 243 13 232 1 125 0 40 179 181 131 162 149 183 138 252 30 154 1 146 137 121 52 190 246 1 224 28 36 102 79 202 159 212 210 252 214 150 156 61 194 235 164 133 239 142 0 0 1 40 179 181 131 162 149 183 138 252 30 154 1 146 137 121 52 190 246 1 224 28 36 102 79 202 159 212 210 252 214 150 156 61 194 235 164 133 239 142 0 0 0 40 60 58 79 249 6 113 81 42 62 163 64 45 148 17 196 92 207 75 88 80 225 216 133 32 64 220 110 107 147 131 21 223 245 83 192 232 107 0 0 0 1 40 60 58 79 249 6 113 81 42 62 163 64 45 148 17 196 92 207 75 88 80 225 216 133 32 64 220 110 107 147 131 21 223 245 83 192 232 107 0 0 0 0 96 12 165 17 255 148 106 77 76 190 146 244 60 246 21 69 4 108 6 135 121 71 44 77 148 210 123 228 244 192 7 178 234 75 27 35 56 139 157 89 246 205 166 104 142 71 22 111 74 215 198 253 47 185 250 203 223 186 72 48 140 56 78 5 248 174 81 223 135 55 86 65 183 39 125 199 89 36 113 114 101 100 241 34 118 182 139 64 184 93 41 222 250 83 8 126 2 1 96 12 165 17 255 148 106 77 76 190 146 244 60 246 21 69 4 108 6 135 121 71 44 77 148 210 123 228 244 192 7 178 234 75 27 35 56 139 157 89 246 205 166 104 142 71 22 111 74 215 198 253 47 185 250 203 223 186 72 48 140 56 78 5 248 174 81 223 135 55 86 65 183 39 125 199 89 36 113 114 101 100 241 34 118 182 139 64 184 93 41 222 250 83 8 126 2 0 80 194 39 168 144 47 63 164 168 230 144 217 13 24 96 155 100 12 59 177 151 216 92 228 192 145 88 206 81 45 221 226 39 93 88 12 250 68 153 137 36 20 58 0 113 35 195 22 121 71 66 8 241 39 201 196 133 230 128 125 7 217 82 221 87 57 93 151 146 24 13 11 157 51 151 229 8 102 193 170 254 1 80 194 39 168 144 47 63 164 168 230 144 217 13 24 96 155 100 12 59 177 151 216 92 228 192 145 88 206 81 45 221 226 39 93 88 12 250 68 153 137 36 20 58 0 113 35 195 22 121 71 66 8 241 39 201 196 133 230 128 125 7 217 82 221 87 57 93 151 146 24 13 11 157 51 151 229 8 102 193 170 254 0 28 115 165 0 181 114 222 7 59 3 124 183 26 196 172 167 125 136 168 200 232 107 92 130 217 10 0 0 0 1 28 115 165 0 181 114 222 7 59 3 124 183 26 196 172 167 125 136 168 200 232 107 92 130 217 10 0 0 0 0 104 236 68 87 125 155 29 32 62 230 30 136 150 217 197 37 30 35 255 242 108 93 176 111 33 250 237 114 238 160 77 113 171 147 43 61 144 12 84 87 115 160 128 222 109 180 248 55 195 181 75 255 203 79 219 130 244 94 36 238 156 212 175 171 162 174 87 117 209 113 175 106 193 36 21 66 244 243 166 248 81 121 94 110 189 10 52 188 102 198 136 150 183 191 180 96 29 51 207 65 251 163 177 216 188 1 104 236 68 87 125 155 29 32 62 230 30 136 150 217 197 37 30 35 255 242 108 93 176 111 33 250 237 114 238 160 77 113 171 147 43 61 144 12 84 87 115 160 128 222 109 180 248 55 195 181 75 255 203 79 219 130 244 94 36 238 156 212 175 171 162 174 87 117 209 113 175 106 193 36 21 66 244 243 166 248 81 121 94 110 189 10 52 188 102 198 136 150 183 191 180 96 29 51 207 65 251 163 177 216 188 0 88 199 62 219 38 224 64 98 122 250 132 90 246 191 177 175 129 238 74 103 140 144 205 156 27 249 53 223 251 192 95 121 104 139 113 181 72 177 157 33 140 244 253 143 104 230 164 205 233 17 33 203 84 40 89 149 26 16 144 238 213 168 166 242 186 189 255 169 165 234 16 127 90 100 62 217 16 139 41 102 89 93 97 62 95 147 122 238 237 1 88 199 62 219 38 224 64 98 122 250 132 90 246 191 177 175 129 238 74 103 140 144 205 156 27 249 53 223 251 192 95 121 104 139 113 181 72 177 157 33 140 244 253 143 104 230 164 205 233 17 33 203 84 40 89 149 26 16 144 238 213 168 166 242 186 189 255 169 165 234 16 127 90 100 62 217 16 139 41 102 89 93 97 62 95 147 122 238 237 0 44 45 84 26 33 30 184 117 77 114 45 211 193 64 207 224 237 136 114 3 145 150 20 213 238 240 36 201 64 122 69 244 22 129 142 201 1 185 151 174 233 1 0 0 0 1 44 45 84 26 33 30 184 117 77 114 45 211 193 64 207 224 237 136 114 3 145 150 20 213 238 240 36 201 64 122 69 244 22 129 142 201 1 185 151 174 233 1 0 0 0 0 24 118 96 110 163 151 234 7 30 202 198 169 47 210 145 198 195 223 20 211 133 162 187 75 48 1 24 118 96 110 163 151 234 7 30 202 198 169 47 210 145 198 195 223 20 211 133 162 187 75 48 0 52 166 132 83 15 114 76 5 198 105 107 64 21 201 37 152 38 123 234 29 114 185 178 23 194 54 124 93 52 128 139 153 108 32 85 243 44 247 113 25 108 194 143 136 29 222 174 212 74 73 19 0 0 1 52 166 132 83 15 114 76 5 198 105 107 64 21 201 37 152 38 123 234 29 114 185 178 23 194 54 124 93 52 128 139 153 108 32 85 243 44 247 113 25 108 194 143 136 29 222 174 212 74 73 19 0 0 0 48 123 248 179 54 119 191 224 218 82 168 17 9 213 235 78 184 70 111 32 105 157 160 212 123 240 230 248 188 30 46 115 251 167 248 212 75 179 20 91 203 47 80 142 34 152 174 246 1 1 48 123 248 179 54 119 191 224 218 82 168 17 9 213 235 78 184 70 111 32 105 157 160 212 123 240 230 248 188 30 46 115 251 167 248 212 75 179 20 91 203 47 80 142 34 152 174 246 1 0 48 156 96 100 244 230 81 145 6 56 18 242 19 211 56 11 208 136 192 193 247 21 84 210 245 251 22 164 190 142 62 191 235 148 86 107 108 228 229 161 113 8 169 132 37 3 0 0 0 1 48 156 96 100 244 230 81 145 6 56 18 242 19 211 56 11 208 136 192 193 247 21 84 210 245 251 22 164 190 142 62 191 235 148 86 107 108 228 229 161 113 8 169 132 37 3 0 0 0 0 84 253 53 33 48 131 189 25 65 204 174 99 186 204 72 230 129 192 106 8 141 23 186 143 8 176 75 97 190 2 190 127 52 92 22 252 200 15 45 98 21 11 157 128 28 145 217 54 150 99 213 145 99 58 65 64 149 218 156 253 58 0 9 210 203 145 96 237 185 130 70 116 6 209 240 157 58 59 8 33 55 1 0 0 0 1 84 253 53 33 48 131 189 25 65 204 174 99 186 204 72 230 129 192 106 8 141 23 186 143 8 176 75 97 190 2 190 127 52 92 22 252 200 15 45 98 21 11 157 128 28 145 217 54 150 99 213 145 99 58 65 64 149 218 156 253 58 0 9 210 203 145 96 237 185 130 70 116 6 209 240 157 58 59 8 33 55 1 0 0 0 0 108 140 139 49 207 205 64 240 199 59 87 85 34 45 23 247 226 20 175 76 118 24 188 97 163 249 238 130 105 219 76 167 90 29 31 159 229 181 73 152 183 74 134 209 139 34 200 210 113 231 227 99 224 196 220 80 243 62 167 195 5 201 123 178 100 95 190 235 171 32 64 54 178 111 83 175 134 22 73 175 164 79 39 170 74 102 74 233 210 216 226 3 131 100 81 201 127 195 224 208 29 109 171 156 77 11 0 0 0 1 108 140 139 49 207 205 64 240 199 59 87 85 34 45 23 247 226 20 175 76 118 24 188 97 163 249 238 130 105 219 76 167 90 29 31 159 229 181 73 152 183 74 134 209 139 34 200 210 113 231 227 99 224 196 220 80 243 62 167 195 5 201 123 178 100 95 190 235 171 32 64 54 178 111 83 175 134 22 73 175 164 79 39 170 74 102 74 233 210 216 226 3 131 100 81 201 127 195 224 208 29 109 171 156 77 11 0 0 0 0 100 222 231 217 128 82 99 10 214 110 228 128 78 114 45 119 81 180 185 243 203 206 92 162 40 82 46 54 187 93 28 152 69 4 123 103 77 208 204 181 235 42 147 170 143 2 139 154 218 144 51 223 215 163 89 75 72 123 205 0 240 64 100 207 207 158 197 65 249 187 175 80 167 154 152 209 32 55 42 171 219 232 238 66 244 61 205 209 141 94 43 111 8 205 151 59 230 205 24 205 241 1 100 222 231 217 128 82 99 10 214 110 228 128 78 114 45 119 81 180 185 243 203 206 92 162 40 82 46 54 187 93 28 152 69 4 123 103 77 208 204 181 235 42 147 170 143 2 139 154 218 144 51 223 215 163 89 75 72 123 205 0 240 64 100 207 207 158 197 65 249 187 175 80 167 154 152 209 32 55 42 171 219 232 238 66 244 61 205 209 141 94 43 111 8 205 151 59 230 205 24 205 241 0 88 207 251 142 39 144 108 252 57 106 73 11 186 19 131 187 69 26 149 177 211 238 136 251 62 89 7 238 7 115 168 92 155 211 100 253 171 162 138 116 33 152 91 134 33 55 71 164 201 152 4 49 26 55 186 161 250 57 85 28 39 171 17 196 138 245 10 0 73 155 144 183 97 4 3 242 240 169 248 22 116 210 225 61 191 6 115 0 0 1 88 207 251 142 39 144 108 252 57 106 73 11 186 19 131 187 69 26 149 177 211 238 136 251 62 89 7 238 7 115 168 92 155 211 100 253 171 162 138 116 33 152 91 134 33 55 71 164 201 152 4 49 26 55 186 161 250 57 85 28 39 171 17 196 138 245 10 0 73 155 144 183 97 4 3 242 240 169 248 22 116 210 225 61 191 6 115 0 0 0 12 137 130 140 24 236 12 214 199 10 105 31 0 1 12 137 130 140 24 236 12 214 199 10 105 31 0 0 52 108 175 196 156 55 213 72 113 207 244 180 56 88 213 35 165 75 248 211 20 212 57 60 188 217 211 48 37 134 141 243 246 161 245 39 195 123 248 138 183 15 28 111 146 50 155 93 170 4 0 0 0 1 52 108 175 196 156 55 213 72 113 207 244 180 56 88 213 35 165 75 248 211 20 212 57 60 188 217 211 48 37 134 141 243 246 161 245 39 195 123 248 138 183 15 28 111 146 50 155 93 170 4 0 0 0 0 120 112 113 30 136 233 190 54 137 121 169 50 162 49 32 173 179 18 162 50 40 203 206 65 185 66 186 230 219 176 80 103 123 27 250 226 122 23 191 77 80 214 47 76 55 89 65 20 139 103 231 246 32 248 93 179 33 222 25 246 60 212 174 114 116 72 105 47 23 51 143 138 172 27 39 246 135 133 254 162 107 108 22 2 166 141 243 6 251 77 176 135 206 2 231 124 148 132 69 84 79 111 64 235 234 76 164 46 49 159 31 188 209 182 60 173 197 202 76 16 0 1 120 112 113 30 136 233 190 54 137 121 169 50 162 49 32 173 179 18 162 50 40 203 206 65 185 66 186 230 219 176 80 103 123 27 250 226 122 23 191 77 80 214 47 76 55 89 65 20 139 103 231 246 32 248 93 179 33 222 25 246 60 212 174 114 116 72 105 47 23 51 143 138 172 27 39 246 135 133 254 162 107 108 22 2 166 141 243 6 251 77 176 135 206 2 231 124 148 132 69 84 79 111 64 235 234 76 164 46 49 159 31 188 209 182 60 173 197 202 76 16 0 0 60 47 160 84 82 9 238 207 219 151 156 134 131 89 62 11 68 11 147 237 99 121 15 73 200 84 95 87 214 232 187 96 240 53 52 195 55 200 190 88 28 76 29 80 151 156 97 63 20 181 127 200 147 98 254 76 151 61 118 77 0 1 60 47 160 84 82 9 238 207 219 151 156 134 131 89 62 11 68 11 147 237 99 121 15 73 200 84 95 87 214 232 187 96 240 53 52 195 55 200 190 88 28 76 29 80 151 156 97 63 20 181 127 200 147 98 254 76 151 61 118 77 0 0 100 238 56 196 120 62 80 239 58 25 190 123 255 60 22 240 193 64 200 155 205 65 125 162 46 114 82 168 130 71 226 104 252 45 143 77 84 254 194 132 208 96 195 7 173 173 156 202 242 175 234 16 37 97 18 174 179 230 94 208 69 94 78 160 223 97 151 58 36 237 203 214 110 180 89 134 104 29 12 23 140 193 36 70 29 183 50 17 167 28 12 196 65 172 236 156 91 251 73 127 1 1 100 238 56 196 120 62 80 239 58 25 190 123 255 60 22 240 193 64 200 155 205 65 125 162 46 114 82 168 130 71 226 104 252 45 143 77 84 254 194 132 208 96 195 7 173 173 156 202 242 175 234 16 37 97 18 174 179 230 94 208 69 94 78 160 223 97 151 58 36 237 203 214 110 180 89 134 104 29 12 23 140 193 36 70 29 183 50 17 167 28 12 196 65 172 236 156 91 251 73 127 1 0 40 149 114 1 116 102 17 2 174 6 173 97 185 176 52 172 147 84 122 233 135 57 32 185 232 151 166 16 42 84 99 130 237 14 101 51 119 173 115 53 0 1 40 149 114 1 116 102 17 2 174 6 173 97 185 176 52 172 147 84 122 233 135 57 32 185 232 151 166 16 42 84 99 130 237 14 101 51 119 173 115 53 0 0 64 242 217 97 202 37 38 150 206 207 10 52 100 102 27 105 39 214 77 170 228 242 244 122 45 230 139 116 113 248 171 76 193 78 80 198 37 181 97 228 185 29 21 241 62 210 131 193 6 1 89 93 123 149 252 254 234 21 49 121 54 70 123 12 0 1 64 242 217 97 202 37 38 150 206 207 10 52 100 102 27 105 39 214 77 170 228 242 244 122 45 230 139 116 113 248 171 76 193 78 80 198 37 181 97 228 185 29 21 241 62 210 131 193 6 1 89 93 123 149 252 254 234 21 49 121 54 70 123 12 0 0 120 126 216 172 15 25 129 241 98 17 2 168 135 214 24 154 85 56 125 146 150 225 161 82 46 26 201 64 204 132 245 111 192 88 211 123 3 119 58 58 245 118 104 138 91 147 19 185 226 101 33 139 62 235 15 91 204 29 220 53 8 11 61 142 142 93 77 162 71 38 142 116 213 43 79 225 85 174 86 234 214 249 189 86 69 229 181 99 122 154 144 192 66 13 218 96 118 124 80 14 168 5 230 111 79 37 76 42 49 185 18 80 157 188 50 80 199 22 0 0 0 1 120 126 216 172 15 25 129 241 98 17 2 168 135 214 24 154 85 56 125 146 150 225 161 82 46 26 201 64 204 132 245 111 192 88 211 123 3 119 58 58 245 118 104 138 91 147 19 185 226 101 33 139 62 235 15 91 204 29 220 53 8 11 61 142 142 93 77 162 71 38 142 116 213 43 79 225 85 174 86 234 214 249 189 86 69 229 181 99 122 154 144 192 66 13 218 96 118 124 80 14 168 5 230 111 79 37 76 42 49 185 18 80 157 188 50 80 199 22 0 0 0 0 56 243 53 196 121 165 92 144 118 3 3 222 84 206 144 5 157 57 16 134 139 198 69 129 221 11 133 183 218 71 108 13 56 83 246 113 103 6 198 202 227 68 93 146 59 161 12 248 177 166 51 150 47 96 161 239 236 1 56 243 53 196 121 165 92 144 118 3 3 222 84 206 144 5 157 57 16 134 139 198 69 129 221 11 133 183 218 71 108 13 56 83 246 113 103 6 198 202 227 68 93 146 59 161 12 248 177 166 51 150 47 96 161 239 236 0 64 153 28 132 11 210 222 158 84 204 251 210 22 227 11 36 206 23 140 161 60 159 143 123 206 191 31 7 46 144 178 243 58 169 39 112 174 47 119 109 7 130 69 51 2 125 253 241 144 64 234 96 3 245 113 8 190 14 182 65 46 222 249 3 0 1 64 153 28 132 11 210 222 158 84 204 251 210 22 227 11 36 206 23 140 161 60 159 143 123 206 191 31 7 46 144 178 243 58 169 39 112 174 47 119 109 7 130 69 51 2 125 253 241 144 64 234 96 3 245 113 8 190 14 182 65 46 222 249 3 0 0 60 98 185 79 194 105 170 12 86 252 124 124 192 23 205 211 77 162 50 205 89 40 158 46 179 237 22 171 26 56 121 32 6 69 111 60 114 251 180 204 199 96 135 46 64 144 243 102 201 99 166 113 208 152 168 179 161 1 6 0 0 1 60 98 185 79 194 105 170 12 86 252 124 124 192 23 205 211 77 162 50 205 89 40 158 46 179 237 22 171 26 56 121 32 6 69 111 60 114 251 180 204 199 96 135 46 64 144 243 102 201 99 166 113 208 152 168 179 161 1 6 0 0 0 100 142 26 227 150 238 69 151 6 3 30 46 190 46 96 134 217 131 85 161 92 34 208 158 197 175 196 117 64 216 114 195 81 101 252 52 106 185 71 47 193 32 27 53 120 25 14 193 3 5 106 149 116 208 152 66 126 218 195 178 209 4 241 87 44 185 217 57 224 49 139 77 191 217 218 19 215 78 14 143 87 180 5 177 20 62 54 52 235 79 31 44 20 98 23 221 250 34 0 0 0 1 100 142 26 227 150 238 69 151 6 3 30 46 190 46 96 134 217 131 85 161 92 34 208 158 197 175 196 117 64 216 114 195 81 101 252 52 106 185 71 47 193 32 27 53 120 25 14 193 3 5 106 149 116 208 152 66 126 218 195 178 209 4 241 87 44 185 217 57 224 49 139 77 191 217 218 19 215 78 14 143 87 180 5 177 20 62 54 52 235 79 31 44 20 98 23 221 250 34 0 0 0 0 40 32 168 235 44 56 166 243 210 154 91 226 40 229 249 145 209 125 211 169 133 252 161 224 125 81 253 117 254 153 178 166 34 26 180 249 135 33 222 152 13 1 40 32 168 235 44 56 166 243 210 154 91 226 40 229 249 145 209 125 211 169 133 252 161 224 125 81 253 117 254 153 178 166 34 26 180 249 135 33 222 152 13 0 16 114 51 72 217 92 64 168 124 50 132 58 208 128 106 1 0 1 16 114 51 72 217 92 64 168 124 50 132 58 208 128 106 1 0 0 68 69 4 0 153 42 90 20 74 230 90 168 97 72 101 100 19 28 241 147 219 3 93 60 246 145 183 55 230 232 224 115 211 143 158 209 214 247 84 89 209 186 139 133 34 124 5 207 184 125 115 201 88 222 241 97 109 108 6 13 211 125 187 117 94 222 2 0 0 1 68 69 4 0 153 42 90 20 74 230 90 168 97 72 101 100 19 28 241 147 219 3 93 60 246 145 183 55 230 232 224 115 211 143 158 209 214 247 84 89 209 186 139 133 34 124 5 207 184 125 115 201 88 222 241 97 109 108 6 13 211 125 187 117 94 222 2 0 0 0 52 153 84 205 104 19 159 225 153 148 74 194 235 72 23 144 76 152 243 229 1 90 189 92 32 175 52 88 183 242 20 84 239 175 56 99 222 31 211 114 93 122 135 65 160 226 51 48 207 12 116 28 0 1 52 153 84 205 104 19 159 225 153 148 74 194 235 72 23 144 76 152 243 229 1 90 189 92 32 175 52 88 183 242 20 84 239 175 56 99 222 31 211 114 93 122 135 65 160 226 51 48 207 12 116 28 0 0 68 245 53 109 105 191 82 1 66 103 122 80 160 241 193 52 254 117 182 127 138 99 142 106 221 128 239 15 222 14 129 176 110 43 113 122 176 232 88 250 58 0 161 215 14 126 59 139 23 140 13 122 239 14 189 40 72 35 18 82 213 254 53 121 213 234 12 0 0 1 68 245 53 109 105 191 82 1 66 103 122 80 160 241 193 52 254 117 182 127 138 99 142 106 221 128 239 15 222 14 129 176 110 43 113 122 176 232 88 250 58 0 161 215 14 126 59 139 23 140 13 122 239 14 189 40 72 35 18 82 213 254 53 121 213 234 12 0 0 0 112 159 8 16 9 71 195 199 198 21 242 159 80 249 120 17 254 76 140 121 166 78 213 92 89 178 160 20 177 8 14 182 122 65 115 133 119 121 16 112 118 105 211 205 62 12 236 55 80 1 131 163 0 83 205 178 80 88 102 233 133 195 61 239 174 246 227 234 216 85 176 76 5 36 121 112 51 212 181 246 245 241 105 195 137 147 72 56 237 179 190 73 134 142 177 146 141 8 159 112 222 16 234 231 234 198 20 89 52 189 194 119 1 1 112 159 8 16 9 71 195 199 198 21 242 159 80 249 120 17 254 76 140 121 166 78 213 92 89 178 160 20 177 8 14 182 122 65 115 133 119 121 16 112 118 105 211 205 62 12 236 55 80 1 131 163 0 83 205 178 80 88 102 233 133 195 61 239 174 246 227 234 216 85 176 76 5 36 121 112 51 212 181 246 245 241 105 195 137 147 72 56 237 179 190 73 134 142 177 146 141 8 159 112 222 16 234 231 234 198 20 89 52 189 194 119 1 0 108 80 214 13 177 215 159 125 169 151 12 42 72 121 18 76 208 238 240 149 68 234 73 20 164 91 171 220 52 255 98 21 228 111 4 175 56 163 222 123 128 30 97 59 67 228 49 187 237 223 220 86 109 144 229 187 251 70 7 146 195 116 106 122 232 185 78 78 58 225 39 134 160 118 235 208 242 69 148 226 101 73 25 136 159 25 99 137 101 248 54 26 247 229 7 34 61 19 28 201 190 36 74 102 133 25 0 0 0 1 108 80 214 13 177 215 159 125 169 151 12 42 72 121 18 76 208 238 240 149 68 234 73 20 164 91 171 220 52 255 98 21 228 111 4 175 56 163 222 123 128 30 97 59 67 228 49 187 237 223 220 86 109 144 229 187 251 70 7 146 195 116 106 122 232 185 78 78 58 225 39 134 160 118 235 208 242 69 148 226 101 73 25 136 159 25 99 137 101 248 54 26 247 229 7 34 61 19 28 201 190 36 74 102 133 25 0 0 0 0 48 214 54 94 179 164 240 155 40 191 186 107 180 206 48 82 137 213 91 241 62 39 183 229 184 237 121 223 179 199 117 185 240 244 56 38 125 32 5 140 166 122 78 243 77 252 116 1 0 1 48 214 54 94 179 164 240 155 40 191 186 107 180 206 48 82 137 213 91 241 62 39 183 229 184 237 121 223 179 199 117 185 240 244 56 38 125 32 5 140 166 122 78 243 77 252 116 1 0 0 104 54 55 200 109 82 156 202 152 175 66 36 193 252 78 5 135 125 117 139 57 40 153 71 77 232 6 37 188 28 77 2 71 137 173 143 223 127 105 125 144 234 178 168 38 38 22 213 12 86 146 58 86 128 124 44 36 53 34 45 2 168 71 121 160 250 8 153 10 51 71 123 250 225 95 140 177 159 103 47 148 120 154 141 97 250 155 186 25 61 104 158 48 167 246 20 132 6 84 93 66 112 47 0 0 1 104 54 55 200 109 82 156 202 152 175 66 36 193 252 78 5 135 125 117 139 57 40 153 71 77 232 6 37 188 28 77 2 71 137 173 143 223 127 105 125 144 234 178 168 38 38 22 213 12 86 146 58 86 128 124 44 36 53 34 45 2 168 71 121 160 250 8 153 10 51 71 123 250 225 95 140 177 159 103 47 148 120 154 141 97 250 155 186 25 61 104 158 48 167 246 20 132 6 84 93 66 112 47 0 0 0 120 6 90 182 206 193 58 216 170 220 9 22 52 156 242 120 157 30 209 26 98 51 196 178 88 228 65 154 229 210 70 170 198 64 16 247 102 16 21 58 87 235 200 244 76 203 136 132 209 76 195 94 143 2 113 149 235 158 1 227 205 1 208 16 81 131 189 40 241 92 36 170 156 224 56 199 188 154 79 125 102 121 78 97 150 233 11 79 62 109 25 212 226 161 220 35 23 232 13 90 56 183 223 124 31 159 158 14 223 62 85 83 193 110 187 158 93 203 8 0 0 1 120 6 90 182 206 193 58 216 170 220 9 22 52 156 242 120 157 30 209 26 98 51 196 178 88 228 65 154 229 210 70 170 198 64 16 247 102 16 21 58 87 235 200 244 76 203 136 132 209 76 195 94 143 2 113 149 235 158 1 227 205 1 208 16 81 131 189 40 241 92 36 170 156 224 56 199 188 154 79 125 102 121 78 97 150 233 11 79 62 109 25 212 226 161 220 35 23 232 13 90 56 183 223 124 31 159 158 14 223 62 85 83 193 110 187 158 93 203 8 0 0 0 84 47 45 238 181 215 239 242 99 34 179 237 146 38 184 178 32 39 156 91 232 37 68 223 154 247 174 99 147 112 220 68 13 168 71 188 111 58 166 58 109 244 156 76 173 12 217 7 247 229 168 222 84 82 81 171 9 74 74 20 144 71 106 164 117 234 163 235 12 58 184 167 68 145 254 103 0 233 175 219 91 115 45 23 0 1 84 47 45 238 181 215 239 242 99 34 179 237 146 38 184 178 32 39 156 91 232 37 68 223 154 247 174 99 147 112 220 68 13 168 71 188 111 58 166 58 109 244 156 76 173 12 217 7 247 229 168 222 84 82 81 171 9 74 74 20 144 71 106 164 117 234 163 235 12 58 184 167 68 145 254 103 0 233 175 219 91 115 45 23 0 0 72 40 180 241 104 90 252 242 234 235 240 236 39 250 255 76 167 29 116 156 87 88 207 205 175 125 89 77 12 21 97 61 253 152 65 25 101 5 139 108 225 153 138 24 18 112 100 115 211 39 249 92 242 104 78 15 126 214 21 35 238 183 248 195 174 170 41 249 203 160 8 0 0 1 72 40 180 241 104 90 252 242 234 235 240 236 39 250 255 76 167 29 116 156 87 88 207 205 175 125 89 77 12 21 97 61 253 152 65 25 101 5 139 108 225 153 138 24 18 112 100 115 211 39 249 92 242 104 78 15 126 214 21 35 238 183 248 195 174 170 41 249 203 160 8 0 0 0 52 22 27 151 194 115 92 119 11 236 51 137 144 137 103 129 95 89 105 130 240 243 170 243 35 191 215 206 102 95 172 26 80 149 177 248 238 54 111 45 244 22 23 22 224 158 95 94 118 19 0 0 0 1 52 22 27 151 194 115 92 119 11 236 51 137 144 137 103 129 95 89 105 130 240 243 170 243 35 191 215 206 102 95 172 26 80 149 177 248 238 54 111 45 244 22 23 22 224 158 95 94 118 19 0 0 0 0 20 156 43 16 56 55 4 61 155 177 58 74 163 225 4 11 131 179 24 1 0 1 20 156 43 16 56 55 4 61 155 177 58 74 163 225 4 11 131 179 24 1 0 0 104 73 76 101 151 31 35 209 56 36 69 31 173 147 81 94 123 172 22 210 79 45 203 20 140 58 218 46 34 183 138 96 94 97 161 218 71 10 21 254 228 117 64 245 83 14 74 129 103 121 90 57 125 205 210 39 213 162 107 185 36 194 249 86 241 82 226 200 210 202 80 195 105 63 67 249 109 65 100 248 77 32 184 210 162 76 62 215 70 139 167 97 35 196 73 132 172 243 85 144 160 14 20 22 193 1 104 73 76 101 151 31 35 209 56 36 69 31 173 147 81 94 123 172 22 210 79 45 203 20 140 58 218 46 34 183 138 96 94 97 161 218 71 10 21 254 228 117 64 245 83 14 74 129 103 121 90 57 125 205 210 39 213 162 107 185 36 194 249 86 241 82 226 200 210 202 80 195 105 63 67 249 109 65 100 248 77 32 184 210 162 76 62 215 70 139 167 97 35 196 73 132 172 243 85 144 160 14 20 22 193 0 28 126 1 30 104 79 113 99 127 177 76 179 201 53 24 182 29 192 54 96 132 91 248 133 211 86 2 0 0 1 28 126 1 30 104 79 113 99 127 177 76 179 201 53 24 182 29 192 54 96 132 91 248 133 211 86 2 0 0 0 72 92 159 45 128 70 93 245 63 92 118 241 226 212 23 182 127 131 42 229 253 64 210 240 253 132 150 70 236 28 94 44 2 105 246 1 151 224 138 233 135 254 20 25 124 118 13 182 172 20 197 252 20 174 143 186 57 51 58 222 119 36 51 0 104 163 78 183 107 2 0 0 0 1 72 92 159 45 128 70 93 245 63 92 118 241 226 212 23 182 127 131 42 229 253 64 210 240 253 132 150 70 236 28 94 44 2 105 246 1 151 224 138 233 135 254 20 25 124 118 13 182 172 20 197 252 20 174 143 186 57 51 58 222 119 36 51 0 104 163 78 183 107 2 0 0 0 0 124 74 103 198 93 113 70 83 77 90 199 193 206 145 183 35 249 192 236 161 64 7 17 137 53 0 187 116 255 249 232 191 215 71 6 51 192 57 52 156 221 118 241 145 238 148 141 72 31 162 90 235 117 210 45 34 240 215 118 239 161 128 10 59 244 108 240 132 108 62 94 40 142 165 219 48 78 211 95 143 5 181 44 128 205 117 175 172 46 236 144 98 44 44 86 152 86 44 46 101 89 209 229 168 49 93 54 154 211 126 167 37 43 164 36 251 17 187 90 218 47 68 10 0 0 1 124 74 103 198 93 113 70 83 77 90 199 193 206 145 183 35 249 192 236 161 64 7 17 137 53 0 187 116 255 249 232 191 215 71 6 51 192 57 52 156 221 118 241 145 238 148 141 72 31 162 90 235 117 210 45 34 240 215 118 239 161 128 10 59 244 108 240 132 108 62 94 40 142 165 219 48 78 211 95 143 5 181 44 128 205 117 175 172 46 236 144 98 44 44 86 152 86 44 46 101 89 209 229 168 49 93 54 154 211 126 167 37 43 164 36 251 17 187 90 218 47 68 10 0 0 0 48 5 35 182 112 113 188 253 125 124 37 72 205 161 238 42 235 141 207 222 101 115 216 55 107 133 114 20 89 39 233 135 120 225 238 214 101 146 108 76 33 35 58 202 67 65 1 0 0 1 48 5 35 182 112 113 188 253 125 124 37 72 205 161 238 42 235 141 207 222 101 115 216 55 107 133 114 20 89 39 233 135 120 225 238 214 101 146 108 76 33 35 58 202 67 65 1 0 0 0 128 104 135 234 221 147 43 69 249 95 82 22 184 215 149 229 138 106 92 255 169 236 121 106 240 235 221 243 154 22 155 148 218 188 88 136 234 72 234 250 14 92 227 117 188 12 118 41 224 174 244 46 222 46 196 200 235 191 13 185 217 77 182 148 203 3 127 173 173 34 254 84 187 72 234 176 92 208 9 125 82 232 207 39 192 114 153 168 166 210 148 43 5 225 117 107 205 99 179 177 46 90 12 119 11 225 27 124 151 136 98 153 156 122 129 197 79 159 225 89 237 180 211 34 198 224 232 1 0 1 128 104 135 234 221 147 43 69 249 95 82 22 184 215 149 229 138 106 92 255 169 236 121 106 240 235 221 243 154 22 155 148 218 188 88 136 234 72 234 250 14 92 227 117 188 12 118 41 224 174 244 46 222 46 196 200 235 191 13 185 217 77 182 148 203 3 127 173 173 34 254 84 187 72 234 176 92 208 9 125 82 232 207 39 192 114 153 168 166 210 148 43 5 225 117 107 205 99 179 177 46 90 12 119 11 225 27 124 151 136 98 153 156 122 129 197 79 159 225 89 237 180 211 34 198 224 232 1 0 0 124 30 16 152 189 248 187 194 106 86 218 107 172 24 210 165 36 4 181 124 54 238 59 132 56 110 109 236 68 95 102 145 133 240 159 128 36 169 4 207 140 229 186 242 94 18 174 89 159 26 138 112 65 245 118 85 137 113 110 126 144 76 37 227 235 138 77 233 26 84 155 51 80 31 201 113 46 222 200 95 96 232 140 13 80 38 36 30 104 180 121 216 89 15 185 161 136 55 32 42 160 149 50 168 225 1 104 50 30 10 3 96 136 60 23 224 146 203 81 219 70 1 0 0 0 1 124 30 16 152 189 248 187 194 106 86 218 107 172 24 210 165 36 4 181 124 54 238 59 132 56 110 109 236 68 95 102 145 133 240 159 128 36 169 4 207 140 229 186 242 94 18 174 89 159 26 138 112 65 245 118 85 137 113 110 126 144 76 37 227 235 138 77 233 26 84 155 51 80 31 201 113 46 222 200 95 96 232 140 13 80 38 36 30 104 180 121 216 89 15 185 161 136 55 32 42 160 149 50 168 225 1 104 50 30 10 3 96 136 60 23 224 146 203 81 219 70 1 0 0 0 0 32 31 3 148 175 154 99 152 211 246 153 40 92 93 24 93 5 168 109 224 21 185 107 37 219 63 153 164 130 241 93 111 0 1 32 31 3 148 175 154 99 152 211 246 153 40 92 93 24 93 5 168 109 224 21 185 107 37 219 63 153 164 130 241 93 111 0 0 112 73 246 239 200 138 198 5 244 5 61 186 215 203 39 176 220 88 141 123 23 70 239 91 228 24 9 208 86 173 30 190 190 160 205 169 222 186 254 3 42 110 229 120 37 181 245 217 107 172 221 147 223 37 33 9 82 153 101 228 62 236 28 113 251 178 124 157 88 255 13 110 233 60 45 129 160 39 244 17 113 220 114 236 12 12 23 203 127 173 99 182 203 235 40 81 17 163 180 158 157 229 232 88 42 248 234 216 11 207 20 25 51 1 112 73 246 239 200 138 198 5 244 5 61 186 215 203 39 176 220 88 141 123 23 70 239 91 228 24 9 208 86 173 30 190 190 160 205 169 222 186 254 3 42 110 229 120 37 181 245 217 107 172 221 147 223 37 33 9 82 153 101 228 62 236 28 113 251 178 124 157 88 255 13 110 233 60 45 129 160 39 244 17 113 220 114 236 12 12 23 203 127 173 99 182 203 235 40 81 17 163 180 158 157 229 232 88 42 248 234 216 11 207 20 25 51 0 4 39 132 6 0 1 4 39 132 6 0 0 72 220 180 23 131 143 83 213 131 208 206 205 120 25 87 192 44 119 67 69 124 227 114 112 253 61 85 176 134 4 56 189 104 188 137 70 0 24 85 129 75 88 245 68 129 51 145 7 213 104 238 115 223 7 147 12 4 53 239 245 119 158 197 135 154 106 50 38 170 151 176 21 0 1 72 220 180 23 131 143 83 213 131 208 206 205 120 25 87 192 44 119 67 69 124 227 114 112 253 61 85 176 134 4 56 189 104 188 137 70 0 24 85 129 75 88 245 68 129 51 145 7 213 104 238 115 223 7 147 12 4 53 239 245 119 158 197 135 154 106 50 38 170 151 176 21 0 0 52 53 186 59 167 241 59 136 87 128 215 201 225 137 253 171 55 175 94 153 156 167 180 232 139 32 51 246 11 119 98 59 201 174 243 8 69 82 213 30 147 100 60 26 207 249 44 53 34 200 114 0 0 1 52 53 186 59 167 241 59 136 87 128 215 201 225 137 253 171 55 175 94 153 156 167 180 232 139 32 51 246 11 119 98 59 201 174 243 8 69 82 213 30 147 100 60 26 207 249 44 53 34 200 114 0 0 0 80 174 62 24 34 239 200 187 235 239 204 93 34 151 115 205 129 228 152 167 94 171 72 91 21 73 128 43 106 226 191 23 128 76 125 32 132 209 72 252 64 195 197 154 199 15 13 192 133 198 108 88 181 61 227 187 44 34 215 108 151 40 54 253 218 203 218 197 100 1 207 108 14 183 168 181 1 75 68 203 52 1 80 174 62 24 34 239 200 187 235 239 204 93 34 151 115 205 129 228 152 167 94 171 72 91 21 73 128 43 106 226 191 23 128 76 125 32 132 209 72 252 64 195 197 154 199 15 13 192 133 198 108 88 181 61 227 187 44 34 215 108 151 40 54 253 218 203 218 197 100 1 207 108 14 183 168 181 1 75 68 203 52 0 100 178 153 248 14 228 148 99 29 41 180 54 4 212 37 168 181 45 110 40 79 241 192 17 133 242 242 158 27 85 230 33 102 187 163 67 188 94 83 9 227 224 31 154 239 89 44 152 114 79 160 147 226 52 244 38 46 88 71 34 217 114 156 13 83 85 223 134 253 133 126 56 188 90 85 65 29 106 94 50 165 88 56 132 55 180 80 212 40 199 4 162 37 213 90 184 228 101 203 7 49 1 100 178 153 248 14 228 148 99 29 41 180 54 4 212 37 168 181 45 110 40 79 241 192 17 133 242 242 158 27 85 230 33 102 187 163 67 188 94 83 9 227 224 31 154 239 89 44 152 114 79 160 147 226 52 244 38 46 88 71 34 217 114 156 13 83 85 223 134 253 133 126 56 188 90 85 65 29 106 94 50 165 88 56 132 55 180 80 212 40 199 4 162 37 213 90 184 228 101 203 7 49 0 76 38 182 96 145 194 1 121 109 64 49 154 66 199 208 229 235 239 165 41 198 204 230 234 178 15 29 203 140 160 143 49 211 78 57 102 214 114 58 133 221 75 184 224 8 199 190 6 247 208 197 161 3 41 23 120 225 80 183 58 134 227 154 146 238 63 175 177 103 131 253 150 250 82 57 2 3 1 76 38 182 96 145 194 1 121 109 64 49 154 66 199 208 229 235 239 165 41 198 204 230 234 178 15 29 203 140 160 143 49 211 78 57 102 214 114 58 133 221 75 184 224 8 199 190 6 247 208 197 161 3 41 23 120 225 80 183 58 134 227 154 146 238 63 175 177 103 131 253 150 250 82 57 2 3 0 64 248 119 27 143 213 236 116 221 199 155 29 196 80 96 187 63 97 42 122 209 144 117 56 28 149 170 177 209 56 44 150 204 131 187 222 85 190 214 23 67 242 17 199 67 116 180 19 62 92 46 154 222 244 151 104 165 83 192 191 210 45 2 0 0 1 64 248 119 27 143 213 236 116 221 199 155 29 196 80 96 187 63 97 42 122 209 144 117 56 28 149 170 177 209 56 44 150 204 131 187 222 85 190 214 23 67 242 17 199 67 116 180 19 62 92 46 154 222 244 151 104 165 83 192 191 210 45 2 0 0 0 28 75 182 65 120 225 60 231 204 95 201 188 204 81 75 120 231 176 122 123 44 181 212 75 241 199 197 22 0 1 28 75 182 65 120 225 60 231 204 95 201 188 204 81 75 120 231 176 122 123 44 181 212 75 241 199 197 22 0 0 72 223 250 238 211 74 58 16 147 125 7 190 218 142 15 49 69 24 56 233 70 213 49 22 223 242 236 38 167 130 195 39 254 92 251 3 205 152 4 121 107 79 85 199 20 69 53 93 242 156 125 37 228 96 255 30 188 96 67 150 203 206 75 217 143 153 171 129 99 51 5 0 0 1 72 223 250 238 211 74 58 16 147 125 7 190 218 142 15 49 69 24 56 233 70 213 49 22 223 242 236 38 167 130 195 39 254 92 251 3 205 152 4 121 107 79 85 199 20 69 53 93 242 156 125 37 228 96 255 30 188 96 67 150 203 206 75 217 143 153 171 129 99 51 5 0 0 0 40 108 135 124 124 29 149 22 174 63 189 26 9 249 247 17 17 89 247 0 255 90 36 201 133 122 164 9 110 235 211 222 139 25 132 124 219 40 148 57 0 1 40 108 135 124 124 29 149 22 174 63 189 26 9 249 247 17 17 89 247 0 255 90 36 201 133 122 164 9 110 235 211 222 139 25 132 124 219 40 148 57 0 0 4 221 214 2 0 1 4 221 214 2 0 0 64 147 243 38 63 33 71 153 12 98 251 245 150 131 176 144 216 39 46 89 50 223 16 34 113 69 13 67 16 135 235 91 48 79 129 250 166 204 227 58 148 218 46 57 182 34 191 165 85 34 220 7 11 186 11 50 182 83 77 72 179 7 0 0 0 1 64 147 243 38 63 33 71 153 12 98 251 245 150 131 176 144 216 39 46 89 50 223 16 34 113 69 13 67 16 135 235 91 48 79 129 250 166 204 227 58 148 218 46 57 182 34 191 165 85 34 220 7 11 186 11 50 182 83 77 72 179 7 0 0 0 0 116 233 246 77 131 243 68 158 180 136 87 207 157 192 121 128 83 72 237 157 134 56 179 201 1 58 190 146 20 153 238 215 88 195 223 67 97 118 17 130 145 223 169 2 15 100 207 216 142 60 64 52 15 48 69 172 151 212 137 218 247 204 232 97 61 38 179 246 161 46 207 132 202 4 168 89 164 121 208 120 93 104 32 129 66 68 235 47 162 233 166 150 103 24 240 136 140 27 137 9 61 79 35 201 200 190 255 32 23 133 194 43 148 11 47 84 2 1 116 233 246 77 131 243 68 158 180 136 87 207 157 192 121 128 83 72 237 157 134 56 179 201 1 58 190 146 20 153 238 215 88 195 223 67 97 118 17 130 145 223 169 2 15 100 207 216 142 60 64 52 15 48 69 172 151 212 137 218 247 204 232 97 61 38 179 246 161 46 207 132 202 4 168 89 164 121 208 120 93 104 32 129 66 68 235 47 162 233 166 150 103 24 240 136 140 27 137 9 61 79 35 201 200 190 255 32 23 133 194 43 148 11 47 84 2 0 32 158 132 247 73 243 86 76 181 117 114 74 0 73 167 54 232 186 178 119 62 251 36 87 106 243 46 78 254 30 13 0 0 1 32 158 132 247 73 243 86 76 181 117 114 74 0 73 167 54 232 186 178 119 62 251 36 87 106 243 46 78 254 30 13 0 0 0 28 187 109 237 12 177 145 13 138 110 36 103 212 219 254 32 2 199 207 206 58 33 91 157 82 142 0 0 0 1 28 187 109 237 12 177 145 13 138 110 36 103 212 219 254 32 2 199 207 206 58 33 91 157 82 142 0 0 0 0 108 191 156 137 40 227 120 81 180 191 249 128 101 54 189 222 126 135 44 172 229 198 254 122 200 254 68 241 155 189 52 134 12 32 127 165 213 33 74 112 219 180 120 124 62 203 145 126 182 239 201 194 229 70 199 78 71 165 89 3 82 85 207 202 83 229 239 95 208 222 39 184 4 206 170 105 230 130 175 81 36 41 97 157 125 234 216 239 63 206 58 107 124 78 26 131 144 70 157 163 62 27 234 177 215 202 140 179 217 1 108 191 156 137 40 227 120 81 180 191 249 128 101 54 189 222 126 135 44 172 229 198 254 122 200 254 68 241 155 189 52 134 12 32 127 165 213 33 74 112 219 180 120 124 62 203 145 126 182 239 201 194 229 70 199 78 71 165 89 3 82 85 207 202 83 229 239 95 208 222 39 184 4 206 170 105 230 130 175 81 36 41 97 157 125 234 216 239 63 206 58 107 124 78 26 131 144 70 157 163 62 27 234 177 215 202 140 179 217 0 116 255 98 44 67 145 156 67 69 207 144 154 245 114 32 23 127 211 123 148 182 146 150 170 172 74 232 254 188 127 136 34 39 122 230 35 121 2 76 118 160 187 17 37 250 134 176 133 100 139 227 15 230 54 106 167 246 167 233 207 141 247 103 135 96 18 251 188 166 202 113 88 34 38 81 212 236 236 142 153 242 1 12 51 124 236 57 28 83 109 124 63 127 190 114 111 5 105 32 46 141 46 195 82 228 121 27 143 106 94 116 99 98 35 8 0 0 1 116 255 98 44 67 145 156 67 69 207 144 154 245 114 32 23 127 211 123 148 182 146 150 170 172 74 232 254 188 127 136 34 39 122 230 35 121 2 76 118 160 187 17 37 250 134 176 133 100 139 227 15 230 54 106 167 246 167 233 207 141 247 103 135 96 18 251 188 166 202 113 88 34 38 81 212 236 236 142 153 242 1 12 51 124 236 57 28 83 109 124 63 127 190 114 111 5 105 32 46 141 46 195 82 228 121 27 143 106 94 116 99 98 35 8 0 0 0 28 232 106 75 132 234 67 145 119 175 2 68 218 133 30 27 34 7 172 120 42 19 45 118 178 216 1 0 0 1 28 232 106 75 132 234 67 145 119 175 2 68 218 133 30 27 34 7 172 120 42 19 45 118 178 216 1 0 0 0 60 129 215 181 185 15 177 200 177 68 80 119 183 36 206 190 141 54 145 230 111 190 97 150 77 141 67 185 87 206 214 237 78 15 79 202 150 147 74 113 9 154 9 23 173 146 190 131 137 247 142 224 174 235 35 57 206 3 0 0 0 1 60 129 215 181 185 15 177 200 177 68 80 119 183 36 206 190 141 54 145 230 111 190 97 150 77 141 67 185 87 206 214 237 78 15 79 202 150 147 74 113 9 154 9 23 173 146 190 131 137 247 142 224 174 235 35 57 206 3 0 0 0 0 32 115 158 93 203 145 117 229 203 77 183 195 60 46 1 188 230 187 238 14 154 176 183 66 57 250 253 70 58 37 0 0 0 1 32 115 158 93 203 145 117 229 203 77 183 195 60 46 1 188 230 187 238 14 154 176 183 66 57 250 253 70 58 37 0 0 0 0 20 81 129 71 67 43 121 89 51 236 18 78 211 96 141 172 26 113 13 214 3 1 20 81 129 71 67 43 121 89 51 236 18 78 211 96 141 172 26 113 13 214 3 0 24 184 13 246 1 153 149 55 198 59 23 173 215 119 87 65 163 114 196 32 40 213 121 0 0 1 24 184 13 246 1 153 149 55 198 59 23 173 215 119 87 65 163 114 196 32 40 213 121 0 0 0 32 56 51 141 41 47 230 78 216 176 139 28 23 160 170 28 45 110 124 64 37 171 195 108 121 74 182 76 40 76 153 115 0 1 32 56 51 141 41 47 230 78 216 176 139 28 23 160 170 28 45 110 124 64 37 171 195 108 121 74 182 76 40 76 153 115 0 0 32 206 242 236 149 72 96 46 45 248 108 12 136 166 194 52 138 152 63 46 130 98 126 192 209 228 24 24 197 243 7 0 0 1 32 206 242 236 149 72 96 46 45 248 108 12 136 166 194 52 138 152 63 46 130 98 126 192 209 228 24 24 197 243 7 0 0 0 104 163 224 244 5 84 160 193 30 20 248 69 99 186 48 205 24 55 21 110 164 203 99 211 59 80 177 211 86 41 161 229 184 106 19 96 95 57 76 140 135 150 249 39 235 242 249 52 35 6 105 190 17 117 228 226 214 214 171 123 84 78 178 176 91 241 160 229 1 232 67 196 8 201 235 118 130 80 124 105 29 101 75 30 179 181 153 56 118 147 86 245 65 10 214 206 110 133 122 248 252 15 53 12 0 1 104 163 224 244 5 84 160 193 30 20 248 69 99 186 48 205 24 55 21 110 164 203 99 211 59 80 177 211 86 41 161 229 184 106 19 96 95 57 76 140 135 150 249 39 235 242 249 52 35 6 105 190 17 117 228 226 214 214 171 123 84 78 178 176 91 241 160 229 1 232 67 196 8 201 235 118 130 80 124 105 29 101 75 30 179 181 153 56 118 147 86 245 65 10 214 206 110 133 122 248 252 15 53 12 0 0 56 255 163 247 43 209 230 164 208 61 194 65 9 8 102 145 97 240 236 201 123 138 71 245 15 204 218 185 57 76 20 213 174 59 153 22 62 121 255 64 38 76 67 69 50 49 114 127 89 242 171 78 13 84 189 144 206 1 56 255 163 247 43 209 230 164 208 61 194 65 9 8 102 145 97 240 236 201 123 138 71 245 15 204 218 185 57 76 20 213 174 59 153 22 62 121 255 64 38 76 67 69 50 49 114 127 89 242 171 78 13 84 189 144 206 0 64 119 123 244 71 66 212 59 231 215 217 150 174 254 235 5 68 31 31 6 176 61 197 15 162 18 140 92 194 120 2 15 65 53 175 46 99 56 24 73 7 37 185 106 245 175 110 29 253 204 28 202 76 47 79 71 204 251 4 48 167 1 0 0 0 1 64 119 123 244 71 66 212 59 231 215 217 150 174 254 235 5 68 31 31 6 176 61 197 15 162 18 140 92 194 120 2 15 65 53 175 46 99 56 24 73 7 37 185 106 245 175 110 29 253 204 28 202 76 47 79 71 204 251 4 48 167 1 0 0 0 0 40 75 92 25 115 221 208 198 30 142 204 73 223 50 228 83 175 70 246 95 204 121 169 116 174 231 117 55 245 122 146 164 239 74 119 247 71 4 100 3 243 1 40 75 92 25 115 221 208 198 30 142 204 73 223 50 228 83 175 70 246 95 204 121 169 116 174 231 117 55 245 122 146 164 239 74 119 247 71 4 100 3 243 0 12 34 19 120 45 63 194 247 76 181 223 195 16 1 12 34 19 120 45 63 194 247 76 181 223 195 16 0 120 11 156 157 89 152 7 19 248 49 41 66 116 237 10 201 152 231 23 143 156 186 202 203 178 43 1 204 30 223 30 82 205 180 255 123 84 194 132 200 55 172 127 23 130 112 165 163 165 42 122 249 39 165 158 69 42 153 176 150 166 240 46 132 80 211 8 120 35 97 238 127 32 91 232 38 236 223 213 67 53 103 162 194 187 151 60 152 119 172 25 69 23 189 153 199 219 236 157 195 152 26 202 31 27 199 10 79 34 126 168 67 114 24 246 235 163 169 176 2 0 1 120 11 156 157 89 152 7 19 248 49 41 66 116 237 10 201 152 231 23 143 156 186 202 203 178 43 1 204 30 223 30 82 205 180 255 123 84 194 132 200 55 172 127 23 130 112 165 163 165 42 122 249 39 165 158 69 42 153 176 150 166 240 46 132 80 211 8 120 35 97 238 127 32 91 232 38 236 223 213 67 53 103 162 194 187 151 60 152 119 172 25 69 23 189 153 199 219 236 157 195 152 26 202 31 27 199 10 79 34 126 168 67 114 24 246 235 163 169 176 2 0 0 84 85 223 220 13 86 122 92 125 254 224 25 165 190 213 4 132 224 45 245 246 242 4 21 101 215 192 193 89 76 244 92 59 156 26 236 182 254 202 196 35 75 32 109 229 252 167 15 126 64 249 191 76 96 115 179 17 42 165 113 135 249 231 21 159 208 162 179 200 212 213 61 123 49 118 34 59 181 1 182 39 112 251 16 0 1 84 85 223 220 13 86 122 92 125 254 224 25 165 190 213 4 132 224 45 245 246 242 4 21 101 215 192 193 89 76 244 92 59 156 26 236 182 254 202 196 35 75 32 109 229 252 167 15 126 64 249 191 76 96 115 179 17 42 165 113 135 249 231 21 159 208 162 179 200 212 213 61 123 49 118 34 59 181 1 182 39 112 251 16 0 0 56 241 153 124 222 255 91 80 137 188 25 206 200 154 27 122 16 125 75 240 248 246 78 65 142 23 205 193 163 87 157 134 225 91 123 69 215 210 244 123 101 159 224 170 194 255 111 207 183 177 8 44 102 228 238 181 2 1 56 241 153 124 222 255 91 80 137 188 25 206 200 154 27 122 16 125 75 240 248 246 78 65 142 23 205 193 163 87 157 134 225 91 123 69 215 210 244 123 101 159 224 170 194 255 111 207 183 177 8 44 102 228 238 181 2 0 84 108 208 238 121 156 133 32 223 68 75 136 121 125 29 189 121 101 228 164 37 65 109 220 250 136 48 233 198 101 96 135 47 117 233 2 196 191 211 238 100 182 234 243 0 91 97 184 199 182 220 252 38 146 252 212 245 32 52 172 255 55 60 67 104 138 139 119 31 23 22 151 0 79 220 46 31 165 72 73 119 91 0 0 0 1 84 108 208 238 121 156 133 32 223 68 75 136 121 125 29 189 121 101 228 164 37 65 109 220 250 136 48 233 198 101 96 135 47 117 233 2 196 191 211 238 100 182 234 243 0 91 97 184 199 182 220 252 38 146 252 212 245 32 52 172 255 55 60 67 104 138 139 119 31 23 22 151 0 79 220 46 31 165 72 73 119 91 0 0 0 0 24 213 179 45 133 224 12 22 86 217 206 37 101 183 225 74 147 210 205 0 173 128 31 240 53 1 24 213 179 45 133 224 12 22 86 217 206 37 101 183 225 74 147 210 205 0 173 128 31 240 53 0 76 90 55 247 101 97 91 255 60 228 172 4 69 150 197 105 130 9 216 50 222 145 121 93 91 122 8 47 193 246 47 193 9 162 74 30 3 151 221 91 204 206 19 231 186 13 155 24 132 70 140 134 148 236 198 3 189 248 97 75 45 121 50 215 87 150 150 229 138 138 91 126 104 37 101 138 0 1 76 90 55 247 101 97 91 255 60 228 172 4 69 150 197 105 130 9 216 50 222 145 121 93 91 122 8 47 193 246 47 193 9 162 74 30 3 151 221 91 204 206 19 231 186 13 155 24 132 70 140 134 148 236 198 3 189 248 97 75 45 121 50 215 87 150 150 229 138 138 91 126 104 37 101 138 0 0 116 115 168 21 247 112 94 184 201 248 149 252 240 29 141 154 150 50 97 41 31 56 85 247 163 55 145 23 152 45 131 53 22 104 104 156 123 120 164 40 242 48 192 145 28 44 4 132 15 113 134 148 171 248 224 123 182 163 113 254 55 6 161 136 98 198 188 165 53 144 141 184 125 14 170 160 0 214 41 35 209 54 31 123 30 107 49 216 97 58 154 19 33 192 193 123 112 203 64 156 187 211 15 178 212 189 77 250 84 218 228 148 93 53 115 124 112 1 116 115 168 21 247 112 94 184 201 248 149 252 240 29 141 154 150 50 97 41 31 56 85 247 163 55 145 23 152 45 131 53 22 104 104 156 123 120 164 40 242 48 192 145 28 44 4 132 15 113 134 148 171 248 224 123 182 163 113 254 55 6 161 136 98 198 188 165 53 144 141 184 125 14 170 160 0 214 41 35 209 54 31 123 30 107 49 216 97 58 154 19 33 192 193 123 112 203 64 156 187 211 15 178 212 189 77 250 84 218 228 148 93 53 115 124 112 0 96 124 82 249 217 103 152 210 105 101 179 152 26 43 32 241 184 13 170 187 237 6 89 158 142 202 72 9 130 229 186 22 231 141 253 32 147 157 150 169 239 239 208 239 192 162 97 2 190 76 255 147 85 133 38 206 102 92 234 167 23 138 70 25 133 14 226 134 237 118 29 40 218 196 187 239 239 178 225 158 55 21 189 63 14 233 211 32 249 204 188 227 125 20 0 0 0 1 96 124 82 249 217 103 152 210 105 101 179 152 26 43 32 241 184 13 170 187 237 6 89 158 142 202 72 9 130 229 186 22 231 141 253 32 147 157 150 169 239 239 208 239 192 162 97 2 190 76 255 147 85 133 38 206 102 92 234 167 23 138 70 25 133 14 226 134 237 118 29 40 218 196 187 239 239 178 225 158 55 21 189 63 14 233 211 32 249 204 188 227 125 20 0 0 0 0 128 177 60 161 102 138 146 247 69 176 188 18 92 242 96 135 152 103 107 37 160 86 206 146 191 253 129 245 98 150 12 55 16 198 207 141 173 254 8 189 100 126 62 201 64 132 146 143 251 54 46 248 170 236 238 107 85 4 232 188 238 154 172 221 156 205 139 30 154 186 201 53 77 80 85 0 164 126 169 125 95 209 214 94 114 253 109 143 69 147 26 150 229 49 67 202 41 185 188 58 222 135 170 143 147 169 56 199 253 208 108 79 241 186 223 39 47 118 166 2 119 183 150 198 249 52 6 0 0 1 128 177 60 161 102 138 146 247 69 176 188 18 92 242 96 135 152 103 107 37 160 86 206 146 191 253 129 245 98 150 12 55 16 198 207 141 173 254 8 189 100 126 62 201 64 132 146 143 251 54 46 248 170 236 238 107 85 4 232 188 238 154 172 221 156 205 139 30 154 186 201 53 77 80 85 0 164 126 169 125 95 209 214 94 114 253 109 143 69 147 26 150 229 49 67 202 41 185 188 58 222 135 170 143 147 169 56 199 253 208 108 79 241 186 223 39 47 118 166 2 119 183 150 198 249 52 6 0 0 0 48 121 50 208 121 198 113 59 191 8 122 194 42 131 235 44 67 197 194 251 149 183 60 30 84 243 193 92 233 207 81 221 84 214 60 215 107 83 0 178 5 171 252 181 246 155 13 0 0 1 48 121 50 208 121 198 113 59 191 8 122 194 42 131 235 44 67 197 194 251 149 183 60 30 84 243 193 92 233 207 81 221 84 214 60 215 107 83 0 178 5 171 252 181 246 155 13 0 0 0 56 166 53 117 196 161 229 248 189 4 118 22 159 55 250 249 52 240 65 18 192 100 153 107 30 88 36 106 130 0 220 222 225 150 0 193 132 255 124 153 51 146 110 36 253 172 218 35 80 8 122 3 16 206 124 33 42 1 56 166 53 117 196 161 229 248 189 4 118 22 159 55 250 249 52 240 65 18 192 100 153 107 30 88 36 106 130 0 220 222 225 150 0 193 132 255 124 153 51 146 110 36 253 172 218 35 80 8 122 3 16 206 124 33 42 0 88 106 68 182 59 178 196 127 243 157 52 191 25 43 145 111 238 141 79 101 131 239 1 63 142 28 0 132 32 245 126 60 32 214 17 147 90 227 5 98 15 248 217 212 142 124 197 131 140 236 233 147 37 78 121 156 176 23 194 249 199 210 9 238 29 123 193 74 93 96 82 46 195 174 189 189 138 161 169 130 51 227 225 203 252 54 230 59 1 1 88 106 68 182 59 178 196 127 243 157 52 191 25 43 145 111 238 141 79 101 131 239 1 63 142 28 0 132 32 245 126 60 32 214 17 147 90 227 5 98 15 248 217 212 142 124 197 131 140 236 233 147 37 78 121 156 176 23 194 249 199 210 9 238 29 123 193 74 93 96 82 46 195 174 189 189 138 161 169 130 51 227 225 203 252 54 230 59 1 0 16 91 51 80 52 153 106 15 96 178 33 98 180 208 107 15 0 1 16 91 51 80 52 153 106 15 96 178 33 98 180 208 107 15 0 0 92 146 234 254 250 136 181 23 108 220 189 235 39 183 250 50 211 23 108 166 159 135 169 94 214 225 32 1 13 78 240 181 132 87 93 98 20 18 115 26 247 31 145 41 94 224 210 84 160 74 211 209 64 225 64 180 241 208 245 103 182 102 43 178 61 140 91 159 243 48 233 2 13 121 164 43 215 31 105 2 197 114 135 82 116 240 53 2 223 62 194 1 0 1 92 146 234 254 250 136 181 23 108 220 189 235 39 183 250 50 211 23 108 166 159 135 169 94 214 225 32 1 13 78 240 181 132 87 93 98 20 18 115 26 247 31 145 41 94 224 210 84 160 74 211 209 64 225 64 180 241 208 245 103 182 102 43 178 61 140 91 159 243 48 233 2 13 121 164 43 215 31 105 2 197 114 135 82 116 240 53 2 223 62 194 1 0 0 36 185 152 217 29 34 198 116 253 71 146 190 251 229 82 88 248 120 47 21 213 170 170 112 236 72 88 154 181 235 239 69 222 48 2 0 0 1 36 185 152 217 29 34 198 116 253 71 146 190 251 229 82 88 248 120 47 21 213 170 170 112 236 72 88 154 181 235 239 69 222 48 2 0 0 0 24 29 136 104 174 70 11 214 125 207 165 237 74 237 199 33 28 122 6 213 243 25 0 0 0 1 24 29 136 104 174 70 11 214 125 207 165 237 74 237 199 33 28 122 6 213 243 25 0 0 0 0 56 208 160 113 38 148 89 13 191 95 94 203 140 7 30 57 94 69 180 223 237 240 172 171 247 162 165 245 245 5 100 24 96 24 245 62 100 128 18 89 116 205 89 200 251 14 195 113 223 134 107 202 24 7 0 0 0 1 56 208 160 113 38 148 89 13 191 95 94 203 140 7 30 57 94 69 180 223 237 240 172 171 247 162 165 245 245 5 100 24 96 24 245 62 100 128 18 89 116 205 89 200 251 14 195 113 223 134 107 202 24 7 0 0 0 0 20 164 26 119 125 80 143 88 12 173 143 157 18 207 147 18 133 102 5 0 0 1 20 164 26 119 125 80 143 88 12 173 143 157 18 207 147 18 133 102 5 0 0 0 80 240 91 93 80 200 2 55 132 40 130 206 143 31 138 22 6 196 227 42 127 4 69 60 97 99 42 199 161 115 16 243 173 96 104 227 89 184 61 55 91 197 16 30 116 69 157 9 62 186 27 47 108 196 231 54 53 86 238 78 204 233 137 113 247 34 18 212 144 7 152 39 169 110 99 156 198 1 0 0 0 1 80 240 91 93 80 200 2 55 132 40 130 206 143 31 138 22 6 196 227 42 127 4 69 60 97 99 42 199 161 115 16 243 173 96 104 227 89 184 61 55 91 197 16 30 116 69 157 9 62 186 27 47 108 196 231 54 53 86 238 78 204 233 137 113 247 34 18 212 144 7 152 39 169 110 99 156 198 1 0 0 0 0 60 164 36 243 234 38 238 24 36 226 207 250 29 63 195 44 89 189 228 110 154 71 14 125 43 159 59 53 176 232 184 148 203 158 152 210 156 44 195 201 57 165 81 190 91 35 122 171 243 195 109 195 142 67 89 184 14 18 25 0 0 1 60 164 36 243 234 38 238 24 36 226 207 250 29 63 195 44 89 189 228 110 154 71 14 125 43 159 59 53 176 232 184 148 203 158 152 210 156 44 195 201 57 165 81 190 91 35 122 171 243 195 109 195 142 67 89 184 14 18 25 0 0 0 36 168 114 107 133 10 23 139 104 205 120 166 131 193 1 223 63 29 201 98 120 19 62 117 38 159 115 66 105 171 210 74 142 248 0 0 0 1 36 168 114 107 133 10 23 139 104 205 120 166 131 193 1 223 63 29 201 98 120 19 62 117 38 159 115 66 105 171 210 74 142 248 0 0 0 0 8 188 118 208 125 103 29 0 0 1 8 188 118 208 125 103 29 0 0 0 80 93 36 106 167 48 129 182 121 19 12 119 143 58 46 98 169 218 191 211 74 102 51 142 112 70 65 240 134 104 65 202 183 210 160 25 144 232 17 193 129 249 86 192 216 157 46 31 9 89 42 0 255 32 223 228 36 241 177 228 240 221 30 38 173 183 42 128 15 55 48 187 131 109 78 5 178 203 7 0 0 1 80 93 36 106 167 48 129 182 121 19 12 119 143 58 46 98 169 218 191 211 74 102 51 142 112 70 65 240 134 104 65 202 183 210 160 25 144 232 17 193 129 249 86 192 216 157 46 31 9 89 42 0 255 32 223 228 36 241 177 228 240 221 30 38 173 183 42 128 15 55 48 187 131 109 78 5 178 203 7 0 0 0 104 209 253 145 149 140 101 72 59 80 61 95 87 223 103 111 142 120 156 200 160 119 178 162 183 243 3 59 250 14 151 250 48 55 97 183 44 47 166 154 9 238 68 13 148 84 67 106 86 157 132 235 187 35 17 121 154 165 226 136 96 27 177 250 145 13 38 0 109 173 58 16 189 45 0 156 64 166 8 87 150 211 191 66 117 148 187 227 116 144 40 22 160 105 172 245 89 17 98 157 251 122 154 0 0 1 104 209 253 145 149 140 101 72 59 80 61 95 87 223 103 111 142 120 156 200 160 119 178 162 183 243 3 59 250 14 151 250 48 55 97 183 44 47 166 154 9 238 68 13 148 84 67 106 86 157 132 235 187 35 17 121 154 165 226 136 96 27 177 250 145 13 38 0 109 173 58 16 189 45 0 156 64 166 8 87 150 211 191 66 117 148 187 227 116 144 40 22 160 105 172 245 89 17 98 157 251 122 154 0 0 0 92 48 216 197 206 211 163 26 178 30 38 25 126 254 218 154 197 147 60 114 177 112 98 153 149 94 247 85 223 187 252 210 64 20 63 98 66 201 175 4 146 53 51 161 164 120 186 172 160 189 77 68 186 110 221 45 4 254 96 67 66 66 64 145 122 236 241 192 130 240 110 229 191 58 172 70 147 64 128 67 77 37 143 90 168 105 183 130 40 128 162 204 0 1 92 48 216 197 206 211 163 26 178 30 38 25 126 254 218 154 197 147 60 114 177 112 98 153 149 94 247 85 223 187 252 210 64 20 63 98 66 201 175 4 146 53 51 161 164 120 186 172 160 189 77 68 186 110 221 45 4 254 96 67 66 66 64 145 122 236 241 192 130 240 110 229 191 58 172 70 147 64 128 67 77 37 143 90 168 105 183 130 40 128 162 204 0 0 24 176 183 71 106 140 200 146 60 201 141 49 175 206 219 24 51 141 203 213 202 124 18 0 0 1 24 176 183 71 106 140 200 146 60 201 141 49 175 206 219 24 51 141 203 213 202 124 18 0 0 0 32 97 221 208 156 227 180 222 58 51 5 156 2 70 25 102 197 16 16 222 115 157 90 121 207 16 211 217 208 2 0 0 0 1 32 97 221 208 156 227 180 222 58 51 5 156 2 70 25 102 197 16 16 222 115 157 90 121 207 16 211 217 208 2 0 0 0 0 108 178 156 236 219 98 243 32 106 184 211 76 115 58 138 184 11 243 158 111 214 180 249 75 209 228 102 1 198 201 169 202 134 82 247 29 60 251 130 101 5 79 254 236 4 3 154 24 213 80 110 237 105 114 57 175 148 37 189 215 96 26 164 159 215 189 91 213 117 182 250 78 196 91 184 197 122 91 11 110 49 145 65 35 242 27 150 116 151 97 138 84 129 122 101 163 101 143 206 236 240 17 99 91 63 34 187 4 0 1 108 178 156 236 219 98 243 32 106 184 211 76 115 58 138 184 11 243 158 111 214 180 249 75 209 228 102 1 198 201 169 202 134 82 247 29 60 251 130 101 5 79 254 236 4 3 154 24 213 80 110 237 105 114 57 175 148 37 189 215 96 26 164 159 215 189 91 213 117 182 250 78 196 91 184 197 122 91 11 110 49 145 65 35 242 27 150 116 151 97 138 84 129 122 101 163 101 143 206 236 240 17 99 91 63 34 187 4 0 0 16 191 50 248 33 176 205 97 154 211 182 118 170 186 32 76 1 1 16 191 50 248 33 176 205 97 154 211 182 118 170 186 32 76 1 0 44 234 193 100 178 9 208 13 92 237 227 179 241 244 131 30 214 22 128 221 109 129 32 221 92 143 17 196 16 142 53 151 122 200 63 163 198 197 112 127 42 47 2 0 0 1 44 234 193 100 178 9 208 13 92 237 227 179 241 244 131 30 214 22 128 221 109 129 32 221 92 143 17 196 16 142 53 151 122 200 63 163 198 197 112 127 42 47 2 0 0 0 40 165 3 177 221 137 96 40 2 95 239 12 147 159 69 92 8 226 226 89 13 220 87 111 111 4 46 185 191 135 108 64 28 98 137 121 69 157 147 3 0 1 40 165 3 177 221 137 96 40 2 95 239 12 147 159 69 92 8 226 226 89 13 220 87 111 111 4 46 185 191 135 108 64 28 98 137 121 69 157 147 3 0 0 88 117 70 136 141 37 22 10 38 199 136 67 121 78 100 165 189 58 199 68 147 53 35 88 254 145 48 3 64 111 49 252 79 215 24 85 125 88 7 197 53 75 129 196 177 222 97 246 145 156 189 140 144 166 41 155 175 68 115 133 179 126 64 86 56 38 73 200 37 103 6 154 47 83 59 156 31 165 8 192 161 64 77 224 85 1 0 0 0 1 88 117 70 136 141 37 22 10 38 199 136 67 121 78 100 165 189 58 199 68 147 53 35 88 254 145 48 3 64 111 49 252 79 215 24 85 125 88 7 197 53 75 129 196 177 222 97 246 145 156 189 140 144 166 41 155 175 68 115 133 179 126 64 86 56 38 73 200 37 103 6 154 47 83 59 156 31 165 8 192 161 64 77 224 85 1 0 0 0 0 44 217 185 213 61 101 246 30 87 9 40 115 28 155 141 207 255 17 194 181 7 208 69 15 189 18 161 29 215 47 247 4 172 133 64 239 27 206 90 55 197 113 0 0 0 1 44 217 185 213 61 101 246 30 87 9 40 115 28 155 141 207 255 17 194 181 7 208 69 15 189 18 161 29 215 47 247 4 172 133 64 239 27 206 90 55 197 113 0 0 0 0 56 148 182 61 42 123 22 99 146 228 21 87 117 190 75 48 0 97 189 188 28 85 193 232 154 144 129 19 107 255 92 192 179 73 21 211 208 243 243 72 10 53 231 255 190 241 19 69 17 2 153 53 8 39 246 0 0 1 56 148 182 61 42 123 22 99 146 228 21 87 117 190 75 48 0 97 189 188 28 85 193 232 154 144 129 19 107 255 92 192 179 73 21 211 208 243 243 72 10 53 231 255 190 241 19 69 17 2 153 53 8 39 246 0 0 0 56 211 66 149 196 5 244 108 154 21 75 148 133 24 12 252 29 159 127 240 191 48 35 202 86 177 34 52 193 54 229 170 58 106 119 182 50 240 221 151 21 237 110 249 225 73 237 49 54 255 10 114 182 126 107 8 0 1 56 211 66 149 196 5 244 108 154 21 75 148 133 24 12 252 29 159 127 240 191 48 35 202 86 177 34 52 193 54 229 170 58 106 119 182 50 240 221 151 21 237 110 249 225 73 237 49 54 255 10 114 182 126 107 8 0 0 104 225 214 120 250 248 166 189 72 25 10 51 38 36 179 73 86 127 210 96 225 42 108 183 54 154 102 128 235 61 79 169 19 33 27 197 27 140 126 108 68 180 57 222 96 50 135 137 200 40 109 22 3 187 139 78 175 226 173 222 38 56 155 201 55 29 54 110 130 125 243 53 89 135 235 66 91 26 131 150 14 181 180 220 56 68 157 222 65 169 237 15 194 167 35 49 59 236 93 240 247 1 0 0 0 1 104 225 214 120 250 248 166 189 72 25 10 51 38 36 179 73 86 127 210 96 225 42 108 183 54 154 102 128 235 61 79 169 19 33 27 197 27 140 126 108 68 180 57 222 96 50 135 137 200 40 109 22 3 187 139 78 175 226 173 222 38 56 155 201 55 29 54 110 130 125 243 53 89 135 235 66 91 26 131 150 14 181 180 220 56 68 157 222 65 169 237 15 194 167 35 49 59 236 93 240 247 1 0 0 0 0 68 250 13 100 76 198 39 97 190 132 34 30 132 205 55 142 174 37 28 5 136 138 69 4 127 203 225 200 100 221 206 243 94 81 111 236 255 188 143 231 143 35 187 81 173 188 250 232 196 70 175 70 188 195 241 113 46 158 102 170 214 243 177 164 189 186 2 0 0 1 68 250 13 100 76 198 39 97 190 132 34 30 132 205 55 142 174 37 28 5 136 138 69 4 127 203 225 200 100 221 206 243 94 81 111 236 255 188 143 231 143 35 187 81 173 188 250 232 196 70 175 70 188 195 241 113 46 158 102 170 214 243 177 164 189 186 2 0 0 0 16 252 62 17 105 107 27 138 254 209 166 253 232 14 173 53 0 1 16 252 62 17 105 107 27 138 254 209 166 253 232 14 173 53 0 0 12 248 20 114 16 45 167 199 205 247 93 60 1 1 12 248 20 114 16 45 167 199 205 247 93 60 1 0 128 68 85 139 65 128 103 40 178 143 96 39 160 16 180 192 162 49 134 53 77 80 87 249 241 72 43 118 116 184 230 72 29 217 203 233 243 99 73 223 120 79 37 252 19 42 245 193 177 160 241 111 129 21 196 151 106 142 158 95 161 24 140 154 174 72 129 49 87 117 19 229 253 93 146 82 164 63 11 89 51 145 182 224 167 87 85 133 130 24 56 22 86 126 37 63 50 11 25 59 22 7 198 60 94 176 166 72 203 118 45 191 236 253 8 4 237 208 247 95 191 61 131 45 100 233 41 140 1 1 128 68 85 139 65 128 103 40 178 143 96 39 160 16 180 192 162 49 134 53 77 80 87 249 241 72 43 118 116 184 230 72 29 217 203 233 243 99 73 223 120 79 37 252 19 42 245 193 177 160 241 111 129 21 196 151 106 142 158 95 161 24 140 154 174 72 129 49 87 117 19 229 253 93 146 82 164 63 11 89 51 145 182 224 167 87 85 133 130 24 56 22 86 126 37 63 50 11 25 59 22 7 198 60 94 176 166 72 203 118 45 191 236 253 8 4 237 208 247 95 191 61 131 45 100 233 41 140 1 0 36 171 175 7 24 85 197 52 53 222 109 116 70 7 33 47 129 85 73 230 121 23 188 153 132 54 221 247 177 60 250 118 199 113 48 0 0 1 36 171 175 7 24 85 197 52 53 222 109 116 70 7 33 47 129 85 73 230 121 23 188 153 132 54 221 247 177 60 250 118 199 113 48 0 0 0 24 93 217 212 50 244 177 120 129 193 148 208 62 51 48 197 29 12 127 5 133 232 174 163 14 1 24 93 217 212 50 244 177 120 129 193 148 208 62 51 48 197 29 12 127 5 133 232 174 163 14 0 104 61 140 155 145 23 121 180 150 193 253 181 78 221 177 28 155 147 231 109 135 40 213 10 176 7 92 102 36 228 91 74 59 128 90 66 174 228 143 117 219 65 92 198 227 147 31 210 199 101 130 185 96 20 234 102 37 117 134 38 231 28 208 231 74 69 32 133 140 236 129 186 142 89 0 72 223 168 63 132 85 4 58 183 202 56 212 86 111 8 7 182 11 108 42 143 34 30 250 94 6 24 226 5 0 1 104 61 140 155 145 23 121 180 150 193 253 181 78 221 177 28 155 147 231 109 135 40 213 10 176 7 92 102 36 228 91 74 59 128 90 66 174 228 143 117 219 65 92 198 227 147 31 210 199 101 130 185 96 20 234 102 37 117 134 38 231 28 208 231 74 69 32 133 140 236 129 186 142 89 0 72 223 168 63 132 85 4 58 183 202 56 212 86 111 8 7 182 11 108 42 143 34 30 250 94 6 24 226 5 0 0 100 69 203 211 226 232 194 190 174 38 42 219 202 126 170 213 67 251 214 240 5 57 56 204 220 229 22 83 177 58 244 203 158 220 19 118 48 28 104 202 235 222 18 48 27 53 30 213 133 250 43 151 110 53 51 81 104 66 224 80 32 48 197 127 8 196 143 211 86 42 231 40 1 196 225 20 87 198 99 207 33 242 133 186 174 87 131 82 161 85 98 41 79 235 6 54 208 79 63 0 0 1 100 69 203 211 226 232 194 190 174 38 42 219 202 126 170 213 67 251 214 240 5 57 56 204 220 229 22 83 177 58 244 203 158 220 19 118 48 28 104 202 235 222 18 48 27 53 30 213 133 250 43 151 110 53 51 81 104 66 224 80 32 48 197 127 8 196 143 211 86 42 231 40 1 196 225 20 87 198 99 207 33 242 133 186 174 87 131 82 161 85 98 41 79 235 6 54 208 79 63 0 0 0 4 106 133 253 254 1 4 106 133 253 254 0 36 52 160 46 168 248 117 14 87 213 169 244 54 52 54 90 204 139 227 70 129 237 255 102 107 43 17 92 104 188 166 27 224 59 206 1 0 1 36 52 160 46 168 248 117 14 87 213 169 244 54 52 54 90 204 139 227 70 129 237 255 102 107 43 17 92 104 188 166 27 224 59 206 1 0 0 120 181 140 78 163 1 144 166 35 223 120 26 62 194 182 189 188 203 150 222 242 105 153 199 190 59 209 251 150 143 51 233 52 50 171 137 94 76 60 155 162 163 194 72 102 39 206 211 44 149 8 71 7 3 14 238 150 49 199 209 147 173 71 223 95 145 84 45 137 227 252 43 100 85 213 9 217 99 70 100 168 88 110 229 244 46 8 112 7 141 228 169 214 105 143 254 11 226 135 101 6 67 255 70 224 194 81 96 193 178 170 189 80 169 153 245 174 120 167 5 0 1 120 181 140 78 163 1 144 166 35 223 120 26 62 194 182 189 188 203 150 222 242 105 153 199 190 59 209 251 150 143 51 233 52 50 171 137 94 76 60 155 162 163 194 72 102 39 206 211 44 149 8 71 7 3 14 238 150 49 199 209 147 173 71 223 95 145 84 45 137 227 252 43 100 85 213 9 217 99 70 100 168 88 110 229 244 46 8 112 7 141 228 169 214 105 143 254 11 226 135 101 6 67 255 70 224 194 81 96 193 178 170 189 80 169 153 245 174 120 167 5 0 0 32 19 169 230 106 158 164 68 252 228 52 75 229 81 25 134 88 61 171 29 148 225 103 206 90 122 156 116 158 229 80 62 7 1 32 19 169 230 106 158 164 68 252 228 52 75 229 81 25 134 88 61 171 29 148 225 103 206 90 122 156 116 158 229 80 62 7 0 96 44 24 45 150 1 57 124 51 120 88 192 53 82 3 14 197 181 78 62 96 149 139 236 70 23 91 206 58 4 12 63 75 51 192 197 2 242 185 178 73 152 109 161 60 142 161 171 63 201 195 243 198 2 124 119 14 189 184 21 26 90 196 117 3 207 78 196 78 191 210 218 232 185 4 72 102 10 124 94 142 17 14 238 243 191 213 250 160 226 11 56 213 156 15 0 0 1 96 44 24 45 150 1 57 124 51 120 88 192 53 82 3 14 197 181 78 62 96 149 139 236 70 23 91 206 58 4 12 63 75 51 192 197 2 242 185 178 73 152 109 161 60 142 161 171 63 201 195 243 198 2 124 119 14 189 184 21 26 90 196 117 3 207 78 196 78 191 210 218 232 185 4 72 102 10 124 94 142 17 14 238 243 191 213 250 160 226 11 56 213 156 15 0 0 0 16 5 128 98 100 111 201 242 99 239 114 208 3 48 1 0 0 1 16 5 128 98 100 111 201 242 99 239 114 208 3 48 1 0 0 0 64 55 164 28 11 235 113 86 122 52 237 225 241 179 197 83 95 114 107 69 13 182 58 173 152 229 230 108 171 135 2 108 102 81 246 165 202 47 238 229 240 109 119 151 6 36 92 18 67 160 204 138 149 79 36 130 164 116 48 77 57 61 42 21 0 1 64 55 164 28 11 235 113 86 122 52 237 225 241 179 197 83 95 114 107 69 13 182 58 173 152 229 230 108 171 135 2 108 102 81 246 165 202 47 238 229 240 109 119 151 6 36 92 18 67 160 204 138 149 79 36 130 164 116 48 77 57 61 42 21 0 0 48 94 61 43 8 236 81 175 216 38 46 240 164 24 125 150 38 110 153 168 221 238 46 195 146 161 141 191 230 139 251 175 57 243 39 106 55 170 158 83 212 72 98 28 253 2 0 0 0 1 48 94 61 43 8 236 81 175 216 38 46 240 164 24 125 150 38 110 153 168 221 238 46 195 146 161 141 191 230 139 251 175 57 243 39 106 55 170 158 83 212 72 98 28 253 2 0 0 0 0 76 48 94 140 165 180 105 31 16 145 182 147 88 246 146 184 137 158 100 218 254 225 130 175 24 164 19 172 15 135 152 163 48 137 131 182 181 101 168 51 195 131 251 4 29 231 230 96 29 58 177 144 95 60 187 109 242 143 92 252 239 108 72 4 59 210 46 232 34 139 28 238 105 211 76 0 0 1 76 48 94 140 165 180 105 31 16 145 182 147 88 246 146 184 137 158 100 218 254 225 130 175 24 164 19 172 15 135 152 163 48 137 131 182 181 101 168 51 195 131 251 4 29 231 230 96 29 58 177 144 95 60 187 109 242 143 92 252 239 108 72 4 59 210 46 232 34 139 28 238 105 211 76 0 0 0 40 234 82 61 126 225 47 95 67 86 217 19 160 166 207 107 2 63 101 138 71 14 205 171 155 149 191 239 138 12 202 149 100 120 202 78 69 3 0 0 0 1 40 234 82 61 126 225 47 95 67 86 217 19 160 166 207 107 2 63 101 138 71 14 205 171 155 149 191 239 138 12 202 149 100 120 202 78 69 3 0 0 0 0 32 254 34 44 189 14 4 206 100 120 172 67 182 70 62 43 236 232 71 120 86 45 165 252 19 123 77 145 98 252 22 8 0 1 32 254 34 44 189 14 4 206 100 120 172 67 182 70 62 43 236 232 71 120 86 45 165 252 19 123 77 145 98 252 22 8 0 0 124 133 133 183 97 16 40 176 80 73 78 7 25 246 204 110 33 191 19 111 253 42 125 217 152 191 133 9 231 196 126 215 115 228 86 114 230 179 150 254 155 22 188 36 125 187 206 19 227 235 11 176 130 143 111 209 43 29 89 113 147 102 119 48 191 43 79 47 89 120 0 227 25 169 53 18 37 83 52 60 241 101 240 255 139 61 119 189 13 92 89 30 29 252 1 22 209 105 170 119 94 158 16 175 58 110 238 74 117 112 41 56 246 67 154 141 63 25 112 206 160 3 84 134 50 1 124 133 133 183 97 16 40 176 80 73 78 7 25 246 204 110 33 191 19 111 253 42 125 217 152 191 133 9 231 196 126 215 115 228 86 114 230 179 150 254 155 22 188 36 125 187 206 19 227 235 11 176 130 143 111 209 43 29 89 113 147 102 119 48 191 43 79 47 89 120 0 227 25 169 53 18 37 83 52 60 241 101 240 255 139 61 119 189 13 92 89 30 29 252 1 22 209 105 170 119 94 158 16 175 58 110 238 74 117 112 41 56 246 67 154 141 63 25 112 206 160 3 84 134 50 0 60 242 208 163 166 217 157 45 88 172 11 229 109 23 46 229 250 139 217 234 229 172 253 211 253 11 8 225 163 20 87 100 148 249 249 188 166 122 64 131 225 233 55 241 36 232 11 174 172 83 153 87 165 3 39 84 162 67 204 110 0 1 60 242 208 163 166 217 157 45 88 172 11 229 109 23 46 229 250 139 217 234 229 172 253 211 253 11 8 225 163 20 87 100 148 249 249 188 166 122 64 131 225 233 55 241 36 232 11 174 172 83 153 87 165 3 39 84 162 67 204 110 0 0 28 62 99 60 181 249 169 105 74 220 130 197 142 213 226 245 78 96 45 105 171 176 157 17 155 32 93 59 15 1 28 62 99 60 181 249 169 105 74 220 130 197 142 213 226 245 78 96 45 105 171 176 157 17 155 32 93 59 15 diff --git a/src/boost/libs/multiprecision/test/serial_txts/cpp_int1024_serial64.txt b/src/boost/libs/multiprecision/test/serial_txts/cpp_int1024_serial64.txt new file mode 100644 index 00000000..f41286bc --- /dev/null +++ b/src/boost/libs/multiprecision/test/serial_txts/cpp_int1024_serial64.txt @@ -0,0 +1 @@ +22 serialization::archive 10 0 0 0 0 0 112 240 216 207 212 25 178 183 244 196 236 95 147 174 198 156 135 30 192 249 71 150 58 81 90 83 157 31 192 97 218 61 242 6 92 59 181 100 93 130 250 188 246 144 44 168 35 244 193 47 12 158 190 153 204 174 128 206 100 236 32 18 126 89 123 194 22 35 211 231 76 148 27 235 109 5 183 33 227 88 207 58 215 251 252 155 139 128 94 102 109 67 113 84 50 31 117 129 72 215 77 164 152 225 243 6 0 0 0 0 0 0 0 1 112 240 216 207 212 25 178 183 244 196 236 95 147 174 198 156 135 30 192 249 71 150 58 81 90 83 157 31 192 97 218 61 242 6 92 59 181 100 93 130 250 188 246 144 44 168 35 244 193 47 12 158 190 153 204 174 128 206 100 236 32 18 126 89 123 194 22 35 211 231 76 148 27 235 109 5 183 33 227 88 207 58 215 251 252 155 139 128 94 102 109 67 113 84 50 31 117 129 72 215 77 164 152 225 243 6 0 0 0 0 0 0 0 0 24 233 110 98 40 22 77 153 193 59 146 80 175 250 132 156 155 86 10 0 0 0 0 0 0 1 24 233 110 98 40 22 77 153 193 59 146 80 175 250 132 156 155 86 10 0 0 0 0 0 0 0 120 195 197 234 211 167 46 136 167 128 33 88 13 108 237 91 62 12 92 69 154 204 29 67 225 108 76 250 33 86 106 195 35 211 56 231 162 75 128 234 92 136 184 82 7 210 243 108 153 53 77 201 114 146 101 203 238 16 127 62 157 89 147 7 159 33 49 73 121 45 71 184 101 48 57 231 136 53 32 117 91 72 53 49 149 132 120 220 38 202 141 199 61 152 225 162 88 241 96 97 235 194 95 106 102 77 171 141 79 25 171 118 0 150 152 162 225 0 0 0 0 1 120 195 197 234 211 167 46 136 167 128 33 88 13 108 237 91 62 12 92 69 154 204 29 67 225 108 76 250 33 86 106 195 35 211 56 231 162 75 128 234 92 136 184 82 7 210 243 108 153 53 77 201 114 146 101 203 238 16 127 62 157 89 147 7 159 33 49 73 121 45 71 184 101 48 57 231 136 53 32 117 91 72 53 49 149 132 120 220 38 202 141 199 61 152 225 162 88 241 96 97 235 194 95 106 102 77 171 141 79 25 171 118 0 150 152 162 225 0 0 0 0 0 112 52 251 142 48 154 38 230 245 135 197 116 187 16 93 121 73 166 67 73 14 108 247 153 173 155 1 1 27 39 117 50 208 104 14 143 42 205 185 79 111 156 236 127 179 134 12 211 3 186 248 224 18 111 115 8 241 120 193 95 162 144 223 81 125 100 15 75 159 151 135 167 7 105 70 42 112 187 150 50 81 238 10 88 7 185 247 8 238 5 251 173 132 245 18 238 209 93 5 153 183 17 250 77 56 125 31 2 0 0 0 0 0 1 112 52 251 142 48 154 38 230 245 135 197 116 187 16 93 121 73 166 67 73 14 108 247 153 173 155 1 1 27 39 117 50 208 104 14 143 42 205 185 79 111 156 236 127 179 134 12 211 3 186 248 224 18 111 115 8 241 120 193 95 162 144 223 81 125 100 15 75 159 151 135 167 7 105 70 42 112 187 150 50 81 238 10 88 7 185 247 8 238 5 251 173 132 245 18 238 209 93 5 153 183 17 250 77 56 125 31 2 0 0 0 0 0 0 24 197 207 215 162 39 250 228 2 55 205 156 2 210 250 185 127 9 0 0 0 0 0 0 0 1 24 197 207 215 162 39 250 228 2 55 205 156 2 210 250 185 127 9 0 0 0 0 0 0 0 0 128 24 227 82 233 197 174 88 134 19 71 12 155 49 99 207 184 189 139 213 148 142 65 83 22 86 59 113 20 118 242 15 207 165 34 25 223 113 59 30 140 39 47 19 17 91 233 70 193 187 55 81 125 94 114 235 6 80 26 251 206 129 223 96 50 3 188 107 248 74 130 151 7 40 68 162 241 8 76 185 168 192 189 109 17 104 12 100 42 186 31 15 28 113 72 249 213 10 120 161 189 54 95 145 140 93 52 223 83 153 80 25 250 68 102 71 63 122 51 3 222 201 139 253 189 0 0 0 0 1 128 24 227 82 233 197 174 88 134 19 71 12 155 49 99 207 184 189 139 213 148 142 65 83 22 86 59 113 20 118 242 15 207 165 34 25 223 113 59 30 140 39 47 19 17 91 233 70 193 187 55 81 125 94 114 235 6 80 26 251 206 129 223 96 50 3 188 107 248 74 130 151 7 40 68 162 241 8 76 185 168 192 189 109 17 104 12 100 42 186 31 15 28 113 72 249 213 10 120 161 189 54 95 145 140 93 52 223 83 153 80 25 250 68 102 71 63 122 51 3 222 201 139 253 189 0 0 0 0 0 120 84 215 85 155 83 224 217 17 152 203 112 82 122 193 196 197 212 174 168 135 168 249 185 103 45 35 64 229 91 250 210 186 58 210 182 98 118 15 126 35 18 69 254 92 98 253 202 81 186 80 212 23 15 9 32 39 1 22 16 116 63 86 191 203 58 113 189 250 81 8 87 78 224 55 184 247 69 246 57 99 3 71 4 32 58 206 214 203 112 60 52 83 234 29 3 197 37 251 251 84 166 130 63 190 142 0 143 110 160 134 104 117 192 171 252 58 243 0 0 0 1 120 84 215 85 155 83 224 217 17 152 203 112 82 122 193 196 197 212 174 168 135 168 249 185 103 45 35 64 229 91 250 210 186 58 210 182 98 118 15 126 35 18 69 254 92 98 253 202 81 186 80 212 23 15 9 32 39 1 22 16 116 63 86 191 203 58 113 189 250 81 8 87 78 224 55 184 247 69 246 57 99 3 71 4 32 58 206 214 203 112 60 52 83 234 29 3 197 37 251 251 84 166 130 63 190 142 0 143 110 160 134 104 117 192 171 252 58 243 0 0 0 0 32 75 106 211 223 67 33 39 159 137 42 62 13 132 4 148 172 13 129 231 52 23 5 189 177 132 71 127 112 12 0 0 0 1 32 75 106 211 223 67 33 39 159 137 42 62 13 132 4 148 172 13 129 231 52 23 5 189 177 132 71 127 112 12 0 0 0 0 88 71 66 188 102 218 45 89 79 100 203 161 190 29 126 44 173 44 86 244 243 53 45 157 176 5 233 73 112 206 44 106 109 159 71 109 87 77 104 184 44 147 80 22 206 180 74 221 169 143 209 179 215 195 26 222 89 28 178 48 206 169 22 229 44 34 14 33 215 159 185 161 56 150 95 20 128 199 66 223 66 113 0 0 0 0 0 0 0 1 88 71 66 188 102 218 45 89 79 100 203 161 190 29 126 44 173 44 86 244 243 53 45 157 176 5 233 73 112 206 44 106 109 159 71 109 87 77 104 184 44 147 80 22 206 180 74 221 169 143 209 179 215 195 26 222 89 28 178 48 206 169 22 229 44 34 14 33 215 159 185 161 56 150 95 20 128 199 66 223 66 113 0 0 0 0 0 0 0 0 40 74 104 149 210 252 235 123 239 168 56 124 239 105 91 87 48 183 253 146 69 244 5 94 42 167 100 207 53 34 116 207 197 97 199 198 121 102 204 246 31 1 40 74 104 149 210 252 235 123 239 168 56 124 239 105 91 87 48 183 253 146 69 244 5 94 42 167 100 207 53 34 116 207 197 97 199 198 121 102 204 246 31 0 16 127 135 241 163 116 139 210 196 195 216 24 255 21 0 0 0 1 16 127 135 241 163 116 139 210 196 195 216 24 255 21 0 0 0 0 72 150 29 179 100 132 144 156 216 95 57 162 101 198 179 215 51 244 149 122 162 171 105 83 53 56 158 83 10 80 190 228 125 131 48 41 93 2 177 156 179 17 217 253 155 46 30 105 35 223 134 100 76 170 35 206 233 252 210 117 27 160 154 210 45 234 95 74 76 159 147 2 0 1 72 150 29 179 100 132 144 156 216 95 57 162 101 198 179 215 51 244 149 122 162 171 105 83 53 56 158 83 10 80 190 228 125 131 48 41 93 2 177 156 179 17 217 253 155 46 30 105 35 223 134 100 76 170 35 206 233 252 210 117 27 160 154 210 45 234 95 74 76 159 147 2 0 0 40 220 123 216 188 130 233 64 162 111 163 35 146 32 32 192 228 163 205 248 224 147 90 97 37 29 2 241 105 156 63 40 242 105 209 126 40 0 0 0 0 1 40 220 123 216 188 130 233 64 162 111 163 35 146 32 32 192 228 163 205 248 224 147 90 97 37 29 2 241 105 156 63 40 242 105 209 126 40 0 0 0 0 0 32 230 134 234 52 30 2 41 143 232 97 74 82 171 119 128 41 82 147 155 86 202 151 8 81 3 0 0 0 0 0 0 0 1 32 230 134 234 52 30 2 41 143 232 97 74 82 171 119 128 41 82 147 155 86 202 151 8 81 3 0 0 0 0 0 0 0 0 72 15 249 15 27 178 199 148 79 23 3 197 198 33 75 3 164 156 4 165 168 224 178 69 133 25 107 103 207 249 91 170 31 103 38 157 136 237 182 137 145 28 255 143 214 212 22 229 64 150 206 235 209 33 197 227 224 182 51 28 205 88 80 228 111 77 96 3 34 184 34 1 0 1 72 15 249 15 27 178 199 148 79 23 3 197 198 33 75 3 164 156 4 165 168 224 178 69 133 25 107 103 207 249 91 170 31 103 38 157 136 237 182 137 145 28 255 143 214 212 22 229 64 150 206 235 209 33 197 227 224 182 51 28 205 88 80 228 111 77 96 3 34 184 34 1 0 0 128 218 44 245 9 8 123 94 221 100 47 84 11 243 15 172 179 239 47 175 194 3 71 55 191 38 122 159 236 92 247 18 47 19 56 134 218 188 171 164 240 122 46 184 162 129 134 174 138 64 233 80 170 255 199 102 146 231 63 160 16 196 95 226 19 153 123 117 200 46 233 120 129 83 125 132 105 126 85 36 229 17 65 127 187 245 154 8 240 255 6 80 120 99 170 69 125 132 67 244 85 139 199 7 155 182 253 26 132 174 228 45 164 121 122 120 13 138 138 103 108 205 110 58 205 79 100 212 0 1 128 218 44 245 9 8 123 94 221 100 47 84 11 243 15 172 179 239 47 175 194 3 71 55 191 38 122 159 236 92 247 18 47 19 56 134 218 188 171 164 240 122 46 184 162 129 134 174 138 64 233 80 170 255 199 102 146 231 63 160 16 196 95 226 19 153 123 117 200 46 233 120 129 83 125 132 105 126 85 36 229 17 65 127 187 245 154 8 240 255 6 80 120 99 170 69 125 132 67 244 85 139 199 7 155 182 253 26 132 174 228 45 164 121 122 120 13 138 138 103 108 205 110 58 205 79 100 212 0 0 128 42 11 175 85 234 29 127 39 168 190 213 6 131 53 241 65 78 99 129 50 177 192 60 169 254 225 53 185 10 30 128 144 147 118 226 21 168 226 101 136 76 35 162 12 195 5 204 132 123 33 134 136 228 63 232 165 209 64 49 61 69 88 217 222 49 226 15 38 80 170 183 154 76 90 32 162 103 214 88 163 4 232 2 248 216 110 84 43 233 82 171 178 169 49 99 13 2 111 187 145 184 169 169 143 134 196 5 58 127 58 229 193 147 117 193 58 158 31 111 94 152 222 23 0 0 0 0 0 1 128 42 11 175 85 234 29 127 39 168 190 213 6 131 53 241 65 78 99 129 50 177 192 60 169 254 225 53 185 10 30 128 144 147 118 226 21 168 226 101 136 76 35 162 12 195 5 204 132 123 33 134 136 228 63 232 165 209 64 49 61 69 88 217 222 49 226 15 38 80 170 183 154 76 90 32 162 103 214 88 163 4 232 2 248 216 110 84 43 233 82 171 178 169 49 99 13 2 111 187 145 184 169 169 143 134 196 5 58 127 58 229 193 147 117 193 58 158 31 111 94 152 222 23 0 0 0 0 0 0 128 117 32 231 128 78 121 139 240 228 103 68 36 169 251 164 16 50 57 142 227 5 246 77 80 110 198 12 68 1 149 50 69 54 143 139 95 198 108 21 41 162 236 219 40 173 104 226 58 15 180 5 40 31 118 13 168 210 43 211 239 7 182 203 237 162 68 33 8 250 179 25 22 162 85 109 252 238 129 170 97 47 77 76 109 6 111 254 168 196 19 35 76 81 88 241 48 255 104 111 142 75 147 180 52 99 76 255 134 237 245 122 252 21 255 187 122 115 41 176 130 69 131 13 23 37 127 20 3 1 128 117 32 231 128 78 121 139 240 228 103 68 36 169 251 164 16 50 57 142 227 5 246 77 80 110 198 12 68 1 149 50 69 54 143 139 95 198 108 21 41 162 236 219 40 173 104 226 58 15 180 5 40 31 118 13 168 210 43 211 239 7 182 203 237 162 68 33 8 250 179 25 22 162 85 109 252 238 129 170 97 47 77 76 109 6 111 254 168 196 19 35 76 81 88 241 48 255 104 111 142 75 147 180 52 99 76 255 134 237 245 122 252 21 255 187 122 115 41 176 130 69 131 13 23 37 127 20 3 0 128 225 196 245 38 129 95 130 255 14 194 101 192 198 28 5 135 65 33 59 109 254 232 229 27 245 239 185 134 58 127 181 232 77 234 159 110 69 82 234 174 133 243 107 210 244 202 250 155 41 109 253 34 38 165 23 103 75 242 126 154 90 16 155 40 180 198 123 44 56 133 74 228 20 41 104 110 42 251 181 50 43 108 181 28 98 126 48 202 202 240 10 236 228 75 105 111 132 35 221 75 171 251 197 139 242 114 49 206 195 33 149 113 119 94 226 71 220 139 93 218 202 156 199 9 0 0 0 0 1 128 225 196 245 38 129 95 130 255 14 194 101 192 198 28 5 135 65 33 59 109 254 232 229 27 245 239 185 134 58 127 181 232 77 234 159 110 69 82 234 174 133 243 107 210 244 202 250 155 41 109 253 34 38 165 23 103 75 242 126 154 90 16 155 40 180 198 123 44 56 133 74 228 20 41 104 110 42 251 181 50 43 108 181 28 98 126 48 202 202 240 10 236 228 75 105 111 132 35 221 75 171 251 197 139 242 114 49 206 195 33 149 113 119 94 226 71 220 139 93 218 202 156 199 9 0 0 0 0 0 128 130 190 211 115 201 224 67 206 209 66 76 220 164 193 3 192 104 19 174 139 21 103 49 247 223 227 161 141 190 242 11 120 201 238 152 120 157 159 206 140 138 29 151 173 117 118 102 209 136 234 50 127 131 161 166 19 148 165 245 82 205 11 104 226 229 91 148 136 10 234 81 120 171 169 131 54 235 207 59 211 127 77 24 204 157 197 253 233 237 199 174 3 72 33 142 5 218 73 26 111 135 205 112 166 233 98 13 15 33 27 131 103 119 191 23 179 123 179 24 99 136 111 206 103 0 0 0 0 1 128 130 190 211 115 201 224 67 206 209 66 76 220 164 193 3 192 104 19 174 139 21 103 49 247 223 227 161 141 190 242 11 120 201 238 152 120 157 159 206 140 138 29 151 173 117 118 102 209 136 234 50 127 131 161 166 19 148 165 245 82 205 11 104 226 229 91 148 136 10 234 81 120 171 169 131 54 235 207 59 211 127 77 24 204 157 197 253 233 237 199 174 3 72 33 142 5 218 73 26 111 135 205 112 166 233 98 13 15 33 27 131 103 119 191 23 179 123 179 24 99 136 111 206 103 0 0 0 0 0 24 236 146 150 122 80 138 70 55 218 171 50 71 53 136 214 55 85 125 93 128 4 0 0 0 1 24 236 146 150 122 80 138 70 55 218 171 50 71 53 136 214 55 85 125 93 128 4 0 0 0 0 96 168 120 24 52 192 139 221 73 242 242 97 74 214 206 178 206 134 205 255 80 249 81 103 62 255 235 105 87 255 215 122 234 6 85 194 142 4 80 39 228 210 83 78 57 126 13 175 79 207 117 247 77 43 53 164 8 185 89 108 206 201 3 63 111 26 179 169 0 252 20 51 5 213 56 133 204 63 19 45 245 58 168 12 87 82 182 175 2 1 111 83 252 59 0 0 0 1 96 168 120 24 52 192 139 221 73 242 242 97 74 214 206 178 206 134 205 255 80 249 81 103 62 255 235 105 87 255 215 122 234 6 85 194 142 4 80 39 228 210 83 78 57 126 13 175 79 207 117 247 77 43 53 164 8 185 89 108 206 201 3 63 111 26 179 169 0 252 20 51 5 213 56 133 204 63 19 45 245 58 168 12 87 82 182 175 2 1 111 83 252 59 0 0 0 0 128 185 132 187 44 241 228 100 105 22 119 238 94 124 126 113 117 10 214 51 133 149 172 201 211 213 121 160 34 164 142 116 97 112 84 155 255 6 108 94 78 4 233 188 142 66 190 97 40 135 40 45 103 104 89 35 225 9 229 254 125 210 134 186 83 219 39 156 96 79 116 202 44 226 193 33 197 237 19 205 187 104 142 222 208 110 38 156 236 173 194 237 92 12 94 102 228 230 145 128 127 23 155 108 123 159 28 189 122 77 188 51 141 193 44 74 135 72 161 176 196 25 238 215 249 1 0 0 0 1 128 185 132 187 44 241 228 100 105 22 119 238 94 124 126 113 117 10 214 51 133 149 172 201 211 213 121 160 34 164 142 116 97 112 84 155 255 6 108 94 78 4 233 188 142 66 190 97 40 135 40 45 103 104 89 35 225 9 229 254 125 210 134 186 83 219 39 156 96 79 116 202 44 226 193 33 197 237 19 205 187 104 142 222 208 110 38 156 236 173 194 237 92 12 94 102 228 230 145 128 127 23 155 108 123 159 28 189 122 77 188 51 141 193 44 74 135 72 161 176 196 25 238 215 249 1 0 0 0 0 128 196 189 1 242 155 244 232 152 101 227 3 217 39 244 236 150 9 178 16 175 212 22 120 54 105 227 225 242 229 156 121 86 139 227 54 127 184 190 41 133 3 17 52 18 138 148 221 246 233 48 84 88 59 192 24 21 252 227 123 179 109 113 77 255 247 152 43 152 181 143 190 106 157 133 109 3 97 155 223 142 24 220 123 209 115 48 134 39 181 47 225 199 64 0 47 19 50 112 64 18 160 79 199 188 82 123 15 244 22 146 43 21 149 157 118 9 188 127 178 30 174 37 125 174 1 17 0 0 1 128 196 189 1 242 155 244 232 152 101 227 3 217 39 244 236 150 9 178 16 175 212 22 120 54 105 227 225 242 229 156 121 86 139 227 54 127 184 190 41 133 3 17 52 18 138 148 221 246 233 48 84 88 59 192 24 21 252 227 123 179 109 113 77 255 247 152 43 152 181 143 190 106 157 133 109 3 97 155 223 142 24 220 123 209 115 48 134 39 181 47 225 199 64 0 47 19 50 112 64 18 160 79 199 188 82 123 15 244 22 146 43 21 149 157 118 9 188 127 178 30 174 37 125 174 1 17 0 0 0 128 125 72 103 215 83 251 97 191 63 231 211 75 247 3 48 39 242 99 75 38 207 10 64 114 118 90 122 122 77 183 190 7 147 103 181 244 49 65 243 162 67 68 8 208 134 116 48 95 95 233 35 252 112 16 102 203 11 124 40 193 161 239 28 210 11 139 204 89 203 38 245 182 150 96 26 18 46 113 77 175 20 177 91 174 135 42 135 219 19 174 215 57 19 213 152 24 76 23 175 160 29 5 177 176 24 219 163 255 97 214 199 54 191 77 15 45 73 191 156 156 85 231 7 0 0 0 0 0 1 128 125 72 103 215 83 251 97 191 63 231 211 75 247 3 48 39 242 99 75 38 207 10 64 114 118 90 122 122 77 183 190 7 147 103 181 244 49 65 243 162 67 68 8 208 134 116 48 95 95 233 35 252 112 16 102 203 11 124 40 193 161 239 28 210 11 139 204 89 203 38 245 182 150 96 26 18 46 113 77 175 20 177 91 174 135 42 135 219 19 174 215 57 19 213 152 24 76 23 175 160 29 5 177 176 24 219 163 255 97 214 199 54 191 77 15 45 73 191 156 156 85 231 7 0 0 0 0 0 0 16 252 17 170 79 122 224 151 223 165 53 141 155 37 87 4 0 1 16 252 17 170 79 122 224 151 223 165 53 141 155 37 87 4 0 0 64 137 35 96 204 136 177 189 143 1 212 169 28 91 106 152 238 147 179 84 155 35 195 77 99 22 143 175 243 178 108 188 125 52 89 146 208 125 21 94 228 98 194 201 165 96 57 144 208 56 103 133 48 45 120 4 182 247 48 112 89 188 153 1 0 1 64 137 35 96 204 136 177 189 143 1 212 169 28 91 106 152 238 147 179 84 155 35 195 77 99 22 143 175 243 178 108 188 125 52 89 146 208 125 21 94 228 98 194 201 165 96 57 144 208 56 103 133 48 45 120 4 182 247 48 112 89 188 153 1 0 0 104 243 59 23 181 19 206 54 217 4 43 183 169 25 245 43 129 181 198 110 56 213 123 240 160 71 185 170 96 174 21 188 158 209 73 67 245 248 18 139 233 181 53 185 30 209 172 198 74 139 145 21 133 168 4 186 236 48 15 19 25 234 227 177 154 240 64 215 74 77 178 193 160 155 223 234 55 201 144 185 140 71 87 18 218 192 168 98 86 67 205 126 50 211 88 59 69 53 208 210 119 1 82 1 0 1 104 243 59 23 181 19 206 54 217 4 43 183 169 25 245 43 129 181 198 110 56 213 123 240 160 71 185 170 96 174 21 188 158 209 73 67 245 248 18 139 233 181 53 185 30 209 172 198 74 139 145 21 133 168 4 186 236 48 15 19 25 234 227 177 154 240 64 215 74 77 178 193 160 155 223 234 55 201 144 185 140 71 87 18 218 192 168 98 86 67 205 126 50 211 88 59 69 53 208 210 119 1 82 1 0 0 104 30 237 199 208 43 126 134 188 221 77 44 64 109 31 47 206 70 172 101 140 66 232 0 138 101 218 81 243 45 157 119 221 30 64 253 209 50 12 45 150 152 200 9 167 220 210 114 70 151 149 141 34 162 151 188 82 189 246 149 204 99 143 240 240 11 119 55 107 27 196 176 61 52 227 44 160 102 215 226 28 36 252 136 5 162 100 95 194 183 2 28 199 117 193 177 41 170 115 62 93 181 186 1 0 1 104 30 237 199 208 43 126 134 188 221 77 44 64 109 31 47 206 70 172 101 140 66 232 0 138 101 218 81 243 45 157 119 221 30 64 253 209 50 12 45 150 152 200 9 167 220 210 114 70 151 149 141 34 162 151 188 82 189 246 149 204 99 143 240 240 11 119 55 107 27 196 176 61 52 227 44 160 102 215 226 28 36 252 136 5 162 100 95 194 183 2 28 199 117 193 177 41 170 115 62 93 181 186 1 0 0 40 53 120 130 161 159 72 98 85 190 182 236 225 240 60 214 46 141 103 182 195 63 222 96 51 133 198 58 90 110 132 208 137 203 153 172 98 79 220 0 0 1 40 53 120 130 161 159 72 98 85 190 182 236 225 240 60 214 46 141 103 182 195 63 222 96 51 133 198 58 90 110 132 208 137 203 153 172 98 79 220 0 0 0 24 118 29 12 161 58 173 221 244 97 16 129 132 213 223 100 52 220 195 7 0 0 0 0 0 1 24 118 29 12 161 58 173 221 244 97 16 129 132 213 223 100 52 220 195 7 0 0 0 0 0 0 8 48 0 0 0 0 0 0 0 1 8 48 0 0 0 0 0 0 0 0 56 231 92 254 163 124 164 150 140 111 46 208 48 245 131 79 191 167 93 72 251 225 197 183 198 127 122 236 47 16 214 74 14 201 193 171 20 118 155 238 33 155 90 192 58 99 154 59 127 53 8 120 227 43 170 1 0 1 56 231 92 254 163 124 164 150 140 111 46 208 48 245 131 79 191 167 93 72 251 225 197 183 198 127 122 236 47 16 214 74 14 201 193 171 20 118 155 238 33 155 90 192 58 99 154 59 127 53 8 120 227 43 170 1 0 0 16 251 177 154 124 124 51 12 184 170 246 21 206 136 0 6 0 1 16 251 177 154 124 124 51 12 184 170 246 21 206 136 0 6 0 0 120 135 228 154 97 97 37 218 64 185 90 19 175 246 80 210 161 113 157 100 67 139 11 67 170 100 55 10 137 62 200 98 216 164 1 43 71 31 156 64 144 57 219 81 105 211 65 2 203 127 45 87 116 177 120 38 220 221 127 219 9 89 68 112 249 96 102 183 83 157 239 104 243 95 199 142 2 33 66 225 186 67 111 177 72 133 48 17 239 26 98 202 8 125 61 65 118 6 55 147 154 167 90 0 162 128 74 17 187 146 174 37 228 190 12 117 100 32 3 0 0 1 120 135 228 154 97 97 37 218 64 185 90 19 175 246 80 210 161 113 157 100 67 139 11 67 170 100 55 10 137 62 200 98 216 164 1 43 71 31 156 64 144 57 219 81 105 211 65 2 203 127 45 87 116 177 120 38 220 221 127 219 9 89 68 112 249 96 102 183 83 157 239 104 243 95 199 142 2 33 66 225 186 67 111 177 72 133 48 17 239 26 98 202 8 125 61 65 118 6 55 147 154 167 90 0 162 128 74 17 187 146 174 37 228 190 12 117 100 32 3 0 0 0 88 26 161 163 242 118 221 0 66 192 252 133 199 57 227 98 231 11 157 63 23 214 37 26 128 100 49 131 94 235 250 249 147 154 51 50 25 98 235 243 5 108 187 118 252 12 79 151 103 7 110 124 8 167 181 214 104 91 65 119 78 66 98 82 217 239 238 114 229 245 1 243 155 98 149 133 248 106 172 101 16 223 244 0 0 0 0 0 0 1 88 26 161 163 242 118 221 0 66 192 252 133 199 57 227 98 231 11 157 63 23 214 37 26 128 100 49 131 94 235 250 249 147 154 51 50 25 98 235 243 5 108 187 118 252 12 79 151 103 7 110 124 8 167 181 214 104 91 65 119 78 66 98 82 217 239 238 114 229 245 1 243 155 98 149 133 248 106 172 101 16 223 244 0 0 0 0 0 0 0 104 51 242 193 71 40 33 244 183 39 87 209 231 123 23 102 244 164 169 195 247 118 193 238 212 202 61 62 28 173 71 226 3 123 32 247 24 21 127 54 196 17 12 180 107 10 66 175 208 88 113 145 18 93 77 231 82 5 172 142 122 173 202 80 213 151 67 189 246 154 57 40 60 62 225 173 49 197 99 197 109 106 160 126 116 179 205 235 122 139 21 129 249 231 216 211 119 4 117 66 52 193 10 0 0 1 104 51 242 193 71 40 33 244 183 39 87 209 231 123 23 102 244 164 169 195 247 118 193 238 212 202 61 62 28 173 71 226 3 123 32 247 24 21 127 54 196 17 12 180 107 10 66 175 208 88 113 145 18 93 77 231 82 5 172 142 122 173 202 80 213 151 67 189 246 154 57 40 60 62 225 173 49 197 99 197 109 106 160 126 116 179 205 235 122 139 21 129 249 231 216 211 119 4 117 66 52 193 10 0 0 0 120 117 133 12 7 22 147 126 60 222 126 15 234 208 110 144 185 13 98 7 11 209 57 121 79 194 58 253 148 206 85 251 165 5 213 112 244 92 244 25 196 40 68 91 10 147 74 13 72 165 3 119 45 32 170 129 46 133 146 166 13 69 50 36 228 124 251 190 233 4 155 225 95 178 231 135 226 223 143 88 24 162 178 240 101 140 125 124 184 151 110 254 193 242 30 230 88 55 219 178 42 54 111 9 248 91 46 181 248 183 164 152 211 7 0 0 0 0 0 0 0 1 120 117 133 12 7 22 147 126 60 222 126 15 234 208 110 144 185 13 98 7 11 209 57 121 79 194 58 253 148 206 85 251 165 5 213 112 244 92 244 25 196 40 68 91 10 147 74 13 72 165 3 119 45 32 170 129 46 133 146 166 13 69 50 36 228 124 251 190 233 4 155 225 95 178 231 135 226 223 143 88 24 162 178 240 101 140 125 124 184 151 110 254 193 242 30 230 88 55 219 178 42 54 111 9 248 91 46 181 248 183 164 152 211 7 0 0 0 0 0 0 0 0 128 63 77 192 16 39 116 41 118 84 43 197 253 236 106 62 1 183 234 241 28 170 49 21 191 231 212 161 33 61 235 39 160 228 125 57 52 78 189 69 47 1 79 177 75 103 238 153 2 38 182 148 88 116 210 38 64 96 188 136 248 75 74 182 169 213 110 205 104 170 28 203 171 146 250 72 188 184 135 129 123 246 18 94 241 239 179 131 133 192 152 204 226 228 3 166 119 222 138 54 116 129 186 64 160 210 30 139 163 195 186 2 85 155 194 170 83 132 36 74 216 27 254 85 0 0 0 0 0 1 128 63 77 192 16 39 116 41 118 84 43 197 253 236 106 62 1 183 234 241 28 170 49 21 191 231 212 161 33 61 235 39 160 228 125 57 52 78 189 69 47 1 79 177 75 103 238 153 2 38 182 148 88 116 210 38 64 96 188 136 248 75 74 182 169 213 110 205 104 170 28 203 171 146 250 72 188 184 135 129 123 246 18 94 241 239 179 131 133 192 152 204 226 228 3 166 119 222 138 54 116 129 186 64 160 210 30 139 163 195 186 2 85 155 194 170 83 132 36 74 216 27 254 85 0 0 0 0 0 0 72 216 172 85 194 158 216 82 110 65 133 85 128 49 103 72 173 54 61 199 26 210 206 103 163 37 220 221 193 233 238 254 54 206 213 124 6 203 165 26 21 241 141 165 246 128 184 43 72 242 66 159 97 79 134 33 147 97 136 247 186 217 103 81 199 29 0 0 0 0 0 0 0 1 72 216 172 85 194 158 216 82 110 65 133 85 128 49 103 72 173 54 61 199 26 210 206 103 163 37 220 221 193 233 238 254 54 206 213 124 6 203 165 26 21 241 141 165 246 128 184 43 72 242 66 159 97 79 134 33 147 97 136 247 186 217 103 81 199 29 0 0 0 0 0 0 0 0 88 198 204 237 247 146 195 97 49 165 23 187 22 34 150 126 136 183 220 165 82 194 13 172 190 161 249 20 192 177 147 243 49 113 56 111 194 238 6 98 97 129 35 110 42 246 44 179 219 221 190 182 94 40 254 25 246 171 109 11 181 1 138 90 3 209 233 133 179 57 67 179 0 223 103 18 74 138 136 231 35 199 161 29 157 1 0 0 0 1 88 198 204 237 247 146 195 97 49 165 23 187 22 34 150 126 136 183 220 165 82 194 13 172 190 161 249 20 192 177 147 243 49 113 56 111 194 238 6 98 97 129 35 110 42 246 44 179 219 221 190 182 94 40 254 25 246 171 109 11 181 1 138 90 3 209 233 133 179 57 67 179 0 223 103 18 74 138 136 231 35 199 161 29 157 1 0 0 0 0 104 200 111 223 113 76 183 17 189 185 203 122 115 218 100 205 191 105 223 132 140 147 126 199 180 195 206 12 73 110 39 71 147 85 229 115 193 236 45 39 98 81 104 24 231 243 122 80 84 171 200 163 28 188 108 159 81 0 102 179 40 112 195 41 169 248 78 181 155 111 130 188 233 129 78 9 71 59 223 40 71 154 214 88 94 144 232 156 144 221 110 76 114 52 34 145 84 178 218 142 15 103 173 3 0 1 104 200 111 223 113 76 183 17 189 185 203 122 115 218 100 205 191 105 223 132 140 147 126 199 180 195 206 12 73 110 39 71 147 85 229 115 193 236 45 39 98 81 104 24 231 243 122 80 84 171 200 163 28 188 108 159 81 0 102 179 40 112 195 41 169 248 78 181 155 111 130 188 233 129 78 9 71 59 223 40 71 154 214 88 94 144 232 156 144 221 110 76 114 52 34 145 84 178 218 142 15 103 173 3 0 0 8 177 137 11 132 66 0 0 0 1 8 177 137 11 132 66 0 0 0 0 48 33 167 44 60 43 5 212 10 233 199 142 141 206 188 38 153 75 245 28 138 78 90 196 228 196 226 63 171 99 123 61 129 93 169 246 14 54 98 199 66 102 119 74 122 163 104 13 0 1 48 33 167 44 60 43 5 212 10 233 199 142 141 206 188 38 153 75 245 28 138 78 90 196 228 196 226 63 171 99 123 61 129 93 169 246 14 54 98 199 66 102 119 74 122 163 104 13 0 0 112 13 142 178 152 223 193 158 172 255 203 197 100 76 79 42 99 97 196 198 42 60 211 249 142 174 154 123 158 254 134 251 235 151 207 55 209 178 137 7 234 137 81 211 255 191 135 78 179 11 30 121 13 152 88 34 61 56 32 249 153 111 6 135 83 62 197 83 191 163 251 20 161 116 248 36 161 123 44 251 45 216 82 212 120 237 125 134 142 89 7 182 228 191 54 121 104 50 110 8 142 248 42 214 76 253 13 190 143 50 0 0 0 1 112 13 142 178 152 223 193 158 172 255 203 197 100 76 79 42 99 97 196 198 42 60 211 249 142 174 154 123 158 254 134 251 235 151 207 55 209 178 137 7 234 137 81 211 255 191 135 78 179 11 30 121 13 152 88 34 61 56 32 249 153 111 6 135 83 62 197 83 191 163 251 20 161 116 248 36 161 123 44 251 45 216 82 212 120 237 125 134 142 89 7 182 228 191 54 121 104 50 110 8 142 248 42 214 76 253 13 190 143 50 0 0 0 0 32 135 115 67 224 57 26 67 50 161 116 97 239 175 143 9 168 232 95 142 29 48 16 121 194 48 241 158 6 0 0 0 0 1 32 135 115 67 224 57 26 67 50 161 116 97 239 175 143 9 168 232 95 142 29 48 16 121 194 48 241 158 6 0 0 0 0 0 120 179 69 194 42 93 120 64 237 75 176 251 199 63 49 12 217 68 117 60 17 14 70 160 57 29 60 226 156 164 120 98 6 241 147 20 139 159 7 106 210 46 18 44 209 147 45 254 121 230 97 80 19 35 222 34 109 179 236 84 205 123 213 217 33 100 118 217 223 98 205 210 213 162 16 151 66 225 173 235 73 110 112 76 172 232 124 30 64 29 119 3 178 184 119 33 176 53 248 40 157 126 127 125 242 209 202 221 233 124 59 53 81 231 151 52 49 122 224 122 27 1 120 179 69 194 42 93 120 64 237 75 176 251 199 63 49 12 217 68 117 60 17 14 70 160 57 29 60 226 156 164 120 98 6 241 147 20 139 159 7 106 210 46 18 44 209 147 45 254 121 230 97 80 19 35 222 34 109 179 236 84 205 123 213 217 33 100 118 217 223 98 205 210 213 162 16 151 66 225 173 235 73 110 112 76 172 232 124 30 64 29 119 3 178 184 119 33 176 53 248 40 157 126 127 125 242 209 202 221 233 124 59 53 81 231 151 52 49 122 224 122 27 0 88 202 249 247 72 190 100 43 14 53 119 130 14 137 197 240 200 81 190 103 225 158 134 179 33 43 177 147 126 191 141 162 245 224 193 132 144 147 134 16 189 234 157 212 246 176 172 112 191 110 66 141 195 94 234 133 171 20 190 248 55 25 132 147 148 135 183 201 74 89 229 183 214 200 16 91 233 10 37 163 27 133 153 134 93 213 152 142 7 1 88 202 249 247 72 190 100 43 14 53 119 130 14 137 197 240 200 81 190 103 225 158 134 179 33 43 177 147 126 191 141 162 245 224 193 132 144 147 134 16 189 234 157 212 246 176 172 112 191 110 66 141 195 94 234 133 171 20 190 248 55 25 132 147 148 135 183 201 74 89 229 183 214 200 16 91 233 10 37 163 27 133 153 134 93 213 152 142 7 0 88 77 103 16 15 148 98 115 149 166 118 218 10 199 232 124 175 175 165 211 217 182 127 122 39 230 51 107 111 80 51 18 145 177 162 46 2 119 80 163 33 253 187 253 121 34 222 134 85 8 230 102 107 120 117 240 151 81 89 38 47 90 107 129 149 16 144 78 38 26 58 78 61 163 182 119 241 129 192 139 249 183 46 39 109 17 15 240 0 1 88 77 103 16 15 148 98 115 149 166 118 218 10 199 232 124 175 175 165 211 217 182 127 122 39 230 51 107 111 80 51 18 145 177 162 46 2 119 80 163 33 253 187 253 121 34 222 134 85 8 230 102 107 120 117 240 151 81 89 38 47 90 107 129 149 16 144 78 38 26 58 78 61 163 182 119 241 129 192 139 249 183 46 39 109 17 15 240 0 0 56 234 213 76 110 121 53 109 162 71 58 96 120 32 67 142 4 161 13 37 85 104 226 206 115 224 160 35 117 179 108 202 225 198 59 157 91 182 20 254 20 5 196 54 221 64 27 198 127 155 96 99 2 0 0 0 0 1 56 234 213 76 110 121 53 109 162 71 58 96 120 32 67 142 4 161 13 37 85 104 226 206 115 224 160 35 117 179 108 202 225 198 59 157 91 182 20 254 20 5 196 54 221 64 27 198 127 155 96 99 2 0 0 0 0 0 104 130 27 80 132 149 206 104 74 186 108 76 162 61 90 101 136 56 238 26 128 103 13 215 175 217 2 94 203 185 103 235 57 73 179 67 251 148 153 157 188 175 176 9 190 11 144 240 204 176 77 140 59 173 23 41 195 49 211 129 99 226 89 41 61 117 216 244 229 187 66 250 141 7 162 242 64 30 74 137 170 157 234 46 180 106 67 91 184 254 133 132 150 83 202 121 109 229 1 0 0 0 0 0 0 1 104 130 27 80 132 149 206 104 74 186 108 76 162 61 90 101 136 56 238 26 128 103 13 215 175 217 2 94 203 185 103 235 57 73 179 67 251 148 153 157 188 175 176 9 190 11 144 240 204 176 77 140 59 173 23 41 195 49 211 129 99 226 89 41 61 117 216 244 229 187 66 250 141 7 162 242 64 30 74 137 170 157 234 46 180 106 67 91 184 254 133 132 150 83 202 121 109 229 1 0 0 0 0 0 0 0 96 180 177 20 52 197 85 168 138 255 101 101 71 208 219 45 169 123 61 167 239 15 8 52 226 172 233 153 47 28 118 122 247 246 33 225 192 78 230 61 188 196 197 48 3 32 37 12 172 242 129 25 220 16 26 252 131 142 114 105 69 201 34 95 85 12 39 146 145 217 235 38 66 245 145 202 77 22 159 59 0 129 139 201 197 42 198 93 48 54 136 29 220 157 47 43 0 1 96 180 177 20 52 197 85 168 138 255 101 101 71 208 219 45 169 123 61 167 239 15 8 52 226 172 233 153 47 28 118 122 247 246 33 225 192 78 230 61 188 196 197 48 3 32 37 12 172 242 129 25 220 16 26 252 131 142 114 105 69 201 34 95 85 12 39 146 145 217 235 38 66 245 145 202 77 22 159 59 0 129 139 201 197 42 198 93 48 54 136 29 220 157 47 43 0 0 96 228 177 197 157 201 233 218 33 173 105 143 149 114 247 135 47 252 136 226 112 224 250 62 15 148 29 202 26 68 127 193 62 109 233 165 67 21 221 99 246 160 113 232 255 240 215 55 219 168 67 172 220 239 70 18 44 75 90 190 126 188 2 138 148 81 54 76 45 139 27 198 140 152 73 84 62 77 207 250 184 202 70 93 74 35 192 212 68 254 66 167 55 43 72 51 1 1 96 228 177 197 157 201 233 218 33 173 105 143 149 114 247 135 47 252 136 226 112 224 250 62 15 148 29 202 26 68 127 193 62 109 233 165 67 21 221 99 246 160 113 232 255 240 215 55 219 168 67 172 220 239 70 18 44 75 90 190 126 188 2 138 148 81 54 76 45 139 27 198 140 152 73 84 62 77 207 250 184 202 70 93 74 35 192 212 68 254 66 167 55 43 72 51 1 0 64 214 194 164 243 67 99 159 221 32 79 138 118 10 246 26 53 220 63 121 128 209 86 55 147 46 21 147 111 73 114 48 231 199 129 181 226 153 2 49 119 72 168 113 113 77 187 140 153 22 15 24 250 59 186 131 64 170 188 226 4 136 0 0 0 1 64 214 194 164 243 67 99 159 221 32 79 138 118 10 246 26 53 220 63 121 128 209 86 55 147 46 21 147 111 73 114 48 231 199 129 181 226 153 2 49 119 72 168 113 113 77 187 140 153 22 15 24 250 59 186 131 64 170 188 226 4 136 0 0 0 0 56 137 1 85 110 191 240 53 229 183 92 119 252 131 102 74 251 188 32 178 3 182 241 244 250 87 89 25 222 123 231 114 153 55 41 42 92 80 171 133 162 143 161 81 69 72 198 206 202 152 186 2 0 0 0 0 0 1 56 137 1 85 110 191 240 53 229 183 92 119 252 131 102 74 251 188 32 178 3 182 241 244 250 87 89 25 222 123 231 114 153 55 41 42 92 80 171 133 162 143 161 81 69 72 198 206 202 152 186 2 0 0 0 0 0 0 56 211 76 143 162 185 129 219 122 124 64 67 106 130 145 59 54 198 182 118 11 1 159 173 227 145 183 65 74 210 107 97 244 37 234 225 245 194 126 48 168 194 239 99 117 113 246 7 68 90 122 30 120 121 204 1 0 1 56 211 76 143 162 185 129 219 122 124 64 67 106 130 145 59 54 198 182 118 11 1 159 173 227 145 183 65 74 210 107 97 244 37 234 225 245 194 126 48 168 194 239 99 117 113 246 7 68 90 122 30 120 121 204 1 0 0 88 105 73 115 54 214 7 115 255 61 66 95 124 249 26 243 37 155 74 9 85 217 163 49 217 173 61 95 67 196 72 63 156 172 27 80 167 165 134 208 52 201 202 92 55 128 155 17 60 176 105 63 30 206 211 19 235 211 182 152 83 135 179 180 37 195 226 138 134 144 171 149 80 65 145 226 242 243 230 43 132 178 250 39 215 0 0 0 0 1 88 105 73 115 54 214 7 115 255 61 66 95 124 249 26 243 37 155 74 9 85 217 163 49 217 173 61 95 67 196 72 63 156 172 27 80 167 165 134 208 52 201 202 92 55 128 155 17 60 176 105 63 30 206 211 19 235 211 182 152 83 135 179 180 37 195 226 138 134 144 171 149 80 65 145 226 242 243 230 43 132 178 250 39 215 0 0 0 0 0 24 238 147 112 201 202 57 233 73 216 169 141 254 73 1 28 115 92 180 201 139 174 21 11 0 1 24 238 147 112 201 202 57 233 73 216 169 141 254 73 1 28 115 92 180 201 139 174 21 11 0 0 24 11 98 186 29 212 176 86 13 53 40 93 147 195 178 153 54 152 222 244 40 193 19 0 0 1 24 11 98 186 29 212 176 86 13 53 40 93 147 195 178 153 54 152 222 244 40 193 19 0 0 0 40 247 180 251 141 141 62 11 228 178 124 25 179 207 78 30 191 6 166 89 240 173 89 181 244 213 201 90 164 248 113 18 220 53 196 159 235 161 36 114 0 1 40 247 180 251 141 141 62 11 228 178 124 25 179 207 78 30 191 6 166 89 240 173 89 181 244 213 201 90 164 248 113 18 220 53 196 159 235 161 36 114 0 0 96 197 219 246 150 141 204 249 197 122 42 147 254 26 80 88 29 210 60 108 233 49 53 58 229 228 74 204 32 164 150 72 227 75 126 222 254 223 216 61 51 43 121 144 51 162 181 207 169 112 177 75 201 49 79 92 41 7 31 62 225 233 82 103 28 12 148 8 127 39 116 68 202 216 227 213 140 255 16 22 227 223 27 82 6 151 211 143 89 62 252 11 0 0 0 0 0 1 96 197 219 246 150 141 204 249 197 122 42 147 254 26 80 88 29 210 60 108 233 49 53 58 229 228 74 204 32 164 150 72 227 75 126 222 254 223 216 61 51 43 121 144 51 162 181 207 169 112 177 75 201 49 79 92 41 7 31 62 225 233 82 103 28 12 148 8 127 39 116 68 202 216 227 213 140 255 16 22 227 223 27 82 6 151 211 143 89 62 252 11 0 0 0 0 0 0 104 84 85 201 229 80 220 110 27 89 135 96 8 25 169 247 170 52 98 214 179 116 102 103 90 190 212 155 200 5 237 5 33 189 15 223 142 50 1 136 100 122 203 43 219 41 31 201 158 108 205 137 41 171 131 15 69 19 41 170 64 244 118 157 0 134 78 207 249 103 223 37 193 0 163 144 187 16 102 223 27 90 215 43 229 11 42 66 58 117 150 42 248 101 141 189 6 240 7 0 242 197 127 1 0 1 104 84 85 201 229 80 220 110 27 89 135 96 8 25 169 247 170 52 98 214 179 116 102 103 90 190 212 155 200 5 237 5 33 189 15 223 142 50 1 136 100 122 203 43 219 41 31 201 158 108 205 137 41 171 131 15 69 19 41 170 64 244 118 157 0 134 78 207 249 103 223 37 193 0 163 144 187 16 102 223 27 90 215 43 229 11 42 66 58 117 150 42 248 101 141 189 6 240 7 0 242 197 127 1 0 0 8 185 243 251 131 7 0 0 0 1 8 185 243 251 131 7 0 0 0 0 48 188 64 12 102 153 116 180 169 232 182 207 120 2 241 87 106 199 3 100 211 214 177 149 40 69 55 14 15 24 136 141 41 198 26 255 238 213 146 192 182 42 0 0 0 0 0 0 0 1 48 188 64 12 102 153 116 180 169 232 182 207 120 2 241 87 106 199 3 100 211 214 177 149 40 69 55 14 15 24 136 141 41 198 26 255 238 213 146 192 182 42 0 0 0 0 0 0 0 0 40 60 69 243 184 98 7 253 248 147 154 234 108 139 170 83 33 71 50 181 137 96 0 97 65 238 127 238 220 145 220 30 197 164 169 50 39 0 0 0 0 1 40 60 69 243 184 98 7 253 248 147 154 234 108 139 170 83 33 71 50 181 137 96 0 97 65 238 127 238 220 145 220 30 197 164 169 50 39 0 0 0 0 0 112 226 167 90 98 229 230 91 40 155 26 167 140 217 74 204 150 223 188 123 34 82 92 87 7 182 125 184 131 72 19 168 23 168 126 18 67 33 218 228 80 219 32 115 52 91 153 74 185 188 251 88 141 206 245 147 186 188 9 11 227 190 147 53 27 159 175 207 126 95 65 244 167 190 77 129 82 251 142 246 254 93 98 112 160 141 225 214 75 62 208 202 45 97 98 146 177 111 133 60 28 249 233 207 10 171 89 174 70 14 94 129 40 1 112 226 167 90 98 229 230 91 40 155 26 167 140 217 74 204 150 223 188 123 34 82 92 87 7 182 125 184 131 72 19 168 23 168 126 18 67 33 218 228 80 219 32 115 52 91 153 74 185 188 251 88 141 206 245 147 186 188 9 11 227 190 147 53 27 159 175 207 126 95 65 244 167 190 77 129 82 251 142 246 254 93 98 112 160 141 225 214 75 62 208 202 45 97 98 146 177 111 133 60 28 249 233 207 10 171 89 174 70 14 94 129 40 0 8 109 138 127 241 182 108 3 0 1 8 109 138 127 241 182 108 3 0 0 24 253 248 186 235 248 125 194 176 203 231 91 182 41 233 0 226 122 118 84 2 0 0 0 0 1 24 253 248 186 235 248 125 194 176 203 231 91 182 41 233 0 226 122 118 84 2 0 0 0 0 0 16 230 16 7 220 125 232 51 204 126 74 73 232 59 0 0 0 1 16 230 16 7 220 125 232 51 204 126 74 73 232 59 0 0 0 0 128 96 188 53 88 57 212 250 97 99 241 119 39 211 59 47 120 144 156 173 166 143 114 227 10 41 16 55 214 158 53 92 82 10 117 44 252 226 154 161 113 202 150 106 200 19 38 79 40 100 2 216 168 103 49 218 150 159 173 218 238 0 59 105 125 25 202 77 232 122 113 96 184 174 146 91 150 158 119 220 235 41 130 173 153 183 164 219 127 2 22 89 184 116 175 152 236 46 180 242 142 205 40 40 121 115 78 145 79 246 133 130 224 161 140 56 114 143 192 138 82 110 74 44 22 99 135 217 2 1 128 96 188 53 88 57 212 250 97 99 241 119 39 211 59 47 120 144 156 173 166 143 114 227 10 41 16 55 214 158 53 92 82 10 117 44 252 226 154 161 113 202 150 106 200 19 38 79 40 100 2 216 168 103 49 218 150 159 173 218 238 0 59 105 125 25 202 77 232 122 113 96 184 174 146 91 150 158 119 220 235 41 130 173 153 183 164 219 127 2 22 89 184 116 175 152 236 46 180 242 142 205 40 40 121 115 78 145 79 246 133 130 224 161 140 56 114 143 192 138 82 110 74 44 22 99 135 217 2 0 112 183 215 158 47 73 44 220 50 163 229 15 148 225 154 78 50 189 136 15 137 135 196 30 145 70 78 206 57 19 181 129 163 193 193 234 155 1 250 142 170 197 218 122 99 180 214 31 196 167 42 38 254 90 90 60 16 232 180 119 19 88 155 128 27 128 25 230 39 205 154 156 158 153 88 120 44 1 136 211 209 30 179 28 159 46 164 62 97 233 105 33 20 253 209 183 59 98 45 110 88 170 73 103 237 172 14 0 0 0 0 0 0 1 112 183 215 158 47 73 44 220 50 163 229 15 148 225 154 78 50 189 136 15 137 135 196 30 145 70 78 206 57 19 181 129 163 193 193 234 155 1 250 142 170 197 218 122 99 180 214 31 196 167 42 38 254 90 90 60 16 232 180 119 19 88 155 128 27 128 25 230 39 205 154 156 158 153 88 120 44 1 136 211 209 30 179 28 159 46 164 62 97 233 105 33 20 253 209 183 59 98 45 110 88 170 73 103 237 172 14 0 0 0 0 0 0 0 112 109 39 198 116 134 109 137 3 154 63 133 155 109 82 108 240 13 83 246 109 126 71 168 5 252 39 139 51 83 180 93 45 15 158 50 208 87 19 218 21 230 235 83 238 84 254 144 65 87 7 55 39 65 75 33 1 137 221 191 101 104 101 15 201 217 163 216 64 237 92 24 199 180 178 166 245 190 146 159 89 122 28 142 102 176 245 112 28 239 140 93 48 144 224 181 154 244 92 174 112 189 17 186 11 61 0 0 0 0 0 0 0 1 112 109 39 198 116 134 109 137 3 154 63 133 155 109 82 108 240 13 83 246 109 126 71 168 5 252 39 139 51 83 180 93 45 15 158 50 208 87 19 218 21 230 235 83 238 84 254 144 65 87 7 55 39 65 75 33 1 137 221 191 101 104 101 15 201 217 163 216 64 237 92 24 199 180 178 166 245 190 146 159 89 122 28 142 102 176 245 112 28 239 140 93 48 144 224 181 154 244 92 174 112 189 17 186 11 61 0 0 0 0 0 0 0 0 96 115 25 74 181 122 105 117 16 23 160 104 186 173 148 142 130 124 69 176 164 120 37 35 164 26 5 203 211 81 114 102 172 157 224 92 119 72 40 156 152 170 218 239 244 122 119 68 255 223 165 182 239 221 222 170 86 17 177 252 123 251 137 160 2 17 88 15 181 45 222 85 1 145 242 26 221 26 143 50 5 231 126 165 15 88 139 246 42 136 0 0 0 0 0 0 0 1 96 115 25 74 181 122 105 117 16 23 160 104 186 173 148 142 130 124 69 176 164 120 37 35 164 26 5 203 211 81 114 102 172 157 224 92 119 72 40 156 152 170 218 239 244 122 119 68 255 223 165 182 239 221 222 170 86 17 177 252 123 251 137 160 2 17 88 15 181 45 222 85 1 145 242 26 221 26 143 50 5 231 126 165 15 88 139 246 42 136 0 0 0 0 0 0 0 0 24 11 96 10 112 174 90 0 74 17 97 66 74 95 235 134 176 1 0 0 0 0 0 0 0 1 24 11 96 10 112 174 90 0 74 17 97 66 74 95 235 134 176 1 0 0 0 0 0 0 0 0 48 154 185 66 152 86 30 237 20 211 200 92 232 231 159 111 104 239 215 186 246 153 131 145 191 158 17 100 149 87 115 114 80 153 175 127 213 20 30 55 123 56 0 0 0 0 0 0 0 1 48 154 185 66 152 86 30 237 20 211 200 92 232 231 159 111 104 239 215 186 246 153 131 145 191 158 17 100 149 87 115 114 80 153 175 127 213 20 30 55 123 56 0 0 0 0 0 0 0 0 104 200 46 197 117 247 255 182 227 22 29 184 198 24 211 143 87 190 175 196 153 250 144 95 50 47 199 87 38 91 196 72 184 66 112 224 205 213 241 213 215 217 50 114 236 249 135 67 151 218 231 131 138 171 95 70 223 55 110 156 24 86 4 116 64 213 4 169 211 115 62 175 39 13 169 242 237 56 166 5 99 183 238 116 46 114 188 183 203 8 57 40 83 132 247 182 225 184 108 0 0 0 0 0 0 1 104 200 46 197 117 247 255 182 227 22 29 184 198 24 211 143 87 190 175 196 153 250 144 95 50 47 199 87 38 91 196 72 184 66 112 224 205 213 241 213 215 217 50 114 236 249 135 67 151 218 231 131 138 171 95 70 223 55 110 156 24 86 4 116 64 213 4 169 211 115 62 175 39 13 169 242 237 56 166 5 99 183 238 116 46 114 188 183 203 8 57 40 83 132 247 182 225 184 108 0 0 0 0 0 0 0 128 94 235 124 73 23 127 111 55 10 111 84 126 170 16 77 106 181 163 73 165 249 170 40 170 90 228 108 176 252 39 45 191 204 225 251 145 26 45 5 233 1 112 57 57 75 136 241 126 114 242 43 156 144 93 196 214 225 123 243 163 118 208 74 233 52 78 129 73 101 32 94 180 49 175 158 209 26 110 42 125 133 11 133 252 19 105 165 220 63 81 214 85 35 166 157 95 220 199 190 78 235 205 161 109 38 86 178 173 75 16 150 107 115 202 87 90 44 122 250 44 242 3 0 0 0 0 0 0 1 128 94 235 124 73 23 127 111 55 10 111 84 126 170 16 77 106 181 163 73 165 249 170 40 170 90 228 108 176 252 39 45 191 204 225 251 145 26 45 5 233 1 112 57 57 75 136 241 126 114 242 43 156 144 93 196 214 225 123 243 163 118 208 74 233 52 78 129 73 101 32 94 180 49 175 158 209 26 110 42 125 133 11 133 252 19 105 165 220 63 81 214 85 35 166 157 95 220 199 190 78 235 205 161 109 38 86 178 173 75 16 150 107 115 202 87 90 44 122 250 44 242 3 0 0 0 0 0 0 0 64 33 38 244 173 112 88 99 122 250 156 144 15 79 132 196 15 41 75 133 177 70 36 29 76 228 221 155 246 69 197 87 207 178 221 150 150 163 43 125 211 170 119 162 199 18 140 88 14 141 156 131 55 86 105 131 87 183 202 138 193 250 146 7 0 1 64 33 38 244 173 112 88 99 122 250 156 144 15 79 132 196 15 41 75 133 177 70 36 29 76 228 221 155 246 69 197 87 207 178 221 150 150 163 43 125 211 170 119 162 199 18 140 88 14 141 156 131 55 86 105 131 87 183 202 138 193 250 146 7 0 0 8 193 65 150 116 8 0 0 0 1 8 193 65 150 116 8 0 0 0 0 88 222 76 87 0 39 117 3 50 43 76 65 78 229 242 96 28 45 68 9 84 77 32 141 102 105 143 7 223 208 38 17 171 1 5 64 101 80 4 202 47 105 247 32 207 194 242 83 135 163 54 216 178 26 17 93 139 73 169 226 217 99 11 82 47 3 157 215 215 153 31 216 121 218 217 197 70 198 39 255 50 228 150 229 67 199 1 0 0 1 88 222 76 87 0 39 117 3 50 43 76 65 78 229 242 96 28 45 68 9 84 77 32 141 102 105 143 7 223 208 38 17 171 1 5 64 101 80 4 202 47 105 247 32 207 194 242 83 135 163 54 216 178 26 17 93 139 73 169 226 217 99 11 82 47 3 157 215 215 153 31 216 121 218 217 197 70 198 39 255 50 228 150 229 67 199 1 0 0 0 64 132 11 227 148 45 72 132 90 43 39 166 76 172 224 159 49 82 126 46 147 149 229 112 96 19 103 129 209 180 204 78 161 218 161 137 155 40 142 2 48 80 224 51 94 209 169 119 94 212 151 125 134 39 145 109 231 4 0 0 0 0 0 0 0 1 64 132 11 227 148 45 72 132 90 43 39 166 76 172 224 159 49 82 126 46 147 149 229 112 96 19 103 129 209 180 204 78 161 218 161 137 155 40 142 2 48 80 224 51 94 209 169 119 94 212 151 125 134 39 145 109 231 4 0 0 0 0 0 0 0 0 24 123 47 118 34 191 206 207 171 213 67 79 77 219 89 68 92 2 0 0 0 0 0 0 0 1 24 123 47 118 34 191 206 207 171 213 67 79 77 219 89 68 92 2 0 0 0 0 0 0 0 0 56 181 219 18 61 30 154 15 167 192 14 196 148 216 66 206 1 98 115 173 137 197 47 49 228 38 188 178 148 202 18 96 2 103 255 202 246 177 221 107 35 180 27 33 72 172 31 69 128 123 0 0 0 0 0 0 0 1 56 181 219 18 61 30 154 15 167 192 14 196 148 216 66 206 1 98 115 173 137 197 47 49 228 38 188 178 148 202 18 96 2 103 255 202 246 177 221 107 35 180 27 33 72 172 31 69 128 123 0 0 0 0 0 0 0 0 32 7 82 250 163 171 151 193 242 222 208 224 252 8 145 119 231 240 219 237 115 112 17 84 150 54 234 247 1 0 0 0 0 1 32 7 82 250 163 171 151 193 242 222 208 224 252 8 145 119 231 240 219 237 115 112 17 84 150 54 234 247 1 0 0 0 0 0 104 106 128 3 1 188 158 131 102 30 13 165 34 56 140 67 110 15 41 20 34 218 85 212 56 208 97 6 198 121 86 231 16 60 41 116 51 112 68 146 225 249 153 79 173 152 178 167 118 161 49 82 252 223 181 39 89 10 249 163 146 32 111 19 91 56 141 207 248 45 150 31 199 164 135 69 61 48 86 28 152 157 46 95 110 240 67 68 230 61 162 195 46 59 109 223 151 104 231 1 0 0 0 0 0 1 104 106 128 3 1 188 158 131 102 30 13 165 34 56 140 67 110 15 41 20 34 218 85 212 56 208 97 6 198 121 86 231 16 60 41 116 51 112 68 146 225 249 153 79 173 152 178 167 118 161 49 82 252 223 181 39 89 10 249 163 146 32 111 19 91 56 141 207 248 45 150 31 199 164 135 69 61 48 86 28 152 157 46 95 110 240 67 68 230 61 162 195 46 59 109 223 151 104 231 1 0 0 0 0 0 0 8 71 170 230 149 60 169 8 0 1 8 71 170 230 149 60 169 8 0 0 104 197 60 13 194 96 169 102 36 193 199 30 151 61 112 84 43 43 191 194 1 161 56 139 53 115 136 32 148 17 113 135 55 123 181 224 91 143 170 42 70 154 95 146 126 90 132 159 105 180 251 18 41 35 80 231 44 31 43 32 145 245 182 101 28 236 119 33 66 1 225 23 219 129 219 214 243 191 203 150 13 208 77 171 34 153 52 224 233 94 147 246 3 95 62 22 212 102 7 164 241 174 21 0 0 1 104 197 60 13 194 96 169 102 36 193 199 30 151 61 112 84 43 43 191 194 1 161 56 139 53 115 136 32 148 17 113 135 55 123 181 224 91 143 170 42 70 154 95 146 126 90 132 159 105 180 251 18 41 35 80 231 44 31 43 32 145 245 182 101 28 236 119 33 66 1 225 23 219 129 219 214 243 191 203 150 13 208 77 171 34 153 52 224 233 94 147 246 3 95 62 22 212 102 7 164 241 174 21 0 0 0 8 255 177 136 137 82 0 0 0 1 8 255 177 136 137 82 0 0 0 0 32 244 28 97 243 182 228 22 188 140 208 197 48 85 163 246 9 179 58 95 58 150 166 115 224 1 0 0 0 0 0 0 0 1 32 244 28 97 243 182 228 22 188 140 208 197 48 85 163 246 9 179 58 95 58 150 166 115 224 1 0 0 0 0 0 0 0 0 56 18 166 152 245 55 183 20 61 65 95 235 22 101 208 144 158 244 134 73 6 107 252 90 131 187 46 111 218 192 193 204 157 69 78 249 68 158 131 231 84 169 155 246 223 255 125 237 56 39 124 83 222 2 0 0 0 1 56 18 166 152 245 55 183 20 61 65 95 235 22 101 208 144 158 244 134 73 6 107 252 90 131 187 46 111 218 192 193 204 157 69 78 249 68 158 131 231 84 169 155 246 223 255 125 237 56 39 124 83 222 2 0 0 0 0 64 125 215 194 190 138 172 44 82 18 4 12 27 37 152 98 142 28 176 36 149 113 6 134 186 247 114 113 24 143 28 126 9 132 211 32 84 48 255 229 143 210 55 139 145 108 151 47 228 54 230 198 125 130 0 191 218 241 25 250 223 160 158 116 0 1 64 125 215 194 190 138 172 44 82 18 4 12 27 37 152 98 142 28 176 36 149 113 6 134 186 247 114 113 24 143 28 126 9 132 211 32 84 48 255 229 143 210 55 139 145 108 151 47 228 54 230 198 125 130 0 191 218 241 25 250 223 160 158 116 0 0 64 3 57 187 171 211 24 69 12 134 135 186 26 223 242 182 51 228 122 123 228 34 89 39 47 189 254 2 149 226 207 2 67 99 42 86 56 191 230 17 56 161 156 156 78 118 244 228 6 251 250 232 155 46 194 10 138 122 135 43 0 0 0 0 0 1 64 3 57 187 171 211 24 69 12 134 135 186 26 223 242 182 51 228 122 123 228 34 89 39 47 189 254 2 149 226 207 2 67 99 42 86 56 191 230 17 56 161 156 156 78 118 244 228 6 251 250 232 155 46 194 10 138 122 135 43 0 0 0 0 0 0 64 172 126 95 38 172 16 35 220 31 69 231 168 50 246 181 132 163 59 105 107 11 195 114 20 55 43 40 50 235 159 196 170 131 133 34 254 126 123 149 223 8 155 192 190 96 9 65 243 130 152 203 23 54 157 5 6 21 0 0 0 0 0 0 0 1 64 172 126 95 38 172 16 35 220 31 69 231 168 50 246 181 132 163 59 105 107 11 195 114 20 55 43 40 50 235 159 196 170 131 133 34 254 126 123 149 223 8 155 192 190 96 9 65 243 130 152 203 23 54 157 5 6 21 0 0 0 0 0 0 0 0 64 2 111 152 136 184 111 221 198 128 165 251 127 213 81 172 8 106 234 51 14 82 18 6 231 152 0 230 43 112 55 155 160 105 77 184 34 204 159 232 23 202 84 150 215 63 252 216 202 135 94 254 143 56 128 190 119 156 93 36 146 106 50 31 0 1 64 2 111 152 136 184 111 221 198 128 165 251 127 213 81 172 8 106 234 51 14 82 18 6 231 152 0 230 43 112 55 155 160 105 77 184 34 204 159 232 23 202 84 150 215 63 252 216 202 135 94 254 143 56 128 190 119 156 93 36 146 106 50 31 0 0 88 67 179 87 45 0 244 146 0 251 216 55 206 169 143 153 155 204 98 242 127 58 228 9 185 140 50 24 85 71 140 103 173 214 208 88 197 18 88 42 237 5 249 171 151 55 8 19 64 247 14 51 205 117 38 200 199 107 98 33 41 209 251 142 166 190 178 246 165 231 178 156 209 134 137 201 40 51 114 105 214 176 192 40 0 0 0 0 0 1 88 67 179 87 45 0 244 146 0 251 216 55 206 169 143 153 155 204 98 242 127 58 228 9 185 140 50 24 85 71 140 103 173 214 208 88 197 18 88 42 237 5 249 171 151 55 8 19 64 247 14 51 205 117 38 200 199 107 98 33 41 209 251 142 166 190 178 246 165 231 178 156 209 134 137 201 40 51 114 105 214 176 192 40 0 0 0 0 0 0 104 210 223 181 52 158 133 105 60 206 60 97 88 35 84 39 241 68 117 46 200 25 178 180 2 135 170 228 237 78 95 141 220 192 61 243 38 81 141 157 147 134 105 20 141 231 139 98 217 141 233 206 38 63 88 41 115 146 165 44 212 80 120 9 35 155 237 10 49 241 130 64 144 5 183 157 196 6 21 107 70 41 197 111 109 215 116 229 241 167 89 202 52 203 220 160 217 246 30 235 144 235 19 0 0 1 104 210 223 181 52 158 133 105 60 206 60 97 88 35 84 39 241 68 117 46 200 25 178 180 2 135 170 228 237 78 95 141 220 192 61 243 38 81 141 157 147 134 105 20 141 231 139 98 217 141 233 206 38 63 88 41 115 146 165 44 212 80 120 9 35 155 237 10 49 241 130 64 144 5 183 157 196 6 21 107 70 41 197 111 109 215 116 229 241 167 89 202 52 203 220 160 217 246 30 235 144 235 19 0 0 0 96 152 150 20 214 127 232 198 173 9 79 27 3 184 211 18 63 222 243 206 88 162 250 92 190 84 152 234 94 69 155 44 142 240 190 37 73 181 195 210 164 18 87 93 129 136 94 136 136 217 218 51 29 223 183 84 208 218 2 84 239 77 91 212 169 82 20 75 248 125 91 121 11 45 39 139 41 225 254 195 35 239 16 190 22 173 227 229 119 204 69 22 0 0 0 0 0 1 96 152 150 20 214 127 232 198 173 9 79 27 3 184 211 18 63 222 243 206 88 162 250 92 190 84 152 234 94 69 155 44 142 240 190 37 73 181 195 210 164 18 87 93 129 136 94 136 136 217 218 51 29 223 183 84 208 218 2 84 239 77 91 212 169 82 20 75 248 125 91 121 11 45 39 139 41 225 254 195 35 239 16 190 22 173 227 229 119 204 69 22 0 0 0 0 0 0 120 44 138 21 104 121 166 168 12 110 50 53 151 231 148 52 129 170 198 240 95 34 68 28 124 55 201 57 159 127 63 21 5 63 2 162 178 197 92 197 192 93 104 136 44 43 255 49 242 182 132 190 94 80 205 87 26 3 171 184 215 205 47 219 227 179 185 205 230 127 65 231 66 123 92 125 163 244 195 94 188 196 160 223 181 5 166 64 111 85 190 120 122 41 201 0 186 192 106 199 252 164 20 92 37 80 149 48 19 150 123 103 189 229 79 223 27 244 74 0 0 1 120 44 138 21 104 121 166 168 12 110 50 53 151 231 148 52 129 170 198 240 95 34 68 28 124 55 201 57 159 127 63 21 5 63 2 162 178 197 92 197 192 93 104 136 44 43 255 49 242 182 132 190 94 80 205 87 26 3 171 184 215 205 47 219 227 179 185 205 230 127 65 231 66 123 92 125 163 244 195 94 188 196 160 223 181 5 166 64 111 85 190 120 122 41 201 0 186 192 106 199 252 164 20 92 37 80 149 48 19 150 123 103 189 229 79 223 27 244 74 0 0 0 104 245 181 98 66 108 43 27 238 39 17 236 216 168 31 46 226 159 160 142 67 146 30 10 164 14 213 242 136 234 225 199 106 255 33 115 237 228 171 8 216 45 122 202 182 141 16 25 154 11 32 53 253 203 2 153 173 247 193 28 139 204 11 42 191 71 206 216 60 1 99 141 204 17 235 245 239 210 176 83 155 175 144 26 254 215 45 202 84 103 74 45 94 174 24 228 158 37 0 0 0 0 0 0 0 1 104 245 181 98 66 108 43 27 238 39 17 236 216 168 31 46 226 159 160 142 67 146 30 10 164 14 213 242 136 234 225 199 106 255 33 115 237 228 171 8 216 45 122 202 182 141 16 25 154 11 32 53 253 203 2 153 173 247 193 28 139 204 11 42 191 71 206 216 60 1 99 141 204 17 235 245 239 210 176 83 155 175 144 26 254 215 45 202 84 103 74 45 94 174 24 228 158 37 0 0 0 0 0 0 0 0 104 57 246 11 97 62 119 196 46 75 16 79 108 49 113 219 104 188 179 248 78 58 245 127 216 140 166 196 171 132 59 25 253 51 249 216 140 222 121 230 30 172 32 207 74 205 85 44 90 36 173 79 87 194 82 25 79 135 112 132 221 164 76 173 137 126 195 194 92 248 173 9 87 209 223 59 125 95 65 85 163 122 135 111 167 236 33 52 80 27 61 178 237 205 251 204 39 240 191 179 209 167 168 143 7 1 104 57 246 11 97 62 119 196 46 75 16 79 108 49 113 219 104 188 179 248 78 58 245 127 216 140 166 196 171 132 59 25 253 51 249 216 140 222 121 230 30 172 32 207 74 205 85 44 90 36 173 79 87 194 82 25 79 135 112 132 221 164 76 173 137 126 195 194 92 248 173 9 87 209 223 59 125 95 65 85 163 122 135 111 167 236 33 52 80 27 61 178 237 205 251 204 39 240 191 179 209 167 168 143 7 0 40 163 89 48 170 102 43 220 156 66 109 77 113 21 188 67 203 215 226 3 205 170 236 98 121 244 145 200 70 209 174 177 8 139 184 149 27 0 0 0 0 1 40 163 89 48 170 102 43 220 156 66 109 77 113 21 188 67 203 215 226 3 205 170 236 98 121 244 145 200 70 209 174 177 8 139 184 149 27 0 0 0 0 0 96 53 9 22 111 90 93 185 232 66 232 61 190 77 71 90 216 56 212 22 125 84 142 129 138 224 63 243 92 90 116 216 187 231 68 78 132 78 241 87 154 62 85 115 206 103 51 246 75 206 191 127 30 122 123 36 8 228 202 50 139 177 122 8 243 137 70 204 22 54 249 70 184 115 203 134 211 234 65 106 138 66 20 24 187 65 57 199 142 254 18 13 0 0 0 0 0 1 96 53 9 22 111 90 93 185 232 66 232 61 190 77 71 90 216 56 212 22 125 84 142 129 138 224 63 243 92 90 116 216 187 231 68 78 132 78 241 87 154 62 85 115 206 103 51 246 75 206 191 127 30 122 123 36 8 228 202 50 139 177 122 8 243 137 70 204 22 54 249 70 184 115 203 134 211 234 65 106 138 66 20 24 187 65 57 199 142 254 18 13 0 0 0 0 0 0 88 149 88 176 69 223 36 37 144 73 234 120 8 99 221 137 178 30 189 44 46 85 157 48 42 245 113 38 233 244 178 224 211 47 14 147 125 42 18 227 2 75 4 61 200 33 227 150 10 58 244 38 21 49 115 166 218 124 93 108 5 73 235 24 7 87 152 177 21 225 23 170 204 54 120 154 213 94 174 62 0 72 37 253 148 145 218 243 1 1 88 149 88 176 69 223 36 37 144 73 234 120 8 99 221 137 178 30 189 44 46 85 157 48 42 245 113 38 233 244 178 224 211 47 14 147 125 42 18 227 2 75 4 61 200 33 227 150 10 58 244 38 21 49 115 166 218 124 93 108 5 73 235 24 7 87 152 177 21 225 23 170 204 54 120 154 213 94 174 62 0 72 37 253 148 145 218 243 1 0 8 30 0 0 0 0 0 0 0 1 8 30 0 0 0 0 0 0 0 0 88 155 231 228 201 142 243 71 208 249 176 228 44 166 218 152 155 74 36 194 74 148 67 125 239 134 32 23 215 211 53 175 202 69 44 53 118 45 165 95 123 12 108 231 154 213 28 20 163 249 156 33 65 206 61 154 174 104 60 98 109 32 78 242 212 129 149 248 201 134 148 123 181 199 217 155 194 96 140 22 149 241 60 138 83 0 0 0 0 1 88 155 231 228 201 142 243 71 208 249 176 228 44 166 218 152 155 74 36 194 74 148 67 125 239 134 32 23 215 211 53 175 202 69 44 53 118 45 165 95 123 12 108 231 154 213 28 20 163 249 156 33 65 206 61 154 174 104 60 98 109 32 78 242 212 129 149 248 201 134 148 123 181 199 217 155 194 96 140 22 149 241 60 138 83 0 0 0 0 0 96 144 67 10 47 192 191 82 221 35 118 53 159 135 152 112 38 73 15 23 69 58 219 225 247 78 102 170 227 6 163 149 12 249 225 137 246 239 39 40 234 163 207 114 112 115 115 194 219 16 202 159 189 202 35 212 109 38 217 132 76 179 231 7 209 218 188 27 208 113 230 164 84 51 101 32 180 123 194 122 68 150 119 65 252 204 137 177 46 234 227 67 1 0 0 0 0 1 96 144 67 10 47 192 191 82 221 35 118 53 159 135 152 112 38 73 15 23 69 58 219 225 247 78 102 170 227 6 163 149 12 249 225 137 246 239 39 40 234 163 207 114 112 115 115 194 219 16 202 159 189 202 35 212 109 38 217 132 76 179 231 7 209 218 188 27 208 113 230 164 84 51 101 32 180 123 194 122 68 150 119 65 252 204 137 177 46 234 227 67 1 0 0 0 0 0 24 72 56 22 141 170 58 90 163 187 180 242 135 44 169 146 74 211 248 249 78 94 0 0 0 1 24 72 56 22 141 170 58 90 163 187 180 242 135 44 169 146 74 211 248 249 78 94 0 0 0 0 88 212 210 42 73 12 25 196 31 47 75 120 243 73 247 127 147 72 96 165 96 14 69 196 39 172 6 5 194 11 134 119 124 92 255 174 158 25 36 41 88 174 179 156 60 218 178 156 41 175 187 120 209 98 0 19 182 231 198 178 95 52 119 23 97 47 127 143 101 176 216 52 159 106 61 182 27 146 186 142 96 231 29 27 0 0 0 0 0 1 88 212 210 42 73 12 25 196 31 47 75 120 243 73 247 127 147 72 96 165 96 14 69 196 39 172 6 5 194 11 134 119 124 92 255 174 158 25 36 41 88 174 179 156 60 218 178 156 41 175 187 120 209 98 0 19 182 231 198 178 95 52 119 23 97 47 127 143 101 176 216 52 159 106 61 182 27 146 186 142 96 231 29 27 0 0 0 0 0 0 16 202 192 8 50 72 83 78 188 175 88 50 125 131 102 195 3 1 16 202 192 8 50 72 83 78 188 175 88 50 125 131 102 195 3 0 64 129 235 99 25 168 162 143 14 181 191 24 1 54 4 85 204 63 111 78 71 241 253 45 225 56 177 121 166 226 7 163 1 182 155 9 74 40 35 9 9 175 144 171 35 224 162 163 133 97 35 188 126 220 236 73 96 97 129 14 0 0 0 0 0 1 64 129 235 99 25 168 162 143 14 181 191 24 1 54 4 85 204 63 111 78 71 241 253 45 225 56 177 121 166 226 7 163 1 182 155 9 74 40 35 9 9 175 144 171 35 224 162 163 133 97 35 188 126 220 236 73 96 97 129 14 0 0 0 0 0 0 64 108 92 234 131 231 188 232 51 18 198 215 40 15 157 152 141 79 144 203 196 249 187 115 41 230 177 33 50 91 32 10 169 73 162 155 234 98 212 245 92 106 18 104 75 83 194 149 253 23 63 13 64 214 243 154 201 132 100 31 187 255 119 206 203 1 64 108 92 234 131 231 188 232 51 18 198 215 40 15 157 152 141 79 144 203 196 249 187 115 41 230 177 33 50 91 32 10 169 73 162 155 234 98 212 245 92 106 18 104 75 83 194 149 253 23 63 13 64 214 243 154 201 132 100 31 187 255 119 206 203 0 104 234 116 169 65 23 182 136 224 163 211 105 192 204 31 82 240 175 46 102 159 95 158 50 9 145 106 22 60 50 33 177 26 225 82 114 86 212 7 154 44 212 126 161 171 72 116 119 246 52 229 38 173 55 41 107 40 184 253 98 215 24 91 66 142 30 173 123 90 125 69 86 227 60 60 95 206 124 147 44 60 155 141 241 90 83 7 53 206 71 46 134 127 122 180 31 53 82 214 176 0 0 0 0 0 1 104 234 116 169 65 23 182 136 224 163 211 105 192 204 31 82 240 175 46 102 159 95 158 50 9 145 106 22 60 50 33 177 26 225 82 114 86 212 7 154 44 212 126 161 171 72 116 119 246 52 229 38 173 55 41 107 40 184 253 98 215 24 91 66 142 30 173 123 90 125 69 86 227 60 60 95 206 124 147 44 60 155 141 241 90 83 7 53 206 71 46 134 127 122 180 31 53 82 214 176 0 0 0 0 0 0 128 246 224 179 231 248 85 24 201 210 110 165 232 153 136 96 155 10 189 255 115 232 19 11 61 42 152 98 194 221 200 42 3 215 220 12 102 106 69 77 69 216 253 146 196 230 240 63 118 205 224 76 129 107 174 183 121 74 199 99 224 180 49 180 47 34 35 35 224 247 193 61 42 51 142 16 105 58 239 223 3 189 5 85 19 221 249 251 255 86 9 113 209 31 184 51 28 17 30 9 254 164 62 237 123 73 56 8 110 166 164 217 88 106 22 85 183 98 156 139 221 73 253 52 0 0 0 0 0 1 128 246 224 179 231 248 85 24 201 210 110 165 232 153 136 96 155 10 189 255 115 232 19 11 61 42 152 98 194 221 200 42 3 215 220 12 102 106 69 77 69 216 253 146 196 230 240 63 118 205 224 76 129 107 174 183 121 74 199 99 224 180 49 180 47 34 35 35 224 247 193 61 42 51 142 16 105 58 239 223 3 189 5 85 19 221 249 251 255 86 9 113 209 31 184 51 28 17 30 9 254 164 62 237 123 73 56 8 110 166 164 217 88 106 22 85 183 98 156 139 221 73 253 52 0 0 0 0 0 0 80 114 71 65 89 237 36 19 196 155 136 82 8 202 243 70 78 29 120 129 104 2 108 32 185 184 120 36 214 143 191 219 217 92 173 243 221 253 134 71 240 107 182 126 78 197 54 130 17 174 97 201 95 84 153 156 87 239 78 186 103 226 240 168 109 214 167 102 253 22 173 79 216 165 16 0 0 0 0 0 0 1 80 114 71 65 89 237 36 19 196 155 136 82 8 202 243 70 78 29 120 129 104 2 108 32 185 184 120 36 214 143 191 219 217 92 173 243 221 253 134 71 240 107 182 126 78 197 54 130 17 174 97 201 95 84 153 156 87 239 78 186 103 226 240 168 109 214 167 102 253 22 173 79 216 165 16 0 0 0 0 0 0 0 48 205 174 153 159 175 148 18 158 235 107 21 147 172 130 150 6 109 216 1 3 85 18 35 218 2 59 66 219 110 2 146 243 32 186 68 69 178 58 234 207 205 114 206 3 0 0 0 0 1 48 205 174 153 159 175 148 18 158 235 107 21 147 172 130 150 6 109 216 1 3 85 18 35 218 2 59 66 219 110 2 146 243 32 186 68 69 178 58 234 207 205 114 206 3 0 0 0 0 0 120 6 227 111 143 56 164 39 218 18 125 60 7 225 195 8 232 184 177 163 16 21 29 165 72 172 201 28 230 132 0 86 23 246 125 104 127 83 109 13 113 149 216 245 166 173 128 120 168 110 19 178 216 69 212 66 94 179 133 240 181 66 121 14 166 89 77 60 143 152 41 85 140 62 121 51 44 123 188 123 173 52 74 2 31 233 7 229 187 139 234 225 45 79 247 235 210 113 240 84 200 66 137 125 254 189 83 79 17 221 213 32 54 4 0 0 0 0 0 0 0 1 120 6 227 111 143 56 164 39 218 18 125 60 7 225 195 8 232 184 177 163 16 21 29 165 72 172 201 28 230 132 0 86 23 246 125 104 127 83 109 13 113 149 216 245 166 173 128 120 168 110 19 178 216 69 212 66 94 179 133 240 181 66 121 14 166 89 77 60 143 152 41 85 140 62 121 51 44 123 188 123 173 52 74 2 31 233 7 229 187 139 234 225 45 79 247 235 210 113 240 84 200 66 137 125 254 189 83 79 17 221 213 32 54 4 0 0 0 0 0 0 0 0 80 180 196 94 156 54 195 58 2 39 205 18 27 183 204 87 155 155 103 140 143 118 225 162 141 198 191 103 246 251 35 33 200 114 204 108 157 138 202 183 109 135 225 247 167 85 247 149 166 13 150 140 115 191 119 88 74 150 209 45 234 64 143 177 65 18 230 195 62 134 19 33 86 117 177 249 0 0 0 0 0 1 80 180 196 94 156 54 195 58 2 39 205 18 27 183 204 87 155 155 103 140 143 118 225 162 141 198 191 103 246 251 35 33 200 114 204 108 157 138 202 183 109 135 225 247 167 85 247 149 166 13 150 140 115 191 119 88 74 150 209 45 234 64 143 177 65 18 230 195 62 134 19 33 86 117 177 249 0 0 0 0 0 0 104 77 194 158 250 209 247 60 209 53 237 237 50 69 209 78 167 168 156 255 102 176 89 29 124 236 2 92 64 171 213 222 61 154 151 17 221 163 26 188 48 218 181 25 207 24 78 174 96 77 4 92 36 81 77 82 53 226 55 109 24 229 73 137 228 213 186 236 231 140 148 101 63 106 130 255 94 160 246 229 63 254 107 254 48 15 56 43 131 180 38 166 178 234 233 86 61 2 85 154 172 81 81 66 9 1 104 77 194 158 250 209 247 60 209 53 237 237 50 69 209 78 167 168 156 255 102 176 89 29 124 236 2 92 64 171 213 222 61 154 151 17 221 163 26 188 48 218 181 25 207 24 78 174 96 77 4 92 36 81 77 82 53 226 55 109 24 229 73 137 228 213 186 236 231 140 148 101 63 106 130 255 94 160 246 229 63 254 107 254 48 15 56 43 131 180 38 166 178 234 233 86 61 2 85 154 172 81 81 66 9 0 32 159 255 244 214 47 170 4 34 47 46 170 236 221 0 119 135 29 199 192 21 169 211 135 216 147 25 112 187 63 0 0 0 1 32 159 255 244 214 47 170 4 34 47 46 170 236 221 0 119 135 29 199 192 21 169 211 135 216 147 25 112 187 63 0 0 0 0 8 136 102 2 0 0 0 0 0 1 8 136 102 2 0 0 0 0 0 0 104 182 114 42 214 204 210 88 197 7 199 39 124 27 200 142 13 162 188 42 112 118 92 202 215 78 160 112 52 72 100 65 30 205 199 86 182 35 211 245 70 139 86 183 94 139 115 30 32 188 225 10 237 169 169 192 188 84 209 158 78 210 48 148 84 141 6 11 247 62 239 52 100 249 186 173 138 163 134 212 20 243 14 250 162 155 177 89 175 243 3 44 202 80 198 163 43 3 0 0 0 0 0 0 0 1 104 182 114 42 214 204 210 88 197 7 199 39 124 27 200 142 13 162 188 42 112 118 92 202 215 78 160 112 52 72 100 65 30 205 199 86 182 35 211 245 70 139 86 183 94 139 115 30 32 188 225 10 237 169 169 192 188 84 209 158 78 210 48 148 84 141 6 11 247 62 239 52 100 249 186 173 138 163 134 212 20 243 14 250 162 155 177 89 175 243 3 44 202 80 198 163 43 3 0 0 0 0 0 0 0 0 112 99 120 242 101 168 63 63 168 132 177 224 65 190 4 179 252 98 42 247 140 190 31 23 0 117 179 116 199 98 202 211 102 139 65 63 177 51 13 22 232 149 208 247 101 128 25 173 165 160 191 102 145 173 51 230 242 244 7 170 233 242 115 73 120 62 67 64 36 3 41 74 159 24 59 71 166 190 104 193 40 86 159 53 253 65 67 111 21 48 43 46 214 182 41 210 212 59 110 156 33 239 225 212 27 107 0 0 0 0 0 0 0 1 112 99 120 242 101 168 63 63 168 132 177 224 65 190 4 179 252 98 42 247 140 190 31 23 0 117 179 116 199 98 202 211 102 139 65 63 177 51 13 22 232 149 208 247 101 128 25 173 165 160 191 102 145 173 51 230 242 244 7 170 233 242 115 73 120 62 67 64 36 3 41 74 159 24 59 71 166 190 104 193 40 86 159 53 253 65 67 111 21 48 43 46 214 182 41 210 212 59 110 156 33 239 225 212 27 107 0 0 0 0 0 0 0 0 40 182 35 41 118 252 144 79 94 31 128 26 169 129 98 79 185 77 204 158 170 99 105 83 166 57 204 35 71 231 68 17 161 7 0 0 0 0 0 0 0 1 40 182 35 41 118 252 144 79 94 31 128 26 169 129 98 79 185 77 204 158 170 99 105 83 166 57 204 35 71 231 68 17 161 7 0 0 0 0 0 0 0 0 112 19 121 68 172 165 141 93 53 202 225 143 125 21 127 168 150 223 142 78 163 244 135 194 197 17 161 238 159 225 207 232 231 141 188 186 185 170 238 141 145 164 234 7 144 31 97 144 227 0 100 164 181 137 33 28 59 136 10 218 56 168 254 166 106 145 203 39 49 163 15 174 143 31 5 178 130 153 84 87 87 61 221 163 29 252 65 53 122 68 235 160 127 229 67 219 215 172 22 9 124 37 73 237 104 38 0 0 0 0 0 0 0 1 112 19 121 68 172 165 141 93 53 202 225 143 125 21 127 168 150 223 142 78 163 244 135 194 197 17 161 238 159 225 207 232 231 141 188 186 185 170 238 141 145 164 234 7 144 31 97 144 227 0 100 164 181 137 33 28 59 136 10 218 56 168 254 166 106 145 203 39 49 163 15 174 143 31 5 178 130 153 84 87 87 61 221 163 29 252 65 53 122 68 235 160 127 229 67 219 215 172 22 9 124 37 73 237 104 38 0 0 0 0 0 0 0 0 72 131 157 197 45 185 223 236 53 246 15 184 5 182 184 23 147 3 15 46 179 218 118 209 114 37 235 220 187 201 154 47 207 166 122 35 26 91 3 127 154 179 249 232 233 237 129 34 68 202 138 161 0 13 77 112 252 203 92 187 188 230 39 55 132 247 0 0 0 0 0 0 0 1 72 131 157 197 45 185 223 236 53 246 15 184 5 182 184 23 147 3 15 46 179 218 118 209 114 37 235 220 187 201 154 47 207 166 122 35 26 91 3 127 154 179 249 232 233 237 129 34 68 202 138 161 0 13 77 112 252 203 92 187 188 230 39 55 132 247 0 0 0 0 0 0 0 0 128 215 194 0 199 219 223 102 242 204 248 124 17 112 73 119 161 49 131 84 207 207 67 43 12 67 150 210 126 148 3 13 241 16 225 134 108 33 87 2 157 76 211 58 133 210 144 225 220 56 131 147 199 231 84 32 218 43 221 252 165 30 119 252 165 229 211 167 197 150 182 197 108 234 8 252 127 239 35 237 26 80 187 183 139 105 103 168 55 42 221 202 112 37 234 50 199 248 234 249 61 133 62 20 172 135 114 63 241 161 127 1 136 155 71 88 83 222 156 240 240 1 0 0 0 0 0 0 0 1 128 215 194 0 199 219 223 102 242 204 248 124 17 112 73 119 161 49 131 84 207 207 67 43 12 67 150 210 126 148 3 13 241 16 225 134 108 33 87 2 157 76 211 58 133 210 144 225 220 56 131 147 199 231 84 32 218 43 221 252 165 30 119 252 165 229 211 167 197 150 182 197 108 234 8 252 127 239 35 237 26 80 187 183 139 105 103 168 55 42 221 202 112 37 234 50 199 248 234 249 61 133 62 20 172 135 114 63 241 161 127 1 136 155 71 88 83 222 156 240 240 1 0 0 0 0 0 0 0 0 96 77 228 31 76 241 138 249 4 98 9 115 184 112 82 183 229 236 138 162 82 102 251 28 188 12 113 181 158 79 211 194 251 196 166 73 83 83 80 42 120 93 243 152 162 232 39 205 85 189 126 54 242 156 193 86 191 44 44 252 55 14 21 27 116 194 191 250 7 74 203 105 99 89 106 178 14 2 236 178 68 170 192 252 120 41 130 72 87 206 11 0 0 0 0 0 0 1 96 77 228 31 76 241 138 249 4 98 9 115 184 112 82 183 229 236 138 162 82 102 251 28 188 12 113 181 158 79 211 194 251 196 166 73 83 83 80 42 120 93 243 152 162 232 39 205 85 189 126 54 242 156 193 86 191 44 44 252 55 14 21 27 116 194 191 250 7 74 203 105 99 89 106 178 14 2 236 178 68 170 192 252 120 41 130 72 87 206 11 0 0 0 0 0 0 0 56 134 225 44 69 119 64 234 84 89 109 244 85 126 103 94 170 253 103 245 228 230 48 38 166 108 164 43 22 74 31 25 224 196 60 126 145 211 177 41 97 248 197 232 65 242 142 255 87 64 104 166 218 221 0 0 0 1 56 134 225 44 69 119 64 234 84 89 109 244 85 126 103 94 170 253 103 245 228 230 48 38 166 108 164 43 22 74 31 25 224 196 60 126 145 211 177 41 97 248 197 232 65 242 142 255 87 64 104 166 218 221 0 0 0 0 120 229 172 191 36 121 40 254 104 25 228 24 190 128 20 169 193 240 145 60 136 35 241 68 254 62 193 45 112 102 236 245 29 64 94 62 47 36 42 252 13 28 27 219 9 245 94 181 136 19 177 1 212 5 30 243 157 117 94 95 128 151 156 4 203 11 190 27 0 62 198 137 167 143 73 204 232 2 248 129 253 159 82 186 78 87 59 101 197 100 160 249 30 152 93 125 199 107 24 125 64 176 236 44 0 171 123 140 55 132 181 2 66 228 115 0 0 0 0 0 0 1 120 229 172 191 36 121 40 254 104 25 228 24 190 128 20 169 193 240 145 60 136 35 241 68 254 62 193 45 112 102 236 245 29 64 94 62 47 36 42 252 13 28 27 219 9 245 94 181 136 19 177 1 212 5 30 243 157 117 94 95 128 151 156 4 203 11 190 27 0 62 198 137 167 143 73 204 232 2 248 129 253 159 82 186 78 87 59 101 197 100 160 249 30 152 93 125 199 107 24 125 64 176 236 44 0 171 123 140 55 132 181 2 66 228 115 0 0 0 0 0 0 0 56 242 178 209 149 127 105 215 100 20 77 91 129 188 44 67 89 61 245 2 145 100 176 98 45 200 226 215 226 171 178 81 56 196 210 25 211 24 236 80 114 182 153 187 70 254 227 193 36 163 1 237 117 87 122 2 0 1 56 242 178 209 149 127 105 215 100 20 77 91 129 188 44 67 89 61 245 2 145 100 176 98 45 200 226 215 226 171 178 81 56 196 210 25 211 24 236 80 114 182 153 187 70 254 227 193 36 163 1 237 117 87 122 2 0 0 128 134 51 146 212 174 146 101 32 54 80 14 156 174 236 212 195 81 90 58 116 149 201 205 7 130 14 255 190 241 205 207 249 221 121 67 167 233 3 91 49 79 77 255 115 246 112 74 5 197 106 119 29 238 202 62 53 27 223 236 152 234 237 36 19 234 248 83 103 87 80 106 110 27 202 134 182 123 143 10 59 147 105 206 20 112 193 190 220 192 38 172 241 167 90 129 71 185 246 137 86 12 195 102 17 186 107 173 97 103 140 196 114 119 155 196 217 44 13 55 170 195 147 93 0 0 0 0 0 1 128 134 51 146 212 174 146 101 32 54 80 14 156 174 236 212 195 81 90 58 116 149 201 205 7 130 14 255 190 241 205 207 249 221 121 67 167 233 3 91 49 79 77 255 115 246 112 74 5 197 106 119 29 238 202 62 53 27 223 236 152 234 237 36 19 234 248 83 103 87 80 106 110 27 202 134 182 123 143 10 59 147 105 206 20 112 193 190 220 192 38 172 241 167 90 129 71 185 246 137 86 12 195 102 17 186 107 173 97 103 140 196 114 119 155 196 217 44 13 55 170 195 147 93 0 0 0 0 0 0 80 252 151 248 45 49 178 79 128 161 10 102 252 132 63 0 196 234 37 213 196 19 233 200 48 79 135 72 224 67 120 56 21 130 243 118 44 119 71 20 190 181 163 216 126 133 133 98 134 74 16 85 129 28 141 49 184 195 10 187 170 152 61 100 174 129 141 139 49 17 137 166 184 197 148 14 0 0 0 0 0 1 80 252 151 248 45 49 178 79 128 161 10 102 252 132 63 0 196 234 37 213 196 19 233 200 48 79 135 72 224 67 120 56 21 130 243 118 44 119 71 20 190 181 163 216 126 133 133 98 134 74 16 85 129 28 141 49 184 195 10 187 170 152 61 100 174 129 141 139 49 17 137 166 184 197 148 14 0 0 0 0 0 0 72 201 189 132 146 184 73 235 58 191 160 218 55 99 221 69 240 85 82 95 206 66 232 212 65 234 63 77 180 226 245 185 90 39 91 117 118 212 95 63 202 231 49 115 110 103 125 28 251 84 217 64 21 37 74 176 91 16 243 99 51 19 229 146 28 76 167 138 98 3 86 2 0 1 72 201 189 132 146 184 73 235 58 191 160 218 55 99 221 69 240 85 82 95 206 66 232 212 65 234 63 77 180 226 245 185 90 39 91 117 118 212 95 63 202 231 49 115 110 103 125 28 251 84 217 64 21 37 74 176 91 16 243 99 51 19 229 146 28 76 167 138 98 3 86 2 0 0 24 4 127 113 119 170 147 209 114 124 184 151 70 216 77 57 33 8 170 193 201 10 0 0 0 1 24 4 127 113 119 170 147 209 114 124 184 151 70 216 77 57 33 8 170 193 201 10 0 0 0 0 24 221 119 146 70 38 139 89 31 158 39 212 71 222 63 236 44 183 75 0 0 0 0 0 0 1 24 221 119 146 70 38 139 89 31 158 39 212 71 222 63 236 44 183 75 0 0 0 0 0 0 0 104 15 190 40 142 118 234 227 167 165 244 200 26 49 57 37 9 217 227 141 192 139 18 100 130 160 53 103 125 170 120 113 53 121 232 23 248 218 111 12 114 85 152 168 69 138 153 228 55 175 99 6 29 234 191 118 238 18 250 139 127 248 148 96 36 236 164 252 127 71 230 13 95 200 86 106 201 201 168 74 148 207 42 56 34 173 114 89 220 58 197 209 56 194 93 253 36 57 2 0 0 0 0 0 0 1 104 15 190 40 142 118 234 227 167 165 244 200 26 49 57 37 9 217 227 141 192 139 18 100 130 160 53 103 125 170 120 113 53 121 232 23 248 218 111 12 114 85 152 168 69 138 153 228 55 175 99 6 29 234 191 118 238 18 250 139 127 248 148 96 36 236 164 252 127 71 230 13 95 200 86 106 201 201 168 74 148 207 42 56 34 173 114 89 220 58 197 209 56 194 93 253 36 57 2 0 0 0 0 0 0 0 24 241 138 87 82 7 150 25 154 252 91 216 29 106 84 123 71 145 238 230 5 0 0 0 0 1 24 241 138 87 82 7 150 25 154 252 91 216 29 106 84 123 71 145 238 230 5 0 0 0 0 0 32 151 63 193 99 4 229 248 206 122 164 94 141 132 110 0 199 239 244 9 150 62 180 68 138 132 112 26 31 217 46 0 0 1 32 151 63 193 99 4 229 248 206 122 164 94 141 132 110 0 199 239 244 9 150 62 180 68 138 132 112 26 31 217 46 0 0 0 40 151 219 5 222 229 79 21 136 176 12 133 59 166 175 203 218 102 58 176 141 26 127 152 21 81 49 214 17 132 22 14 243 177 3 0 0 0 0 0 0 1 40 151 219 5 222 229 79 21 136 176 12 133 59 166 175 203 218 102 58 176 141 26 127 152 21 81 49 214 17 132 22 14 243 177 3 0 0 0 0 0 0 0 104 6 168 179 178 70 132 236 140 85 20 22 237 179 132 40 18 248 209 250 75 115 245 45 67 206 107 231 237 102 198 61 0 53 181 149 233 167 119 49 80 107 58 194 191 82 80 182 33 90 50 185 65 82 236 47 123 143 42 21 75 76 220 97 26 140 95 213 177 133 178 200 249 254 187 252 127 168 64 33 103 133 36 183 203 53 160 28 249 121 153 43 163 187 30 115 14 218 222 176 173 69 117 99 12 1 104 6 168 179 178 70 132 236 140 85 20 22 237 179 132 40 18 248 209 250 75 115 245 45 67 206 107 231 237 102 198 61 0 53 181 149 233 167 119 49 80 107 58 194 191 82 80 182 33 90 50 185 65 82 236 47 123 143 42 21 75 76 220 97 26 140 95 213 177 133 178 200 249 254 187 252 127 168 64 33 103 133 36 183 203 53 160 28 249 121 153 43 163 187 30 115 14 218 222 176 173 69 117 99 12 0 112 2 212 34 173 196 82 79 56 112 170 220 63 200 109 239 119 47 163 110 174 76 171 32 84 196 96 74 147 73 116 212 7 81 2 123 170 250 193 70 154 132 132 185 57 39 161 95 139 69 234 233 243 142 195 223 169 214 193 142 130 202 53 250 215 1 232 72 89 42 138 164 214 96 81 207 117 204 208 64 159 221 205 19 127 120 90 20 23 72 45 155 78 40 43 86 112 83 186 201 240 77 86 191 92 249 160 247 61 0 0 0 0 1 112 2 212 34 173 196 82 79 56 112 170 220 63 200 109 239 119 47 163 110 174 76 171 32 84 196 96 74 147 73 116 212 7 81 2 123 170 250 193 70 154 132 132 185 57 39 161 95 139 69 234 233 243 142 195 223 169 214 193 142 130 202 53 250 215 1 232 72 89 42 138 164 214 96 81 207 117 204 208 64 159 221 205 19 127 120 90 20 23 72 45 155 78 40 43 86 112 83 186 201 240 77 86 191 92 249 160 247 61 0 0 0 0 0 128 102 251 156 92 43 108 29 62 40 215 42 15 198 118 248 50 157 25 129 219 206 70 124 249 193 82 122 51 209 211 166 198 129 204 78 210 123 124 106 191 69 198 115 9 187 105 170 16 189 25 66 30 61 214 177 166 27 0 66 226 174 106 52 23 197 236 68 43 88 169 245 109 62 252 144 219 129 154 127 116 74 210 197 53 171 56 209 150 200 215 71 80 187 84 179 235 71 14 27 0 159 145 132 91 170 69 4 77 60 185 156 0 93 72 67 68 185 235 189 29 178 144 42 227 35 59 27 0 1 128 102 251 156 92 43 108 29 62 40 215 42 15 198 118 248 50 157 25 129 219 206 70 124 249 193 82 122 51 209 211 166 198 129 204 78 210 123 124 106 191 69 198 115 9 187 105 170 16 189 25 66 30 61 214 177 166 27 0 66 226 174 106 52 23 197 236 68 43 88 169 245 109 62 252 144 219 129 154 127 116 74 210 197 53 171 56 209 150 200 215 71 80 187 84 179 235 71 14 27 0 159 145 132 91 170 69 4 77 60 185 156 0 93 72 67 68 185 235 189 29 178 144 42 227 35 59 27 0 0 40 22 179 130 104 210 45 171 95 5 140 87 49 187 173 206 147 141 26 50 138 30 228 117 173 59 57 138 187 138 30 79 102 10 0 0 0 0 0 0 0 1 40 22 179 130 104 210 45 171 95 5 140 87 49 187 173 206 147 141 26 50 138 30 228 117 173 59 57 138 187 138 30 79 102 10 0 0 0 0 0 0 0 0 48 245 222 165 23 160 186 7 2 211 238 67 132 133 157 254 89 199 178 45 73 151 206 197 254 6 172 31 88 199 204 161 72 65 160 25 246 142 223 123 52 172 12 6 0 0 0 0 0 1 48 245 222 165 23 160 186 7 2 211 238 67 132 133 157 254 89 199 178 45 73 151 206 197 254 6 172 31 88 199 204 161 72 65 160 25 246 142 223 123 52 172 12 6 0 0 0 0 0 0 112 222 47 68 13 28 124 145 191 235 84 137 87 165 230 34 132 42 90 242 140 248 118 51 137 4 68 91 156 194 220 89 46 217 200 72 50 124 24 209 194 179 150 236 12 223 90 150 72 220 112 234 137 123 179 108 65 16 250 73 68 13 219 174 119 68 216 117 5 143 105 238 147 162 128 99 201 30 204 31 130 46 147 73 191 185 192 73 212 83 18 90 106 146 126 18 59 63 194 86 25 42 52 82 92 6 0 0 0 0 0 0 0 1 112 222 47 68 13 28 124 145 191 235 84 137 87 165 230 34 132 42 90 242 140 248 118 51 137 4 68 91 156 194 220 89 46 217 200 72 50 124 24 209 194 179 150 236 12 223 90 150 72 220 112 234 137 123 179 108 65 16 250 73 68 13 219 174 119 68 216 117 5 143 105 238 147 162 128 99 201 30 204 31 130 46 147 73 191 185 192 73 212 83 18 90 106 146 126 18 59 63 194 86 25 42 52 82 92 6 0 0 0 0 0 0 0 0 40 74 204 182 19 172 57 74 106 161 11 250 172 174 63 33 117 146 108 133 108 20 20 28 215 14 216 35 120 250 72 181 31 75 237 185 64 125 38 30 0 1 40 74 204 182 19 172 57 74 106 161 11 250 172 174 63 33 117 146 108 133 108 20 20 28 215 14 216 35 120 250 72 181 31 75 237 185 64 125 38 30 0 0 32 39 90 158 132 213 173 24 145 199 200 240 251 85 122 152 148 224 56 26 234 37 58 180 82 137 37 60 8 144 85 118 5 1 32 39 90 158 132 213 173 24 145 199 200 240 251 85 122 152 148 224 56 26 234 37 58 180 82 137 37 60 8 144 85 118 5 0 8 138 84 0 0 0 0 0 0 1 8 138 84 0 0 0 0 0 0 0 120 6 116 242 108 248 14 140 127 243 249 231 147 68 151 120 38 231 8 34 6 106 4 211 91 3 66 139 242 76 75 130 178 43 63 174 27 78 5 184 165 84 187 23 158 140 41 71 59 22 178 59 239 6 145 6 103 216 172 37 75 231 145 41 56 213 208 27 181 52 16 183 237 193 209 238 106 47 104 214 15 82 217 35 168 104 64 76 104 111 95 151 127 241 27 86 63 95 186 251 237 14 164 119 230 211 234 83 245 143 10 244 120 135 32 125 144 92 8 189 0 1 120 6 116 242 108 248 14 140 127 243 249 231 147 68 151 120 38 231 8 34 6 106 4 211 91 3 66 139 242 76 75 130 178 43 63 174 27 78 5 184 165 84 187 23 158 140 41 71 59 22 178 59 239 6 145 6 103 216 172 37 75 231 145 41 56 213 208 27 181 52 16 183 237 193 209 238 106 47 104 214 15 82 217 35 168 104 64 76 104 111 95 151 127 241 27 86 63 95 186 251 237 14 164 119 230 211 234 83 245 143 10 244 120 135 32 125 144 92 8 189 0 0 32 169 164 216 5 23 138 199 97 227 119 26 63 15 87 131 107 175 132 108 223 46 17 101 176 195 214 100 232 0 0 0 0 1 32 169 164 216 5 23 138 199 97 227 119 26 63 15 87 131 107 175 132 108 223 46 17 101 176 195 214 100 232 0 0 0 0 0 48 8 170 244 92 198 184 32 64 24 118 241 85 66 189 103 28 33 244 60 230 74 7 243 100 2 1 93 74 149 165 150 65 102 220 228 186 83 101 123 141 123 109 182 122 105 0 0 0 1 48 8 170 244 92 198 184 32 64 24 118 241 85 66 189 103 28 33 244 60 230 74 7 243 100 2 1 93 74 149 165 150 65 102 220 228 186 83 101 123 141 123 109 182 122 105 0 0 0 0 120 12 158 20 122 77 167 176 86 158 51 230 99 136 241 101 17 244 121 59 87 103 26 111 205 53 244 235 242 229 169 15 224 95 241 248 47 71 217 197 177 238 46 133 175 43 178 246 61 15 216 239 68 140 164 169 9 17 109 185 231 2 170 188 140 250 123 194 232 88 232 26 60 214 152 106 181 39 234 136 137 58 62 209 190 251 104 89 19 70 178 56 124 109 18 185 167 142 60 123 228 26 54 187 187 148 203 130 114 248 49 111 198 191 107 86 222 3 0 0 0 1 120 12 158 20 122 77 167 176 86 158 51 230 99 136 241 101 17 244 121 59 87 103 26 111 205 53 244 235 242 229 169 15 224 95 241 248 47 71 217 197 177 238 46 133 175 43 178 246 61 15 216 239 68 140 164 169 9 17 109 185 231 2 170 188 140 250 123 194 232 88 232 26 60 214 152 106 181 39 234 136 137 58 62 209 190 251 104 89 19 70 178 56 124 109 18 185 167 142 60 123 228 26 54 187 187 148 203 130 114 248 49 111 198 191 107 86 222 3 0 0 0 0 32 105 179 233 126 169 174 183 251 227 117 195 127 211 122 235 34 108 161 29 184 19 156 152 225 139 6 0 0 0 0 0 0 1 32 105 179 233 126 169 174 183 251 227 117 195 127 211 122 235 34 108 161 29 184 19 156 152 225 139 6 0 0 0 0 0 0 0 112 107 214 160 47 12 148 181 229 136 85 57 117 58 49 175 91 20 92 201 244 247 222 130 215 158 98 242 146 190 210 201 180 77 219 243 130 159 138 227 73 54 255 186 170 144 106 170 66 197 143 127 162 210 122 37 99 171 90 242 115 145 250 57 97 176 167 16 225 132 49 247 59 22 25 236 36 64 252 125 139 145 215 22 92 228 240 79 244 183 178 12 93 194 169 217 159 169 69 179 171 96 5 35 137 33 198 85 237 12 0 0 0 1 112 107 214 160 47 12 148 181 229 136 85 57 117 58 49 175 91 20 92 201 244 247 222 130 215 158 98 242 146 190 210 201 180 77 219 243 130 159 138 227 73 54 255 186 170 144 106 170 66 197 143 127 162 210 122 37 99 171 90 242 115 145 250 57 97 176 167 16 225 132 49 247 59 22 25 236 36 64 252 125 139 145 215 22 92 228 240 79 244 183 178 12 93 194 169 217 159 169 69 179 171 96 5 35 137 33 198 85 237 12 0 0 0 0 40 151 236 140 234 49 95 40 136 48 181 242 198 107 168 119 133 33 148 222 230 48 187 177 235 54 92 147 200 220 8 9 80 3 0 0 0 0 0 0 0 1 40 151 236 140 234 49 95 40 136 48 181 242 198 107 168 119 133 33 148 222 230 48 187 177 235 54 92 147 200 220 8 9 80 3 0 0 0 0 0 0 0 0 128 86 110 24 37 97 222 163 92 216 221 199 229 79 95 24 16 74 176 194 98 40 169 140 19 1 205 231 70 185 36 255 18 60 202 214 208 120 214 232 112 172 228 176 230 94 127 136 74 11 44 237 249 68 118 244 151 238 132 77 38 186 252 14 206 146 197 57 245 192 244 29 199 74 59 195 148 69 151 165 29 107 182 98 147 191 148 189 200 184 33 221 44 102 236 230 236 155 131 213 212 11 163 71 97 118 61 218 110 71 189 129 17 181 221 250 137 80 48 231 83 123 104 6 0 0 0 0 0 1 128 86 110 24 37 97 222 163 92 216 221 199 229 79 95 24 16 74 176 194 98 40 169 140 19 1 205 231 70 185 36 255 18 60 202 214 208 120 214 232 112 172 228 176 230 94 127 136 74 11 44 237 249 68 118 244 151 238 132 77 38 186 252 14 206 146 197 57 245 192 244 29 199 74 59 195 148 69 151 165 29 107 182 98 147 191 148 189 200 184 33 221 44 102 236 230 236 155 131 213 212 11 163 71 97 118 61 218 110 71 189 129 17 181 221 250 137 80 48 231 83 123 104 6 0 0 0 0 0 0 80 243 176 186 126 186 98 210 179 162 140 92 40 240 184 134 105 0 157 103 36 223 108 115 65 73 109 222 11 169 151 183 215 249 45 86 167 172 26 95 222 130 112 5 193 174 61 230 154 13 242 26 53 125 184 23 119 6 116 85 81 153 220 146 138 224 238 242 57 50 24 89 106 223 20 181 86 96 139 192 0 1 80 243 176 186 126 186 98 210 179 162 140 92 40 240 184 134 105 0 157 103 36 223 108 115 65 73 109 222 11 169 151 183 215 249 45 86 167 172 26 95 222 130 112 5 193 174 61 230 154 13 242 26 53 125 184 23 119 6 116 85 81 153 220 146 138 224 238 242 57 50 24 89 106 223 20 181 86 96 139 192 0 0 104 118 189 65 124 187 124 164 181 40 78 215 14 181 239 248 104 169 212 147 203 95 26 103 54 4 23 49 26 46 240 31 57 71 166 134 221 134 146 219 246 49 7 96 225 138 247 198 120 76 183 208 201 100 120 240 147 60 217 93 237 131 48 5 244 23 233 221 83 229 102 159 120 118 222 134 200 86 131 193 55 124 183 137 148 160 79 166 91 219 240 18 236 83 72 210 216 101 108 113 68 0 0 0 0 1 104 118 189 65 124 187 124 164 181 40 78 215 14 181 239 248 104 169 212 147 203 95 26 103 54 4 23 49 26 46 240 31 57 71 166 134 221 134 146 219 246 49 7 96 225 138 247 198 120 76 183 208 201 100 120 240 147 60 217 93 237 131 48 5 244 23 233 221 83 229 102 159 120 118 222 134 200 86 131 193 55 124 183 137 148 160 79 166 91 219 240 18 236 83 72 210 216 101 108 113 68 0 0 0 0 0 64 6 22 71 2 163 86 17 242 164 39 109 95 160 109 98 241 37 105 112 221 113 19 63 140 96 143 87 147 41 36 27 242 55 158 16 197 226 52 235 172 133 128 179 181 251 150 32 196 95 149 76 252 69 10 230 30 27 76 224 226 22 0 0 0 1 64 6 22 71 2 163 86 17 242 164 39 109 95 160 109 98 241 37 105 112 221 113 19 63 140 96 143 87 147 41 36 27 242 55 158 16 197 226 52 235 172 133 128 179 181 251 150 32 196 95 149 76 252 69 10 230 30 27 76 224 226 22 0 0 0 0 128 30 130 103 205 32 243 152 123 79 104 19 33 177 209 230 129 178 23 223 13 94 146 223 35 144 45 101 240 232 191 92 122 248 142 90 70 70 227 195 145 191 197 239 106 26 240 233 128 67 75 182 93 107 72 57 103 203 190 221 242 163 253 180 159 146 253 103 81 208 252 1 223 226 217 70 222 240 174 35 247 131 232 230 20 50 149 109 33 236 254 14 141 202 198 2 116 168 2 254 234 211 168 142 232 27 76 165 171 140 74 161 29 242 180 17 221 182 28 140 165 153 167 81 47 103 223 10 0 1 128 30 130 103 205 32 243 152 123 79 104 19 33 177 209 230 129 178 23 223 13 94 146 223 35 144 45 101 240 232 191 92 122 248 142 90 70 70 227 195 145 191 197 239 106 26 240 233 128 67 75 182 93 107 72 57 103 203 190 221 242 163 253 180 159 146 253 103 81 208 252 1 223 226 217 70 222 240 174 35 247 131 232 230 20 50 149 109 33 236 254 14 141 202 198 2 116 168 2 254 234 211 168 142 232 27 76 165 171 140 74 161 29 242 180 17 221 182 28 140 165 153 167 81 47 103 223 10 0 0 48 150 89 14 218 228 227 23 162 153 39 113 34 98 183 194 25 93 68 57 205 28 17 6 69 82 191 227 207 100 5 188 188 211 209 220 205 0 146 180 251 104 31 119 91 104 1 0 0 1 48 150 89 14 218 228 227 23 162 153 39 113 34 98 183 194 25 93 68 57 205 28 17 6 69 82 191 227 207 100 5 188 188 211 209 220 205 0 146 180 251 104 31 119 91 104 1 0 0 0 16 3 75 50 16 21 240 211 149 188 0 0 0 0 0 0 0 1 16 3 75 50 16 21 240 211 149 188 0 0 0 0 0 0 0 0 112 9 115 108 68 232 102 178 176 69 243 217 106 209 14 224 172 167 195 216 60 119 98 115 232 110 47 157 119 32 78 224 248 168 59 100 46 75 172 15 39 92 41 128 82 192 201 101 82 196 22 185 109 161 212 23 243 181 215 188 245 6 226 125 224 129 249 88 9 231 215 83 203 0 1 5 225 190 75 41 64 109 105 106 37 227 156 251 13 180 250 104 241 34 187 224 79 84 147 11 127 35 64 121 111 143 12 0 0 0 0 0 0 1 112 9 115 108 68 232 102 178 176 69 243 217 106 209 14 224 172 167 195 216 60 119 98 115 232 110 47 157 119 32 78 224 248 168 59 100 46 75 172 15 39 92 41 128 82 192 201 101 82 196 22 185 109 161 212 23 243 181 215 188 245 6 226 125 224 129 249 88 9 231 215 83 203 0 1 5 225 190 75 41 64 109 105 106 37 227 156 251 13 180 250 104 241 34 187 224 79 84 147 11 127 35 64 121 111 143 12 0 0 0 0 0 0 0 104 240 35 102 147 107 156 95 120 67 253 248 209 46 242 211 131 200 126 89 191 255 206 143 125 130 26 163 12 32 199 40 52 166 9 162 113 48 113 189 72 74 18 54 6 99 229 23 115 221 174 124 195 235 108 45 255 154 244 4 181 164 158 200 138 77 6 47 98 56 178 18 75 69 235 225 139 243 201 174 122 249 136 131 59 94 43 192 187 209 135 159 123 162 213 155 59 184 180 92 174 163 38 0 0 1 104 240 35 102 147 107 156 95 120 67 253 248 209 46 242 211 131 200 126 89 191 255 206 143 125 130 26 163 12 32 199 40 52 166 9 162 113 48 113 189 72 74 18 54 6 99 229 23 115 221 174 124 195 235 108 45 255 154 244 4 181 164 158 200 138 77 6 47 98 56 178 18 75 69 235 225 139 243 201 174 122 249 136 131 59 94 43 192 187 209 135 159 123 162 213 155 59 184 180 92 174 163 38 0 0 0 80 34 44 18 251 194 132 188 93 116 144 0 196 15 253 248 161 78 252 35 178 201 70 179 45 245 2 116 179 119 55 186 117 38 191 38 14 139 33 131 60 35 40 0 31 70 182 70 55 167 178 147 137 65 30 203 93 63 183 214 107 14 138 249 141 189 54 170 164 36 100 151 195 142 247 0 1 0 0 0 0 1 80 34 44 18 251 194 132 188 93 116 144 0 196 15 253 248 161 78 252 35 178 201 70 179 45 245 2 116 179 119 55 186 117 38 191 38 14 139 33 131 60 35 40 0 31 70 182 70 55 167 178 147 137 65 30 203 93 63 183 214 107 14 138 249 141 189 54 170 164 36 100 151 195 142 247 0 1 0 0 0 0 0 80 79 161 242 148 36 174 71 109 70 137 27 172 124 50 231 16 178 199 67 3 78 176 12 53 168 39 253 247 13 21 191 128 38 67 12 15 248 234 73 154 95 171 123 99 52 42 32 229 121 208 121 181 151 154 103 80 7 41 152 206 129 106 69 208 252 39 163 130 241 51 69 244 247 1 5 121 0 0 0 0 1 80 79 161 242 148 36 174 71 109 70 137 27 172 124 50 231 16 178 199 67 3 78 176 12 53 168 39 253 247 13 21 191 128 38 67 12 15 248 234 73 154 95 171 123 99 52 42 32 229 121 208 121 181 151 154 103 80 7 41 152 206 129 106 69 208 252 39 163 130 241 51 69 244 247 1 5 121 0 0 0 0 0 72 100 73 185 231 4 112 172 84 227 126 234 51 137 221 166 192 16 157 41 74 141 121 176 14 135 245 170 38 223 239 224 207 235 164 137 197 183 43 64 0 12 216 240 6 61 23 238 237 201 225 110 75 253 193 88 168 185 218 43 229 167 97 130 102 214 215 134 90 204 214 6 0 1 72 100 73 185 231 4 112 172 84 227 126 234 51 137 221 166 192 16 157 41 74 141 121 176 14 135 245 170 38 223 239 224 207 235 164 137 197 183 43 64 0 12 216 240 6 61 23 238 237 201 225 110 75 253 193 88 168 185 218 43 229 167 97 130 102 214 215 134 90 204 214 6 0 0 96 219 203 221 208 224 159 230 219 11 100 135 13 4 127 208 103 80 48 213 73 245 143 157 122 152 178 240 239 253 126 244 30 239 102 14 87 67 14 70 171 224 149 9 84 107 219 85 124 178 61 180 47 218 225 163 193 116 189 130 11 146 64 142 109 98 176 49 26 100 226 15 127 68 213 132 163 70 52 46 10 247 185 6 76 76 180 190 205 124 250 143 171 106 50 0 0 1 96 219 203 221 208 224 159 230 219 11 100 135 13 4 127 208 103 80 48 213 73 245 143 157 122 152 178 240 239 253 126 244 30 239 102 14 87 67 14 70 171 224 149 9 84 107 219 85 124 178 61 180 47 218 225 163 193 116 189 130 11 146 64 142 109 98 176 49 26 100 226 15 127 68 213 132 163 70 52 46 10 247 185 6 76 76 180 190 205 124 250 143 171 106 50 0 0 0 120 217 116 20 196 181 6 137 250 178 207 36 29 215 183 251 28 156 129 254 149 110 35 250 145 188 199 148 182 206 23 143 174 147 1 195 119 32 158 253 47 241 245 160 161 23 172 143 224 166 48 241 224 180 60 40 55 163 113 65 217 210 254 250 75 125 222 20 146 22 127 207 180 19 232 245 117 4 55 117 208 11 134 81 103 44 211 65 174 30 21 186 123 156 224 41 168 144 253 5 228 247 219 192 43 85 242 13 199 36 248 50 226 239 233 47 12 212 3 0 0 1 120 217 116 20 196 181 6 137 250 178 207 36 29 215 183 251 28 156 129 254 149 110 35 250 145 188 199 148 182 206 23 143 174 147 1 195 119 32 158 253 47 241 245 160 161 23 172 143 224 166 48 241 224 180 60 40 55 163 113 65 217 210 254 250 75 125 222 20 146 22 127 207 180 19 232 245 117 4 55 117 208 11 134 81 103 44 211 65 174 30 21 186 123 156 224 41 168 144 253 5 228 247 219 192 43 85 242 13 199 36 248 50 226 239 233 47 12 212 3 0 0 0 96 94 102 6 123 33 254 222 92 46 211 170 116 91 71 221 6 87 3 144 77 231 38 4 248 202 135 81 159 100 30 21 111 114 225 52 100 98 124 212 26 0 192 179 224 123 152 186 35 198 14 32 169 2 28 91 12 93 226 2 56 176 203 77 155 47 63 21 131 158 27 252 110 108 46 2 205 114 62 224 151 97 97 251 197 34 255 29 36 247 1 0 0 0 0 0 0 1 96 94 102 6 123 33 254 222 92 46 211 170 116 91 71 221 6 87 3 144 77 231 38 4 248 202 135 81 159 100 30 21 111 114 225 52 100 98 124 212 26 0 192 179 224 123 152 186 35 198 14 32 169 2 28 91 12 93 226 2 56 176 203 77 155 47 63 21 131 158 27 252 110 108 46 2 205 114 62 224 151 97 97 251 197 34 255 29 36 247 1 0 0 0 0 0 0 0 40 213 155 45 217 157 63 158 214 179 178 45 31 167 171 88 99 135 205 98 19 102 250 247 155 144 144 184 108 185 216 134 183 188 174 39 244 81 0 0 0 1 40 213 155 45 217 157 63 158 214 179 178 45 31 167 171 88 99 135 205 98 19 102 250 247 155 144 144 184 108 185 216 134 183 188 174 39 244 81 0 0 0 0 88 143 221 144 99 71 55 91 51 132 189 170 46 209 246 137 32 255 61 37 105 68 54 129 75 74 69 209 169 194 207 43 51 79 37 156 64 84 31 147 49 63 100 147 137 157 156 108 126 196 246 233 144 88 124 237 160 146 162 62 111 128 118 225 95 72 29 227 189 100 72 148 6 238 216 74 124 168 129 102 216 225 99 39 71 85 27 125 1 1 88 143 221 144 99 71 55 91 51 132 189 170 46 209 246 137 32 255 61 37 105 68 54 129 75 74 69 209 169 194 207 43 51 79 37 156 64 84 31 147 49 63 100 147 137 157 156 108 126 196 246 233 144 88 124 237 160 146 162 62 111 128 118 225 95 72 29 227 189 100 72 148 6 238 216 74 124 168 129 102 216 225 99 39 71 85 27 125 1 0 104 154 59 8 214 250 135 152 185 224 10 174 79 58 146 203 236 143 30 28 53 247 75 23 46 61 14 153 250 130 43 106 99 3 114 97 134 236 14 79 134 253 241 239 191 59 197 179 112 33 255 64 2 35 190 107 61 57 182 11 43 73 118 122 234 246 107 208 63 148 121 113 255 201 200 66 134 64 61 39 183 76 142 5 123 90 113 163 171 46 238 92 52 235 152 239 73 131 0 0 0 0 0 0 0 1 104 154 59 8 214 250 135 152 185 224 10 174 79 58 146 203 236 143 30 28 53 247 75 23 46 61 14 153 250 130 43 106 99 3 114 97 134 236 14 79 134 253 241 239 191 59 197 179 112 33 255 64 2 35 190 107 61 57 182 11 43 73 118 122 234 246 107 208 63 148 121 113 255 201 200 66 134 64 61 39 183 76 142 5 123 90 113 163 171 46 238 92 52 235 152 239 73 131 0 0 0 0 0 0 0 0 56 1 38 134 41 29 170 88 160 233 145 132 85 205 36 47 50 209 38 92 196 100 126 18 43 149 60 250 154 84 98 23 80 203 61 86 37 43 121 198 250 148 214 237 218 106 31 30 52 22 223 4 0 0 0 0 0 1 56 1 38 134 41 29 170 88 160 233 145 132 85 205 36 47 50 209 38 92 196 100 126 18 43 149 60 250 154 84 98 23 80 203 61 86 37 43 121 198 250 148 214 237 218 106 31 30 52 22 223 4 0 0 0 0 0 0 104 215 110 214 250 112 196 210 135 44 106 41 81 231 208 226 187 180 124 169 6 101 223 131 248 7 59 123 141 245 45 155 111 191 45 243 237 47 248 47 233 222 27 53 116 18 174 176 121 70 241 49 29 54 248 100 119 186 7 84 242 46 154 182 14 231 49 213 37 52 160 79 242 253 165 71 241 87 50 98 158 58 249 163 206 75 138 146 172 232 178 183 137 30 153 204 59 17 0 0 0 0 0 0 0 1 104 215 110 214 250 112 196 210 135 44 106 41 81 231 208 226 187 180 124 169 6 101 223 131 248 7 59 123 141 245 45 155 111 191 45 243 237 47 248 47 233 222 27 53 116 18 174 176 121 70 241 49 29 54 248 100 119 186 7 84 242 46 154 182 14 231 49 213 37 52 160 79 242 253 165 71 241 87 50 98 158 58 249 163 206 75 138 146 172 232 178 183 137 30 153 204 59 17 0 0 0 0 0 0 0 0 72 226 229 244 239 100 207 243 201 63 193 44 114 73 253 9 63 199 34 184 12 34 181 93 167 70 38 119 43 136 85 61 200 200 27 101 128 179 178 146 168 152 45 163 217 123 227 167 40 116 43 26 248 220 216 17 126 35 228 188 102 203 130 134 149 10 8 144 5 253 158 4 186 1 72 226 229 244 239 100 207 243 201 63 193 44 114 73 253 9 63 199 34 184 12 34 181 93 167 70 38 119 43 136 85 61 200 200 27 101 128 179 178 146 168 152 45 163 217 123 227 167 40 116 43 26 248 220 216 17 126 35 228 188 102 203 130 134 149 10 8 144 5 253 158 4 186 0 56 94 1 134 237 212 63 41 32 13 66 189 152 40 150 138 20 124 116 62 140 23 229 83 230 85 61 202 206 29 102 39 28 182 37 173 34 29 120 65 193 196 145 186 204 173 159 132 183 115 0 0 0 0 0 0 0 1 56 94 1 134 237 212 63 41 32 13 66 189 152 40 150 138 20 124 116 62 140 23 229 83 230 85 61 202 206 29 102 39 28 182 37 173 34 29 120 65 193 196 145 186 204 173 159 132 183 115 0 0 0 0 0 0 0 0 32 172 92 233 22 126 43 253 105 39 155 94 185 44 226 60 168 170 203 19 17 108 152 224 242 209 228 43 0 0 0 0 0 1 32 172 92 233 22 126 43 253 105 39 155 94 185 44 226 60 168 170 203 19 17 108 152 224 242 209 228 43 0 0 0 0 0 0 80 76 207 112 0 53 15 20 52 176 51 179 204 201 221 199 215 198 47 180 117 63 178 218 237 224 7 238 83 244 101 132 225 169 14 209 41 140 228 33 125 131 46 213 26 149 30 9 194 107 82 49 220 69 57 63 176 58 107 164 112 122 14 78 212 162 39 156 86 247 229 146 165 114 0 0 0 0 0 0 0 1 80 76 207 112 0 53 15 20 52 176 51 179 204 201 221 199 215 198 47 180 117 63 178 218 237 224 7 238 83 244 101 132 225 169 14 209 41 140 228 33 125 131 46 213 26 149 30 9 194 107 82 49 220 69 57 63 176 58 107 164 112 122 14 78 212 162 39 156 86 247 229 146 165 114 0 0 0 0 0 0 0 0 72 251 218 113 128 106 254 150 82 225 107 92 157 216 88 77 244 99 157 1 98 151 72 130 185 194 141 147 195 242 231 156 213 157 138 94 239 99 178 106 231 226 192 202 146 27 248 176 225 209 153 7 186 7 50 120 183 212 126 50 190 105 134 94 43 155 64 125 6 0 0 0 0 1 72 251 218 113 128 106 254 150 82 225 107 92 157 216 88 77 244 99 157 1 98 151 72 130 185 194 141 147 195 242 231 156 213 157 138 94 239 99 178 106 231 226 192 202 146 27 248 176 225 209 153 7 186 7 50 120 183 212 126 50 190 105 134 94 43 155 64 125 6 0 0 0 0 0 16 209 108 141 185 23 199 10 211 38 178 0 0 0 0 0 0 1 16 209 108 141 185 23 199 10 211 38 178 0 0 0 0 0 0 0 56 154 210 229 202 23 25 195 186 179 6 6 199 170 59 41 215 172 79 12 201 40 201 127 61 38 143 15 80 87 105 227 146 32 219 224 101 136 180 226 214 34 112 110 89 114 34 177 212 74 212 106 6 0 0 0 0 1 56 154 210 229 202 23 25 195 186 179 6 6 199 170 59 41 215 172 79 12 201 40 201 127 61 38 143 15 80 87 105 227 146 32 219 224 101 136 180 226 214 34 112 110 89 114 34 177 212 74 212 106 6 0 0 0 0 0 8 100 135 7 25 201 86 188 2 1 8 100 135 7 25 201 86 188 2 0 48 109 14 55 6 23 219 83 134 16 29 117 179 205 24 254 117 81 245 228 115 29 245 23 120 19 143 171 136 217 234 105 176 54 200 15 132 252 117 219 34 127 228 168 111 203 2 0 0 1 48 109 14 55 6 23 219 83 134 16 29 117 179 205 24 254 117 81 245 228 115 29 245 23 120 19 143 171 136 217 234 105 176 54 200 15 132 252 117 219 34 127 228 168 111 203 2 0 0 0 72 189 190 26 27 18 245 206 184 37 205 141 131 212 0 127 17 122 35 32 152 79 200 69 20 74 161 75 208 251 152 129 241 33 169 49 200 168 98 138 154 1 201 2 137 248 97 109 91 51 92 185 150 229 58 56 137 252 73 190 235 237 144 130 251 152 190 194 0 0 0 0 0 1 72 189 190 26 27 18 245 206 184 37 205 141 131 212 0 127 17 122 35 32 152 79 200 69 20 74 161 75 208 251 152 129 241 33 169 49 200 168 98 138 154 1 201 2 137 248 97 109 91 51 92 185 150 229 58 56 137 252 73 190 235 237 144 130 251 152 190 194 0 0 0 0 0 0 80 207 251 128 22 249 241 160 213 177 156 81 63 226 211 104 180 224 253 194 155 185 4 55 89 47 114 245 7 150 248 180 92 51 125 222 246 36 165 153 246 217 229 236 207 71 52 111 220 127 235 87 138 209 205 186 72 20 6 162 209 199 59 28 143 29 40 129 110 196 31 138 191 210 255 29 45 0 0 0 0 1 80 207 251 128 22 249 241 160 213 177 156 81 63 226 211 104 180 224 253 194 155 185 4 55 89 47 114 245 7 150 248 180 92 51 125 222 246 36 165 153 246 217 229 236 207 71 52 111 220 127 235 87 138 209 205 186 72 20 6 162 209 199 59 28 143 29 40 129 110 196 31 138 191 210 255 29 45 0 0 0 0 0 104 34 105 251 242 196 29 25 191 13 57 197 24 56 214 71 179 84 16 80 235 205 101 211 115 134 253 214 216 165 198 158 63 242 99 11 173 46 16 134 146 11 55 237 102 192 144 220 243 114 208 229 213 0 218 193 226 110 51 184 76 183 51 12 136 3 140 173 50 245 19 16 15 166 7 51 67 86 66 36 164 78 174 152 214 177 106 255 43 110 199 185 127 79 12 140 96 198 60 160 102 0 0 0 0 1 104 34 105 251 242 196 29 25 191 13 57 197 24 56 214 71 179 84 16 80 235 205 101 211 115 134 253 214 216 165 198 158 63 242 99 11 173 46 16 134 146 11 55 237 102 192 144 220 243 114 208 229 213 0 218 193 226 110 51 184 76 183 51 12 136 3 140 173 50 245 19 16 15 166 7 51 67 86 66 36 164 78 174 152 214 177 106 255 43 110 199 185 127 79 12 140 96 198 60 160 102 0 0 0 0 0 48 151 50 240 113 2 240 195 92 196 249 19 127 144 80 105 89 196 158 41 252 36 228 125 87 223 38 175 180 160 171 217 8 107 79 15 49 18 96 89 233 92 36 110 25 144 127 0 0 1 48 151 50 240 113 2 240 195 92 196 249 19 127 144 80 105 89 196 158 41 252 36 228 125 87 223 38 175 180 160 171 217 8 107 79 15 49 18 96 89 233 92 36 110 25 144 127 0 0 0 120 220 111 204 84 44 130 217 213 198 206 117 146 194 10 147 26 202 239 193 244 37 205 135 142 56 32 249 87 168 225 194 69 224 42 44 177 94 77 94 53 91 119 184 126 54 91 178 96 62 34 235 141 251 16 10 187 157 41 198 141 167 60 123 73 194 190 232 21 131 122 95 94 19 80 131 0 80 156 191 71 14 30 148 74 123 179 226 24 229 233 126 54 51 237 55 92 191 74 239 104 108 155 8 161 36 74 77 55 133 160 139 207 243 154 53 85 221 49 167 10 1 120 220 111 204 84 44 130 217 213 198 206 117 146 194 10 147 26 202 239 193 244 37 205 135 142 56 32 249 87 168 225 194 69 224 42 44 177 94 77 94 53 91 119 184 126 54 91 178 96 62 34 235 141 251 16 10 187 157 41 198 141 167 60 123 73 194 190 232 21 131 122 95 94 19 80 131 0 80 156 191 71 14 30 148 74 123 179 226 24 229 233 126 54 51 237 55 92 191 74 239 104 108 155 8 161 36 74 77 55 133 160 139 207 243 154 53 85 221 49 167 10 0 128 66 181 48 69 164 115 164 70 89 243 215 101 175 87 235 67 90 105 180 75 47 179 125 207 87 227 224 42 29 17 96 44 75 24 133 40 113 24 135 93 121 59 20 187 166 95 86 53 166 161 86 99 27 119 194 156 39 207 117 76 162 208 78 38 249 64 104 247 119 216 98 220 191 85 93 88 71 67 153 91 210 137 198 13 84 67 129 197 58 103 183 253 111 51 7 9 158 89 134 12 78 19 173 133 159 221 103 18 198 238 156 111 121 141 61 104 245 244 206 7 118 23 61 26 0 0 0 0 1 128 66 181 48 69 164 115 164 70 89 243 215 101 175 87 235 67 90 105 180 75 47 179 125 207 87 227 224 42 29 17 96 44 75 24 133 40 113 24 135 93 121 59 20 187 166 95 86 53 166 161 86 99 27 119 194 156 39 207 117 76 162 208 78 38 249 64 104 247 119 216 98 220 191 85 93 88 71 67 153 91 210 137 198 13 84 67 129 197 58 103 183 253 111 51 7 9 158 89 134 12 78 19 173 133 159 221 103 18 198 238 156 111 121 141 61 104 245 244 206 7 118 23 61 26 0 0 0 0 0 24 53 158 199 70 207 47 204 168 124 200 230 150 58 31 240 105 24 0 0 0 0 0 0 0 1 24 53 158 199 70 207 47 204 168 124 200 230 150 58 31 240 105 24 0 0 0 0 0 0 0 0 24 44 216 57 222 28 184 85 185 207 83 175 57 221 190 218 247 150 5 9 117 0 0 0 0 1 24 44 216 57 222 28 184 85 185 207 83 175 57 221 190 218 247 150 5 9 117 0 0 0 0 0 80 175 96 135 121 157 156 226 243 56 243 161 244 255 180 122 46 138 241 238 214 239 108 19 34 52 247 13 21 71 51 38 3 155 181 28 151 11 194 1 127 89 168 237 141 215 157 75 68 132 79 117 113 7 76 199 243 237 109 44 236 225 116 106 60 77 216 199 25 21 97 116 178 189 0 0 0 0 0 0 0 1 80 175 96 135 121 157 156 226 243 56 243 161 244 255 180 122 46 138 241 238 214 239 108 19 34 52 247 13 21 71 51 38 3 155 181 28 151 11 194 1 127 89 168 237 141 215 157 75 68 132 79 117 113 7 76 199 243 237 109 44 236 225 116 106 60 77 216 199 25 21 97 116 178 189 0 0 0 0 0 0 0 0 56 202 229 137 148 154 5 233 137 136 40 13 16 169 117 12 152 29 203 90 68 73 225 131 236 45 230 124 112 148 9 55 131 227 132 115 213 238 10 238 61 255 35 176 204 139 43 31 180 151 38 28 0 0 0 0 0 1 56 202 229 137 148 154 5 233 137 136 40 13 16 169 117 12 152 29 203 90 68 73 225 131 236 45 230 124 112 148 9 55 131 227 132 115 213 238 10 238 61 255 35 176 204 139 43 31 180 151 38 28 0 0 0 0 0 0 64 235 98 102 1 125 196 43 138 213 140 187 232 56 154 133 53 67 83 164 240 80 16 61 51 160 252 62 34 180 200 255 184 169 84 36 69 72 6 78 7 150 152 1 13 250 97 34 132 97 157 173 219 115 157 86 128 104 9 243 111 0 0 0 0 1 64 235 98 102 1 125 196 43 138 213 140 187 232 56 154 133 53 67 83 164 240 80 16 61 51 160 252 62 34 180 200 255 184 169 84 36 69 72 6 78 7 150 152 1 13 250 97 34 132 97 157 173 219 115 157 86 128 104 9 243 111 0 0 0 0 0 56 110 238 199 119 170 141 33 211 193 225 211 65 71 230 113 169 249 100 145 146 90 130 63 193 239 121 202 133 82 133 133 53 185 111 84 99 172 253 212 36 243 170 231 244 134 94 195 226 84 11 0 0 0 0 0 0 1 56 110 238 199 119 170 141 33 211 193 225 211 65 71 230 113 169 249 100 145 146 90 130 63 193 239 121 202 133 82 133 133 53 185 111 84 99 172 253 212 36 243 170 231 244 134 94 195 226 84 11 0 0 0 0 0 0 0 8 106 26 0 0 0 0 0 0 1 8 106 26 0 0 0 0 0 0 0 96 55 152 73 157 134 83 107 104 157 196 53 164 2 160 29 214 41 144 154 185 26 161 178 109 113 19 105 96 157 167 54 34 103 42 200 114 164 164 104 227 67 103 2 210 8 116 188 135 174 40 62 91 190 166 226 195 250 41 221 152 30 57 61 233 241 101 130 10 63 191 169 19 148 16 188 139 65 132 105 232 99 49 96 137 153 204 114 212 66 194 182 129 146 0 0 0 1 96 55 152 73 157 134 83 107 104 157 196 53 164 2 160 29 214 41 144 154 185 26 161 178 109 113 19 105 96 157 167 54 34 103 42 200 114 164 164 104 227 67 103 2 210 8 116 188 135 174 40 62 91 190 166 226 195 250 41 221 152 30 57 61 233 241 101 130 10 63 191 169 19 148 16 188 139 65 132 105 232 99 49 96 137 153 204 114 212 66 194 182 129 146 0 0 0 0 48 215 234 168 32 222 91 186 69 25 72 240 30 59 198 171 46 112 186 148 235 6 205 150 234 108 20 173 83 144 129 239 167 253 152 161 53 229 15 251 248 211 51 238 4 0 0 0 0 1 48 215 234 168 32 222 91 186 69 25 72 240 30 59 198 171 46 112 186 148 235 6 205 150 234 108 20 173 83 144 129 239 167 253 152 161 53 229 15 251 248 211 51 238 4 0 0 0 0 0 56 189 135 39 96 175 218 106 164 199 43 5 248 111 65 179 200 109 31 254 255 126 80 190 92 65 237 178 43 23 153 58 10 9 97 226 246 198 243 117 174 24 218 33 231 128 164 157 128 151 190 0 0 0 0 0 0 1 56 189 135 39 96 175 218 106 164 199 43 5 248 111 65 179 200 109 31 254 255 126 80 190 92 65 237 178 43 23 153 58 10 9 97 226 246 198 243 117 174 24 218 33 231 128 164 157 128 151 190 0 0 0 0 0 0 0 24 239 56 183 78 45 154 165 142 40 239 207 3 167 77 151 86 239 3 11 209 79 0 0 0 1 24 239 56 183 78 45 154 165 142 40 239 207 3 167 77 151 86 239 3 11 209 79 0 0 0 0 120 130 184 128 68 207 249 83 80 33 163 142 32 202 202 145 151 232 83 195 182 58 116 163 243 175 189 47 35 208 19 5 175 59 26 2 94 105 183 66 152 203 200 32 2 26 199 8 181 211 38 92 194 207 149 100 136 89 145 224 231 176 230 123 222 97 24 81 114 242 42 179 218 87 154 251 235 53 36 114 72 81 186 89 13 87 192 22 111 97 8 245 31 80 244 208 101 196 210 93 76 175 182 133 13 74 7 144 34 186 229 253 42 25 120 196 253 145 203 34 0 1 120 130 184 128 68 207 249 83 80 33 163 142 32 202 202 145 151 232 83 195 182 58 116 163 243 175 189 47 35 208 19 5 175 59 26 2 94 105 183 66 152 203 200 32 2 26 199 8 181 211 38 92 194 207 149 100 136 89 145 224 231 176 230 123 222 97 24 81 114 242 42 179 218 87 154 251 235 53 36 114 72 81 186 89 13 87 192 22 111 97 8 245 31 80 244 208 101 196 210 93 76 175 182 133 13 74 7 144 34 186 229 253 42 25 120 196 253 145 203 34 0 0 104 177 43 20 0 140 140 47 23 231 84 40 77 91 102 55 158 233 117 153 218 25 252 97 80 128 163 220 227 30 148 92 31 92 123 175 218 18 184 223 122 242 27 52 233 221 142 227 84 175 165 149 51 30 52 3 112 242 251 194 123 45 37 79 48 197 65 154 217 117 129 115 239 202 140 4 219 13 126 27 135 146 152 96 151 82 124 223 118 24 195 194 175 191 121 134 29 81 56 114 151 40 33 0 0 1 104 177 43 20 0 140 140 47 23 231 84 40 77 91 102 55 158 233 117 153 218 25 252 97 80 128 163 220 227 30 148 92 31 92 123 175 218 18 184 223 122 242 27 52 233 221 142 227 84 175 165 149 51 30 52 3 112 242 251 194 123 45 37 79 48 197 65 154 217 117 129 115 239 202 140 4 219 13 126 27 135 146 152 96 151 82 124 223 118 24 195 194 175 191 121 134 29 81 56 114 151 40 33 0 0 0 56 226 202 173 6 149 116 30 177 236 7 160 65 73 122 165 121 36 223 128 217 110 236 2 31 124 183 89 207 252 6 59 84 137 76 50 38 76 184 223 208 6 130 201 233 242 76 37 234 218 223 126 70 103 75 198 17 1 56 226 202 173 6 149 116 30 177 236 7 160 65 73 122 165 121 36 223 128 217 110 236 2 31 124 183 89 207 252 6 59 84 137 76 50 38 76 184 223 208 6 130 201 233 242 76 37 234 218 223 126 70 103 75 198 17 0 40 143 226 94 34 87 62 30 33 239 85 79 57 245 111 192 126 163 234 125 86 103 149 210 150 242 12 158 215 135 158 29 55 151 47 136 29 80 31 37 252 1 40 143 226 94 34 87 62 30 33 239 85 79 57 245 111 192 126 163 234 125 86 103 149 210 150 242 12 158 215 135 158 29 55 151 47 136 29 80 31 37 252 0 112 181 27 23 157 82 76 57 33 149 24 89 155 221 152 127 94 66 164 208 210 148 182 78 234 184 210 234 72 255 16 100 229 47 58 156 105 247 59 66 253 245 169 65 48 79 130 122 51 190 191 81 1 34 200 63 2 65 127 95 41 111 129 132 49 253 173 167 197 104 55 130 14 224 162 119 109 66 142 188 11 186 58 39 173 207 179 212 181 61 158 3 218 40 241 226 184 47 0 88 220 135 180 224 61 164 169 34 189 151 91 0 0 1 112 181 27 23 157 82 76 57 33 149 24 89 155 221 152 127 94 66 164 208 210 148 182 78 234 184 210 234 72 255 16 100 229 47 58 156 105 247 59 66 253 245 169 65 48 79 130 122 51 190 191 81 1 34 200 63 2 65 127 95 41 111 129 132 49 253 173 167 197 104 55 130 14 224 162 119 109 66 142 188 11 186 58 39 173 207 179 212 181 61 158 3 218 40 241 226 184 47 0 88 220 135 180 224 61 164 169 34 189 151 91 0 0 0 72 245 37 28 124 5 215 158 136 244 187 142 156 141 44 84 13 112 140 11 136 159 80 12 232 82 107 30 135 75 126 13 223 106 21 218 151 253 45 223 202 227 61 206 171 121 209 68 8 191 131 100 178 102 54 84 51 65 145 226 154 248 80 115 68 154 209 63 76 0 0 0 0 1 72 245 37 28 124 5 215 158 136 244 187 142 156 141 44 84 13 112 140 11 136 159 80 12 232 82 107 30 135 75 126 13 223 106 21 218 151 253 45 223 202 227 61 206 171 121 209 68 8 191 131 100 178 102 54 84 51 65 145 226 154 248 80 115 68 154 209 63 76 0 0 0 0 0 80 135 137 38 34 14 3 46 79 186 179 131 28 57 25 247 29 19 45 197 193 203 121 109 165 119 101 172 185 115 171 154 177 182 27 155 85 37 5 182 213 87 183 42 234 134 15 60 0 46 192 218 165 41 22 150 148 218 236 133 178 67 163 140 233 134 213 210 71 193 23 166 26 63 204 170 123 79 127 246 26 1 80 135 137 38 34 14 3 46 79 186 179 131 28 57 25 247 29 19 45 197 193 203 121 109 165 119 101 172 185 115 171 154 177 182 27 155 85 37 5 182 213 87 183 42 234 134 15 60 0 46 192 218 165 41 22 150 148 218 236 133 178 67 163 140 233 134 213 210 71 193 23 166 26 63 204 170 123 79 127 246 26 0 24 161 11 98 151 34 241 111 106 193 28 3 100 220 97 185 34 185 14 129 244 209 10 0 0 1 24 161 11 98 151 34 241 111 106 193 28 3 100 220 97 185 34 185 14 129 244 209 10 0 0 0 16 130 229 241 126 185 171 21 95 192 161 17 185 7 19 79 20 1 16 130 229 241 126 185 171 21 95 192 161 17 185 7 19 79 20 0 80 9 13 228 66 211 156 80 135 182 180 214 181 47 183 227 46 41 12 246 131 232 90 158 5 19 60 63 252 117 169 61 164 189 193 27 141 183 254 18 152 59 130 30 176 181 167 165 190 60 186 198 100 145 152 47 75 69 203 253 237 35 74 191 49 205 55 93 241 175 147 35 169 57 234 147 255 216 2 0 0 1 80 9 13 228 66 211 156 80 135 182 180 214 181 47 183 227 46 41 12 246 131 232 90 158 5 19 60 63 252 117 169 61 164 189 193 27 141 183 254 18 152 59 130 30 176 181 167 165 190 60 186 198 100 145 152 47 75 69 203 253 237 35 74 191 49 205 55 93 241 175 147 35 169 57 234 147 255 216 2 0 0 0 64 141 139 202 76 43 47 180 136 161 170 209 0 136 207 136 36 208 145 71 130 83 221 226 101 19 151 187 159 109 224 255 62 88 129 165 22 98 27 176 90 80 16 65 129 69 250 183 187 147 190 130 199 5 11 138 101 83 65 161 2 6 0 0 0 1 64 141 139 202 76 43 47 180 136 161 170 209 0 136 207 136 36 208 145 71 130 83 221 226 101 19 151 187 159 109 224 255 62 88 129 165 22 98 27 176 90 80 16 65 129 69 250 183 187 147 190 130 199 5 11 138 101 83 65 161 2 6 0 0 0 0 40 187 72 171 67 22 57 200 41 156 125 20 118 214 230 17 121 132 100 6 245 170 66 142 117 245 148 173 113 251 22 92 19 155 30 0 0 0 0 0 0 1 40 187 72 171 67 22 57 200 41 156 125 20 118 214 230 17 121 132 100 6 245 170 66 142 117 245 148 173 113 251 22 92 19 155 30 0 0 0 0 0 0 0 48 101 58 72 216 138 4 45 140 222 69 239 13 13 50 235 67 209 36 214 49 165 77 35 96 140 27 164 215 181 180 73 146 42 130 29 96 159 153 232 94 77 175 255 20 0 0 0 0 1 48 101 58 72 216 138 4 45 140 222 69 239 13 13 50 235 67 209 36 214 49 165 77 35 96 140 27 164 215 181 180 73 146 42 130 29 96 159 153 232 94 77 175 255 20 0 0 0 0 0 88 219 224 155 211 221 151 19 144 234 158 11 45 122 35 132 149 62 141 108 208 26 84 49 255 193 206 21 192 119 23 25 107 230 224 23 255 211 84 131 200 163 22 3 191 95 246 22 164 37 9 116 62 212 138 8 160 64 31 218 139 106 242 89 216 218 255 147 91 71 129 205 194 18 209 161 119 85 170 226 225 162 83 212 20 0 0 0 0 1 88 219 224 155 211 221 151 19 144 234 158 11 45 122 35 132 149 62 141 108 208 26 84 49 255 193 206 21 192 119 23 25 107 230 224 23 255 211 84 131 200 163 22 3 191 95 246 22 164 37 9 116 62 212 138 8 160 64 31 218 139 106 242 89 216 218 255 147 91 71 129 205 194 18 209 161 119 85 170 226 225 162 83 212 20 0 0 0 0 0 72 14 156 116 249 212 16 111 35 17 9 212 224 210 14 154 158 72 254 112 138 10 30 123 27 209 114 67 151 154 58 185 70 230 39 91 161 175 96 144 42 108 176 175 129 131 222 206 150 81 39 184 66 31 183 226 159 121 73 128 206 177 92 204 53 155 0 167 103 0 0 0 0 1 72 14 156 116 249 212 16 111 35 17 9 212 224 210 14 154 158 72 254 112 138 10 30 123 27 209 114 67 151 154 58 185 70 230 39 91 161 175 96 144 42 108 176 175 129 131 222 206 150 81 39 184 66 31 183 226 159 121 73 128 206 177 92 204 53 155 0 167 103 0 0 0 0 0 96 24 127 183 77 135 143 95 88 89 95 188 40 117 29 239 121 158 197 98 117 88 96 129 197 2 191 220 182 209 38 73 53 151 197 255 5 2 62 107 10 40 43 253 32 105 98 219 212 155 202 52 7 137 199 16 43 208 83 186 41 89 60 249 93 40 107 182 175 147 127 53 185 207 74 51 82 246 167 59 57 221 250 206 122 32 222 85 116 2 0 0 0 0 0 0 0 1 96 24 127 183 77 135 143 95 88 89 95 188 40 117 29 239 121 158 197 98 117 88 96 129 197 2 191 220 182 209 38 73 53 151 197 255 5 2 62 107 10 40 43 253 32 105 98 219 212 155 202 52 7 137 199 16 43 208 83 186 41 89 60 249 93 40 107 182 175 147 127 53 185 207 74 51 82 246 167 59 57 221 250 206 122 32 222 85 116 2 0 0 0 0 0 0 0 0 96 147 237 31 71 216 196 26 132 246 73 163 25 96 43 245 7 209 8 5 54 169 7 250 78 177 89 40 0 243 40 2 158 24 11 198 234 171 172 170 64 188 187 101 123 162 237 222 202 89 40 19 173 38 211 166 45 226 3 80 235 195 110 200 92 16 163 19 117 163 211 172 5 18 87 238 191 193 83 143 189 110 113 70 107 147 246 94 49 35 15 198 45 0 0 0 0 1 96 147 237 31 71 216 196 26 132 246 73 163 25 96 43 245 7 209 8 5 54 169 7 250 78 177 89 40 0 243 40 2 158 24 11 198 234 171 172 170 64 188 187 101 123 162 237 222 202 89 40 19 173 38 211 166 45 226 3 80 235 195 110 200 92 16 163 19 117 163 211 172 5 18 87 238 191 193 83 143 189 110 113 70 107 147 246 94 49 35 15 198 45 0 0 0 0 0 96 64 61 164 44 87 227 172 18 31 65 156 146 28 18 93 184 64 206 182 188 247 38 246 148 197 40 179 134 87 253 99 200 144 207 105 35 236 191 211 141 2 166 22 69 97 111 181 148 114 108 196 62 4 205 40 5 94 207 78 159 83 52 193 205 124 45 112 37 168 234 114 146 238 213 231 94 67 171 153 42 253 122 194 188 137 165 213 50 253 178 210 172 158 19 49 97 1 96 64 61 164 44 87 227 172 18 31 65 156 146 28 18 93 184 64 206 182 188 247 38 246 148 197 40 179 134 87 253 99 200 144 207 105 35 236 191 211 141 2 166 22 69 97 111 181 148 114 108 196 62 4 205 40 5 94 207 78 159 83 52 193 205 124 45 112 37 168 234 114 146 238 213 231 94 67 171 153 42 253 122 194 188 137 165 213 50 253 178 210 172 158 19 49 97 0 128 18 25 43 69 203 163 208 25 129 70 179 87 12 27 80 85 159 26 23 217 250 145 72 121 50 16 37 139 240 158 153 146 201 8 164 249 47 152 57 202 235 15 58 45 34 201 248 69 113 190 138 170 65 10 208 146 132 110 25 228 113 14 229 109 123 49 220 88 192 96 240 71 116 139 193 10 198 27 240 251 107 253 255 213 42 221 24 113 228 220 232 119 71 248 233 220 92 90 99 190 197 160 163 32 110 191 182 102 164 156 66 22 63 71 173 246 104 8 68 245 41 178 81 182 144 193 28 0 1 128 18 25 43 69 203 163 208 25 129 70 179 87 12 27 80 85 159 26 23 217 250 145 72 121 50 16 37 139 240 158 153 146 201 8 164 249 47 152 57 202 235 15 58 45 34 201 248 69 113 190 138 170 65 10 208 146 132 110 25 228 113 14 229 109 123 49 220 88 192 96 240 71 116 139 193 10 198 27 240 251 107 253 255 213 42 221 24 113 228 220 232 119 71 248 233 220 92 90 99 190 197 160 163 32 110 191 182 102 164 156 66 22 63 71 173 246 104 8 68 245 41 178 81 182 144 193 28 0 0 64 106 111 228 235 51 226 122 218 7 64 133 195 240 189 43 175 243 131 132 104 152 3 70 2 1 203 253 95 8 193 163 40 223 43 68 152 88 4 207 245 179 156 172 179 217 24 72 255 34 91 50 116 117 25 16 159 79 126 0 0 0 0 0 0 1 64 106 111 228 235 51 226 122 218 7 64 133 195 240 189 43 175 243 131 132 104 152 3 70 2 1 203 253 95 8 193 163 40 223 43 68 152 88 4 207 245 179 156 172 179 217 24 72 255 34 91 50 116 117 25 16 159 79 126 0 0 0 0 0 0 0 96 242 78 165 200 211 109 6 120 204 217 25 19 113 152 179 73 130 49 149 173 66 167 106 162 150 87 123 191 217 234 1 44 116 181 9 66 210 127 251 186 48 185 108 188 94 122 96 63 201 235 22 186 67 42 225 10 180 91 176 96 61 82 61 81 28 92 254 57 197 179 147 78 166 147 71 129 176 7 57 241 168 104 58 31 131 207 114 100 228 122 222 33 1 0 0 0 1 96 242 78 165 200 211 109 6 120 204 217 25 19 113 152 179 73 130 49 149 173 66 167 106 162 150 87 123 191 217 234 1 44 116 181 9 66 210 127 251 186 48 185 108 188 94 122 96 63 201 235 22 186 67 42 225 10 180 91 176 96 61 82 61 81 28 92 254 57 197 179 147 78 166 147 71 129 176 7 57 241 168 104 58 31 131 207 114 100 228 122 222 33 1 0 0 0 0 16 97 77 106 250 36 19 39 116 255 76 19 0 0 0 0 0 1 16 97 77 106 250 36 19 39 116 255 76 19 0 0 0 0 0 0 120 111 83 184 168 71 100 200 47 99 200 7 122 64 223 9 88 127 36 176 17 86 69 21 128 134 171 205 233 96 184 231 129 34 199 145 56 105 1 143 43 41 220 152 215 178 124 68 220 20 206 108 104 17 70 117 37 42 80 169 70 134 89 10 29 153 175 13 143 30 175 166 31 179 51 111 40 201 178 167 176 195 238 36 55 237 111 116 105 132 211 219 6 26 164 101 240 113 151 131 108 247 150 189 114 192 163 218 28 145 0 191 98 2 111 27 49 39 0 0 0 1 120 111 83 184 168 71 100 200 47 99 200 7 122 64 223 9 88 127 36 176 17 86 69 21 128 134 171 205 233 96 184 231 129 34 199 145 56 105 1 143 43 41 220 152 215 178 124 68 220 20 206 108 104 17 70 117 37 42 80 169 70 134 89 10 29 153 175 13 143 30 175 166 31 179 51 111 40 201 178 167 176 195 238 36 55 237 111 116 105 132 211 219 6 26 164 101 240 113 151 131 108 247 150 189 114 192 163 218 28 145 0 191 98 2 111 27 49 39 0 0 0 0 32 81 112 148 108 23 32 68 197 136 108 75 125 74 153 138 193 143 46 240 12 147 141 114 195 168 154 52 204 254 27 0 0 1 32 81 112 148 108 23 32 68 197 136 108 75 125 74 153 138 193 143 46 240 12 147 141 114 195 168 154 52 204 254 27 0 0 0 72 229 45 84 95 24 25 32 216 165 111 25 116 164 115 152 232 97 207 181 82 250 83 172 4 143 100 89 243 176 103 143 89 97 174 71 138 98 227 83 33 167 157 210 208 119 156 79 89 223 158 79 207 126 107 230 151 179 67 137 75 82 190 93 51 33 0 0 0 0 0 0 0 1 72 229 45 84 95 24 25 32 216 165 111 25 116 164 115 152 232 97 207 181 82 250 83 172 4 143 100 89 243 176 103 143 89 97 174 71 138 98 227 83 33 167 157 210 208 119 156 79 89 223 158 79 207 126 107 230 151 179 67 137 75 82 190 93 51 33 0 0 0 0 0 0 0 0 120 221 101 250 13 148 219 147 8 203 24 156 18 193 222 45 207 235 157 11 245 111 54 46 193 242 190 64 24 32 5 137 205 125 176 100 17 201 24 239 205 106 167 230 189 153 124 31 64 237 182 168 183 7 51 170 88 147 80 176 116 117 47 23 224 52 179 41 43 139 109 178 28 245 173 29 90 7 170 105 16 115 2 213 39 87 247 94 160 195 0 33 49 96 68 43 87 69 180 255 100 174 99 176 29 24 104 158 236 125 224 97 89 243 65 242 94 178 0 0 0 1 120 221 101 250 13 148 219 147 8 203 24 156 18 193 222 45 207 235 157 11 245 111 54 46 193 242 190 64 24 32 5 137 205 125 176 100 17 201 24 239 205 106 167 230 189 153 124 31 64 237 182 168 183 7 51 170 88 147 80 176 116 117 47 23 224 52 179 41 43 139 109 178 28 245 173 29 90 7 170 105 16 115 2 213 39 87 247 94 160 195 0 33 49 96 68 43 87 69 180 255 100 174 99 176 29 24 104 158 236 125 224 97 89 243 65 242 94 178 0 0 0 0 72 184 253 189 224 206 45 217 58 19 82 204 156 74 148 217 108 38 0 212 209 189 122 237 87 236 106 6 235 35 39 176 243 21 191 101 210 52 159 254 224 228 116 193 110 127 138 238 156 91 101 182 243 43 212 2 192 249 29 46 143 26 92 106 122 73 98 4 82 141 13 112 16 1 72 184 253 189 224 206 45 217 58 19 82 204 156 74 148 217 108 38 0 212 209 189 122 237 87 236 106 6 235 35 39 176 243 21 191 101 210 52 159 254 224 228 116 193 110 127 138 238 156 91 101 182 243 43 212 2 192 249 29 46 143 26 92 106 122 73 98 4 82 141 13 112 16 0 24 141 65 210 229 224 235 23 20 177 164 60 252 191 64 31 44 84 216 95 0 0 0 0 0 1 24 141 65 210 229 224 235 23 20 177 164 60 252 191 64 31 44 84 216 95 0 0 0 0 0 0 72 48 154 41 124 74 158 181 70 130 132 240 230 198 88 167 2 237 114 242 9 139 158 87 188 104 154 110 210 176 38 252 92 77 243 54 213 93 179 111 60 173 65 242 154 5 78 138 79 93 20 212 247 205 148 243 182 244 13 15 150 159 207 103 38 24 0 0 0 0 0 0 0 1 72 48 154 41 124 74 158 181 70 130 132 240 230 198 88 167 2 237 114 242 9 139 158 87 188 104 154 110 210 176 38 252 92 77 243 54 213 93 179 111 60 173 65 242 154 5 78 138 79 93 20 212 247 205 148 243 182 244 13 15 150 159 207 103 38 24 0 0 0 0 0 0 0 0 112 78 251 44 163 60 65 61 73 160 130 160 8 28 61 196 90 12 152 7 115 142 7 114 17 198 170 252 19 236 254 162 201 32 45 18 43 189 44 46 90 207 184 59 237 162 203 126 224 42 136 170 154 0 222 28 154 135 82 229 44 204 68 59 154 17 125 179 36 205 42 28 134 10 215 115 12 32 14 56 173 76 9 183 175 169 7 152 168 55 94 109 58 166 129 180 156 71 14 106 140 11 108 205 121 170 23 0 0 0 0 0 0 1 112 78 251 44 163 60 65 61 73 160 130 160 8 28 61 196 90 12 152 7 115 142 7 114 17 198 170 252 19 236 254 162 201 32 45 18 43 189 44 46 90 207 184 59 237 162 203 126 224 42 136 170 154 0 222 28 154 135 82 229 44 204 68 59 154 17 125 179 36 205 42 28 134 10 215 115 12 32 14 56 173 76 9 183 175 169 7 152 168 55 94 109 58 166 129 180 156 71 14 106 140 11 108 205 121 170 23 0 0 0 0 0 0 0 64 99 133 203 247 192 63 4 144 228 175 21 211 17 186 191 58 203 241 243 89 132 220 36 39 238 217 164 218 253 0 222 143 219 114 227 127 56 66 234 167 126 143 213 130 213 113 84 86 215 204 56 188 57 9 152 64 225 239 108 6 0 0 0 0 1 64 99 133 203 247 192 63 4 144 228 175 21 211 17 186 191 58 203 241 243 89 132 220 36 39 238 217 164 218 253 0 222 143 219 114 227 127 56 66 234 167 126 143 213 130 213 113 84 86 215 204 56 188 57 9 152 64 225 239 108 6 0 0 0 0 0 72 77 228 188 235 97 138 100 91 238 49 139 79 56 188 11 184 173 83 39 221 20 245 96 38 125 60 181 72 3 128 43 118 106 90 15 200 8 233 181 34 5 7 174 190 71 134 170 210 207 164 152 232 51 89 112 82 165 188 21 114 191 123 230 238 197 193 95 140 244 0 0 0 1 72 77 228 188 235 97 138 100 91 238 49 139 79 56 188 11 184 173 83 39 221 20 245 96 38 125 60 181 72 3 128 43 118 106 90 15 200 8 233 181 34 5 7 174 190 71 134 170 210 207 164 152 232 51 89 112 82 165 188 21 114 191 123 230 238 197 193 95 140 244 0 0 0 0 72 200 145 197 200 104 129 137 228 214 164 61 15 232 3 217 235 218 189 116 152 154 227 248 233 253 158 5 97 255 64 215 227 139 23 14 251 106 37 121 16 114 173 198 111 218 117 222 246 94 169 123 172 250 61 68 19 205 181 67 85 17 104 14 254 137 136 84 247 78 166 0 0 1 72 200 145 197 200 104 129 137 228 214 164 61 15 232 3 217 235 218 189 116 152 154 227 248 233 253 158 5 97 255 64 215 227 139 23 14 251 106 37 121 16 114 173 198 111 218 117 222 246 94 169 123 172 250 61 68 19 205 181 67 85 17 104 14 254 137 136 84 247 78 166 0 0 0 128 191 181 108 55 139 94 198 152 77 78 82 43 3 109 236 227 118 234 47 173 167 61 164 86 55 233 192 147 235 37 168 97 183 33 155 177 136 201 235 222 168 48 190 137 110 204 183 228 175 147 199 33 208 144 139 202 91 20 77 67 243 128 152 254 108 127 176 61 57 40 166 158 31 208 193 11 83 26 80 21 170 235 14 210 177 151 96 197 239 137 246 114 65 165 208 148 237 25 245 124 152 104 92 83 194 136 203 136 100 251 64 2 205 220 145 219 198 171 222 38 134 250 16 34 65 224 146 28 1 128 191 181 108 55 139 94 198 152 77 78 82 43 3 109 236 227 118 234 47 173 167 61 164 86 55 233 192 147 235 37 168 97 183 33 155 177 136 201 235 222 168 48 190 137 110 204 183 228 175 147 199 33 208 144 139 202 91 20 77 67 243 128 152 254 108 127 176 61 57 40 166 158 31 208 193 11 83 26 80 21 170 235 14 210 177 151 96 197 239 137 246 114 65 165 208 148 237 25 245 124 152 104 92 83 194 136 203 136 100 251 64 2 205 220 145 219 198 171 222 38 134 250 16 34 65 224 146 28 0 64 63 224 19 125 187 26 164 208 55 163 27 59 187 247 242 95 30 57 122 111 64 134 84 248 151 190 15 136 136 161 61 28 228 22 27 68 11 3 140 252 156 29 4 41 11 48 15 96 244 213 20 233 6 76 130 58 119 15 0 0 0 0 0 0 1 64 63 224 19 125 187 26 164 208 55 163 27 59 187 247 242 95 30 57 122 111 64 134 84 248 151 190 15 136 136 161 61 28 228 22 27 68 11 3 140 252 156 29 4 41 11 48 15 96 244 213 20 233 6 76 130 58 119 15 0 0 0 0 0 0 0 16 199 42 98 80 178 185 90 221 165 35 3 0 0 0 0 0 1 16 199 42 98 80 178 185 90 221 165 35 3 0 0 0 0 0 0 112 211 92 224 84 192 161 220 29 37 84 220 160 179 136 96 15 250 25 26 167 119 216 78 12 23 28 94 80 65 148 105 37 226 205 178 88 179 130 190 233 252 123 197 227 186 157 58 116 47 213 216 8 19 202 72 179 134 248 62 205 139 137 198 65 155 154 205 249 99 56 187 14 119 158 233 203 37 34 208 100 56 19 122 70 223 132 177 96 84 56 150 254 49 2 204 7 119 253 28 226 37 130 47 153 193 3 66 88 188 3 0 0 1 112 211 92 224 84 192 161 220 29 37 84 220 160 179 136 96 15 250 25 26 167 119 216 78 12 23 28 94 80 65 148 105 37 226 205 178 88 179 130 190 233 252 123 197 227 186 157 58 116 47 213 216 8 19 202 72 179 134 248 62 205 139 137 198 65 155 154 205 249 99 56 187 14 119 158 233 203 37 34 208 100 56 19 122 70 223 132 177 96 84 56 150 254 49 2 204 7 119 253 28 226 37 130 47 153 193 3 66 88 188 3 0 0 0 64 140 122 119 39 180 83 252 77 149 191 129 134 12 141 62 96 133 98 170 229 37 197 136 97 68 58 105 144 236 92 39 65 44 221 243 133 48 202 183 51 237 155 98 163 154 52 14 169 35 49 67 177 150 145 49 75 8 0 0 0 0 0 0 0 1 64 140 122 119 39 180 83 252 77 149 191 129 134 12 141 62 96 133 98 170 229 37 197 136 97 68 58 105 144 236 92 39 65 44 221 243 133 48 202 183 51 237 155 98 163 154 52 14 169 35 49 67 177 150 145 49 75 8 0 0 0 0 0 0 0 0 80 9 61 184 172 233 13 43 45 30 119 185 68 107 159 107 243 178 49 80 0 96 120 155 240 156 53 48 213 202 121 253 151 95 14 88 52 193 70 56 174 121 49 216 9 237 188 33 131 0 202 142 97 27 187 215 252 182 119 74 239 189 124 236 151 198 110 105 243 51 188 18 131 2 91 205 73 28 4 0 0 1 80 9 61 184 172 233 13 43 45 30 119 185 68 107 159 107 243 178 49 80 0 96 120 155 240 156 53 48 213 202 121 253 151 95 14 88 52 193 70 56 174 121 49 216 9 237 188 33 131 0 202 142 97 27 187 215 252 182 119 74 239 189 124 236 151 198 110 105 243 51 188 18 131 2 91 205 73 28 4 0 0 0 16 137 77 210 245 248 194 39 160 111 226 179 107 25 44 0 0 1 16 137 77 210 245 248 194 39 160 111 226 179 107 25 44 0 0 0 64 90 160 7 65 4 255 208 168 205 179 4 240 248 31 206 47 175 22 191 41 103 114 135 198 218 147 111 186 210 117 127 71 122 113 161 142 45 56 90 182 5 196 124 208 246 99 179 100 179 27 123 2 247 71 97 127 214 218 135 188 45 50 128 224 1 64 90 160 7 65 4 255 208 168 205 179 4 240 248 31 206 47 175 22 191 41 103 114 135 198 218 147 111 186 210 117 127 71 122 113 161 142 45 56 90 182 5 196 124 208 246 99 179 100 179 27 123 2 247 71 97 127 214 218 135 188 45 50 128 224 0 128 32 154 212 74 8 112 124 62 201 195 129 67 76 87 211 0 54 149 15 2 59 137 176 18 143 114 152 101 173 81 166 31 220 98 29 15 12 143 193 186 10 214 32 46 186 56 227 96 71 41 12 224 186 32 190 104 219 81 226 245 30 187 162 67 12 238 66 40 214 182 170 73 67 29 245 229 231 140 16 172 204 90 196 85 159 37 247 5 72 91 26 80 132 221 105 222 230 137 161 192 217 213 175 8 134 107 130 255 104 27 119 215 213 254 251 29 13 165 7 158 123 144 75 0 0 0 0 0 1 128 32 154 212 74 8 112 124 62 201 195 129 67 76 87 211 0 54 149 15 2 59 137 176 18 143 114 152 101 173 81 166 31 220 98 29 15 12 143 193 186 10 214 32 46 186 56 227 96 71 41 12 224 186 32 190 104 219 81 226 245 30 187 162 67 12 238 66 40 214 182 170 73 67 29 245 229 231 140 16 172 204 90 196 85 159 37 247 5 72 91 26 80 132 221 105 222 230 137 161 192 217 213 175 8 134 107 130 255 104 27 119 215 213 254 251 29 13 165 7 158 123 144 75 0 0 0 0 0 0 128 239 164 224 84 239 190 177 240 167 255 153 207 198 235 157 218 101 209 117 110 57 158 113 160 68 242 223 109 247 33 237 229 57 186 145 95 59 2 2 106 153 109 194 24 239 241 188 61 245 211 125 238 32 54 37 170 29 197 209 243 122 188 213 28 57 75 147 38 170 70 103 138 223 146 28 2 3 91 146 155 55 185 226 218 164 234 79 158 254 61 31 183 119 148 157 226 56 110 177 236 227 71 43 83 82 161 247 161 196 1 164 120 80 136 191 208 140 164 14 207 160 41 164 244 119 14 0 0 1 128 239 164 224 84 239 190 177 240 167 255 153 207 198 235 157 218 101 209 117 110 57 158 113 160 68 242 223 109 247 33 237 229 57 186 145 95 59 2 2 106 153 109 194 24 239 241 188 61 245 211 125 238 32 54 37 170 29 197 209 243 122 188 213 28 57 75 147 38 170 70 103 138 223 146 28 2 3 91 146 155 55 185 226 218 164 234 79 158 254 61 31 183 119 148 157 226 56 110 177 236 227 71 43 83 82 161 247 161 196 1 164 120 80 136 191 208 140 164 14 207 160 41 164 244 119 14 0 0 0 8 117 0 0 0 0 0 0 0 1 8 117 0 0 0 0 0 0 0 0 8 167 54 193 64 7 0 0 0 1 8 167 54 193 64 7 0 0 0 0 104 163 255 64 83 203 87 36 149 94 156 52 123 63 158 204 53 182 225 176 27 17 88 255 208 169 246 109 207 8 64 136 93 175 10 180 61 49 204 55 239 115 146 100 212 148 94 230 159 166 203 181 245 53 40 149 146 56 136 42 224 170 147 35 157 91 64 177 60 196 240 153 231 11 78 17 76 195 177 43 46 180 131 25 83 109 63 119 225 27 57 57 188 91 199 152 23 5 174 91 1 0 0 0 0 1 104 163 255 64 83 203 87 36 149 94 156 52 123 63 158 204 53 182 225 176 27 17 88 255 208 169 246 109 207 8 64 136 93 175 10 180 61 49 204 55 239 115 146 100 212 148 94 230 159 166 203 181 245 53 40 149 146 56 136 42 224 170 147 35 157 91 64 177 60 196 240 153 231 11 78 17 76 195 177 43 46 180 131 25 83 109 63 119 225 27 57 57 188 91 199 152 23 5 174 91 1 0 0 0 0 0 128 208 138 109 225 227 64 152 153 2 96 34 145 164 157 131 115 155 183 104 200 193 145 244 83 249 93 179 164 174 212 200 81 147 54 91 88 194 241 160 176 132 66 20 118 17 178 241 133 189 166 164 150 50 53 47 1 210 38 252 20 112 90 129 36 107 137 165 239 174 138 211 103 99 134 246 76 212 170 81 144 177 228 153 120 20 106 60 41 27 26 142 218 209 123 220 154 21 104 181 204 11 114 252 113 18 117 199 212 53 240 129 51 13 132 82 236 158 244 158 200 100 104 97 216 25 1 0 0 1 128 208 138 109 225 227 64 152 153 2 96 34 145 164 157 131 115 155 183 104 200 193 145 244 83 249 93 179 164 174 212 200 81 147 54 91 88 194 241 160 176 132 66 20 118 17 178 241 133 189 166 164 150 50 53 47 1 210 38 252 20 112 90 129 36 107 137 165 239 174 138 211 103 99 134 246 76 212 170 81 144 177 228 153 120 20 106 60 41 27 26 142 218 209 123 220 154 21 104 181 204 11 114 252 113 18 117 199 212 53 240 129 51 13 132 82 236 158 244 158 200 100 104 97 216 25 1 0 0 0 112 88 85 211 200 39 154 110 112 105 110 167 223 36 85 108 22 191 129 29 63 186 205 74 174 242 107 26 190 218 113 172 16 57 224 133 51 114 134 142 127 13 144 200 97 128 128 218 245 64 148 11 69 93 180 151 220 172 202 66 76 33 187 244 229 35 36 242 82 235 185 65 36 190 117 245 110 49 206 180 71 37 57 255 79 12 219 105 17 123 252 191 204 128 157 112 79 129 176 184 68 206 60 102 245 5 0 0 0 0 0 0 0 1 112 88 85 211 200 39 154 110 112 105 110 167 223 36 85 108 22 191 129 29 63 186 205 74 174 242 107 26 190 218 113 172 16 57 224 133 51 114 134 142 127 13 144 200 97 128 128 218 245 64 148 11 69 93 180 151 220 172 202 66 76 33 187 244 229 35 36 242 82 235 185 65 36 190 117 245 110 49 206 180 71 37 57 255 79 12 219 105 17 123 252 191 204 128 157 112 79 129 176 184 68 206 60 102 245 5 0 0 0 0 0 0 0 0 48 148 74 37 131 247 53 39 99 216 223 47 18 9 18 136 179 193 37 55 33 91 7 244 148 62 42 57 238 215 181 93 98 8 101 69 225 214 132 204 75 52 125 56 24 213 200 8 0 1 48 148 74 37 131 247 53 39 99 216 223 47 18 9 18 136 179 193 37 55 33 91 7 244 148 62 42 57 238 215 181 93 98 8 101 69 225 214 132 204 75 52 125 56 24 213 200 8 0 0 112 64 220 239 97 7 93 87 27 105 63 207 167 21 133 15 227 58 185 168 161 239 33 193 128 172 161 15 59 239 186 103 81 115 178 232 138 149 139 198 145 252 165 58 125 110 48 134 211 40 242 174 206 78 255 94 75 31 44 237 250 204 57 72 109 14 12 198 119 229 200 254 145 184 208 143 78 161 97 105 128 146 153 84 125 239 129 93 98 110 23 17 170 158 50 181 141 42 47 152 191 196 3 192 174 110 71 240 178 232 63 60 2 1 112 64 220 239 97 7 93 87 27 105 63 207 167 21 133 15 227 58 185 168 161 239 33 193 128 172 161 15 59 239 186 103 81 115 178 232 138 149 139 198 145 252 165 58 125 110 48 134 211 40 242 174 206 78 255 94 75 31 44 237 250 204 57 72 109 14 12 198 119 229 200 254 145 184 208 143 78 161 97 105 128 146 153 84 125 239 129 93 98 110 23 17 170 158 50 181 141 42 47 152 191 196 3 192 174 110 71 240 178 232 63 60 2 0 88 246 113 176 137 13 123 106 26 224 128 91 228 193 243 252 242 15 62 220 212 178 30 202 11 111 66 230 161 177 241 60 253 100 208 201 117 225 216 68 197 128 174 145 95 149 128 91 24 175 176 25 111 104 124 66 50 242 232 64 14 195 239 251 14 206 116 190 242 168 216 235 100 161 227 42 119 101 187 234 141 57 76 100 11 246 212 179 0 1 88 246 113 176 137 13 123 106 26 224 128 91 228 193 243 252 242 15 62 220 212 178 30 202 11 111 66 230 161 177 241 60 253 100 208 201 117 225 216 68 197 128 174 145 95 149 128 91 24 175 176 25 111 104 124 66 50 242 232 64 14 195 239 251 14 206 116 190 242 168 216 235 100 161 227 42 119 101 187 234 141 57 76 100 11 246 212 179 0 0 16 55 56 172 187 58 164 70 156 120 82 181 1 0 0 0 0 1 16 55 56 172 187 58 164 70 156 120 82 181 1 0 0 0 0 0 48 220 172 17 9 205 156 24 242 134 168 180 223 153 206 236 236 90 205 11 224 120 98 214 90 123 243 129 201 165 220 225 6 36 19 55 134 83 178 129 164 32 109 15 112 3 0 0 0 1 48 220 172 17 9 205 156 24 242 134 168 180 223 153 206 236 236 90 205 11 224 120 98 214 90 123 243 129 201 165 220 225 6 36 19 55 134 83 178 129 164 32 109 15 112 3 0 0 0 0 56 193 141 127 34 209 21 199 67 68 204 143 241 45 80 225 214 45 100 21 48 33 106 113 2 148 20 23 159 40 68 202 237 170 200 232 238 164 242 236 171 136 93 52 242 83 251 122 237 48 94 107 2 0 0 0 0 1 56 193 141 127 34 209 21 199 67 68 204 143 241 45 80 225 214 45 100 21 48 33 106 113 2 148 20 23 159 40 68 202 237 170 200 232 238 164 242 236 171 136 93 52 242 83 251 122 237 48 94 107 2 0 0 0 0 0 112 207 93 175 32 64 88 139 55 246 244 132 171 62 72 184 11 242 187 171 224 39 148 96 224 166 191 87 37 46 103 39 90 112 54 172 23 47 108 13 198 12 169 216 111 103 124 235 201 195 16 145 148 127 191 56 185 218 102 131 173 6 53 96 126 92 36 77 124 130 17 196 69 227 95 129 211 148 22 209 224 108 6 158 123 117 167 143 244 183 183 224 114 73 162 213 215 117 83 229 22 1 63 246 155 62 220 132 1 179 0 0 0 1 112 207 93 175 32 64 88 139 55 246 244 132 171 62 72 184 11 242 187 171 224 39 148 96 224 166 191 87 37 46 103 39 90 112 54 172 23 47 108 13 198 12 169 216 111 103 124 235 201 195 16 145 148 127 191 56 185 218 102 131 173 6 53 96 126 92 36 77 124 130 17 196 69 227 95 129 211 148 22 209 224 108 6 158 123 117 167 143 244 183 183 224 114 73 162 213 215 117 83 229 22 1 63 246 155 62 220 132 1 179 0 0 0 0 40 28 191 13 194 165 182 248 57 186 139 244 112 207 96 200 175 106 69 10 84 43 142 147 3 182 157 30 118 79 126 104 103 178 4 0 0 0 0 0 0 1 40 28 191 13 194 165 182 248 57 186 139 244 112 207 96 200 175 106 69 10 84 43 142 147 3 182 157 30 118 79 126 104 103 178 4 0 0 0 0 0 0 0 8 212 78 222 60 176 142 1 0 1 8 212 78 222 60 176 142 1 0 0 104 145 100 67 42 119 254 160 245 196 55 20 64 100 33 63 183 247 83 171 250 148 186 67 236 130 147 92 200 183 110 211 65 19 126 207 82 103 84 16 52 82 16 73 99 33 53 16 184 44 239 234 154 184 25 81 99 110 127 146 231 156 136 36 208 247 98 178 87 0 213 166 40 147 186 233 193 12 80 213 75 67 53 102 157 20 22 155 226 99 40 237 217 91 216 187 183 209 192 42 100 71 58 1 0 1 104 145 100 67 42 119 254 160 245 196 55 20 64 100 33 63 183 247 83 171 250 148 186 67 236 130 147 92 200 183 110 211 65 19 126 207 82 103 84 16 52 82 16 73 99 33 53 16 184 44 239 234 154 184 25 81 99 110 127 146 231 156 136 36 208 247 98 178 87 0 213 166 40 147 186 233 193 12 80 213 75 67 53 102 157 20 22 155 226 99 40 237 217 91 216 187 183 209 192 42 100 71 58 1 0 0 88 125 231 30 134 199 198 64 150 204 149 136 212 55 251 17 236 75 172 60 103 13 112 161 248 228 121 4 183 230 238 235 81 68 11 65 213 88 3 234 7 110 178 57 19 166 16 98 54 80 226 89 131 81 212 59 162 55 8 27 204 124 98 217 79 46 181 86 195 56 99 31 161 60 165 222 210 115 82 149 178 121 38 60 117 25 0 0 0 1 88 125 231 30 134 199 198 64 150 204 149 136 212 55 251 17 236 75 172 60 103 13 112 161 248 228 121 4 183 230 238 235 81 68 11 65 213 88 3 234 7 110 178 57 19 166 16 98 54 80 226 89 131 81 212 59 162 55 8 27 204 124 98 217 79 46 181 86 195 56 99 31 161 60 165 222 210 115 82 149 178 121 38 60 117 25 0 0 0 0 56 55 79 115 254 18 45 144 84 54 237 229 99 113 73 136 188 244 213 254 183 151 168 225 91 201 252 214 57 183 27 164 26 210 240 237 171 92 108 203 191 175 120 3 12 116 19 67 245 233 249 115 5 240 214 35 0 1 56 55 79 115 254 18 45 144 84 54 237 229 99 113 73 136 188 244 213 254 183 151 168 225 91 201 252 214 57 183 27 164 26 210 240 237 171 92 108 203 191 175 120 3 12 116 19 67 245 233 249 115 5 240 214 35 0 0 96 149 115 162 199 81 74 3 202 108 176 213 7 202 56 50 54 238 173 104 162 72 222 19 198 247 157 194 69 205 163 168 225 51 180 210 187 109 152 138 75 137 178 226 20 227 183 17 221 228 33 75 27 234 181 159 148 112 168 204 13 44 22 165 143 41 73 80 229 106 191 38 16 134 93 174 157 141 69 61 203 130 122 44 39 131 2 164 80 62 160 63 47 120 166 28 140 1 96 149 115 162 199 81 74 3 202 108 176 213 7 202 56 50 54 238 173 104 162 72 222 19 198 247 157 194 69 205 163 168 225 51 180 210 187 109 152 138 75 137 178 226 20 227 183 17 221 228 33 75 27 234 181 159 148 112 168 204 13 44 22 165 143 41 73 80 229 106 191 38 16 134 93 174 157 141 69 61 203 130 122 44 39 131 2 164 80 62 160 63 47 120 166 28 140 0 120 177 73 66 225 183 251 124 47 179 14 57 160 213 173 196 252 133 171 44 98 102 65 108 221 64 128 144 3 168 15 10 125 144 93 198 204 237 212 228 129 58 93 188 102 216 32 20 56 110 5 186 118 149 188 145 246 98 31 144 172 117 122 179 94 110 54 137 100 169 159 233 64 176 40 159 107 80 248 222 131 122 156 155 179 205 124 225 233 168 165 4 29 207 254 20 155 7 94 221 210 178 187 38 94 68 88 18 166 136 0 118 237 105 249 139 19 14 0 0 0 1 120 177 73 66 225 183 251 124 47 179 14 57 160 213 173 196 252 133 171 44 98 102 65 108 221 64 128 144 3 168 15 10 125 144 93 198 204 237 212 228 129 58 93 188 102 216 32 20 56 110 5 186 118 149 188 145 246 98 31 144 172 117 122 179 94 110 54 137 100 169 159 233 64 176 40 159 107 80 248 222 131 122 156 155 179 205 124 225 233 168 165 4 29 207 254 20 155 7 94 221 210 178 187 38 94 68 88 18 166 136 0 118 237 105 249 139 19 14 0 0 0 0 24 144 98 85 217 149 150 223 122 8 206 59 47 131 103 65 155 173 0 0 0 0 0 0 0 1 24 144 98 85 217 149 150 223 122 8 206 59 47 131 103 65 155 173 0 0 0 0 0 0 0 0 24 220 124 42 149 85 78 138 33 185 250 196 15 48 72 171 163 134 2 88 6 85 142 130 2 1 24 220 124 42 149 85 78 138 33 185 250 196 15 48 72 171 163 134 2 88 6 85 142 130 2 0 128 212 122 169 156 54 138 107 16 121 38 59 69 203 193 117 75 63 180 179 47 63 118 224 1 181 147 133 85 37 60 119 246 102 174 58 174 167 181 225 245 128 208 200 176 210 149 71 173 107 114 230 170 178 95 214 144 188 159 164 164 189 64 23 6 49 14 195 137 72 104 1 156 208 120 58 123 105 78 15 149 254 83 83 82 154 175 59 38 12 161 82 182 68 227 130 172 160 38 178 36 70 164 50 135 65 11 243 87 239 25 151 184 247 104 210 135 241 219 1 53 174 119 60 149 230 43 0 0 1 128 212 122 169 156 54 138 107 16 121 38 59 69 203 193 117 75 63 180 179 47 63 118 224 1 181 147 133 85 37 60 119 246 102 174 58 174 167 181 225 245 128 208 200 176 210 149 71 173 107 114 230 170 178 95 214 144 188 159 164 164 189 64 23 6 49 14 195 137 72 104 1 156 208 120 58 123 105 78 15 149 254 83 83 82 154 175 59 38 12 161 82 182 68 227 130 172 160 38 178 36 70 164 50 135 65 11 243 87 239 25 151 184 247 104 210 135 241 219 1 53 174 119 60 149 230 43 0 0 0 40 100 188 84 92 121 120 255 45 117 214 25 143 9 160 32 125 250 37 133 240 255 252 20 126 29 171 3 237 205 240 235 36 208 143 0 0 0 0 0 0 1 40 100 188 84 92 121 120 255 45 117 214 25 143 9 160 32 125 250 37 133 240 255 252 20 126 29 171 3 237 205 240 235 36 208 143 0 0 0 0 0 0 0 16 204 130 239 246 187 158 93 86 47 108 73 1 13 0 0 0 1 16 204 130 239 246 187 158 93 86 47 108 73 1 13 0 0 0 0 24 202 131 231 76 126 186 127 132 23 187 208 204 73 5 178 40 150 139 35 0 0 0 0 0 1 24 202 131 231 76 126 186 127 132 23 187 208 204 73 5 178 40 150 139 35 0 0 0 0 0 0 40 107 133 121 0 139 12 135 132 162 235 102 36 43 184 250 87 59 67 137 202 96 199 100 109 243 118 70 114 158 224 173 101 40 37 48 74 1 0 0 0 1 40 107 133 121 0 139 12 135 132 162 235 102 36 43 184 250 87 59 67 137 202 96 199 100 109 243 118 70 114 158 224 173 101 40 37 48 74 1 0 0 0 0 24 102 233 199 173 120 192 172 230 96 54 194 151 124 92 161 206 20 63 0 0 0 0 0 0 1 24 102 233 199 173 120 192 172 230 96 54 194 151 124 92 161 206 20 63 0 0 0 0 0 0 0 104 100 11 95 76 33 185 232 209 233 63 34 185 176 109 189 253 110 207 211 238 172 100 29 184 164 214 167 6 238 105 2 20 159 93 77 69 163 157 21 207 95 133 129 211 104 170 34 230 70 233 190 110 110 143 167 140 190 151 103 146 32 227 27 255 248 240 157 241 20 32 236 100 44 139 162 28 213 191 101 140 119 176 40 84 199 138 241 56 14 243 128 9 9 244 235 30 65 225 224 112 146 250 26 0 1 104 100 11 95 76 33 185 232 209 233 63 34 185 176 109 189 253 110 207 211 238 172 100 29 184 164 214 167 6 238 105 2 20 159 93 77 69 163 157 21 207 95 133 129 211 104 170 34 230 70 233 190 110 110 143 167 140 190 151 103 146 32 227 27 255 248 240 157 241 20 32 236 100 44 139 162 28 213 191 101 140 119 176 40 84 199 138 241 56 14 243 128 9 9 244 235 30 65 225 224 112 146 250 26 0 0 112 182 231 30 134 177 100 37 122 104 11 71 195 133 25 28 169 0 181 147 130 44 177 101 57 112 42 199 21 101 103 140 223 42 216 201 189 53 195 100 237 238 71 248 113 40 44 240 38 199 64 195 184 81 25 41 68 92 218 4 53 122 241 204 51 58 42 144 93 242 88 103 109 196 188 0 52 79 84 246 121 89 177 54 12 27 96 80 73 210 243 157 157 69 16 99 156 41 206 86 47 228 138 204 240 83 60 157 254 252 73 192 5 1 112 182 231 30 134 177 100 37 122 104 11 71 195 133 25 28 169 0 181 147 130 44 177 101 57 112 42 199 21 101 103 140 223 42 216 201 189 53 195 100 237 238 71 248 113 40 44 240 38 199 64 195 184 81 25 41 68 92 218 4 53 122 241 204 51 58 42 144 93 242 88 103 109 196 188 0 52 79 84 246 121 89 177 54 12 27 96 80 73 210 243 157 157 69 16 99 156 41 206 86 47 228 138 204 240 83 60 157 254 252 73 192 5 0 16 197 213 123 115 98 52 254 70 238 15 1 0 0 0 0 0 1 16 197 213 123 115 98 52 254 70 238 15 1 0 0 0 0 0 0 80 210 145 122 99 89 37 131 47 52 147 113 130 64 191 58 127 124 89 27 75 1 37 219 223 7 191 140 168 223 254 58 21 31 33 247 253 167 137 36 155 41 0 231 239 197 12 2 35 195 249 194 240 216 58 92 5 213 221 245 127 195 161 21 118 66 85 175 221 8 222 64 201 103 150 0 0 0 0 0 0 1 80 210 145 122 99 89 37 131 47 52 147 113 130 64 191 58 127 124 89 27 75 1 37 219 223 7 191 140 168 223 254 58 21 31 33 247 253 167 137 36 155 41 0 231 239 197 12 2 35 195 249 194 240 216 58 92 5 213 221 245 127 195 161 21 118 66 85 175 221 8 222 64 201 103 150 0 0 0 0 0 0 0 88 102 17 96 82 154 52 112 87 18 167 167 218 54 218 124 208 194 201 83 97 231 176 221 100 220 46 62 248 6 192 115 8 87 141 125 98 123 239 88 101 67 173 98 197 3 232 107 94 225 39 234 38 220 115 81 68 201 24 107 126 207 211 147 102 232 111 120 175 151 194 198 220 102 170 182 69 63 31 181 226 6 0 0 0 0 0 0 0 1 88 102 17 96 82 154 52 112 87 18 167 167 218 54 218 124 208 194 201 83 97 231 176 221 100 220 46 62 248 6 192 115 8 87 141 125 98 123 239 88 101 67 173 98 197 3 232 107 94 225 39 234 38 220 115 81 68 201 24 107 126 207 211 147 102 232 111 120 175 151 194 198 220 102 170 182 69 63 31 181 226 6 0 0 0 0 0 0 0 0 72 145 142 130 152 168 95 187 252 167 72 111 60 173 234 4 233 25 77 201 212 221 165 137 12 169 149 226 137 232 12 31 136 171 31 255 243 138 160 179 185 30 246 120 97 97 100 77 175 51 130 43 32 46 143 163 120 150 96 104 169 233 159 139 198 126 120 21 227 79 54 10 0 1 72 145 142 130 152 168 95 187 252 167 72 111 60 173 234 4 233 25 77 201 212 221 165 137 12 169 149 226 137 232 12 31 136 171 31 255 243 138 160 179 185 30 246 120 97 97 100 77 175 51 130 43 32 46 143 163 120 150 96 104 169 233 159 139 198 126 120 21 227 79 54 10 0 0 8 209 5 0 0 0 0 0 0 1 8 209 5 0 0 0 0 0 0 0 24 69 29 214 123 179 196 196 154 251 96 42 73 71 146 179 99 47 210 101 0 0 0 0 0 1 24 69 29 214 123 179 196 196 154 251 96 42 73 71 146 179 99 47 210 101 0 0 0 0 0 0 88 205 231 92 64 63 136 90 54 204 92 82 240 111 88 87 211 205 64 177 174 111 246 250 90 188 132 108 77 132 226 209 192 221 34 204 124 101 65 183 13 73 28 188 123 178 61 12 115 7 113 85 201 249 122 39 164 5 195 152 12 24 213 221 225 91 183 40 236 164 234 105 15 207 109 160 192 144 206 42 56 17 71 51 153 182 149 229 1 1 88 205 231 92 64 63 136 90 54 204 92 82 240 111 88 87 211 205 64 177 174 111 246 250 90 188 132 108 77 132 226 209 192 221 34 204 124 101 65 183 13 73 28 188 123 178 61 12 115 7 113 85 201 249 122 39 164 5 195 152 12 24 213 221 225 91 183 40 236 164 234 105 15 207 109 160 192 144 206 42 56 17 71 51 153 182 149 229 1 0 112 75 185 2 45 158 234 42 220 77 129 40 207 111 250 118 209 102 233 123 133 227 197 44 57 196 23 50 237 189 56 114 42 117 188 70 201 140 176 85 119 26 80 196 78 38 152 73 81 60 72 29 44 30 96 127 77 209 43 84 19 238 161 199 121 222 254 69 226 80 194 175 85 135 165 209 175 199 237 223 219 141 82 63 115 118 194 96 58 8 45 138 219 118 118 250 164 228 179 178 255 210 12 129 255 206 164 214 156 233 1 0 0 1 112 75 185 2 45 158 234 42 220 77 129 40 207 111 250 118 209 102 233 123 133 227 197 44 57 196 23 50 237 189 56 114 42 117 188 70 201 140 176 85 119 26 80 196 78 38 152 73 81 60 72 29 44 30 96 127 77 209 43 84 19 238 161 199 121 222 254 69 226 80 194 175 85 135 165 209 175 199 237 223 219 141 82 63 115 118 194 96 58 8 45 138 219 118 118 250 164 228 179 178 255 210 12 129 255 206 164 214 156 233 1 0 0 0 72 170 113 192 138 104 174 124 39 73 93 28 193 169 216 164 220 91 84 152 21 86 210 138 141 248 203 166 85 144 162 254 201 183 85 193 224 116 40 113 190 178 244 129 164 250 249 19 14 209 96 142 161 190 213 129 69 159 67 19 1 205 41 215 144 51 30 49 29 6 0 0 0 1 72 170 113 192 138 104 174 124 39 73 93 28 193 169 216 164 220 91 84 152 21 86 210 138 141 248 203 166 85 144 162 254 201 183 85 193 224 116 40 113 190 178 244 129 164 250 249 19 14 209 96 142 161 190 213 129 69 159 67 19 1 205 41 215 144 51 30 49 29 6 0 0 0 0 80 187 125 249 0 237 185 92 151 185 34 111 175 129 204 191 155 242 60 103 220 201 34 29 144 204 63 230 124 192 11 86 89 46 248 84 65 216 118 216 186 101 34 52 12 183 171 200 31 196 236 206 37 26 50 4 49 58 103 122 211 219 34 244 124 191 195 111 184 185 248 253 224 239 127 121 202 148 98 106 14 1 80 187 125 249 0 237 185 92 151 185 34 111 175 129 204 191 155 242 60 103 220 201 34 29 144 204 63 230 124 192 11 86 89 46 248 84 65 216 118 216 186 101 34 52 12 183 171 200 31 196 236 206 37 26 50 4 49 58 103 122 211 219 34 244 124 191 195 111 184 185 248 253 224 239 127 121 202 148 98 106 14 0 64 139 102 172 114 149 72 104 165 114 58 106 15 225 235 97 205 254 36 224 45 49 116 146 137 86 251 107 88 136 139 83 17 137 15 7 72 222 67 112 165 159 252 189 213 77 46 142 192 37 63 205 124 221 187 30 104 5 0 0 0 0 0 0 0 1 64 139 102 172 114 149 72 104 165 114 58 106 15 225 235 97 205 254 36 224 45 49 116 146 137 86 251 107 88 136 139 83 17 137 15 7 72 222 67 112 165 159 252 189 213 77 46 142 192 37 63 205 124 221 187 30 104 5 0 0 0 0 0 0 0 0 48 193 117 186 128 69 247 91 107 62 131 175 40 131 137 103 76 253 5 75 34 122 71 127 130 217 242 2 7 156 145 247 63 191 243 59 172 98 22 239 18 159 250 155 96 146 0 0 0 1 48 193 117 186 128 69 247 91 107 62 131 175 40 131 137 103 76 253 5 75 34 122 71 127 130 217 242 2 7 156 145 247 63 191 243 59 172 98 22 239 18 159 250 155 96 146 0 0 0 0 32 47 51 76 163 249 78 98 148 84 63 232 105 55 224 47 211 142 180 28 84 89 211 77 14 249 46 0 0 0 0 0 0 1 32 47 51 76 163 249 78 98 148 84 63 232 105 55 224 47 211 142 180 28 84 89 211 77 14 249 46 0 0 0 0 0 0 0 72 201 214 155 246 50 22 166 239 223 78 244 233 195 105 89 119 99 157 184 116 51 233 12 83 167 255 76 111 102 220 89 20 93 143 234 73 99 250 59 120 26 217 181 201 39 66 23 209 115 214 70 225 241 60 167 247 136 252 1 227 55 151 13 131 195 45 0 0 0 0 0 0 1 72 201 214 155 246 50 22 166 239 223 78 244 233 195 105 89 119 99 157 184 116 51 233 12 83 167 255 76 111 102 220 89 20 93 143 234 73 99 250 59 120 26 217 181 201 39 66 23 209 115 214 70 225 241 60 167 247 136 252 1 227 55 151 13 131 195 45 0 0 0 0 0 0 0 24 23 30 33 8 157 238 224 164 246 31 43 191 176 252 7 205 45 242 0 0 0 0 0 0 1 24 23 30 33 8 157 238 224 164 246 31 43 191 176 252 7 205 45 242 0 0 0 0 0 0 0 56 54 228 32 91 115 93 129 151 246 253 217 44 135 61 82 191 178 138 66 53 138 127 124 132 49 110 155 83 6 68 149 49 137 123 196 184 39 167 125 47 74 249 193 203 43 79 83 101 134 133 9 11 0 0 0 0 1 56 54 228 32 91 115 93 129 151 246 253 217 44 135 61 82 191 178 138 66 53 138 127 124 132 49 110 155 83 6 68 149 49 137 123 196 184 39 167 125 47 74 249 193 203 43 79 83 101 134 133 9 11 0 0 0 0 0 56 77 188 100 119 111 50 9 100 13 63 121 125 142 166 34 201 103 64 166 45 83 205 159 233 137 246 116 27 220 206 160 89 216 10 52 203 22 78 211 51 23 240 179 183 83 170 242 111 240 0 0 0 0 0 0 0 1 56 77 188 100 119 111 50 9 100 13 63 121 125 142 166 34 201 103 64 166 45 83 205 159 233 137 246 116 27 220 206 160 89 216 10 52 203 22 78 211 51 23 240 179 183 83 170 242 111 240 0 0 0 0 0 0 0 0 16 183 62 167 189 129 14 105 162 209 89 0 0 0 0 0 0 1 16 183 62 167 189 129 14 105 162 209 89 0 0 0 0 0 0 0 104 118 204 239 47 128 120 188 223 1 55 39 227 110 234 226 46 9 49 105 96 118 213 142 45 148 25 46 222 99 148 85 221 31 128 11 140 49 253 179 116 86 166 9 89 85 77 43 213 244 104 94 141 180 94 152 53 231 238 203 17 49 2 219 158 139 90 32 173 163 68 117 8 23 52 205 75 107 41 4 131 110 118 52 89 83 200 125 45 226 180 48 90 244 16 175 35 209 5 0 0 0 0 0 0 1 104 118 204 239 47 128 120 188 223 1 55 39 227 110 234 226 46 9 49 105 96 118 213 142 45 148 25 46 222 99 148 85 221 31 128 11 140 49 253 179 116 86 166 9 89 85 77 43 213 244 104 94 141 180 94 152 53 231 238 203 17 49 2 219 158 139 90 32 173 163 68 117 8 23 52 205 75 107 41 4 131 110 118 52 89 83 200 125 45 226 180 48 90 244 16 175 35 209 5 0 0 0 0 0 0 0 32 141 129 3 16 248 10 239 222 142 76 62 151 42 178 39 242 64 15 167 154 168 11 249 175 85 5 12 3 103 49 42 0 1 32 141 129 3 16 248 10 239 222 142 76 62 151 42 178 39 242 64 15 167 154 168 11 249 175 85 5 12 3 103 49 42 0 0 8 123 78 196 123 153 10 0 0 1 8 123 78 196 123 153 10 0 0 0 16 144 212 195 123 171 191 34 243 189 164 67 38 150 212 224 39 1 16 144 212 195 123 171 191 34 243 189 164 67 38 150 212 224 39 0 32 187 134 178 60 106 197 246 170 105 173 38 215 230 126 251 232 114 84 137 220 128 251 54 111 198 172 1 114 19 30 189 175 1 32 187 134 178 60 106 197 246 170 105 173 38 215 230 126 251 232 114 84 137 220 128 251 54 111 198 172 1 114 19 30 189 175 0 24 143 215 216 189 149 84 197 67 202 64 106 120 162 162 86 42 64 51 134 144 124 43 171 16 1 24 143 215 216 189 149 84 197 67 202 64 106 120 162 162 86 42 64 51 134 144 124 43 171 16 0 72 139 212 65 201 234 213 89 222 141 127 253 158 87 57 57 116 99 73 197 165 146 10 238 243 162 67 87 231 145 147 216 148 210 201 209 126 220 255 168 121 230 233 9 201 51 185 90 86 120 23 45 86 96 77 163 130 157 206 192 50 201 33 37 54 59 0 0 0 0 0 0 0 1 72 139 212 65 201 234 213 89 222 141 127 253 158 87 57 57 116 99 73 197 165 146 10 238 243 162 67 87 231 145 147 216 148 210 201 209 126 220 255 168 121 230 233 9 201 51 185 90 86 120 23 45 86 96 77 163 130 157 206 192 50 201 33 37 54 59 0 0 0 0 0 0 0 0 32 23 231 42 113 193 81 226 51 220 131 214 166 146 8 75 191 48 0 176 34 36 39 225 46 186 62 45 29 56 240 98 0 1 32 23 231 42 113 193 81 226 51 220 131 214 166 146 8 75 191 48 0 176 34 36 39 225 46 186 62 45 29 56 240 98 0 0 112 227 163 90 90 118 151 96 241 208 91 153 230 68 148 109 36 156 59 108 3 56 117 211 213 19 39 240 123 158 82 0 37 126 14 223 103 223 22 131 216 204 69 250 101 220 238 12 18 77 151 114 103 62 43 207 60 13 44 63 145 155 196 15 104 68 124 226 214 9 255 2 209 143 177 56 5 128 66 245 24 171 251 123 103 175 179 158 169 79 76 238 144 42 92 164 86 181 59 182 45 185 118 125 221 29 2 0 0 0 0 0 0 1 112 227 163 90 90 118 151 96 241 208 91 153 230 68 148 109 36 156 59 108 3 56 117 211 213 19 39 240 123 158 82 0 37 126 14 223 103 223 22 131 216 204 69 250 101 220 238 12 18 77 151 114 103 62 43 207 60 13 44 63 145 155 196 15 104 68 124 226 214 9 255 2 209 143 177 56 5 128 66 245 24 171 251 123 103 175 179 158 169 79 76 238 144 42 92 164 86 181 59 182 45 185 118 125 221 29 2 0 0 0 0 0 0 0 56 21 205 7 125 176 60 227 180 194 177 238 254 236 214 253 45 120 92 88 238 119 13 43 164 250 120 212 254 127 151 28 105 87 83 93 136 139 49 151 198 102 118 229 122 40 245 156 201 162 113 68 119 67 16 0 0 1 56 21 205 7 125 176 60 227 180 194 177 238 254 236 214 253 45 120 92 88 238 119 13 43 164 250 120 212 254 127 151 28 105 87 83 93 136 139 49 151 198 102 118 229 122 40 245 156 201 162 113 68 119 67 16 0 0 0 128 109 98 40 183 212 31 133 44 220 177 117 246 95 158 65 148 190 211 252 136 162 225 177 247 115 56 178 10 194 128 11 57 161 119 91 128 227 125 160 201 170 74 199 20 117 57 205 164 167 39 140 51 104 152 111 244 236 125 79 209 50 96 221 6 70 174 222 210 141 0 0 38 91 25 23 175 171 151 185 223 189 29 181 4 186 136 186 187 211 92 240 132 239 86 157 142 233 42 105 221 144 98 224 139 152 138 40 2 75 65 232 64 78 37 25 85 43 247 17 170 71 235 54 68 95 61 0 0 1 128 109 98 40 183 212 31 133 44 220 177 117 246 95 158 65 148 190 211 252 136 162 225 177 247 115 56 178 10 194 128 11 57 161 119 91 128 227 125 160 201 170 74 199 20 117 57 205 164 167 39 140 51 104 152 111 244 236 125 79 209 50 96 221 6 70 174 222 210 141 0 0 38 91 25 23 175 171 151 185 223 189 29 181 4 186 136 186 187 211 92 240 132 239 86 157 142 233 42 105 221 144 98 224 139 152 138 40 2 75 65 232 64 78 37 25 85 43 247 17 170 71 235 54 68 95 61 0 0 0 8 84 104 15 69 62 160 26 0 1 8 84 104 15 69 62 160 26 0 0 112 219 65 187 13 190 48 46 122 32 188 62 55 54 62 116 201 244 243 89 151 14 43 21 29 19 142 33 75 56 94 48 19 170 145 179 161 25 76 133 125 215 133 4 159 74 89 201 157 226 92 172 10 213 88 179 123 109 36 223 242 66 12 21 230 200 219 144 151 19 8 235 54 85 254 74 95 63 248 92 164 209 97 251 119 65 142 10 170 247 216 222 98 38 21 72 54 73 122 224 248 221 198 101 236 254 0 0 0 0 0 0 0 1 112 219 65 187 13 190 48 46 122 32 188 62 55 54 62 116 201 244 243 89 151 14 43 21 29 19 142 33 75 56 94 48 19 170 145 179 161 25 76 133 125 215 133 4 159 74 89 201 157 226 92 172 10 213 88 179 123 109 36 223 242 66 12 21 230 200 219 144 151 19 8 235 54 85 254 74 95 63 248 92 164 209 97 251 119 65 142 10 170 247 216 222 98 38 21 72 54 73 122 224 248 221 198 101 236 254 0 0 0 0 0 0 0 0 120 173 131 100 228 57 121 99 67 36 188 26 116 195 11 33 238 99 149 244 192 69 122 152 142 206 32 93 57 158 59 204 109 129 133 85 46 84 246 35 199 170 91 5 153 166 135 136 100 219 159 177 96 71 252 20 164 194 225 242 95 219 102 176 247 177 135 49 219 166 200 159 163 69 215 174 34 15 87 114 111 202 124 88 204 39 19 12 146 233 34 22 85 241 111 63 103 250 222 19 62 55 235 240 190 151 122 115 229 120 69 13 175 97 196 211 28 0 0 0 0 1 120 173 131 100 228 57 121 99 67 36 188 26 116 195 11 33 238 99 149 244 192 69 122 152 142 206 32 93 57 158 59 204 109 129 133 85 46 84 246 35 199 170 91 5 153 166 135 136 100 219 159 177 96 71 252 20 164 194 225 242 95 219 102 176 247 177 135 49 219 166 200 159 163 69 215 174 34 15 87 114 111 202 124 88 204 39 19 12 146 233 34 22 85 241 111 63 103 250 222 19 62 55 235 240 190 151 122 115 229 120 69 13 175 97 196 211 28 0 0 0 0 0 40 243 42 248 54 150 57 118 223 89 213 123 0 145 11 121 246 65 78 171 9 235 26 93 69 20 253 245 14 109 46 33 35 29 254 140 52 122 13 60 0 1 40 243 42 248 54 150 57 118 223 89 213 123 0 145 11 121 246 65 78 171 9 235 26 93 69 20 253 245 14 109 46 33 35 29 254 140 52 122 13 60 0 0 128 203 79 238 32 121 29 119 220 119 105 16 43 194 81 73 221 217 2 148 227 212 111 94 30 4 186 210 125 205 136 245 32 214 39 108 83 11 185 216 199 221 176 13 218 150 42 152 40 224 210 120 250 254 120 131 79 250 21 126 178 2 237 252 78 209 43 98 114 190 99 82 138 216 142 31 167 59 58 104 199 119 105 205 151 40 188 42 120 215 171 111 159 24 71 230 74 3 175 149 59 28 47 26 232 212 124 173 155 1 51 182 82 59 115 81 68 151 198 197 107 41 0 0 0 0 0 0 0 1 128 203 79 238 32 121 29 119 220 119 105 16 43 194 81 73 221 217 2 148 227 212 111 94 30 4 186 210 125 205 136 245 32 214 39 108 83 11 185 216 199 221 176 13 218 150 42 152 40 224 210 120 250 254 120 131 79 250 21 126 178 2 237 252 78 209 43 98 114 190 99 82 138 216 142 31 167 59 58 104 199 119 105 205 151 40 188 42 120 215 171 111 159 24 71 230 74 3 175 149 59 28 47 26 232 212 124 173 155 1 51 182 82 59 115 81 68 151 198 197 107 41 0 0 0 0 0 0 0 0 8 70 47 94 78 85 213 4 0 1 8 70 47 94 78 85 213 4 0 0 64 168 239 3 109 249 109 253 64 147 102 173 10 159 193 47 134 235 24 116 111 234 17 218 47 133 118 130 4 234 130 216 79 86 7 158 19 179 226 92 28 11 213 95 197 165 161 196 126 158 172 83 45 60 0 243 82 11 125 51 88 204 253 201 0 1 64 168 239 3 109 249 109 253 64 147 102 173 10 159 193 47 134 235 24 116 111 234 17 218 47 133 118 130 4 234 130 216 79 86 7 158 19 179 226 92 28 11 213 95 197 165 161 196 126 158 172 83 45 60 0 243 82 11 125 51 88 204 253 201 0 0 32 91 8 155 0 244 185 150 213 21 51 193 238 33 114 252 243 203 63 197 56 17 152 0 158 202 81 224 155 176 168 48 8 1 32 91 8 155 0 244 185 150 213 21 51 193 238 33 114 252 243 203 63 197 56 17 152 0 158 202 81 224 155 176 168 48 8 0 64 237 110 141 244 234 81 71 9 84 235 128 228 166 210 171 84 207 172 13 18 245 134 71 141 15 168 153 177 38 185 201 244 241 170 222 1 133 147 146 102 43 229 200 175 199 75 172 190 162 84 189 67 156 147 154 31 13 207 129 50 200 231 74 0 1 64 237 110 141 244 234 81 71 9 84 235 128 228 166 210 171 84 207 172 13 18 245 134 71 141 15 168 153 177 38 185 201 244 241 170 222 1 133 147 146 102 43 229 200 175 199 75 172 190 162 84 189 67 156 147 154 31 13 207 129 50 200 231 74 0 0 72 87 52 91 18 47 239 64 167 1 198 52 25 230 164 41 73 76 171 61 96 213 30 252 201 4 21 212 155 40 229 150 154 204 69 5 231 234 118 236 96 115 165 148 146 43 62 108 172 9 72 82 112 145 170 221 58 127 30 73 27 88 182 208 159 212 102 122 105 69 67 0 0 1 72 87 52 91 18 47 239 64 167 1 198 52 25 230 164 41 73 76 171 61 96 213 30 252 201 4 21 212 155 40 229 150 154 204 69 5 231 234 118 236 96 115 165 148 146 43 62 108 172 9 72 82 112 145 170 221 58 127 30 73 27 88 182 208 159 212 102 122 105 69 67 0 0 0 48 64 172 114 48 214 193 164 216 67 60 29 158 200 157 119 130 148 115 28 173 33 19 100 127 6 67 27 159 246 211 0 250 103 226 195 106 155 248 97 202 123 209 221 13 0 0 0 0 1 48 64 172 114 48 214 193 164 216 67 60 29 158 200 157 119 130 148 115 28 173 33 19 100 127 6 67 27 159 246 211 0 250 103 226 195 106 155 248 97 202 123 209 221 13 0 0 0 0 0 120 81 252 110 197 13 166 231 72 130 41 106 65 232 254 107 124 243 255 107 207 47 194 183 40 150 50 4 210 204 224 43 196 247 122 120 215 166 135 245 209 137 61 188 138 187 74 103 184 183 141 129 116 149 165 53 145 106 74 23 238 142 63 216 57 144 68 13 165 129 66 25 38 206 230 110 91 93 226 41 154 75 235 92 163 186 140 230 191 218 201 127 59 108 139 3 252 44 100 3 234 46 162 34 110 218 167 38 61 218 67 214 231 20 40 0 0 0 0 0 0 1 120 81 252 110 197 13 166 231 72 130 41 106 65 232 254 107 124 243 255 107 207 47 194 183 40 150 50 4 210 204 224 43 196 247 122 120 215 166 135 245 209 137 61 188 138 187 74 103 184 183 141 129 116 149 165 53 145 106 74 23 238 142 63 216 57 144 68 13 165 129 66 25 38 206 230 110 91 93 226 41 154 75 235 92 163 186 140 230 191 218 201 127 59 108 139 3 252 44 100 3 234 46 162 34 110 218 167 38 61 218 67 214 231 20 40 0 0 0 0 0 0 0 120 243 247 18 11 29 244 71 100 171 9 7 235 135 165 185 174 82 125 144 46 101 141 39 25 219 161 166 142 138 73 193 151 231 217 184 5 47 234 106 36 39 20 133 77 81 241 34 12 59 55 212 158 163 139 77 54 232 111 133 109 11 226 82 170 77 232 17 218 114 50 113 152 83 202 219 168 218 132 34 241 173 58 247 200 6 151 173 6 185 4 118 166 131 92 255 162 247 111 148 166 68 56 169 253 254 48 168 30 109 251 179 213 140 46 219 3 0 0 0 0 1 120 243 247 18 11 29 244 71 100 171 9 7 235 135 165 185 174 82 125 144 46 101 141 39 25 219 161 166 142 138 73 193 151 231 217 184 5 47 234 106 36 39 20 133 77 81 241 34 12 59 55 212 158 163 139 77 54 232 111 133 109 11 226 82 170 77 232 17 218 114 50 113 152 83 202 219 168 218 132 34 241 173 58 247 200 6 151 173 6 185 4 118 166 131 92 255 162 247 111 148 166 68 56 169 253 254 48 168 30 109 251 179 213 140 46 219 3 0 0 0 0 0 48 170 134 196 251 187 25 104 34 95 69 85 184 199 0 89 253 150 101 212 7 202 243 18 178 248 98 105 134 18 215 189 22 99 238 235 78 124 3 142 134 188 8 188 178 2 0 0 0 1 48 170 134 196 251 187 25 104 34 95 69 85 184 199 0 89 253 150 101 212 7 202 243 18 178 248 98 105 134 18 215 189 22 99 238 235 78 124 3 142 134 188 8 188 178 2 0 0 0 0 48 200 105 57 90 124 53 229 14 158 143 66 34 150 228 210 143 188 213 175 175 21 92 123 213 52 223 97 128 64 234 169 31 165 1 230 126 33 17 32 28 25 238 131 159 125 84 120 8 1 48 200 105 57 90 124 53 229 14 158 143 66 34 150 228 210 143 188 213 175 175 21 92 123 213 52 223 97 128 64 234 169 31 165 1 230 126 33 17 32 28 25 238 131 159 125 84 120 8 0 8 236 26 245 49 19 0 0 0 1 8 236 26 245 49 19 0 0 0 0 16 134 207 199 26 175 188 103 160 76 140 48 55 30 189 7 0 1 16 134 207 199 26 175 188 103 160 76 140 48 55 30 189 7 0 0 24 7 216 8 30 195 251 90 24 198 179 171 59 27 243 102 163 205 126 247 84 4 0 0 0 1 24 7 216 8 30 195 251 90 24 198 179 171 59 27 243 102 163 205 126 247 84 4 0 0 0 0 104 89 190 73 217 127 252 160 134 16 114 94 182 255 223 176 58 217 71 107 33 21 118 140 226 166 128 254 219 248 19 33 93 9 225 89 44 103 188 91 203 146 155 17 20 40 125 153 23 87 125 86 166 25 181 17 220 165 143 13 245 94 144 64 231 41 17 165 224 79 44 34 246 169 187 130 155 57 121 213 161 21 178 163 44 75 169 37 6 67 200 63 171 50 214 213 230 10 148 179 25 0 0 0 0 1 104 89 190 73 217 127 252 160 134 16 114 94 182 255 223 176 58 217 71 107 33 21 118 140 226 166 128 254 219 248 19 33 93 9 225 89 44 103 188 91 203 146 155 17 20 40 125 153 23 87 125 86 166 25 181 17 220 165 143 13 245 94 144 64 231 41 17 165 224 79 44 34 246 169 187 130 155 57 121 213 161 21 178 163 44 75 169 37 6 67 200 63 171 50 214 213 230 10 148 179 25 0 0 0 0 0 120 239 141 241 165 45 224 229 17 155 67 37 181 127 150 115 133 137 72 239 12 3 103 142 204 53 108 13 4 11 96 213 15 192 155 67 147 30 66 19 222 160 17 202 156 77 143 151 241 100 236 128 33 207 105 116 196 68 142 109 237 94 29 86 196 190 96 158 51 78 107 53 2 158 62 195 101 125 181 245 191 185 105 37 77 113 109 85 110 93 152 188 115 136 136 93 10 235 225 51 77 110 7 74 32 118 44 157 117 193 127 80 54 2 0 0 0 0 0 0 0 1 120 239 141 241 165 45 224 229 17 155 67 37 181 127 150 115 133 137 72 239 12 3 103 142 204 53 108 13 4 11 96 213 15 192 155 67 147 30 66 19 222 160 17 202 156 77 143 151 241 100 236 128 33 207 105 116 196 68 142 109 237 94 29 86 196 190 96 158 51 78 107 53 2 158 62 195 101 125 181 245 191 185 105 37 77 113 109 85 110 93 152 188 115 136 136 93 10 235 225 51 77 110 7 74 32 118 44 157 117 193 127 80 54 2 0 0 0 0 0 0 0 0 56 161 103 132 41 228 199 245 93 101 166 142 168 205 96 95 52 143 127 100 173 175 132 102 181 237 4 42 52 30 10 219 202 27 68 79 23 201 116 89 53 50 85 239 183 254 11 165 100 129 247 0 0 0 0 0 0 1 56 161 103 132 41 228 199 245 93 101 166 142 168 205 96 95 52 143 127 100 173 175 132 102 181 237 4 42 52 30 10 219 202 27 68 79 23 201 116 89 53 50 85 239 183 254 11 165 100 129 247 0 0 0 0 0 0 0 32 255 251 221 115 146 46 163 229 176 14 203 138 27 28 41 62 22 109 49 16 185 119 54 172 191 85 184 0 0 0 0 0 1 32 255 251 221 115 146 46 163 229 176 14 203 138 27 28 41 62 22 109 49 16 185 119 54 172 191 85 184 0 0 0 0 0 0 32 247 33 196 253 43 205 187 127 110 212 213 12 214 143 22 252 209 96 90 89 50 103 47 68 146 216 72 215 61 226 134 3 1 32 247 33 196 253 43 205 187 127 110 212 213 12 214 143 22 252 209 96 90 89 50 103 47 68 146 216 72 215 61 226 134 3 0 40 59 97 19 31 78 83 69 133 60 42 103 67 71 156 83 145 176 67 103 93 114 176 15 117 43 90 82 152 45 121 12 17 76 244 53 1 0 0 0 0 1 40 59 97 19 31 78 83 69 133 60 42 103 67 71 156 83 145 176 67 103 93 114 176 15 117 43 90 82 152 45 121 12 17 76 244 53 1 0 0 0 0 0 56 219 241 133 51 75 86 155 36 83 56 69 111 93 54 193 19 54 88 242 30 144 132 66 61 131 189 217 126 87 64 134 162 139 199 3 85 234 160 230 114 164 25 154 94 87 76 241 251 243 147 109 83 0 0 0 0 1 56 219 241 133 51 75 86 155 36 83 56 69 111 93 54 193 19 54 88 242 30 144 132 66 61 131 189 217 126 87 64 134 162 139 199 3 85 234 160 230 114 164 25 154 94 87 76 241 251 243 147 109 83 0 0 0 0 0 64 43 137 16 132 202 104 91 201 107 180 196 200 93 138 129 13 78 33 73 134 236 116 150 83 184 197 132 23 82 3 247 20 140 181 22 152 27 60 63 98 254 172 152 20 58 101 176 236 139 225 217 61 37 39 22 240 147 101 158 189 117 172 129 3 1 64 43 137 16 132 202 104 91 201 107 180 196 200 93 138 129 13 78 33 73 134 236 116 150 83 184 197 132 23 82 3 247 20 140 181 22 152 27 60 63 98 254 172 152 20 58 101 176 236 139 225 217 61 37 39 22 240 147 101 158 189 117 172 129 3 0 16 174 250 80 27 225 76 117 105 139 6 48 23 21 0 0 0 1 16 174 250 80 27 225 76 117 105 139 6 48 23 21 0 0 0 0 32 79 208 51 133 78 86 8 203 246 180 251 28 21 185 125 159 144 112 64 104 31 37 123 126 115 170 223 1 66 0 0 0 1 32 79 208 51 133 78 86 8 203 246 180 251 28 21 185 125 159 144 112 64 104 31 37 123 126 115 170 223 1 66 0 0 0 0 24 59 170 196 192 162 161 183 242 120 40 171 157 254 236 242 64 223 1 0 0 0 0 0 0 1 24 59 170 196 192 162 161 183 242 120 40 171 157 254 236 242 64 223 1 0 0 0 0 0 0 0 64 158 138 13 99 212 72 79 220 230 16 119 150 64 148 121 100 5 104 182 189 57 158 100 143 129 122 146 11 169 192 52 74 169 74 4 0 229 160 168 226 62 202 182 250 171 51 251 90 159 122 13 111 16 28 141 139 1 41 229 97 17 73 120 0 1 64 158 138 13 99 212 72 79 220 230 16 119 150 64 148 121 100 5 104 182 189 57 158 100 143 129 122 146 11 169 192 52 74 169 74 4 0 229 160 168 226 62 202 182 250 171 51 251 90 159 122 13 111 16 28 141 139 1 41 229 97 17 73 120 0 0 128 54 211 84 85 147 162 152 160 127 96 156 128 144 183 140 26 170 242 255 112 211 16 24 233 93 177 189 62 26 230 8 18 162 102 53 79 255 93 127 37 173 116 119 61 21 221 30 71 51 18 217 197 225 89 208 228 54 16 14 158 40 254 222 6 144 144 95 30 116 51 208 187 221 207 73 40 215 178 180 184 67 243 230 235 85 174 4 118 231 32 148 73 211 37 140 151 196 184 12 41 14 98 78 190 103 107 141 66 52 100 222 58 141 135 84 85 90 76 97 21 18 0 0 0 0 0 0 0 1 128 54 211 84 85 147 162 152 160 127 96 156 128 144 183 140 26 170 242 255 112 211 16 24 233 93 177 189 62 26 230 8 18 162 102 53 79 255 93 127 37 173 116 119 61 21 221 30 71 51 18 217 197 225 89 208 228 54 16 14 158 40 254 222 6 144 144 95 30 116 51 208 187 221 207 73 40 215 178 180 184 67 243 230 235 85 174 4 118 231 32 148 73 211 37 140 151 196 184 12 41 14 98 78 190 103 107 141 66 52 100 222 58 141 135 84 85 90 76 97 21 18 0 0 0 0 0 0 0 0 128 94 236 109 194 205 86 41 192 155 21 79 52 203 207 37 42 40 126 224 32 228 152 22 204 190 205 68 99 253 159 127 249 241 8 5 27 151 203 115 75 236 216 195 28 184 201 166 85 152 106 8 201 248 148 93 54 156 87 135 56 251 121 202 96 173 198 190 134 110 223 180 127 230 136 159 180 9 44 207 255 43 80 213 238 43 117 135 78 121 149 22 24 198 179 157 59 238 245 168 85 45 36 70 88 161 109 52 49 133 96 74 209 106 244 99 200 247 185 127 197 240 97 2 0 0 0 0 0 1 128 94 236 109 194 205 86 41 192 155 21 79 52 203 207 37 42 40 126 224 32 228 152 22 204 190 205 68 99 253 159 127 249 241 8 5 27 151 203 115 75 236 216 195 28 184 201 166 85 152 106 8 201 248 148 93 54 156 87 135 56 251 121 202 96 173 198 190 134 110 223 180 127 230 136 159 180 9 44 207 255 43 80 213 238 43 117 135 78 121 149 22 24 198 179 157 59 238 245 168 85 45 36 70 88 161 109 52 49 133 96 74 209 106 244 99 200 247 185 127 197 240 97 2 0 0 0 0 0 0 128 14 202 151 114 198 177 79 116 173 42 198 179 37 189 161 34 90 109 151 134 15 53 12 218 203 186 227 104 124 114 146 230 193 76 40 120 134 85 85 179 206 122 201 169 68 255 199 58 19 184 117 183 58 105 131 49 120 224 207 113 249 249 52 245 213 117 133 240 15 235 167 111 253 250 71 98 115 41 241 120 23 72 80 150 152 182 145 130 4 69 103 219 252 177 172 87 76 137 67 198 105 98 131 12 8 87 204 104 138 42 101 155 161 225 254 112 96 164 148 113 139 130 6 0 0 0 0 0 1 128 14 202 151 114 198 177 79 116 173 42 198 179 37 189 161 34 90 109 151 134 15 53 12 218 203 186 227 104 124 114 146 230 193 76 40 120 134 85 85 179 206 122 201 169 68 255 199 58 19 184 117 183 58 105 131 49 120 224 207 113 249 249 52 245 213 117 133 240 15 235 167 111 253 250 71 98 115 41 241 120 23 72 80 150 152 182 145 130 4 69 103 219 252 177 172 87 76 137 67 198 105 98 131 12 8 87 204 104 138 42 101 155 161 225 254 112 96 164 148 113 139 130 6 0 0 0 0 0 0 88 222 236 36 90 191 241 183 85 110 108 88 240 111 232 78 103 27 70 144 224 71 76 230 109 75 89 21 251 126 142 18 121 105 170 253 72 64 73 2 238 74 157 109 22 80 12 236 206 45 90 23 64 23 14 190 116 110 37 81 228 238 254 84 202 140 111 243 20 88 246 161 13 249 31 162 155 221 13 64 215 171 161 29 14 0 0 0 0 1 88 222 236 36 90 191 241 183 85 110 108 88 240 111 232 78 103 27 70 144 224 71 76 230 109 75 89 21 251 126 142 18 121 105 170 253 72 64 73 2 238 74 157 109 22 80 12 236 206 45 90 23 64 23 14 190 116 110 37 81 228 238 254 84 202 140 111 243 20 88 246 161 13 249 31 162 155 221 13 64 215 171 161 29 14 0 0 0 0 0 80 69 2 96 19 137 241 75 149 54 240 119 4 53 193 106 38 190 90 56 134 205 201 129 251 62 99 112 152 118 97 184 216 164 110 226 53 156 74 62 42 32 199 114 107 27 36 188 14 59 253 131 97 129 87 74 48 164 130 23 116 217 134 169 80 29 241 90 26 86 7 137 144 117 50 0 0 0 0 0 0 1 80 69 2 96 19 137 241 75 149 54 240 119 4 53 193 106 38 190 90 56 134 205 201 129 251 62 99 112 152 118 97 184 216 164 110 226 53 156 74 62 42 32 199 114 107 27 36 188 14 59 253 131 97 129 87 74 48 164 130 23 116 217 134 169 80 29 241 90 26 86 7 137 144 117 50 0 0 0 0 0 0 0 104 60 2 183 139 129 88 99 244 170 89 0 177 28 40 203 18 239 70 82 138 113 96 148 242 156 70 22 152 221 31 149 38 127 107 45 254 28 166 210 227 215 191 161 12 230 95 230 64 209 16 253 82 63 212 15 119 73 178 25 88 182 249 227 148 207 62 209 192 72 37 56 62 203 161 110 196 250 228 14 19 181 87 35 11 15 255 155 107 206 61 54 223 191 92 51 188 42 0 0 0 0 0 0 0 1 104 60 2 183 139 129 88 99 244 170 89 0 177 28 40 203 18 239 70 82 138 113 96 148 242 156 70 22 152 221 31 149 38 127 107 45 254 28 166 210 227 215 191 161 12 230 95 230 64 209 16 253 82 63 212 15 119 73 178 25 88 182 249 227 148 207 62 209 192 72 37 56 62 203 161 110 196 250 228 14 19 181 87 35 11 15 255 155 107 206 61 54 223 191 92 51 188 42 0 0 0 0 0 0 0 0 8 161 145 84 161 51 102 34 163 1 8 161 145 84 161 51 102 34 163 0 56 160 51 60 244 243 228 49 105 198 184 5 130 241 114 177 248 245 101 241 141 249 87 160 252 119 173 82 11 10 104 49 95 69 254 101 134 79 46 129 192 118 64 243 147 3 51 61 70 176 159 167 235 86 145 44 55 1 56 160 51 60 244 243 228 49 105 198 184 5 130 241 114 177 248 245 101 241 141 249 87 160 252 119 173 82 11 10 104 49 95 69 254 101 134 79 46 129 192 118 64 243 147 3 51 61 70 176 159 167 235 86 145 44 55 0 32 180 181 48 71 211 35 86 174 153 231 246 211 154 205 97 74 237 0 199 183 8 131 127 228 121 26 229 18 39 183 3 0 1 32 180 181 48 71 211 35 86 174 153 231 246 211 154 205 97 74 237 0 199 183 8 131 127 228 121 26 229 18 39 183 3 0 0 72 235 208 249 69 198 27 28 175 48 201 165 210 55 86 150 90 198 36 230 165 54 20 213 19 85 189 110 233 79 254 190 153 19 131 115 116 152 36 49 241 5 53 57 191 108 36 43 245 224 105 242 219 194 163 217 52 122 224 205 161 21 47 142 100 254 80 178 115 134 181 158 0 1 72 235 208 249 69 198 27 28 175 48 201 165 210 55 86 150 90 198 36 230 165 54 20 213 19 85 189 110 233 79 254 190 153 19 131 115 116 152 36 49 241 5 53 57 191 108 36 43 245 224 105 242 219 194 163 217 52 122 224 205 161 21 47 142 100 254 80 178 115 134 181 158 0 0 48 24 216 31 31 121 32 6 35 230 132 116 1 93 231 239 114 29 239 68 226 187 220 209 191 89 111 162 77 90 222 196 5 16 190 98 88 179 228 211 83 191 201 156 101 38 6 0 0 1 48 24 216 31 31 121 32 6 35 230 132 116 1 93 231 239 114 29 239 68 226 187 220 209 191 89 111 162 77 90 222 196 5 16 190 98 88 179 228 211 83 191 201 156 101 38 6 0 0 0 8 120 9 155 198 227 119 139 0 1 8 120 9 155 198 227 119 139 0 0 112 67 233 173 239 2 147 31 164 67 28 157 14 181 143 121 205 94 47 18 212 89 86 192 240 97 248 17 119 22 163 109 127 226 138 109 233 234 45 230 169 33 186 2 126 255 20 183 106 178 83 140 195 205 223 184 177 109 237 177 147 165 5 252 192 192 124 61 142 140 69 133 239 214 170 94 162 222 231 95 68 100 116 183 60 109 34 233 105 48 238 47 153 181 219 232 176 110 180 54 190 173 160 203 79 0 3 0 0 0 0 0 0 1 112 67 233 173 239 2 147 31 164 67 28 157 14 181 143 121 205 94 47 18 212 89 86 192 240 97 248 17 119 22 163 109 127 226 138 109 233 234 45 230 169 33 186 2 126 255 20 183 106 178 83 140 195 205 223 184 177 109 237 177 147 165 5 252 192 192 124 61 142 140 69 133 239 214 170 94 162 222 231 95 68 100 116 183 60 109 34 233 105 48 238 47 153 181 219 232 176 110 180 54 190 173 160 203 79 0 3 0 0 0 0 0 0 0 48 113 179 208 89 229 97 41 83 34 181 248 69 45 117 67 182 227 176 114 161 166 167 142 142 47 25 191 4 182 213 77 37 61 119 165 249 59 176 118 228 161 1 0 0 0 0 0 0 1 48 113 179 208 89 229 97 41 83 34 181 248 69 45 117 67 182 227 176 114 161 166 167 142 142 47 25 191 4 182 213 77 37 61 119 165 249 59 176 118 228 161 1 0 0 0 0 0 0 0 8 205 230 1 0 0 0 0 0 1 8 205 230 1 0 0 0 0 0 0 56 77 166 237 60 159 113 214 225 225 196 126 16 105 189 104 42 252 167 15 186 63 111 11 23 250 53 128 208 225 81 238 136 75 225 4 178 227 11 107 243 121 83 238 164 31 105 2 177 163 135 105 60 0 0 0 0 1 56 77 166 237 60 159 113 214 225 225 196 126 16 105 189 104 42 252 167 15 186 63 111 11 23 250 53 128 208 225 81 238 136 75 225 4 178 227 11 107 243 121 83 238 164 31 105 2 177 163 135 105 60 0 0 0 0 0 8 7 177 200 9 87 48 0 0 1 8 7 177 200 9 87 48 0 0 0 120 95 0 17 198 196 3 168 29 232 224 109 67 23 135 235 50 52 214 192 80 146 255 65 119 139 83 153 210 130 123 45 5 148 58 19 42 240 226 164 159 61 91 236 215 59 183 160 255 155 79 104 47 81 69 79 205 46 250 193 179 14 221 169 205 128 237 109 128 36 7 21 98 118 172 243 166 158 151 127 232 156 225 22 108 82 127 8 238 182 238 200 235 199 229 34 2 128 5 166 74 164 159 85 41 32 254 62 100 188 86 40 138 142 240 122 56 2 0 0 0 1 120 95 0 17 198 196 3 168 29 232 224 109 67 23 135 235 50 52 214 192 80 146 255 65 119 139 83 153 210 130 123 45 5 148 58 19 42 240 226 164 159 61 91 236 215 59 183 160 255 155 79 104 47 81 69 79 205 46 250 193 179 14 221 169 205 128 237 109 128 36 7 21 98 118 172 243 166 158 151 127 232 156 225 22 108 82 127 8 238 182 238 200 235 199 229 34 2 128 5 166 74 164 159 85 41 32 254 62 100 188 86 40 138 142 240 122 56 2 0 0 0 0 24 52 171 120 247 245 238 38 189 200 10 21 246 79 73 111 224 107 101 199 80 238 49 0 0 1 24 52 171 120 247 245 238 38 189 200 10 21 246 79 73 111 224 107 101 199 80 238 49 0 0 0 104 57 158 161 115 39 26 101 249 18 39 40 1 93 199 25 128 79 244 212 44 60 231 196 18 52 157 210 236 197 32 195 30 224 115 47 62 183 108 27 196 234 161 196 225 103 21 202 150 178 236 60 175 217 66 254 151 71 126 230 34 45 143 24 111 88 165 51 57 138 241 251 139 79 160 192 71 182 96 28 48 193 182 46 229 150 230 46 13 249 26 35 98 104 138 125 230 36 173 131 138 29 153 37 15 1 104 57 158 161 115 39 26 101 249 18 39 40 1 93 199 25 128 79 244 212 44 60 231 196 18 52 157 210 236 197 32 195 30 224 115 47 62 183 108 27 196 234 161 196 225 103 21 202 150 178 236 60 175 217 66 254 151 71 126 230 34 45 143 24 111 88 165 51 57 138 241 251 139 79 160 192 71 182 96 28 48 193 182 46 229 150 230 46 13 249 26 35 98 104 138 125 230 36 173 131 138 29 153 37 15 0 88 201 67 176 170 12 214 223 113 151 240 121 127 115 67 246 173 119 207 202 219 102 176 87 124 64 46 160 253 231 56 131 2 167 194 119 80 227 152 34 209 118 189 9 5 175 115 207 20 15 201 85 82 139 3 122 200 232 151 18 106 251 0 202 255 146 176 226 219 69 250 238 111 233 251 3 57 189 253 30 108 224 253 116 0 0 0 0 0 1 88 201 67 176 170 12 214 223 113 151 240 121 127 115 67 246 173 119 207 202 219 102 176 87 124 64 46 160 253 231 56 131 2 167 194 119 80 227 152 34 209 118 189 9 5 175 115 207 20 15 201 85 82 139 3 122 200 232 151 18 106 251 0 202 255 146 176 226 219 69 250 238 111 233 251 3 57 189 253 30 108 224 253 116 0 0 0 0 0 0 40 216 207 22 26 220 111 75 102 80 113 167 57 132 171 148 110 197 33 103 213 177 123 206 218 242 178 9 228 125 117 218 221 76 2 0 0 0 0 0 0 1 40 216 207 22 26 220 111 75 102 80 113 167 57 132 171 148 110 197 33 103 213 177 123 206 218 242 178 9 228 125 117 218 221 76 2 0 0 0 0 0 0 0 96 209 38 226 122 66 37 110 32 0 244 215 135 36 169 50 93 130 191 147 142 209 240 154 14 39 115 83 99 104 166 126 171 89 95 133 0 168 235 114 121 112 237 201 242 105 25 68 88 53 63 4 70 8 16 14 139 78 16 28 216 131 240 108 136 129 244 99 100 247 236 64 222 120 6 100 242 25 164 196 251 190 21 202 16 243 72 23 21 27 253 232 129 65 12 0 0 1 96 209 38 226 122 66 37 110 32 0 244 215 135 36 169 50 93 130 191 147 142 209 240 154 14 39 115 83 99 104 166 126 171 89 95 133 0 168 235 114 121 112 237 201 242 105 25 68 88 53 63 4 70 8 16 14 139 78 16 28 216 131 240 108 136 129 244 99 100 247 236 64 222 120 6 100 242 25 164 196 251 190 21 202 16 243 72 23 21 27 253 232 129 65 12 0 0 0 24 137 7 71 104 123 1 230 162 84 85 84 78 76 1 146 149 3 0 0 0 0 0 0 0 1 24 137 7 71 104 123 1 230 162 84 85 84 78 76 1 146 149 3 0 0 0 0 0 0 0 0 88 17 135 189 91 189 22 119 161 7 236 246 162 42 137 207 149 58 10 147 68 241 83 242 92 176 9 168 195 250 98 204 19 131 82 40 2 115 30 134 119 85 234 171 51 248 6 232 13 126 100 100 208 191 92 68 52 56 79 102 83 41 100 249 214 204 9 147 69 246 254 24 120 21 121 111 194 137 125 190 39 201 58 31 0 0 0 0 0 1 88 17 135 189 91 189 22 119 161 7 236 246 162 42 137 207 149 58 10 147 68 241 83 242 92 176 9 168 195 250 98 204 19 131 82 40 2 115 30 134 119 85 234 171 51 248 6 232 13 126 100 100 208 191 92 68 52 56 79 102 83 41 100 249 214 204 9 147 69 246 254 24 120 21 121 111 194 137 125 190 39 201 58 31 0 0 0 0 0 0 64 174 140 149 163 3 107 111 4 34 250 106 21 208 102 247 217 125 106 201 189 50 165 180 247 173 193 91 219 22 221 135 48 75 167 217 77 123 120 130 238 30 6 129 157 63 162 58 79 199 175 93 130 164 195 209 241 206 111 166 90 218 65 223 2 1 64 174 140 149 163 3 107 111 4 34 250 106 21 208 102 247 217 125 106 201 189 50 165 180 247 173 193 91 219 22 221 135 48 75 167 217 77 123 120 130 238 30 6 129 157 63 162 58 79 199 175 93 130 164 195 209 241 206 111 166 90 218 65 223 2 0 64 94 39 245 99 17 252 182 140 162 112 156 230 137 46 180 2 25 35 78 204 212 30 138 67 63 147 188 132 251 223 228 122 221 52 247 47 60 130 213 221 67 57 251 17 236 100 5 136 157 85 85 137 180 82 210 206 141 57 0 0 0 0 0 0 1 64 94 39 245 99 17 252 182 140 162 112 156 230 137 46 180 2 25 35 78 204 212 30 138 67 63 147 188 132 251 223 228 122 221 52 247 47 60 130 213 221 67 57 251 17 236 100 5 136 157 85 85 137 180 82 210 206 141 57 0 0 0 0 0 0 0 56 130 153 165 204 195 100 32 242 200 177 22 23 48 222 90 173 238 62 11 195 207 31 94 106 111 19 23 102 123 154 11 25 69 140 143 38 27 47 211 73 199 58 157 241 52 98 114 254 14 0 0 0 0 0 0 0 1 56 130 153 165 204 195 100 32 242 200 177 22 23 48 222 90 173 238 62 11 195 207 31 94 106 111 19 23 102 123 154 11 25 69 140 143 38 27 47 211 73 199 58 157 241 52 98 114 254 14 0 0 0 0 0 0 0 0 72 242 139 53 248 243 242 47 139 119 188 176 74 227 81 33 108 130 169 69 136 245 21 31 87 103 135 189 216 110 191 185 187 15 111 235 113 59 97 210 163 3 82 39 248 57 165 173 26 7 64 153 147 109 165 237 85 23 91 144 96 82 212 163 110 172 233 196 20 189 194 1 0 1 72 242 139 53 248 243 242 47 139 119 188 176 74 227 81 33 108 130 169 69 136 245 21 31 87 103 135 189 216 110 191 185 187 15 111 235 113 59 97 210 163 3 82 39 248 57 165 173 26 7 64 153 147 109 165 237 85 23 91 144 96 82 212 163 110 172 233 196 20 189 194 1 0 0 96 63 196 195 103 33 69 53 0 35 106 115 86 145 225 79 206 13 41 97 138 221 49 15 101 120 43 207 2 164 87 76 203 63 18 204 117 208 102 150 11 45 65 74 88 87 11 31 221 40 244 204 108 35 1 221 236 192 33 114 34 255 16 27 102 160 251 229 204 178 67 44 210 45 249 116 212 232 9 246 165 134 232 228 248 94 170 234 243 13 232 1 125 0 0 0 0 1 96 63 196 195 103 33 69 53 0 35 106 115 86 145 225 79 206 13 41 97 138 221 49 15 101 120 43 207 2 164 87 76 203 63 18 204 117 208 102 150 11 45 65 74 88 87 11 31 221 40 244 204 108 35 1 221 236 192 33 114 34 255 16 27 102 160 251 229 204 178 67 44 210 45 249 116 212 232 9 246 165 134 232 228 248 94 170 234 243 13 232 1 125 0 0 0 0 0 40 179 181 131 162 149 183 138 252 30 154 1 146 137 121 52 190 246 1 224 28 36 102 79 202 159 212 210 252 214 150 156 61 194 235 164 133 239 142 0 0 1 40 179 181 131 162 149 183 138 252 30 154 1 146 137 121 52 190 246 1 224 28 36 102 79 202 159 212 210 252 214 150 156 61 194 235 164 133 239 142 0 0 0 40 60 58 79 249 6 113 81 42 62 163 64 45 148 17 196 92 207 75 88 80 225 216 133 32 64 220 110 107 147 131 21 223 245 83 192 232 107 0 0 0 1 40 60 58 79 249 6 113 81 42 62 163 64 45 148 17 196 92 207 75 88 80 225 216 133 32 64 220 110 107 147 131 21 223 245 83 192 232 107 0 0 0 0 96 12 165 17 255 148 106 77 76 190 146 244 60 246 21 69 4 108 6 135 121 71 44 77 148 210 123 228 244 192 7 178 234 75 27 35 56 139 157 89 246 205 166 104 142 71 22 111 74 215 198 253 47 185 250 203 223 186 72 48 140 56 78 5 248 174 81 223 135 55 86 65 183 39 125 199 89 36 113 114 101 100 241 34 118 182 139 64 184 93 41 222 250 83 8 126 2 1 96 12 165 17 255 148 106 77 76 190 146 244 60 246 21 69 4 108 6 135 121 71 44 77 148 210 123 228 244 192 7 178 234 75 27 35 56 139 157 89 246 205 166 104 142 71 22 111 74 215 198 253 47 185 250 203 223 186 72 48 140 56 78 5 248 174 81 223 135 55 86 65 183 39 125 199 89 36 113 114 101 100 241 34 118 182 139 64 184 93 41 222 250 83 8 126 2 0 80 194 39 168 144 47 63 164 168 230 144 217 13 24 96 155 100 12 59 177 151 216 92 228 192 145 88 206 81 45 221 226 39 93 88 12 250 68 153 137 36 20 58 0 113 35 195 22 121 71 66 8 241 39 201 196 133 230 128 125 7 217 82 221 87 57 93 151 146 24 13 11 157 51 151 229 8 102 193 170 254 1 80 194 39 168 144 47 63 164 168 230 144 217 13 24 96 155 100 12 59 177 151 216 92 228 192 145 88 206 81 45 221 226 39 93 88 12 250 68 153 137 36 20 58 0 113 35 195 22 121 71 66 8 241 39 201 196 133 230 128 125 7 217 82 221 87 57 93 151 146 24 13 11 157 51 151 229 8 102 193 170 254 0 32 115 165 0 181 114 222 7 59 3 124 183 26 196 172 167 125 136 168 200 232 107 92 130 217 10 0 0 0 0 0 0 0 1 32 115 165 0 181 114 222 7 59 3 124 183 26 196 172 167 125 136 168 200 232 107 92 130 217 10 0 0 0 0 0 0 0 0 104 236 68 87 125 155 29 32 62 230 30 136 150 217 197 37 30 35 255 242 108 93 176 111 33 250 237 114 238 160 77 113 171 147 43 61 144 12 84 87 115 160 128 222 109 180 248 55 195 181 75 255 203 79 219 130 244 94 36 238 156 212 175 171 162 174 87 117 209 113 175 106 193 36 21 66 244 243 166 248 81 121 94 110 189 10 52 188 102 198 136 150 183 191 180 96 29 51 207 65 251 163 177 216 188 1 104 236 68 87 125 155 29 32 62 230 30 136 150 217 197 37 30 35 255 242 108 93 176 111 33 250 237 114 238 160 77 113 171 147 43 61 144 12 84 87 115 160 128 222 109 180 248 55 195 181 75 255 203 79 219 130 244 94 36 238 156 212 175 171 162 174 87 117 209 113 175 106 193 36 21 66 244 243 166 248 81 121 94 110 189 10 52 188 102 198 136 150 183 191 180 96 29 51 207 65 251 163 177 216 188 0 88 199 62 219 38 224 64 98 122 250 132 90 246 191 177 175 129 238 74 103 140 144 205 156 27 249 53 223 251 192 95 121 104 139 113 181 72 177 157 33 140 244 253 143 104 230 164 205 233 17 33 203 84 40 89 149 26 16 144 238 213 168 166 242 186 189 255 169 165 234 16 127 90 100 62 217 16 139 41 102 89 93 97 62 95 147 122 238 237 1 88 199 62 219 38 224 64 98 122 250 132 90 246 191 177 175 129 238 74 103 140 144 205 156 27 249 53 223 251 192 95 121 104 139 113 181 72 177 157 33 140 244 253 143 104 230 164 205 233 17 33 203 84 40 89 149 26 16 144 238 213 168 166 242 186 189 255 169 165 234 16 127 90 100 62 217 16 139 41 102 89 93 97 62 95 147 122 238 237 0 48 45 84 26 33 30 184 117 77 114 45 211 193 64 207 224 237 136 114 3 145 150 20 213 238 240 36 201 64 122 69 244 22 129 142 201 1 185 151 174 233 1 0 0 0 0 0 0 0 1 48 45 84 26 33 30 184 117 77 114 45 211 193 64 207 224 237 136 114 3 145 150 20 213 238 240 36 201 64 122 69 244 22 129 142 201 1 185 151 174 233 1 0 0 0 0 0 0 0 0 24 118 96 110 163 151 234 7 30 202 198 169 47 210 145 198 195 223 20 211 133 162 187 75 48 1 24 118 96 110 163 151 234 7 30 202 198 169 47 210 145 198 195 223 20 211 133 162 187 75 48 0 56 166 132 83 15 114 76 5 198 105 107 64 21 201 37 152 38 123 234 29 114 185 178 23 194 54 124 93 52 128 139 153 108 32 85 243 44 247 113 25 108 194 143 136 29 222 174 212 74 73 19 0 0 0 0 0 0 1 56 166 132 83 15 114 76 5 198 105 107 64 21 201 37 152 38 123 234 29 114 185 178 23 194 54 124 93 52 128 139 153 108 32 85 243 44 247 113 25 108 194 143 136 29 222 174 212 74 73 19 0 0 0 0 0 0 0 48 123 248 179 54 119 191 224 218 82 168 17 9 213 235 78 184 70 111 32 105 157 160 212 123 240 230 248 188 30 46 115 251 167 248 212 75 179 20 91 203 47 80 142 34 152 174 246 1 1 48 123 248 179 54 119 191 224 218 82 168 17 9 213 235 78 184 70 111 32 105 157 160 212 123 240 230 248 188 30 46 115 251 167 248 212 75 179 20 91 203 47 80 142 34 152 174 246 1 0 48 156 96 100 244 230 81 145 6 56 18 242 19 211 56 11 208 136 192 193 247 21 84 210 245 251 22 164 190 142 62 191 235 148 86 107 108 228 229 161 113 8 169 132 37 3 0 0 0 1 48 156 96 100 244 230 81 145 6 56 18 242 19 211 56 11 208 136 192 193 247 21 84 210 245 251 22 164 190 142 62 191 235 148 86 107 108 228 229 161 113 8 169 132 37 3 0 0 0 0 88 253 53 33 48 131 189 25 65 204 174 99 186 204 72 230 129 192 106 8 141 23 186 143 8 176 75 97 190 2 190 127 52 92 22 252 200 15 45 98 21 11 157 128 28 145 217 54 150 99 213 145 99 58 65 64 149 218 156 253 58 0 9 210 203 145 96 237 185 130 70 116 6 209 240 157 58 59 8 33 55 1 0 0 0 0 0 0 0 1 88 253 53 33 48 131 189 25 65 204 174 99 186 204 72 230 129 192 106 8 141 23 186 143 8 176 75 97 190 2 190 127 52 92 22 252 200 15 45 98 21 11 157 128 28 145 217 54 150 99 213 145 99 58 65 64 149 218 156 253 58 0 9 210 203 145 96 237 185 130 70 116 6 209 240 157 58 59 8 33 55 1 0 0 0 0 0 0 0 0 112 140 139 49 207 205 64 240 199 59 87 85 34 45 23 247 226 20 175 76 118 24 188 97 163 249 238 130 105 219 76 167 90 29 31 159 229 181 73 152 183 74 134 209 139 34 200 210 113 231 227 99 224 196 220 80 243 62 167 195 5 201 123 178 100 95 190 235 171 32 64 54 178 111 83 175 134 22 73 175 164 79 39 170 74 102 74 233 210 216 226 3 131 100 81 201 127 195 224 208 29 109 171 156 77 11 0 0 0 0 0 0 0 1 112 140 139 49 207 205 64 240 199 59 87 85 34 45 23 247 226 20 175 76 118 24 188 97 163 249 238 130 105 219 76 167 90 29 31 159 229 181 73 152 183 74 134 209 139 34 200 210 113 231 227 99 224 196 220 80 243 62 167 195 5 201 123 178 100 95 190 235 171 32 64 54 178 111 83 175 134 22 73 175 164 79 39 170 74 102 74 233 210 216 226 3 131 100 81 201 127 195 224 208 29 109 171 156 77 11 0 0 0 0 0 0 0 0 104 222 231 217 128 82 99 10 214 110 228 128 78 114 45 119 81 180 185 243 203 206 92 162 40 82 46 54 187 93 28 152 69 4 123 103 77 208 204 181 235 42 147 170 143 2 139 154 218 144 51 223 215 163 89 75 72 123 205 0 240 64 100 207 207 158 197 65 249 187 175 80 167 154 152 209 32 55 42 171 219 232 238 66 244 61 205 209 141 94 43 111 8 205 151 59 230 205 24 205 241 0 0 0 0 1 104 222 231 217 128 82 99 10 214 110 228 128 78 114 45 119 81 180 185 243 203 206 92 162 40 82 46 54 187 93 28 152 69 4 123 103 77 208 204 181 235 42 147 170 143 2 139 154 218 144 51 223 215 163 89 75 72 123 205 0 240 64 100 207 207 158 197 65 249 187 175 80 167 154 152 209 32 55 42 171 219 232 238 66 244 61 205 209 141 94 43 111 8 205 151 59 230 205 24 205 241 0 0 0 0 0 88 207 251 142 39 144 108 252 57 106 73 11 186 19 131 187 69 26 149 177 211 238 136 251 62 89 7 238 7 115 168 92 155 211 100 253 171 162 138 116 33 152 91 134 33 55 71 164 201 152 4 49 26 55 186 161 250 57 85 28 39 171 17 196 138 245 10 0 73 155 144 183 97 4 3 242 240 169 248 22 116 210 225 61 191 6 115 0 0 1 88 207 251 142 39 144 108 252 57 106 73 11 186 19 131 187 69 26 149 177 211 238 136 251 62 89 7 238 7 115 168 92 155 211 100 253 171 162 138 116 33 152 91 134 33 55 71 164 201 152 4 49 26 55 186 161 250 57 85 28 39 171 17 196 138 245 10 0 73 155 144 183 97 4 3 242 240 169 248 22 116 210 225 61 191 6 115 0 0 0 16 137 130 140 24 236 12 214 199 10 105 31 0 0 0 0 0 1 16 137 130 140 24 236 12 214 199 10 105 31 0 0 0 0 0 0 56 108 175 196 156 55 213 72 113 207 244 180 56 88 213 35 165 75 248 211 20 212 57 60 188 217 211 48 37 134 141 243 246 161 245 39 195 123 248 138 183 15 28 111 146 50 155 93 170 4 0 0 0 0 0 0 0 1 56 108 175 196 156 55 213 72 113 207 244 180 56 88 213 35 165 75 248 211 20 212 57 60 188 217 211 48 37 134 141 243 246 161 245 39 195 123 248 138 183 15 28 111 146 50 155 93 170 4 0 0 0 0 0 0 0 0 120 112 113 30 136 233 190 54 137 121 169 50 162 49 32 173 179 18 162 50 40 203 206 65 185 66 186 230 219 176 80 103 123 27 250 226 122 23 191 77 80 214 47 76 55 89 65 20 139 103 231 246 32 248 93 179 33 222 25 246 60 212 174 114 116 72 105 47 23 51 143 138 172 27 39 246 135 133 254 162 107 108 22 2 166 141 243 6 251 77 176 135 206 2 231 124 148 132 69 84 79 111 64 235 234 76 164 46 49 159 31 188 209 182 60 173 197 202 76 16 0 1 120 112 113 30 136 233 190 54 137 121 169 50 162 49 32 173 179 18 162 50 40 203 206 65 185 66 186 230 219 176 80 103 123 27 250 226 122 23 191 77 80 214 47 76 55 89 65 20 139 103 231 246 32 248 93 179 33 222 25 246 60 212 174 114 116 72 105 47 23 51 143 138 172 27 39 246 135 133 254 162 107 108 22 2 166 141 243 6 251 77 176 135 206 2 231 124 148 132 69 84 79 111 64 235 234 76 164 46 49 159 31 188 209 182 60 173 197 202 76 16 0 0 64 47 160 84 82 9 238 207 219 151 156 134 131 89 62 11 68 11 147 237 99 121 15 73 200 84 95 87 214 232 187 96 240 53 52 195 55 200 190 88 28 76 29 80 151 156 97 63 20 181 127 200 147 98 254 76 151 61 118 77 0 0 0 0 0 1 64 47 160 84 82 9 238 207 219 151 156 134 131 89 62 11 68 11 147 237 99 121 15 73 200 84 95 87 214 232 187 96 240 53 52 195 55 200 190 88 28 76 29 80 151 156 97 63 20 181 127 200 147 98 254 76 151 61 118 77 0 0 0 0 0 0 104 238 56 196 120 62 80 239 58 25 190 123 255 60 22 240 193 64 200 155 205 65 125 162 46 114 82 168 130 71 226 104 252 45 143 77 84 254 194 132 208 96 195 7 173 173 156 202 242 175 234 16 37 97 18 174 179 230 94 208 69 94 78 160 223 97 151 58 36 237 203 214 110 180 89 134 104 29 12 23 140 193 36 70 29 183 50 17 167 28 12 196 65 172 236 156 91 251 73 127 1 0 0 0 0 1 104 238 56 196 120 62 80 239 58 25 190 123 255 60 22 240 193 64 200 155 205 65 125 162 46 114 82 168 130 71 226 104 252 45 143 77 84 254 194 132 208 96 195 7 173 173 156 202 242 175 234 16 37 97 18 174 179 230 94 208 69 94 78 160 223 97 151 58 36 237 203 214 110 180 89 134 104 29 12 23 140 193 36 70 29 183 50 17 167 28 12 196 65 172 236 156 91 251 73 127 1 0 0 0 0 0 40 149 114 1 116 102 17 2 174 6 173 97 185 176 52 172 147 84 122 233 135 57 32 185 232 151 166 16 42 84 99 130 237 14 101 51 119 173 115 53 0 1 40 149 114 1 116 102 17 2 174 6 173 97 185 176 52 172 147 84 122 233 135 57 32 185 232 151 166 16 42 84 99 130 237 14 101 51 119 173 115 53 0 0 64 242 217 97 202 37 38 150 206 207 10 52 100 102 27 105 39 214 77 170 228 242 244 122 45 230 139 116 113 248 171 76 193 78 80 198 37 181 97 228 185 29 21 241 62 210 131 193 6 1 89 93 123 149 252 254 234 21 49 121 54 70 123 12 0 1 64 242 217 97 202 37 38 150 206 207 10 52 100 102 27 105 39 214 77 170 228 242 244 122 45 230 139 116 113 248 171 76 193 78 80 198 37 181 97 228 185 29 21 241 62 210 131 193 6 1 89 93 123 149 252 254 234 21 49 121 54 70 123 12 0 0 120 126 216 172 15 25 129 241 98 17 2 168 135 214 24 154 85 56 125 146 150 225 161 82 46 26 201 64 204 132 245 111 192 88 211 123 3 119 58 58 245 118 104 138 91 147 19 185 226 101 33 139 62 235 15 91 204 29 220 53 8 11 61 142 142 93 77 162 71 38 142 116 213 43 79 225 85 174 86 234 214 249 189 86 69 229 181 99 122 154 144 192 66 13 218 96 118 124 80 14 168 5 230 111 79 37 76 42 49 185 18 80 157 188 50 80 199 22 0 0 0 1 120 126 216 172 15 25 129 241 98 17 2 168 135 214 24 154 85 56 125 146 150 225 161 82 46 26 201 64 204 132 245 111 192 88 211 123 3 119 58 58 245 118 104 138 91 147 19 185 226 101 33 139 62 235 15 91 204 29 220 53 8 11 61 142 142 93 77 162 71 38 142 116 213 43 79 225 85 174 86 234 214 249 189 86 69 229 181 99 122 154 144 192 66 13 218 96 118 124 80 14 168 5 230 111 79 37 76 42 49 185 18 80 157 188 50 80 199 22 0 0 0 0 56 243 53 196 121 165 92 144 118 3 3 222 84 206 144 5 157 57 16 134 139 198 69 129 221 11 133 183 218 71 108 13 56 83 246 113 103 6 198 202 227 68 93 146 59 161 12 248 177 166 51 150 47 96 161 239 236 1 56 243 53 196 121 165 92 144 118 3 3 222 84 206 144 5 157 57 16 134 139 198 69 129 221 11 133 183 218 71 108 13 56 83 246 113 103 6 198 202 227 68 93 146 59 161 12 248 177 166 51 150 47 96 161 239 236 0 64 153 28 132 11 210 222 158 84 204 251 210 22 227 11 36 206 23 140 161 60 159 143 123 206 191 31 7 46 144 178 243 58 169 39 112 174 47 119 109 7 130 69 51 2 125 253 241 144 64 234 96 3 245 113 8 190 14 182 65 46 222 249 3 0 1 64 153 28 132 11 210 222 158 84 204 251 210 22 227 11 36 206 23 140 161 60 159 143 123 206 191 31 7 46 144 178 243 58 169 39 112 174 47 119 109 7 130 69 51 2 125 253 241 144 64 234 96 3 245 113 8 190 14 182 65 46 222 249 3 0 0 64 98 185 79 194 105 170 12 86 252 124 124 192 23 205 211 77 162 50 205 89 40 158 46 179 237 22 171 26 56 121 32 6 69 111 60 114 251 180 204 199 96 135 46 64 144 243 102 201 99 166 113 208 152 168 179 161 1 6 0 0 0 0 0 0 1 64 98 185 79 194 105 170 12 86 252 124 124 192 23 205 211 77 162 50 205 89 40 158 46 179 237 22 171 26 56 121 32 6 69 111 60 114 251 180 204 199 96 135 46 64 144 243 102 201 99 166 113 208 152 168 179 161 1 6 0 0 0 0 0 0 0 104 142 26 227 150 238 69 151 6 3 30 46 190 46 96 134 217 131 85 161 92 34 208 158 197 175 196 117 64 216 114 195 81 101 252 52 106 185 71 47 193 32 27 53 120 25 14 193 3 5 106 149 116 208 152 66 126 218 195 178 209 4 241 87 44 185 217 57 224 49 139 77 191 217 218 19 215 78 14 143 87 180 5 177 20 62 54 52 235 79 31 44 20 98 23 221 250 34 0 0 0 0 0 0 0 1 104 142 26 227 150 238 69 151 6 3 30 46 190 46 96 134 217 131 85 161 92 34 208 158 197 175 196 117 64 216 114 195 81 101 252 52 106 185 71 47 193 32 27 53 120 25 14 193 3 5 106 149 116 208 152 66 126 218 195 178 209 4 241 87 44 185 217 57 224 49 139 77 191 217 218 19 215 78 14 143 87 180 5 177 20 62 54 52 235 79 31 44 20 98 23 221 250 34 0 0 0 0 0 0 0 0 40 32 168 235 44 56 166 243 210 154 91 226 40 229 249 145 209 125 211 169 133 252 161 224 125 81 253 117 254 153 178 166 34 26 180 249 135 33 222 152 13 1 40 32 168 235 44 56 166 243 210 154 91 226 40 229 249 145 209 125 211 169 133 252 161 224 125 81 253 117 254 153 178 166 34 26 180 249 135 33 222 152 13 0 16 114 51 72 217 92 64 168 124 50 132 58 208 128 106 1 0 1 16 114 51 72 217 92 64 168 124 50 132 58 208 128 106 1 0 0 72 69 4 0 153 42 90 20 74 230 90 168 97 72 101 100 19 28 241 147 219 3 93 60 246 145 183 55 230 232 224 115 211 143 158 209 214 247 84 89 209 186 139 133 34 124 5 207 184 125 115 201 88 222 241 97 109 108 6 13 211 125 187 117 94 222 2 0 0 0 0 0 0 1 72 69 4 0 153 42 90 20 74 230 90 168 97 72 101 100 19 28 241 147 219 3 93 60 246 145 183 55 230 232 224 115 211 143 158 209 214 247 84 89 209 186 139 133 34 124 5 207 184 125 115 201 88 222 241 97 109 108 6 13 211 125 187 117 94 222 2 0 0 0 0 0 0 0 56 153 84 205 104 19 159 225 153 148 74 194 235 72 23 144 76 152 243 229 1 90 189 92 32 175 52 88 183 242 20 84 239 175 56 99 222 31 211 114 93 122 135 65 160 226 51 48 207 12 116 28 0 0 0 0 0 1 56 153 84 205 104 19 159 225 153 148 74 194 235 72 23 144 76 152 243 229 1 90 189 92 32 175 52 88 183 242 20 84 239 175 56 99 222 31 211 114 93 122 135 65 160 226 51 48 207 12 116 28 0 0 0 0 0 0 72 245 53 109 105 191 82 1 66 103 122 80 160 241 193 52 254 117 182 127 138 99 142 106 221 128 239 15 222 14 129 176 110 43 113 122 176 232 88 250 58 0 161 215 14 126 59 139 23 140 13 122 239 14 189 40 72 35 18 82 213 254 53 121 213 234 12 0 0 0 0 0 0 1 72 245 53 109 105 191 82 1 66 103 122 80 160 241 193 52 254 117 182 127 138 99 142 106 221 128 239 15 222 14 129 176 110 43 113 122 176 232 88 250 58 0 161 215 14 126 59 139 23 140 13 122 239 14 189 40 72 35 18 82 213 254 53 121 213 234 12 0 0 0 0 0 0 0 112 159 8 16 9 71 195 199 198 21 242 159 80 249 120 17 254 76 140 121 166 78 213 92 89 178 160 20 177 8 14 182 122 65 115 133 119 121 16 112 118 105 211 205 62 12 236 55 80 1 131 163 0 83 205 178 80 88 102 233 133 195 61 239 174 246 227 234 216 85 176 76 5 36 121 112 51 212 181 246 245 241 105 195 137 147 72 56 237 179 190 73 134 142 177 146 141 8 159 112 222 16 234 231 234 198 20 89 52 189 194 119 1 1 112 159 8 16 9 71 195 199 198 21 242 159 80 249 120 17 254 76 140 121 166 78 213 92 89 178 160 20 177 8 14 182 122 65 115 133 119 121 16 112 118 105 211 205 62 12 236 55 80 1 131 163 0 83 205 178 80 88 102 233 133 195 61 239 174 246 227 234 216 85 176 76 5 36 121 112 51 212 181 246 245 241 105 195 137 147 72 56 237 179 190 73 134 142 177 146 141 8 159 112 222 16 234 231 234 198 20 89 52 189 194 119 1 0 112 80 214 13 177 215 159 125 169 151 12 42 72 121 18 76 208 238 240 149 68 234 73 20 164 91 171 220 52 255 98 21 228 111 4 175 56 163 222 123 128 30 97 59 67 228 49 187 237 223 220 86 109 144 229 187 251 70 7 146 195 116 106 122 232 185 78 78 58 225 39 134 160 118 235 208 242 69 148 226 101 73 25 136 159 25 99 137 101 248 54 26 247 229 7 34 61 19 28 201 190 36 74 102 133 25 0 0 0 0 0 0 0 1 112 80 214 13 177 215 159 125 169 151 12 42 72 121 18 76 208 238 240 149 68 234 73 20 164 91 171 220 52 255 98 21 228 111 4 175 56 163 222 123 128 30 97 59 67 228 49 187 237 223 220 86 109 144 229 187 251 70 7 146 195 116 106 122 232 185 78 78 58 225 39 134 160 118 235 208 242 69 148 226 101 73 25 136 159 25 99 137 101 248 54 26 247 229 7 34 61 19 28 201 190 36 74 102 133 25 0 0 0 0 0 0 0 0 48 214 54 94 179 164 240 155 40 191 186 107 180 206 48 82 137 213 91 241 62 39 183 229 184 237 121 223 179 199 117 185 240 244 56 38 125 32 5 140 166 122 78 243 77 252 116 1 0 1 48 214 54 94 179 164 240 155 40 191 186 107 180 206 48 82 137 213 91 241 62 39 183 229 184 237 121 223 179 199 117 185 240 244 56 38 125 32 5 140 166 122 78 243 77 252 116 1 0 0 104 54 55 200 109 82 156 202 152 175 66 36 193 252 78 5 135 125 117 139 57 40 153 71 77 232 6 37 188 28 77 2 71 137 173 143 223 127 105 125 144 234 178 168 38 38 22 213 12 86 146 58 86 128 124 44 36 53 34 45 2 168 71 121 160 250 8 153 10 51 71 123 250 225 95 140 177 159 103 47 148 120 154 141 97 250 155 186 25 61 104 158 48 167 246 20 132 6 84 93 66 112 47 0 0 1 104 54 55 200 109 82 156 202 152 175 66 36 193 252 78 5 135 125 117 139 57 40 153 71 77 232 6 37 188 28 77 2 71 137 173 143 223 127 105 125 144 234 178 168 38 38 22 213 12 86 146 58 86 128 124 44 36 53 34 45 2 168 71 121 160 250 8 153 10 51 71 123 250 225 95 140 177 159 103 47 148 120 154 141 97 250 155 186 25 61 104 158 48 167 246 20 132 6 84 93 66 112 47 0 0 0 120 6 90 182 206 193 58 216 170 220 9 22 52 156 242 120 157 30 209 26 98 51 196 178 88 228 65 154 229 210 70 170 198 64 16 247 102 16 21 58 87 235 200 244 76 203 136 132 209 76 195 94 143 2 113 149 235 158 1 227 205 1 208 16 81 131 189 40 241 92 36 170 156 224 56 199 188 154 79 125 102 121 78 97 150 233 11 79 62 109 25 212 226 161 220 35 23 232 13 90 56 183 223 124 31 159 158 14 223 62 85 83 193 110 187 158 93 203 8 0 0 1 120 6 90 182 206 193 58 216 170 220 9 22 52 156 242 120 157 30 209 26 98 51 196 178 88 228 65 154 229 210 70 170 198 64 16 247 102 16 21 58 87 235 200 244 76 203 136 132 209 76 195 94 143 2 113 149 235 158 1 227 205 1 208 16 81 131 189 40 241 92 36 170 156 224 56 199 188 154 79 125 102 121 78 97 150 233 11 79 62 109 25 212 226 161 220 35 23 232 13 90 56 183 223 124 31 159 158 14 223 62 85 83 193 110 187 158 93 203 8 0 0 0 88 47 45 238 181 215 239 242 99 34 179 237 146 38 184 178 32 39 156 91 232 37 68 223 154 247 174 99 147 112 220 68 13 168 71 188 111 58 166 58 109 244 156 76 173 12 217 7 247 229 168 222 84 82 81 171 9 74 74 20 144 71 106 164 117 234 163 235 12 58 184 167 68 145 254 103 0 233 175 219 91 115 45 23 0 0 0 0 0 1 88 47 45 238 181 215 239 242 99 34 179 237 146 38 184 178 32 39 156 91 232 37 68 223 154 247 174 99 147 112 220 68 13 168 71 188 111 58 166 58 109 244 156 76 173 12 217 7 247 229 168 222 84 82 81 171 9 74 74 20 144 71 106 164 117 234 163 235 12 58 184 167 68 145 254 103 0 233 175 219 91 115 45 23 0 0 0 0 0 0 72 40 180 241 104 90 252 242 234 235 240 236 39 250 255 76 167 29 116 156 87 88 207 205 175 125 89 77 12 21 97 61 253 152 65 25 101 5 139 108 225 153 138 24 18 112 100 115 211 39 249 92 242 104 78 15 126 214 21 35 238 183 248 195 174 170 41 249 203 160 8 0 0 1 72 40 180 241 104 90 252 242 234 235 240 236 39 250 255 76 167 29 116 156 87 88 207 205 175 125 89 77 12 21 97 61 253 152 65 25 101 5 139 108 225 153 138 24 18 112 100 115 211 39 249 92 242 104 78 15 126 214 21 35 238 183 248 195 174 170 41 249 203 160 8 0 0 0 56 22 27 151 194 115 92 119 11 236 51 137 144 137 103 129 95 89 105 130 240 243 170 243 35 191 215 206 102 95 172 26 80 149 177 248 238 54 111 45 244 22 23 22 224 158 95 94 118 19 0 0 0 0 0 0 0 1 56 22 27 151 194 115 92 119 11 236 51 137 144 137 103 129 95 89 105 130 240 243 170 243 35 191 215 206 102 95 172 26 80 149 177 248 238 54 111 45 244 22 23 22 224 158 95 94 118 19 0 0 0 0 0 0 0 0 24 156 43 16 56 55 4 61 155 177 58 74 163 225 4 11 131 179 24 1 0 0 0 0 0 1 24 156 43 16 56 55 4 61 155 177 58 74 163 225 4 11 131 179 24 1 0 0 0 0 0 0 104 73 76 101 151 31 35 209 56 36 69 31 173 147 81 94 123 172 22 210 79 45 203 20 140 58 218 46 34 183 138 96 94 97 161 218 71 10 21 254 228 117 64 245 83 14 74 129 103 121 90 57 125 205 210 39 213 162 107 185 36 194 249 86 241 82 226 200 210 202 80 195 105 63 67 249 109 65 100 248 77 32 184 210 162 76 62 215 70 139 167 97 35 196 73 132 172 243 85 144 160 14 20 22 193 1 104 73 76 101 151 31 35 209 56 36 69 31 173 147 81 94 123 172 22 210 79 45 203 20 140 58 218 46 34 183 138 96 94 97 161 218 71 10 21 254 228 117 64 245 83 14 74 129 103 121 90 57 125 205 210 39 213 162 107 185 36 194 249 86 241 82 226 200 210 202 80 195 105 63 67 249 109 65 100 248 77 32 184 210 162 76 62 215 70 139 167 97 35 196 73 132 172 243 85 144 160 14 20 22 193 0 32 126 1 30 104 79 113 99 127 177 76 179 201 53 24 182 29 192 54 96 132 91 248 133 211 86 2 0 0 0 0 0 0 1 32 126 1 30 104 79 113 99 127 177 76 179 201 53 24 182 29 192 54 96 132 91 248 133 211 86 2 0 0 0 0 0 0 0 72 92 159 45 128 70 93 245 63 92 118 241 226 212 23 182 127 131 42 229 253 64 210 240 253 132 150 70 236 28 94 44 2 105 246 1 151 224 138 233 135 254 20 25 124 118 13 182 172 20 197 252 20 174 143 186 57 51 58 222 119 36 51 0 104 163 78 183 107 2 0 0 0 1 72 92 159 45 128 70 93 245 63 92 118 241 226 212 23 182 127 131 42 229 253 64 210 240 253 132 150 70 236 28 94 44 2 105 246 1 151 224 138 233 135 254 20 25 124 118 13 182 172 20 197 252 20 174 143 186 57 51 58 222 119 36 51 0 104 163 78 183 107 2 0 0 0 0 128 74 103 198 93 113 70 83 77 90 199 193 206 145 183 35 249 192 236 161 64 7 17 137 53 0 187 116 255 249 232 191 215 71 6 51 192 57 52 156 221 118 241 145 238 148 141 72 31 162 90 235 117 210 45 34 240 215 118 239 161 128 10 59 244 108 240 132 108 62 94 40 142 165 219 48 78 211 95 143 5 181 44 128 205 117 175 172 46 236 144 98 44 44 86 152 86 44 46 101 89 209 229 168 49 93 54 154 211 126 167 37 43 164 36 251 17 187 90 218 47 68 10 0 0 0 0 0 0 1 128 74 103 198 93 113 70 83 77 90 199 193 206 145 183 35 249 192 236 161 64 7 17 137 53 0 187 116 255 249 232 191 215 71 6 51 192 57 52 156 221 118 241 145 238 148 141 72 31 162 90 235 117 210 45 34 240 215 118 239 161 128 10 59 244 108 240 132 108 62 94 40 142 165 219 48 78 211 95 143 5 181 44 128 205 117 175 172 46 236 144 98 44 44 86 152 86 44 46 101 89 209 229 168 49 93 54 154 211 126 167 37 43 164 36 251 17 187 90 218 47 68 10 0 0 0 0 0 0 0 48 5 35 182 112 113 188 253 125 124 37 72 205 161 238 42 235 141 207 222 101 115 216 55 107 133 114 20 89 39 233 135 120 225 238 214 101 146 108 76 33 35 58 202 67 65 1 0 0 1 48 5 35 182 112 113 188 253 125 124 37 72 205 161 238 42 235 141 207 222 101 115 216 55 107 133 114 20 89 39 233 135 120 225 238 214 101 146 108 76 33 35 58 202 67 65 1 0 0 0 128 104 135 234 221 147 43 69 249 95 82 22 184 215 149 229 138 106 92 255 169 236 121 106 240 235 221 243 154 22 155 148 218 188 88 136 234 72 234 250 14 92 227 117 188 12 118 41 224 174 244 46 222 46 196 200 235 191 13 185 217 77 182 148 203 3 127 173 173 34 254 84 187 72 234 176 92 208 9 125 82 232 207 39 192 114 153 168 166 210 148 43 5 225 117 107 205 99 179 177 46 90 12 119 11 225 27 124 151 136 98 153 156 122 129 197 79 159 225 89 237 180 211 34 198 224 232 1 0 1 128 104 135 234 221 147 43 69 249 95 82 22 184 215 149 229 138 106 92 255 169 236 121 106 240 235 221 243 154 22 155 148 218 188 88 136 234 72 234 250 14 92 227 117 188 12 118 41 224 174 244 46 222 46 196 200 235 191 13 185 217 77 182 148 203 3 127 173 173 34 254 84 187 72 234 176 92 208 9 125 82 232 207 39 192 114 153 168 166 210 148 43 5 225 117 107 205 99 179 177 46 90 12 119 11 225 27 124 151 136 98 153 156 122 129 197 79 159 225 89 237 180 211 34 198 224 232 1 0 0 128 30 16 152 189 248 187 194 106 86 218 107 172 24 210 165 36 4 181 124 54 238 59 132 56 110 109 236 68 95 102 145 133 240 159 128 36 169 4 207 140 229 186 242 94 18 174 89 159 26 138 112 65 245 118 85 137 113 110 126 144 76 37 227 235 138 77 233 26 84 155 51 80 31 201 113 46 222 200 95 96 232 140 13 80 38 36 30 104 180 121 216 89 15 185 161 136 55 32 42 160 149 50 168 225 1 104 50 30 10 3 96 136 60 23 224 146 203 81 219 70 1 0 0 0 0 0 0 0 1 128 30 16 152 189 248 187 194 106 86 218 107 172 24 210 165 36 4 181 124 54 238 59 132 56 110 109 236 68 95 102 145 133 240 159 128 36 169 4 207 140 229 186 242 94 18 174 89 159 26 138 112 65 245 118 85 137 113 110 126 144 76 37 227 235 138 77 233 26 84 155 51 80 31 201 113 46 222 200 95 96 232 140 13 80 38 36 30 104 180 121 216 89 15 185 161 136 55 32 42 160 149 50 168 225 1 104 50 30 10 3 96 136 60 23 224 146 203 81 219 70 1 0 0 0 0 0 0 0 0 32 31 3 148 175 154 99 152 211 246 153 40 92 93 24 93 5 168 109 224 21 185 107 37 219 63 153 164 130 241 93 111 0 1 32 31 3 148 175 154 99 152 211 246 153 40 92 93 24 93 5 168 109 224 21 185 107 37 219 63 153 164 130 241 93 111 0 0 112 73 246 239 200 138 198 5 244 5 61 186 215 203 39 176 220 88 141 123 23 70 239 91 228 24 9 208 86 173 30 190 190 160 205 169 222 186 254 3 42 110 229 120 37 181 245 217 107 172 221 147 223 37 33 9 82 153 101 228 62 236 28 113 251 178 124 157 88 255 13 110 233 60 45 129 160 39 244 17 113 220 114 236 12 12 23 203 127 173 99 182 203 235 40 81 17 163 180 158 157 229 232 88 42 248 234 216 11 207 20 25 51 1 112 73 246 239 200 138 198 5 244 5 61 186 215 203 39 176 220 88 141 123 23 70 239 91 228 24 9 208 86 173 30 190 190 160 205 169 222 186 254 3 42 110 229 120 37 181 245 217 107 172 221 147 223 37 33 9 82 153 101 228 62 236 28 113 251 178 124 157 88 255 13 110 233 60 45 129 160 39 244 17 113 220 114 236 12 12 23 203 127 173 99 182 203 235 40 81 17 163 180 158 157 229 232 88 42 248 234 216 11 207 20 25 51 0 8 39 132 6 0 0 0 0 0 1 8 39 132 6 0 0 0 0 0 0 72 220 180 23 131 143 83 213 131 208 206 205 120 25 87 192 44 119 67 69 124 227 114 112 253 61 85 176 134 4 56 189 104 188 137 70 0 24 85 129 75 88 245 68 129 51 145 7 213 104 238 115 223 7 147 12 4 53 239 245 119 158 197 135 154 106 50 38 170 151 176 21 0 1 72 220 180 23 131 143 83 213 131 208 206 205 120 25 87 192 44 119 67 69 124 227 114 112 253 61 85 176 134 4 56 189 104 188 137 70 0 24 85 129 75 88 245 68 129 51 145 7 213 104 238 115 223 7 147 12 4 53 239 245 119 158 197 135 154 106 50 38 170 151 176 21 0 0 56 53 186 59 167 241 59 136 87 128 215 201 225 137 253 171 55 175 94 153 156 167 180 232 139 32 51 246 11 119 98 59 201 174 243 8 69 82 213 30 147 100 60 26 207 249 44 53 34 200 114 0 0 0 0 0 0 1 56 53 186 59 167 241 59 136 87 128 215 201 225 137 253 171 55 175 94 153 156 167 180 232 139 32 51 246 11 119 98 59 201 174 243 8 69 82 213 30 147 100 60 26 207 249 44 53 34 200 114 0 0 0 0 0 0 0 80 174 62 24 34 239 200 187 235 239 204 93 34 151 115 205 129 228 152 167 94 171 72 91 21 73 128 43 106 226 191 23 128 76 125 32 132 209 72 252 64 195 197 154 199 15 13 192 133 198 108 88 181 61 227 187 44 34 215 108 151 40 54 253 218 203 218 197 100 1 207 108 14 183 168 181 1 75 68 203 52 1 80 174 62 24 34 239 200 187 235 239 204 93 34 151 115 205 129 228 152 167 94 171 72 91 21 73 128 43 106 226 191 23 128 76 125 32 132 209 72 252 64 195 197 154 199 15 13 192 133 198 108 88 181 61 227 187 44 34 215 108 151 40 54 253 218 203 218 197 100 1 207 108 14 183 168 181 1 75 68 203 52 0 104 178 153 248 14 228 148 99 29 41 180 54 4 212 37 168 181 45 110 40 79 241 192 17 133 242 242 158 27 85 230 33 102 187 163 67 188 94 83 9 227 224 31 154 239 89 44 152 114 79 160 147 226 52 244 38 46 88 71 34 217 114 156 13 83 85 223 134 253 133 126 56 188 90 85 65 29 106 94 50 165 88 56 132 55 180 80 212 40 199 4 162 37 213 90 184 228 101 203 7 49 0 0 0 0 1 104 178 153 248 14 228 148 99 29 41 180 54 4 212 37 168 181 45 110 40 79 241 192 17 133 242 242 158 27 85 230 33 102 187 163 67 188 94 83 9 227 224 31 154 239 89 44 152 114 79 160 147 226 52 244 38 46 88 71 34 217 114 156 13 83 85 223 134 253 133 126 56 188 90 85 65 29 106 94 50 165 88 56 132 55 180 80 212 40 199 4 162 37 213 90 184 228 101 203 7 49 0 0 0 0 0 80 38 182 96 145 194 1 121 109 64 49 154 66 199 208 229 235 239 165 41 198 204 230 234 178 15 29 203 140 160 143 49 211 78 57 102 214 114 58 133 221 75 184 224 8 199 190 6 247 208 197 161 3 41 23 120 225 80 183 58 134 227 154 146 238 63 175 177 103 131 253 150 250 82 57 2 3 0 0 0 0 1 80 38 182 96 145 194 1 121 109 64 49 154 66 199 208 229 235 239 165 41 198 204 230 234 178 15 29 203 140 160 143 49 211 78 57 102 214 114 58 133 221 75 184 224 8 199 190 6 247 208 197 161 3 41 23 120 225 80 183 58 134 227 154 146 238 63 175 177 103 131 253 150 250 82 57 2 3 0 0 0 0 0 64 248 119 27 143 213 236 116 221 199 155 29 196 80 96 187 63 97 42 122 209 144 117 56 28 149 170 177 209 56 44 150 204 131 187 222 85 190 214 23 67 242 17 199 67 116 180 19 62 92 46 154 222 244 151 104 165 83 192 191 210 45 2 0 0 1 64 248 119 27 143 213 236 116 221 199 155 29 196 80 96 187 63 97 42 122 209 144 117 56 28 149 170 177 209 56 44 150 204 131 187 222 85 190 214 23 67 242 17 199 67 116 180 19 62 92 46 154 222 244 151 104 165 83 192 191 210 45 2 0 0 0 32 75 182 65 120 225 60 231 204 95 201 188 204 81 75 120 231 176 122 123 44 181 212 75 241 199 197 22 0 0 0 0 0 1 32 75 182 65 120 225 60 231 204 95 201 188 204 81 75 120 231 176 122 123 44 181 212 75 241 199 197 22 0 0 0 0 0 0 72 223 250 238 211 74 58 16 147 125 7 190 218 142 15 49 69 24 56 233 70 213 49 22 223 242 236 38 167 130 195 39 254 92 251 3 205 152 4 121 107 79 85 199 20 69 53 93 242 156 125 37 228 96 255 30 188 96 67 150 203 206 75 217 143 153 171 129 99 51 5 0 0 1 72 223 250 238 211 74 58 16 147 125 7 190 218 142 15 49 69 24 56 233 70 213 49 22 223 242 236 38 167 130 195 39 254 92 251 3 205 152 4 121 107 79 85 199 20 69 53 93 242 156 125 37 228 96 255 30 188 96 67 150 203 206 75 217 143 153 171 129 99 51 5 0 0 0 40 108 135 124 124 29 149 22 174 63 189 26 9 249 247 17 17 89 247 0 255 90 36 201 133 122 164 9 110 235 211 222 139 25 132 124 219 40 148 57 0 1 40 108 135 124 124 29 149 22 174 63 189 26 9 249 247 17 17 89 247 0 255 90 36 201 133 122 164 9 110 235 211 222 139 25 132 124 219 40 148 57 0 0 8 221 214 2 0 0 0 0 0 1 8 221 214 2 0 0 0 0 0 0 64 147 243 38 63 33 71 153 12 98 251 245 150 131 176 144 216 39 46 89 50 223 16 34 113 69 13 67 16 135 235 91 48 79 129 250 166 204 227 58 148 218 46 57 182 34 191 165 85 34 220 7 11 186 11 50 182 83 77 72 179 7 0 0 0 1 64 147 243 38 63 33 71 153 12 98 251 245 150 131 176 144 216 39 46 89 50 223 16 34 113 69 13 67 16 135 235 91 48 79 129 250 166 204 227 58 148 218 46 57 182 34 191 165 85 34 220 7 11 186 11 50 182 83 77 72 179 7 0 0 0 0 120 233 246 77 131 243 68 158 180 136 87 207 157 192 121 128 83 72 237 157 134 56 179 201 1 58 190 146 20 153 238 215 88 195 223 67 97 118 17 130 145 223 169 2 15 100 207 216 142 60 64 52 15 48 69 172 151 212 137 218 247 204 232 97 61 38 179 246 161 46 207 132 202 4 168 89 164 121 208 120 93 104 32 129 66 68 235 47 162 233 166 150 103 24 240 136 140 27 137 9 61 79 35 201 200 190 255 32 23 133 194 43 148 11 47 84 2 0 0 0 0 1 120 233 246 77 131 243 68 158 180 136 87 207 157 192 121 128 83 72 237 157 134 56 179 201 1 58 190 146 20 153 238 215 88 195 223 67 97 118 17 130 145 223 169 2 15 100 207 216 142 60 64 52 15 48 69 172 151 212 137 218 247 204 232 97 61 38 179 246 161 46 207 132 202 4 168 89 164 121 208 120 93 104 32 129 66 68 235 47 162 233 166 150 103 24 240 136 140 27 137 9 61 79 35 201 200 190 255 32 23 133 194 43 148 11 47 84 2 0 0 0 0 0 32 158 132 247 73 243 86 76 181 117 114 74 0 73 167 54 232 186 178 119 62 251 36 87 106 243 46 78 254 30 13 0 0 1 32 158 132 247 73 243 86 76 181 117 114 74 0 73 167 54 232 186 178 119 62 251 36 87 106 243 46 78 254 30 13 0 0 0 32 187 109 237 12 177 145 13 138 110 36 103 212 219 254 32 2 199 207 206 58 33 91 157 82 142 0 0 0 0 0 0 0 1 32 187 109 237 12 177 145 13 138 110 36 103 212 219 254 32 2 199 207 206 58 33 91 157 82 142 0 0 0 0 0 0 0 0 112 191 156 137 40 227 120 81 180 191 249 128 101 54 189 222 126 135 44 172 229 198 254 122 200 254 68 241 155 189 52 134 12 32 127 165 213 33 74 112 219 180 120 124 62 203 145 126 182 239 201 194 229 70 199 78 71 165 89 3 82 85 207 202 83 229 239 95 208 222 39 184 4 206 170 105 230 130 175 81 36 41 97 157 125 234 216 239 63 206 58 107 124 78 26 131 144 70 157 163 62 27 234 177 215 202 140 179 217 0 0 0 0 1 112 191 156 137 40 227 120 81 180 191 249 128 101 54 189 222 126 135 44 172 229 198 254 122 200 254 68 241 155 189 52 134 12 32 127 165 213 33 74 112 219 180 120 124 62 203 145 126 182 239 201 194 229 70 199 78 71 165 89 3 82 85 207 202 83 229 239 95 208 222 39 184 4 206 170 105 230 130 175 81 36 41 97 157 125 234 216 239 63 206 58 107 124 78 26 131 144 70 157 163 62 27 234 177 215 202 140 179 217 0 0 0 0 0 120 255 98 44 67 145 156 67 69 207 144 154 245 114 32 23 127 211 123 148 182 146 150 170 172 74 232 254 188 127 136 34 39 122 230 35 121 2 76 118 160 187 17 37 250 134 176 133 100 139 227 15 230 54 106 167 246 167 233 207 141 247 103 135 96 18 251 188 166 202 113 88 34 38 81 212 236 236 142 153 242 1 12 51 124 236 57 28 83 109 124 63 127 190 114 111 5 105 32 46 141 46 195 82 228 121 27 143 106 94 116 99 98 35 8 0 0 0 0 0 0 1 120 255 98 44 67 145 156 67 69 207 144 154 245 114 32 23 127 211 123 148 182 146 150 170 172 74 232 254 188 127 136 34 39 122 230 35 121 2 76 118 160 187 17 37 250 134 176 133 100 139 227 15 230 54 106 167 246 167 233 207 141 247 103 135 96 18 251 188 166 202 113 88 34 38 81 212 236 236 142 153 242 1 12 51 124 236 57 28 83 109 124 63 127 190 114 111 5 105 32 46 141 46 195 82 228 121 27 143 106 94 116 99 98 35 8 0 0 0 0 0 0 0 32 232 106 75 132 234 67 145 119 175 2 68 218 133 30 27 34 7 172 120 42 19 45 118 178 216 1 0 0 0 0 0 0 1 32 232 106 75 132 234 67 145 119 175 2 68 218 133 30 27 34 7 172 120 42 19 45 118 178 216 1 0 0 0 0 0 0 0 64 129 215 181 185 15 177 200 177 68 80 119 183 36 206 190 141 54 145 230 111 190 97 150 77 141 67 185 87 206 214 237 78 15 79 202 150 147 74 113 9 154 9 23 173 146 190 131 137 247 142 224 174 235 35 57 206 3 0 0 0 0 0 0 0 1 64 129 215 181 185 15 177 200 177 68 80 119 183 36 206 190 141 54 145 230 111 190 97 150 77 141 67 185 87 206 214 237 78 15 79 202 150 147 74 113 9 154 9 23 173 146 190 131 137 247 142 224 174 235 35 57 206 3 0 0 0 0 0 0 0 0 32 115 158 93 203 145 117 229 203 77 183 195 60 46 1 188 230 187 238 14 154 176 183 66 57 250 253 70 58 37 0 0 0 1 32 115 158 93 203 145 117 229 203 77 183 195 60 46 1 188 230 187 238 14 154 176 183 66 57 250 253 70 58 37 0 0 0 0 24 81 129 71 67 43 121 89 51 236 18 78 211 96 141 172 26 113 13 214 3 0 0 0 0 1 24 81 129 71 67 43 121 89 51 236 18 78 211 96 141 172 26 113 13 214 3 0 0 0 0 0 24 184 13 246 1 153 149 55 198 59 23 173 215 119 87 65 163 114 196 32 40 213 121 0 0 1 24 184 13 246 1 153 149 55 198 59 23 173 215 119 87 65 163 114 196 32 40 213 121 0 0 0 32 56 51 141 41 47 230 78 216 176 139 28 23 160 170 28 45 110 124 64 37 171 195 108 121 74 182 76 40 76 153 115 0 1 32 56 51 141 41 47 230 78 216 176 139 28 23 160 170 28 45 110 124 64 37 171 195 108 121 74 182 76 40 76 153 115 0 0 32 206 242 236 149 72 96 46 45 248 108 12 136 166 194 52 138 152 63 46 130 98 126 192 209 228 24 24 197 243 7 0 0 1 32 206 242 236 149 72 96 46 45 248 108 12 136 166 194 52 138 152 63 46 130 98 126 192 209 228 24 24 197 243 7 0 0 0 104 163 224 244 5 84 160 193 30 20 248 69 99 186 48 205 24 55 21 110 164 203 99 211 59 80 177 211 86 41 161 229 184 106 19 96 95 57 76 140 135 150 249 39 235 242 249 52 35 6 105 190 17 117 228 226 214 214 171 123 84 78 178 176 91 241 160 229 1 232 67 196 8 201 235 118 130 80 124 105 29 101 75 30 179 181 153 56 118 147 86 245 65 10 214 206 110 133 122 248 252 15 53 12 0 1 104 163 224 244 5 84 160 193 30 20 248 69 99 186 48 205 24 55 21 110 164 203 99 211 59 80 177 211 86 41 161 229 184 106 19 96 95 57 76 140 135 150 249 39 235 242 249 52 35 6 105 190 17 117 228 226 214 214 171 123 84 78 178 176 91 241 160 229 1 232 67 196 8 201 235 118 130 80 124 105 29 101 75 30 179 181 153 56 118 147 86 245 65 10 214 206 110 133 122 248 252 15 53 12 0 0 56 255 163 247 43 209 230 164 208 61 194 65 9 8 102 145 97 240 236 201 123 138 71 245 15 204 218 185 57 76 20 213 174 59 153 22 62 121 255 64 38 76 67 69 50 49 114 127 89 242 171 78 13 84 189 144 206 1 56 255 163 247 43 209 230 164 208 61 194 65 9 8 102 145 97 240 236 201 123 138 71 245 15 204 218 185 57 76 20 213 174 59 153 22 62 121 255 64 38 76 67 69 50 49 114 127 89 242 171 78 13 84 189 144 206 0 64 119 123 244 71 66 212 59 231 215 217 150 174 254 235 5 68 31 31 6 176 61 197 15 162 18 140 92 194 120 2 15 65 53 175 46 99 56 24 73 7 37 185 106 245 175 110 29 253 204 28 202 76 47 79 71 204 251 4 48 167 1 0 0 0 1 64 119 123 244 71 66 212 59 231 215 217 150 174 254 235 5 68 31 31 6 176 61 197 15 162 18 140 92 194 120 2 15 65 53 175 46 99 56 24 73 7 37 185 106 245 175 110 29 253 204 28 202 76 47 79 71 204 251 4 48 167 1 0 0 0 0 40 75 92 25 115 221 208 198 30 142 204 73 223 50 228 83 175 70 246 95 204 121 169 116 174 231 117 55 245 122 146 164 239 74 119 247 71 4 100 3 243 1 40 75 92 25 115 221 208 198 30 142 204 73 223 50 228 83 175 70 246 95 204 121 169 116 174 231 117 55 245 122 146 164 239 74 119 247 71 4 100 3 243 0 16 34 19 120 45 63 194 247 76 181 223 195 16 0 0 0 0 1 16 34 19 120 45 63 194 247 76 181 223 195 16 0 0 0 0 0 120 11 156 157 89 152 7 19 248 49 41 66 116 237 10 201 152 231 23 143 156 186 202 203 178 43 1 204 30 223 30 82 205 180 255 123 84 194 132 200 55 172 127 23 130 112 165 163 165 42 122 249 39 165 158 69 42 153 176 150 166 240 46 132 80 211 8 120 35 97 238 127 32 91 232 38 236 223 213 67 53 103 162 194 187 151 60 152 119 172 25 69 23 189 153 199 219 236 157 195 152 26 202 31 27 199 10 79 34 126 168 67 114 24 246 235 163 169 176 2 0 1 120 11 156 157 89 152 7 19 248 49 41 66 116 237 10 201 152 231 23 143 156 186 202 203 178 43 1 204 30 223 30 82 205 180 255 123 84 194 132 200 55 172 127 23 130 112 165 163 165 42 122 249 39 165 158 69 42 153 176 150 166 240 46 132 80 211 8 120 35 97 238 127 32 91 232 38 236 223 213 67 53 103 162 194 187 151 60 152 119 172 25 69 23 189 153 199 219 236 157 195 152 26 202 31 27 199 10 79 34 126 168 67 114 24 246 235 163 169 176 2 0 0 88 85 223 220 13 86 122 92 125 254 224 25 165 190 213 4 132 224 45 245 246 242 4 21 101 215 192 193 89 76 244 92 59 156 26 236 182 254 202 196 35 75 32 109 229 252 167 15 126 64 249 191 76 96 115 179 17 42 165 113 135 249 231 21 159 208 162 179 200 212 213 61 123 49 118 34 59 181 1 182 39 112 251 16 0 0 0 0 0 1 88 85 223 220 13 86 122 92 125 254 224 25 165 190 213 4 132 224 45 245 246 242 4 21 101 215 192 193 89 76 244 92 59 156 26 236 182 254 202 196 35 75 32 109 229 252 167 15 126 64 249 191 76 96 115 179 17 42 165 113 135 249 231 21 159 208 162 179 200 212 213 61 123 49 118 34 59 181 1 182 39 112 251 16 0 0 0 0 0 0 56 241 153 124 222 255 91 80 137 188 25 206 200 154 27 122 16 125 75 240 248 246 78 65 142 23 205 193 163 87 157 134 225 91 123 69 215 210 244 123 101 159 224 170 194 255 111 207 183 177 8 44 102 228 238 181 2 1 56 241 153 124 222 255 91 80 137 188 25 206 200 154 27 122 16 125 75 240 248 246 78 65 142 23 205 193 163 87 157 134 225 91 123 69 215 210 244 123 101 159 224 170 194 255 111 207 183 177 8 44 102 228 238 181 2 0 88 108 208 238 121 156 133 32 223 68 75 136 121 125 29 189 121 101 228 164 37 65 109 220 250 136 48 233 198 101 96 135 47 117 233 2 196 191 211 238 100 182 234 243 0 91 97 184 199 182 220 252 38 146 252 212 245 32 52 172 255 55 60 67 104 138 139 119 31 23 22 151 0 79 220 46 31 165 72 73 119 91 0 0 0 0 0 0 0 1 88 108 208 238 121 156 133 32 223 68 75 136 121 125 29 189 121 101 228 164 37 65 109 220 250 136 48 233 198 101 96 135 47 117 233 2 196 191 211 238 100 182 234 243 0 91 97 184 199 182 220 252 38 146 252 212 245 32 52 172 255 55 60 67 104 138 139 119 31 23 22 151 0 79 220 46 31 165 72 73 119 91 0 0 0 0 0 0 0 0 24 213 179 45 133 224 12 22 86 217 206 37 101 183 225 74 147 210 205 0 173 128 31 240 53 1 24 213 179 45 133 224 12 22 86 217 206 37 101 183 225 74 147 210 205 0 173 128 31 240 53 0 80 90 55 247 101 97 91 255 60 228 172 4 69 150 197 105 130 9 216 50 222 145 121 93 91 122 8 47 193 246 47 193 9 162 74 30 3 151 221 91 204 206 19 231 186 13 155 24 132 70 140 134 148 236 198 3 189 248 97 75 45 121 50 215 87 150 150 229 138 138 91 126 104 37 101 138 0 0 0 0 0 1 80 90 55 247 101 97 91 255 60 228 172 4 69 150 197 105 130 9 216 50 222 145 121 93 91 122 8 47 193 246 47 193 9 162 74 30 3 151 221 91 204 206 19 231 186 13 155 24 132 70 140 134 148 236 198 3 189 248 97 75 45 121 50 215 87 150 150 229 138 138 91 126 104 37 101 138 0 0 0 0 0 0 120 115 168 21 247 112 94 184 201 248 149 252 240 29 141 154 150 50 97 41 31 56 85 247 163 55 145 23 152 45 131 53 22 104 104 156 123 120 164 40 242 48 192 145 28 44 4 132 15 113 134 148 171 248 224 123 182 163 113 254 55 6 161 136 98 198 188 165 53 144 141 184 125 14 170 160 0 214 41 35 209 54 31 123 30 107 49 216 97 58 154 19 33 192 193 123 112 203 64 156 187 211 15 178 212 189 77 250 84 218 228 148 93 53 115 124 112 0 0 0 0 1 120 115 168 21 247 112 94 184 201 248 149 252 240 29 141 154 150 50 97 41 31 56 85 247 163 55 145 23 152 45 131 53 22 104 104 156 123 120 164 40 242 48 192 145 28 44 4 132 15 113 134 148 171 248 224 123 182 163 113 254 55 6 161 136 98 198 188 165 53 144 141 184 125 14 170 160 0 214 41 35 209 54 31 123 30 107 49 216 97 58 154 19 33 192 193 123 112 203 64 156 187 211 15 178 212 189 77 250 84 218 228 148 93 53 115 124 112 0 0 0 0 0 96 124 82 249 217 103 152 210 105 101 179 152 26 43 32 241 184 13 170 187 237 6 89 158 142 202 72 9 130 229 186 22 231 141 253 32 147 157 150 169 239 239 208 239 192 162 97 2 190 76 255 147 85 133 38 206 102 92 234 167 23 138 70 25 133 14 226 134 237 118 29 40 218 196 187 239 239 178 225 158 55 21 189 63 14 233 211 32 249 204 188 227 125 20 0 0 0 1 96 124 82 249 217 103 152 210 105 101 179 152 26 43 32 241 184 13 170 187 237 6 89 158 142 202 72 9 130 229 186 22 231 141 253 32 147 157 150 169 239 239 208 239 192 162 97 2 190 76 255 147 85 133 38 206 102 92 234 167 23 138 70 25 133 14 226 134 237 118 29 40 218 196 187 239 239 178 225 158 55 21 189 63 14 233 211 32 249 204 188 227 125 20 0 0 0 0 128 177 60 161 102 138 146 247 69 176 188 18 92 242 96 135 152 103 107 37 160 86 206 146 191 253 129 245 98 150 12 55 16 198 207 141 173 254 8 189 100 126 62 201 64 132 146 143 251 54 46 248 170 236 238 107 85 4 232 188 238 154 172 221 156 205 139 30 154 186 201 53 77 80 85 0 164 126 169 125 95 209 214 94 114 253 109 143 69 147 26 150 229 49 67 202 41 185 188 58 222 135 170 143 147 169 56 199 253 208 108 79 241 186 223 39 47 118 166 2 119 183 150 198 249 52 6 0 0 1 128 177 60 161 102 138 146 247 69 176 188 18 92 242 96 135 152 103 107 37 160 86 206 146 191 253 129 245 98 150 12 55 16 198 207 141 173 254 8 189 100 126 62 201 64 132 146 143 251 54 46 248 170 236 238 107 85 4 232 188 238 154 172 221 156 205 139 30 154 186 201 53 77 80 85 0 164 126 169 125 95 209 214 94 114 253 109 143 69 147 26 150 229 49 67 202 41 185 188 58 222 135 170 143 147 169 56 199 253 208 108 79 241 186 223 39 47 118 166 2 119 183 150 198 249 52 6 0 0 0 48 121 50 208 121 198 113 59 191 8 122 194 42 131 235 44 67 197 194 251 149 183 60 30 84 243 193 92 233 207 81 221 84 214 60 215 107 83 0 178 5 171 252 181 246 155 13 0 0 1 48 121 50 208 121 198 113 59 191 8 122 194 42 131 235 44 67 197 194 251 149 183 60 30 84 243 193 92 233 207 81 221 84 214 60 215 107 83 0 178 5 171 252 181 246 155 13 0 0 0 56 166 53 117 196 161 229 248 189 4 118 22 159 55 250 249 52 240 65 18 192 100 153 107 30 88 36 106 130 0 220 222 225 150 0 193 132 255 124 153 51 146 110 36 253 172 218 35 80 8 122 3 16 206 124 33 42 1 56 166 53 117 196 161 229 248 189 4 118 22 159 55 250 249 52 240 65 18 192 100 153 107 30 88 36 106 130 0 220 222 225 150 0 193 132 255 124 153 51 146 110 36 253 172 218 35 80 8 122 3 16 206 124 33 42 0 88 106 68 182 59 178 196 127 243 157 52 191 25 43 145 111 238 141 79 101 131 239 1 63 142 28 0 132 32 245 126 60 32 214 17 147 90 227 5 98 15 248 217 212 142 124 197 131 140 236 233 147 37 78 121 156 176 23 194 249 199 210 9 238 29 123 193 74 93 96 82 46 195 174 189 189 138 161 169 130 51 227 225 203 252 54 230 59 1 1 88 106 68 182 59 178 196 127 243 157 52 191 25 43 145 111 238 141 79 101 131 239 1 63 142 28 0 132 32 245 126 60 32 214 17 147 90 227 5 98 15 248 217 212 142 124 197 131 140 236 233 147 37 78 121 156 176 23 194 249 199 210 9 238 29 123 193 74 93 96 82 46 195 174 189 189 138 161 169 130 51 227 225 203 252 54 230 59 1 0 16 91 51 80 52 153 106 15 96 178 33 98 180 208 107 15 0 1 16 91 51 80 52 153 106 15 96 178 33 98 180 208 107 15 0 0 96 146 234 254 250 136 181 23 108 220 189 235 39 183 250 50 211 23 108 166 159 135 169 94 214 225 32 1 13 78 240 181 132 87 93 98 20 18 115 26 247 31 145 41 94 224 210 84 160 74 211 209 64 225 64 180 241 208 245 103 182 102 43 178 61 140 91 159 243 48 233 2 13 121 164 43 215 31 105 2 197 114 135 82 116 240 53 2 223 62 194 1 0 0 0 0 0 1 96 146 234 254 250 136 181 23 108 220 189 235 39 183 250 50 211 23 108 166 159 135 169 94 214 225 32 1 13 78 240 181 132 87 93 98 20 18 115 26 247 31 145 41 94 224 210 84 160 74 211 209 64 225 64 180 241 208 245 103 182 102 43 178 61 140 91 159 243 48 233 2 13 121 164 43 215 31 105 2 197 114 135 82 116 240 53 2 223 62 194 1 0 0 0 0 0 0 40 185 152 217 29 34 198 116 253 71 146 190 251 229 82 88 248 120 47 21 213 170 170 112 236 72 88 154 181 235 239 69 222 48 2 0 0 0 0 0 0 1 40 185 152 217 29 34 198 116 253 71 146 190 251 229 82 88 248 120 47 21 213 170 170 112 236 72 88 154 181 235 239 69 222 48 2 0 0 0 0 0 0 0 24 29 136 104 174 70 11 214 125 207 165 237 74 237 199 33 28 122 6 213 243 25 0 0 0 1 24 29 136 104 174 70 11 214 125 207 165 237 74 237 199 33 28 122 6 213 243 25 0 0 0 0 56 208 160 113 38 148 89 13 191 95 94 203 140 7 30 57 94 69 180 223 237 240 172 171 247 162 165 245 245 5 100 24 96 24 245 62 100 128 18 89 116 205 89 200 251 14 195 113 223 134 107 202 24 7 0 0 0 1 56 208 160 113 38 148 89 13 191 95 94 203 140 7 30 57 94 69 180 223 237 240 172 171 247 162 165 245 245 5 100 24 96 24 245 62 100 128 18 89 116 205 89 200 251 14 195 113 223 134 107 202 24 7 0 0 0 0 24 164 26 119 125 80 143 88 12 173 143 157 18 207 147 18 133 102 5 0 0 0 0 0 0 1 24 164 26 119 125 80 143 88 12 173 143 157 18 207 147 18 133 102 5 0 0 0 0 0 0 0 80 240 91 93 80 200 2 55 132 40 130 206 143 31 138 22 6 196 227 42 127 4 69 60 97 99 42 199 161 115 16 243 173 96 104 227 89 184 61 55 91 197 16 30 116 69 157 9 62 186 27 47 108 196 231 54 53 86 238 78 204 233 137 113 247 34 18 212 144 7 152 39 169 110 99 156 198 1 0 0 0 1 80 240 91 93 80 200 2 55 132 40 130 206 143 31 138 22 6 196 227 42 127 4 69 60 97 99 42 199 161 115 16 243 173 96 104 227 89 184 61 55 91 197 16 30 116 69 157 9 62 186 27 47 108 196 231 54 53 86 238 78 204 233 137 113 247 34 18 212 144 7 152 39 169 110 99 156 198 1 0 0 0 0 64 164 36 243 234 38 238 24 36 226 207 250 29 63 195 44 89 189 228 110 154 71 14 125 43 159 59 53 176 232 184 148 203 158 152 210 156 44 195 201 57 165 81 190 91 35 122 171 243 195 109 195 142 67 89 184 14 18 25 0 0 0 0 0 0 1 64 164 36 243 234 38 238 24 36 226 207 250 29 63 195 44 89 189 228 110 154 71 14 125 43 159 59 53 176 232 184 148 203 158 152 210 156 44 195 201 57 165 81 190 91 35 122 171 243 195 109 195 142 67 89 184 14 18 25 0 0 0 0 0 0 0 40 168 114 107 133 10 23 139 104 205 120 166 131 193 1 223 63 29 201 98 120 19 62 117 38 159 115 66 105 171 210 74 142 248 0 0 0 0 0 0 0 1 40 168 114 107 133 10 23 139 104 205 120 166 131 193 1 223 63 29 201 98 120 19 62 117 38 159 115 66 105 171 210 74 142 248 0 0 0 0 0 0 0 0 8 188 118 208 125 103 29 0 0 1 8 188 118 208 125 103 29 0 0 0 80 93 36 106 167 48 129 182 121 19 12 119 143 58 46 98 169 218 191 211 74 102 51 142 112 70 65 240 134 104 65 202 183 210 160 25 144 232 17 193 129 249 86 192 216 157 46 31 9 89 42 0 255 32 223 228 36 241 177 228 240 221 30 38 173 183 42 128 15 55 48 187 131 109 78 5 178 203 7 0 0 1 80 93 36 106 167 48 129 182 121 19 12 119 143 58 46 98 169 218 191 211 74 102 51 142 112 70 65 240 134 104 65 202 183 210 160 25 144 232 17 193 129 249 86 192 216 157 46 31 9 89 42 0 255 32 223 228 36 241 177 228 240 221 30 38 173 183 42 128 15 55 48 187 131 109 78 5 178 203 7 0 0 0 104 209 253 145 149 140 101 72 59 80 61 95 87 223 103 111 142 120 156 200 160 119 178 162 183 243 3 59 250 14 151 250 48 55 97 183 44 47 166 154 9 238 68 13 148 84 67 106 86 157 132 235 187 35 17 121 154 165 226 136 96 27 177 250 145 13 38 0 109 173 58 16 189 45 0 156 64 166 8 87 150 211 191 66 117 148 187 227 116 144 40 22 160 105 172 245 89 17 98 157 251 122 154 0 0 1 104 209 253 145 149 140 101 72 59 80 61 95 87 223 103 111 142 120 156 200 160 119 178 162 183 243 3 59 250 14 151 250 48 55 97 183 44 47 166 154 9 238 68 13 148 84 67 106 86 157 132 235 187 35 17 121 154 165 226 136 96 27 177 250 145 13 38 0 109 173 58 16 189 45 0 156 64 166 8 87 150 211 191 66 117 148 187 227 116 144 40 22 160 105 172 245 89 17 98 157 251 122 154 0 0 0 96 48 216 197 206 211 163 26 178 30 38 25 126 254 218 154 197 147 60 114 177 112 98 153 149 94 247 85 223 187 252 210 64 20 63 98 66 201 175 4 146 53 51 161 164 120 186 172 160 189 77 68 186 110 221 45 4 254 96 67 66 66 64 145 122 236 241 192 130 240 110 229 191 58 172 70 147 64 128 67 77 37 143 90 168 105 183 130 40 128 162 204 0 0 0 0 0 1 96 48 216 197 206 211 163 26 178 30 38 25 126 254 218 154 197 147 60 114 177 112 98 153 149 94 247 85 223 187 252 210 64 20 63 98 66 201 175 4 146 53 51 161 164 120 186 172 160 189 77 68 186 110 221 45 4 254 96 67 66 66 64 145 122 236 241 192 130 240 110 229 191 58 172 70 147 64 128 67 77 37 143 90 168 105 183 130 40 128 162 204 0 0 0 0 0 0 24 176 183 71 106 140 200 146 60 201 141 49 175 206 219 24 51 141 203 213 202 124 18 0 0 1 24 176 183 71 106 140 200 146 60 201 141 49 175 206 219 24 51 141 203 213 202 124 18 0 0 0 32 97 221 208 156 227 180 222 58 51 5 156 2 70 25 102 197 16 16 222 115 157 90 121 207 16 211 217 208 2 0 0 0 1 32 97 221 208 156 227 180 222 58 51 5 156 2 70 25 102 197 16 16 222 115 157 90 121 207 16 211 217 208 2 0 0 0 0 112 178 156 236 219 98 243 32 106 184 211 76 115 58 138 184 11 243 158 111 214 180 249 75 209 228 102 1 198 201 169 202 134 82 247 29 60 251 130 101 5 79 254 236 4 3 154 24 213 80 110 237 105 114 57 175 148 37 189 215 96 26 164 159 215 189 91 213 117 182 250 78 196 91 184 197 122 91 11 110 49 145 65 35 242 27 150 116 151 97 138 84 129 122 101 163 101 143 206 236 240 17 99 91 63 34 187 4 0 0 0 0 0 1 112 178 156 236 219 98 243 32 106 184 211 76 115 58 138 184 11 243 158 111 214 180 249 75 209 228 102 1 198 201 169 202 134 82 247 29 60 251 130 101 5 79 254 236 4 3 154 24 213 80 110 237 105 114 57 175 148 37 189 215 96 26 164 159 215 189 91 213 117 182 250 78 196 91 184 197 122 91 11 110 49 145 65 35 242 27 150 116 151 97 138 84 129 122 101 163 101 143 206 236 240 17 99 91 63 34 187 4 0 0 0 0 0 0 16 191 50 248 33 176 205 97 154 211 182 118 170 186 32 76 1 1 16 191 50 248 33 176 205 97 154 211 182 118 170 186 32 76 1 0 48 234 193 100 178 9 208 13 92 237 227 179 241 244 131 30 214 22 128 221 109 129 32 221 92 143 17 196 16 142 53 151 122 200 63 163 198 197 112 127 42 47 2 0 0 0 0 0 0 1 48 234 193 100 178 9 208 13 92 237 227 179 241 244 131 30 214 22 128 221 109 129 32 221 92 143 17 196 16 142 53 151 122 200 63 163 198 197 112 127 42 47 2 0 0 0 0 0 0 0 40 165 3 177 221 137 96 40 2 95 239 12 147 159 69 92 8 226 226 89 13 220 87 111 111 4 46 185 191 135 108 64 28 98 137 121 69 157 147 3 0 1 40 165 3 177 221 137 96 40 2 95 239 12 147 159 69 92 8 226 226 89 13 220 87 111 111 4 46 185 191 135 108 64 28 98 137 121 69 157 147 3 0 0 88 117 70 136 141 37 22 10 38 199 136 67 121 78 100 165 189 58 199 68 147 53 35 88 254 145 48 3 64 111 49 252 79 215 24 85 125 88 7 197 53 75 129 196 177 222 97 246 145 156 189 140 144 166 41 155 175 68 115 133 179 126 64 86 56 38 73 200 37 103 6 154 47 83 59 156 31 165 8 192 161 64 77 224 85 1 0 0 0 1 88 117 70 136 141 37 22 10 38 199 136 67 121 78 100 165 189 58 199 68 147 53 35 88 254 145 48 3 64 111 49 252 79 215 24 85 125 88 7 197 53 75 129 196 177 222 97 246 145 156 189 140 144 166 41 155 175 68 115 133 179 126 64 86 56 38 73 200 37 103 6 154 47 83 59 156 31 165 8 192 161 64 77 224 85 1 0 0 0 0 48 217 185 213 61 101 246 30 87 9 40 115 28 155 141 207 255 17 194 181 7 208 69 15 189 18 161 29 215 47 247 4 172 133 64 239 27 206 90 55 197 113 0 0 0 0 0 0 0 1 48 217 185 213 61 101 246 30 87 9 40 115 28 155 141 207 255 17 194 181 7 208 69 15 189 18 161 29 215 47 247 4 172 133 64 239 27 206 90 55 197 113 0 0 0 0 0 0 0 0 56 148 182 61 42 123 22 99 146 228 21 87 117 190 75 48 0 97 189 188 28 85 193 232 154 144 129 19 107 255 92 192 179 73 21 211 208 243 243 72 10 53 231 255 190 241 19 69 17 2 153 53 8 39 246 0 0 1 56 148 182 61 42 123 22 99 146 228 21 87 117 190 75 48 0 97 189 188 28 85 193 232 154 144 129 19 107 255 92 192 179 73 21 211 208 243 243 72 10 53 231 255 190 241 19 69 17 2 153 53 8 39 246 0 0 0 56 211 66 149 196 5 244 108 154 21 75 148 133 24 12 252 29 159 127 240 191 48 35 202 86 177 34 52 193 54 229 170 58 106 119 182 50 240 221 151 21 237 110 249 225 73 237 49 54 255 10 114 182 126 107 8 0 1 56 211 66 149 196 5 244 108 154 21 75 148 133 24 12 252 29 159 127 240 191 48 35 202 86 177 34 52 193 54 229 170 58 106 119 182 50 240 221 151 21 237 110 249 225 73 237 49 54 255 10 114 182 126 107 8 0 0 104 225 214 120 250 248 166 189 72 25 10 51 38 36 179 73 86 127 210 96 225 42 108 183 54 154 102 128 235 61 79 169 19 33 27 197 27 140 126 108 68 180 57 222 96 50 135 137 200 40 109 22 3 187 139 78 175 226 173 222 38 56 155 201 55 29 54 110 130 125 243 53 89 135 235 66 91 26 131 150 14 181 180 220 56 68 157 222 65 169 237 15 194 167 35 49 59 236 93 240 247 1 0 0 0 1 104 225 214 120 250 248 166 189 72 25 10 51 38 36 179 73 86 127 210 96 225 42 108 183 54 154 102 128 235 61 79 169 19 33 27 197 27 140 126 108 68 180 57 222 96 50 135 137 200 40 109 22 3 187 139 78 175 226 173 222 38 56 155 201 55 29 54 110 130 125 243 53 89 135 235 66 91 26 131 150 14 181 180 220 56 68 157 222 65 169 237 15 194 167 35 49 59 236 93 240 247 1 0 0 0 0 72 250 13 100 76 198 39 97 190 132 34 30 132 205 55 142 174 37 28 5 136 138 69 4 127 203 225 200 100 221 206 243 94 81 111 236 255 188 143 231 143 35 187 81 173 188 250 232 196 70 175 70 188 195 241 113 46 158 102 170 214 243 177 164 189 186 2 0 0 0 0 0 0 1 72 250 13 100 76 198 39 97 190 132 34 30 132 205 55 142 174 37 28 5 136 138 69 4 127 203 225 200 100 221 206 243 94 81 111 236 255 188 143 231 143 35 187 81 173 188 250 232 196 70 175 70 188 195 241 113 46 158 102 170 214 243 177 164 189 186 2 0 0 0 0 0 0 0 16 252 62 17 105 107 27 138 254 209 166 253 232 14 173 53 0 1 16 252 62 17 105 107 27 138 254 209 166 253 232 14 173 53 0 0 16 248 20 114 16 45 167 199 205 247 93 60 1 0 0 0 0 1 16 248 20 114 16 45 167 199 205 247 93 60 1 0 0 0 0 0 128 68 85 139 65 128 103 40 178 143 96 39 160 16 180 192 162 49 134 53 77 80 87 249 241 72 43 118 116 184 230 72 29 217 203 233 243 99 73 223 120 79 37 252 19 42 245 193 177 160 241 111 129 21 196 151 106 142 158 95 161 24 140 154 174 72 129 49 87 117 19 229 253 93 146 82 164 63 11 89 51 145 182 224 167 87 85 133 130 24 56 22 86 126 37 63 50 11 25 59 22 7 198 60 94 176 166 72 203 118 45 191 236 253 8 4 237 208 247 95 191 61 131 45 100 233 41 140 1 1 128 68 85 139 65 128 103 40 178 143 96 39 160 16 180 192 162 49 134 53 77 80 87 249 241 72 43 118 116 184 230 72 29 217 203 233 243 99 73 223 120 79 37 252 19 42 245 193 177 160 241 111 129 21 196 151 106 142 158 95 161 24 140 154 174 72 129 49 87 117 19 229 253 93 146 82 164 63 11 89 51 145 182 224 167 87 85 133 130 24 56 22 86 126 37 63 50 11 25 59 22 7 198 60 94 176 166 72 203 118 45 191 236 253 8 4 237 208 247 95 191 61 131 45 100 233 41 140 1 0 40 171 175 7 24 85 197 52 53 222 109 116 70 7 33 47 129 85 73 230 121 23 188 153 132 54 221 247 177 60 250 118 199 113 48 0 0 0 0 0 0 1 40 171 175 7 24 85 197 52 53 222 109 116 70 7 33 47 129 85 73 230 121 23 188 153 132 54 221 247 177 60 250 118 199 113 48 0 0 0 0 0 0 0 24 93 217 212 50 244 177 120 129 193 148 208 62 51 48 197 29 12 127 5 133 232 174 163 14 1 24 93 217 212 50 244 177 120 129 193 148 208 62 51 48 197 29 12 127 5 133 232 174 163 14 0 104 61 140 155 145 23 121 180 150 193 253 181 78 221 177 28 155 147 231 109 135 40 213 10 176 7 92 102 36 228 91 74 59 128 90 66 174 228 143 117 219 65 92 198 227 147 31 210 199 101 130 185 96 20 234 102 37 117 134 38 231 28 208 231 74 69 32 133 140 236 129 186 142 89 0 72 223 168 63 132 85 4 58 183 202 56 212 86 111 8 7 182 11 108 42 143 34 30 250 94 6 24 226 5 0 1 104 61 140 155 145 23 121 180 150 193 253 181 78 221 177 28 155 147 231 109 135 40 213 10 176 7 92 102 36 228 91 74 59 128 90 66 174 228 143 117 219 65 92 198 227 147 31 210 199 101 130 185 96 20 234 102 37 117 134 38 231 28 208 231 74 69 32 133 140 236 129 186 142 89 0 72 223 168 63 132 85 4 58 183 202 56 212 86 111 8 7 182 11 108 42 143 34 30 250 94 6 24 226 5 0 0 104 69 203 211 226 232 194 190 174 38 42 219 202 126 170 213 67 251 214 240 5 57 56 204 220 229 22 83 177 58 244 203 158 220 19 118 48 28 104 202 235 222 18 48 27 53 30 213 133 250 43 151 110 53 51 81 104 66 224 80 32 48 197 127 8 196 143 211 86 42 231 40 1 196 225 20 87 198 99 207 33 242 133 186 174 87 131 82 161 85 98 41 79 235 6 54 208 79 63 0 0 0 0 0 0 1 104 69 203 211 226 232 194 190 174 38 42 219 202 126 170 213 67 251 214 240 5 57 56 204 220 229 22 83 177 58 244 203 158 220 19 118 48 28 104 202 235 222 18 48 27 53 30 213 133 250 43 151 110 53 51 81 104 66 224 80 32 48 197 127 8 196 143 211 86 42 231 40 1 196 225 20 87 198 99 207 33 242 133 186 174 87 131 82 161 85 98 41 79 235 6 54 208 79 63 0 0 0 0 0 0 0 8 106 133 253 254 0 0 0 0 1 8 106 133 253 254 0 0 0 0 0 40 52 160 46 168 248 117 14 87 213 169 244 54 52 54 90 204 139 227 70 129 237 255 102 107 43 17 92 104 188 166 27 224 59 206 1 0 0 0 0 0 1 40 52 160 46 168 248 117 14 87 213 169 244 54 52 54 90 204 139 227 70 129 237 255 102 107 43 17 92 104 188 166 27 224 59 206 1 0 0 0 0 0 0 120 181 140 78 163 1 144 166 35 223 120 26 62 194 182 189 188 203 150 222 242 105 153 199 190 59 209 251 150 143 51 233 52 50 171 137 94 76 60 155 162 163 194 72 102 39 206 211 44 149 8 71 7 3 14 238 150 49 199 209 147 173 71 223 95 145 84 45 137 227 252 43 100 85 213 9 217 99 70 100 168 88 110 229 244 46 8 112 7 141 228 169 214 105 143 254 11 226 135 101 6 67 255 70 224 194 81 96 193 178 170 189 80 169 153 245 174 120 167 5 0 1 120 181 140 78 163 1 144 166 35 223 120 26 62 194 182 189 188 203 150 222 242 105 153 199 190 59 209 251 150 143 51 233 52 50 171 137 94 76 60 155 162 163 194 72 102 39 206 211 44 149 8 71 7 3 14 238 150 49 199 209 147 173 71 223 95 145 84 45 137 227 252 43 100 85 213 9 217 99 70 100 168 88 110 229 244 46 8 112 7 141 228 169 214 105 143 254 11 226 135 101 6 67 255 70 224 194 81 96 193 178 170 189 80 169 153 245 174 120 167 5 0 0 32 19 169 230 106 158 164 68 252 228 52 75 229 81 25 134 88 61 171 29 148 225 103 206 90 122 156 116 158 229 80 62 7 1 32 19 169 230 106 158 164 68 252 228 52 75 229 81 25 134 88 61 171 29 148 225 103 206 90 122 156 116 158 229 80 62 7 0 96 44 24 45 150 1 57 124 51 120 88 192 53 82 3 14 197 181 78 62 96 149 139 236 70 23 91 206 58 4 12 63 75 51 192 197 2 242 185 178 73 152 109 161 60 142 161 171 63 201 195 243 198 2 124 119 14 189 184 21 26 90 196 117 3 207 78 196 78 191 210 218 232 185 4 72 102 10 124 94 142 17 14 238 243 191 213 250 160 226 11 56 213 156 15 0 0 1 96 44 24 45 150 1 57 124 51 120 88 192 53 82 3 14 197 181 78 62 96 149 139 236 70 23 91 206 58 4 12 63 75 51 192 197 2 242 185 178 73 152 109 161 60 142 161 171 63 201 195 243 198 2 124 119 14 189 184 21 26 90 196 117 3 207 78 196 78 191 210 218 232 185 4 72 102 10 124 94 142 17 14 238 243 191 213 250 160 226 11 56 213 156 15 0 0 0 16 5 128 98 100 111 201 242 99 239 114 208 3 48 1 0 0 1 16 5 128 98 100 111 201 242 99 239 114 208 3 48 1 0 0 0 64 55 164 28 11 235 113 86 122 52 237 225 241 179 197 83 95 114 107 69 13 182 58 173 152 229 230 108 171 135 2 108 102 81 246 165 202 47 238 229 240 109 119 151 6 36 92 18 67 160 204 138 149 79 36 130 164 116 48 77 57 61 42 21 0 1 64 55 164 28 11 235 113 86 122 52 237 225 241 179 197 83 95 114 107 69 13 182 58 173 152 229 230 108 171 135 2 108 102 81 246 165 202 47 238 229 240 109 119 151 6 36 92 18 67 160 204 138 149 79 36 130 164 116 48 77 57 61 42 21 0 0 48 94 61 43 8 236 81 175 216 38 46 240 164 24 125 150 38 110 153 168 221 238 46 195 146 161 141 191 230 139 251 175 57 243 39 106 55 170 158 83 212 72 98 28 253 2 0 0 0 1 48 94 61 43 8 236 81 175 216 38 46 240 164 24 125 150 38 110 153 168 221 238 46 195 146 161 141 191 230 139 251 175 57 243 39 106 55 170 158 83 212 72 98 28 253 2 0 0 0 0 80 48 94 140 165 180 105 31 16 145 182 147 88 246 146 184 137 158 100 218 254 225 130 175 24 164 19 172 15 135 152 163 48 137 131 182 181 101 168 51 195 131 251 4 29 231 230 96 29 58 177 144 95 60 187 109 242 143 92 252 239 108 72 4 59 210 46 232 34 139 28 238 105 211 76 0 0 0 0 0 0 1 80 48 94 140 165 180 105 31 16 145 182 147 88 246 146 184 137 158 100 218 254 225 130 175 24 164 19 172 15 135 152 163 48 137 131 182 181 101 168 51 195 131 251 4 29 231 230 96 29 58 177 144 95 60 187 109 242 143 92 252 239 108 72 4 59 210 46 232 34 139 28 238 105 211 76 0 0 0 0 0 0 0 40 234 82 61 126 225 47 95 67 86 217 19 160 166 207 107 2 63 101 138 71 14 205 171 155 149 191 239 138 12 202 149 100 120 202 78 69 3 0 0 0 1 40 234 82 61 126 225 47 95 67 86 217 19 160 166 207 107 2 63 101 138 71 14 205 171 155 149 191 239 138 12 202 149 100 120 202 78 69 3 0 0 0 0 32 254 34 44 189 14 4 206 100 120 172 67 182 70 62 43 236 232 71 120 86 45 165 252 19 123 77 145 98 252 22 8 0 1 32 254 34 44 189 14 4 206 100 120 172 67 182 70 62 43 236 232 71 120 86 45 165 252 19 123 77 145 98 252 22 8 0 0 128 133 133 183 97 16 40 176 80 73 78 7 25 246 204 110 33 191 19 111 253 42 125 217 152 191 133 9 231 196 126 215 115 228 86 114 230 179 150 254 155 22 188 36 125 187 206 19 227 235 11 176 130 143 111 209 43 29 89 113 147 102 119 48 191 43 79 47 89 120 0 227 25 169 53 18 37 83 52 60 241 101 240 255 139 61 119 189 13 92 89 30 29 252 1 22 209 105 170 119 94 158 16 175 58 110 238 74 117 112 41 56 246 67 154 141 63 25 112 206 160 3 84 134 50 0 0 0 0 1 128 133 133 183 97 16 40 176 80 73 78 7 25 246 204 110 33 191 19 111 253 42 125 217 152 191 133 9 231 196 126 215 115 228 86 114 230 179 150 254 155 22 188 36 125 187 206 19 227 235 11 176 130 143 111 209 43 29 89 113 147 102 119 48 191 43 79 47 89 120 0 227 25 169 53 18 37 83 52 60 241 101 240 255 139 61 119 189 13 92 89 30 29 252 1 22 209 105 170 119 94 158 16 175 58 110 238 74 117 112 41 56 246 67 154 141 63 25 112 206 160 3 84 134 50 0 0 0 0 0 64 242 208 163 166 217 157 45 88 172 11 229 109 23 46 229 250 139 217 234 229 172 253 211 253 11 8 225 163 20 87 100 148 249 249 188 166 122 64 131 225 233 55 241 36 232 11 174 172 83 153 87 165 3 39 84 162 67 204 110 0 0 0 0 0 1 64 242 208 163 166 217 157 45 88 172 11 229 109 23 46 229 250 139 217 234 229 172 253 211 253 11 8 225 163 20 87 100 148 249 249 188 166 122 64 131 225 233 55 241 36 232 11 174 172 83 153 87 165 3 39 84 162 67 204 110 0 0 0 0 0 0 32 62 99 60 181 249 169 105 74 220 130 197 142 213 226 245 78 96 45 105 171 176 157 17 155 32 93 59 15 0 0 0 0 1 32 62 99 60 181 249 169 105 74 220 130 197 142 213 226 245 78 96 45 105 171 176 157 17 155 32 93 59 15 0 0 0 0 diff --git a/src/boost/libs/multiprecision/test/serial_txts/cpp_int128_serial32.txt b/src/boost/libs/multiprecision/test/serial_txts/cpp_int128_serial32.txt new file mode 100644 index 00000000..ed152d2f --- /dev/null +++ b/src/boost/libs/multiprecision/test/serial_txts/cpp_int128_serial32.txt @@ -0,0 +1 @@ +22 serialization::archive 10 0 0 0 0 0 16 37 8 254 63 21 239 57 20 229 108 249 176 89 1 0 0 1 16 37 8 254 63 21 239 57 20 229 108 249 176 89 1 0 0 0 4 44 53 2 0 1 4 44 53 2 0 0 16 255 227 23 91 116 215 6 77 105 216 187 1 221 183 7 0 1 16 255 227 23 91 116 215 6 77 105 216 187 1 221 183 7 0 0 16 215 97 73 133 223 240 209 70 227 76 76 44 42 9 0 0 1 16 215 97 73 133 223 240 209 70 227 76 76 44 42 9 0 0 0 4 26 205 1 0 1 4 26 205 1 0 0 16 171 248 220 122 202 115 96 223 240 82 153 66 149 194 43 14 1 16 171 248 220 122 202 115 96 223 240 82 153 66 149 194 43 14 0 16 73 169 70 111 188 124 78 80 182 195 40 65 247 218 58 0 1 16 73 169 70 111 188 124 78 80 182 195 40 65 247 218 58 0 0 4 55 1 42 59 1 4 55 1 42 59 0 12 112 146 42 85 255 28 14 50 168 228 0 0 1 12 112 146 42 85 255 28 14 50 168 228 0 0 0 8 3 132 142 0 89 0 0 0 1 8 3 132 142 0 89 0 0 0 0 4 59 31 0 0 1 4 59 31 0 0 0 12 128 184 17 143 213 41 148 184 91 0 0 0 1 12 128 184 17 143 213 41 148 184 91 0 0 0 0 8 52 43 163 205 58 0 0 0 1 8 52 43 163 205 58 0 0 0 0 4 7 136 199 3 1 4 7 136 199 3 0 12 103 144 142 223 219 161 68 75 104 0 0 0 1 12 103 144 142 223 219 161 68 75 104 0 0 0 0 16 231 211 175 248 223 4 118 100 4 104 73 218 45 121 30 164 1 16 231 211 175 248 223 4 118 100 4 104 73 218 45 121 30 164 0 16 64 136 51 28 35 115 186 14 0 15 31 170 194 137 96 1 1 16 64 136 51 28 35 115 186 14 0 15 31 170 194 137 96 1 0 16 6 253 75 10 176 96 217 180 15 153 73 162 221 96 13 175 1 16 6 253 75 10 176 96 217 180 15 153 73 162 221 96 13 175 0 16 9 195 227 5 98 90 197 22 123 173 13 24 184 217 65 14 1 16 9 195 227 5 98 90 197 22 123 173 13 24 184 217 65 14 0 16 36 207 83 207 252 162 46 155 216 62 210 211 118 157 254 13 1 16 36 207 83 207 252 162 46 155 216 62 210 211 118 157 254 13 0 4 48 115 9 0 1 4 48 115 9 0 0 12 18 132 205 178 240 43 208 33 177 56 170 10 1 12 18 132 205 178 240 43 208 33 177 56 170 10 0 16 0 134 168 204 110 75 199 196 245 20 142 108 179 194 4 27 1 16 0 134 168 204 110 75 199 196 245 20 142 108 179 194 4 27 0 16 137 40 185 28 226 228 143 223 62 177 68 144 87 133 253 16 1 16 137 40 185 28 226 228 143 223 62 177 68 144 87 133 253 16 0 16 241 205 249 80 146 210 1 55 43 173 109 143 84 117 209 0 1 16 241 205 249 80 146 210 1 55 43 173 109 143 84 117 209 0 0 4 171 208 0 0 1 4 171 208 0 0 0 8 131 223 243 126 121 98 88 88 1 8 131 223 243 126 121 98 88 88 0 16 34 183 141 118 51 30 229 127 23 141 157 166 11 0 0 0 1 16 34 183 141 118 51 30 229 127 23 141 157 166 11 0 0 0 0 16 58 245 156 2 19 251 183 255 219 45 27 253 9 0 0 0 1 16 58 245 156 2 19 251 183 255 219 45 27 253 9 0 0 0 0 8 153 44 205 37 255 0 0 0 1 8 153 44 205 37 255 0 0 0 0 4 246 238 8 0 1 4 246 238 8 0 0 4 7 0 0 0 1 4 7 0 0 0 0 8 8 53 135 13 104 37 51 0 1 8 8 53 135 13 104 37 51 0 0 4 89 148 1 0 1 4 89 148 1 0 0 16 220 42 79 160 82 149 191 194 119 33 248 143 15 159 45 0 1 16 220 42 79 160 82 149 191 194 119 33 248 143 15 159 45 0 0 12 85 100 42 49 80 139 191 189 106 176 0 0 1 12 85 100 42 49 80 139 191 189 106 176 0 0 0 16 244 148 210 156 57 140 123 241 227 171 90 25 5 0 0 0 1 16 244 148 210 156 57 140 123 241 227 171 90 25 5 0 0 0 0 16 11 118 127 38 199 175 117 18 23 63 204 177 158 199 1 0 1 16 11 118 127 38 199 175 117 18 23 63 204 177 158 199 1 0 0 16 133 146 81 4 4 226 254 92 139 68 104 13 103 27 212 5 1 16 133 146 81 4 4 226 254 92 139 68 104 13 103 27 212 5 0 12 32 198 99 47 231 25 151 81 1 0 0 0 1 12 32 198 99 47 231 25 151 81 1 0 0 0 0 12 137 233 68 65 94 40 65 221 33 159 2 0 1 12 137 233 68 65 94 40 65 221 33 159 2 0 0 16 83 34 240 62 72 73 173 41 206 111 192 80 37 0 0 0 1 16 83 34 240 62 72 73 173 41 206 111 192 80 37 0 0 0 0 4 97 0 0 0 1 4 97 0 0 0 0 8 138 189 92 247 169 147 0 0 1 8 138 189 92 247 169 147 0 0 0 16 161 190 61 94 114 107 106 245 122 129 25 170 59 22 0 0 1 16 161 190 61 94 114 107 106 245 122 129 25 170 59 22 0 0 0 4 2 130 235 26 1 4 2 130 235 26 0 16 109 53 53 179 152 230 103 254 224 148 134 9 132 15 236 0 1 16 109 53 53 179 152 230 103 254 224 148 134 9 132 15 236 0 0 12 213 70 114 188 144 14 234 210 9 163 24 0 1 12 213 70 114 188 144 14 234 210 9 163 24 0 0 12 33 107 225 17 111 28 212 164 73 197 193 0 1 12 33 107 225 17 111 28 212 164 73 197 193 0 0 8 146 173 184 73 148 56 4 0 1 8 146 173 184 73 148 56 4 0 0 12 44 163 145 53 213 144 139 110 48 114 127 219 1 12 44 163 145 53 213 144 139 110 48 114 127 219 0 12 173 188 229 221 105 34 146 117 254 239 166 51 1 12 173 188 229 221 105 34 146 117 254 239 166 51 0 12 4 69 232 58 38 108 238 203 253 199 77 145 1 12 4 69 232 58 38 108 238 203 253 199 77 145 0 8 107 215 91 159 76 215 198 33 1 8 107 215 91 159 76 215 198 33 0 8 11 77 137 244 167 98 1 0 1 8 11 77 137 244 167 98 1 0 0 8 186 129 52 47 127 178 152 0 1 8 186 129 52 47 127 178 152 0 0 12 201 180 214 22 110 46 55 229 64 200 26 0 1 12 201 180 214 22 110 46 55 229 64 200 26 0 0 4 208 223 215 0 1 4 208 223 215 0 0 4 64 29 111 0 1 4 64 29 111 0 0 8 189 214 205 206 195 1 0 0 1 8 189 214 205 206 195 1 0 0 0 12 186 181 125 189 118 38 122 114 34 230 100 1 1 12 186 181 125 189 118 38 122 114 34 230 100 1 0 16 48 214 190 50 128 72 169 213 65 189 101 126 93 0 0 0 1 16 48 214 190 50 128 72 169 213 65 189 101 126 93 0 0 0 0 4 30 0 0 0 1 4 30 0 0 0 0 8 13 245 224 15 53 1 0 0 1 8 13 245 224 15 53 1 0 0 0 8 202 238 193 147 15 0 0 0 1 8 202 238 193 147 15 0 0 0 0 16 128 116 52 14 187 110 131 0 144 16 182 41 228 82 0 0 1 16 128 116 52 14 187 110 131 0 144 16 182 41 228 82 0 0 0 4 100 0 0 0 1 4 100 0 0 0 0 4 89 180 24 0 1 4 89 180 24 0 0 4 34 124 0 0 1 4 34 124 0 0 0 16 250 39 95 39 67 1 167 94 233 155 216 3 100 183 116 118 1 16 250 39 95 39 67 1 167 94 233 155 216 3 100 183 116 118 0 16 128 143 58 104 102 58 4 109 40 213 225 112 135 3 0 0 1 16 128 143 58 104 102 58 4 109 40 213 225 112 135 3 0 0 0 16 182 167 174 164 204 91 160 188 128 28 213 237 236 1 0 0 1 16 182 167 174 164 204 91 160 188 128 28 213 237 236 1 0 0 0 12 198 204 232 165 163 187 202 201 158 244 103 2 1 12 198 204 232 165 163 187 202 201 158 244 103 2 0 4 52 41 2 0 1 4 52 41 2 0 0 8 95 141 198 19 2 2 0 0 1 8 95 141 198 19 2 2 0 0 0 16 254 2 20 231 85 24 126 151 177 138 78 145 2 0 0 0 1 16 254 2 20 231 85 24 126 151 177 138 78 145 2 0 0 0 0 16 127 34 155 130 248 106 222 183 31 216 113 190 213 220 134 3 1 16 127 34 155 130 248 106 222 183 31 216 113 190 213 220 134 3 0 8 185 223 116 102 248 10 180 190 1 8 185 223 116 102 248 10 180 190 0 4 28 0 0 0 1 4 28 0 0 0 0 12 152 5 232 129 30 191 73 187 48 122 16 0 1 12 152 5 232 129 30 191 73 187 48 122 16 0 0 8 22 174 151 82 172 15 209 0 1 8 22 174 151 82 172 15 209 0 0 4 167 181 0 0 1 4 167 181 0 0 0 8 34 164 28 2 70 207 0 0 1 8 34 164 28 2 70 207 0 0 0 4 73 175 2 31 1 4 73 175 2 31 0 16 191 123 4 56 221 89 117 10 45 163 68 188 6 0 0 0 1 16 191 123 4 56 221 89 117 10 45 163 68 188 6 0 0 0 0 4 32 0 0 0 1 4 32 0 0 0 0 16 153 114 240 104 169 142 230 72 169 205 183 45 29 0 0 0 1 16 153 114 240 104 169 142 230 72 169 205 183 45 29 0 0 0 0 4 104 0 0 0 1 4 104 0 0 0 0 4 250 4 201 0 1 4 250 4 201 0 0 8 235 69 188 51 63 136 32 0 1 8 235 69 188 51 63 136 32 0 0 8 194 197 163 82 68 56 132 186 1 8 194 197 163 82 68 56 132 186 0 8 209 149 168 103 172 0 245 13 1 8 209 149 168 103 172 0 245 13 0 8 95 103 181 13 108 192 162 0 1 8 95 103 181 13 108 192 162 0 0 8 203 201 28 164 225 153 81 140 1 8 203 201 28 164 225 153 81 140 0 12 61 213 68 146 15 4 91 15 163 73 1 0 1 12 61 213 68 146 15 4 91 15 163 73 1 0 0 16 94 145 165 53 103 5 192 143 85 206 43 169 47 0 0 0 1 16 94 145 165 53 103 5 192 143 85 206 43 169 47 0 0 0 0 12 50 151 92 208 203 159 144 76 92 251 123 11 1 12 50 151 92 208 203 159 144 76 92 251 123 11 0 16 190 5 157 205 191 246 224 1 231 37 151 216 251 10 66 0 1 16 190 5 157 205 191 246 224 1 231 37 151 216 251 10 66 0 0 12 77 149 133 65 141 196 79 8 138 249 60 120 1 12 77 149 133 65 141 196 79 8 138 249 60 120 0 16 220 86 90 254 157 201 65 199 11 135 199 91 106 0 0 0 1 16 220 86 90 254 157 201 65 199 11 135 199 91 106 0 0 0 0 8 204 151 79 174 7 0 0 0 1 8 204 151 79 174 7 0 0 0 0 12 24 141 202 136 150 117 206 49 76 1 63 7 1 12 24 141 202 136 150 117 206 49 76 1 63 7 0 12 119 133 5 211 186 190 56 29 220 201 21 0 1 12 119 133 5 211 186 190 56 29 220 201 21 0 0 4 7 0 0 0 1 4 7 0 0 0 0 12 72 15 156 17 9 105 177 79 67 146 0 0 1 12 72 15 156 17 9 105 177 79 67 146 0 0 0 12 249 168 160 82 66 6 134 143 40 37 107 13 1 12 249 168 160 82 66 6 134 143 40 37 107 13 0 4 4 185 65 0 1 4 4 185 65 0 0 12 12 112 73 235 143 130 15 35 185 148 4 0 1 12 12 112 73 235 143 130 15 35 185 148 4 0 0 4 245 60 0 0 1 4 245 60 0 0 0 8 42 49 128 144 182 3 210 10 1 8 42 49 128 144 182 3 210 10 0 12 213 148 0 33 85 171 97 185 1 0 0 0 1 12 213 148 0 33 85 171 97 185 1 0 0 0 0 16 54 54 252 21 199 151 88 16 3 233 15 10 1 0 0 0 1 16 54 54 252 21 199 151 88 16 3 233 15 10 1 0 0 0 0 16 34 61 250 8 165 194 32 79 231 214 230 190 194 240 114 7 1 16 34 61 250 8 165 194 32 79 231 214 230 190 194 240 114 7 0 12 104 245 221 84 173 227 229 31 19 5 0 0 1 12 104 245 221 84 173 227 229 31 19 5 0 0 0 8 240 84 253 169 3 21 0 0 1 8 240 84 253 169 3 21 0 0 0 16 178 134 22 38 169 249 193 201 236 162 74 212 159 200 1 0 1 16 178 134 22 38 169 249 193 201 236 162 74 212 159 200 1 0 0 12 188 15 207 107 111 126 74 110 184 12 0 0 1 12 188 15 207 107 111 126 74 110 184 12 0 0 0 16 135 53 52 188 239 136 188 128 108 91 237 149 155 0 0 0 1 16 135 53 52 188 239 136 188 128 108 91 237 149 155 0 0 0 0 4 214 243 150 104 1 4 214 243 150 104 0 4 28 0 0 0 1 4 28 0 0 0 0 16 176 32 111 181 139 147 85 223 223 124 248 32 1 0 0 0 1 16 176 32 111 181 139 147 85 223 223 124 248 32 1 0 0 0 0 16 220 111 201 142 140 206 56 69 169 37 41 8 209 2 0 0 1 16 220 111 201 142 140 206 56 69 169 37 41 8 209 2 0 0 0 8 49 22 111 81 3 0 0 0 1 8 49 22 111 81 3 0 0 0 0 16 12 25 137 51 170 194 60 198 250 154 97 254 184 1 0 0 1 16 12 25 137 51 170 194 60 198 250 154 97 254 184 1 0 0 0 12 69 58 72 167 111 230 201 95 3 0 0 0 1 12 69 58 72 167 111 230 201 95 3 0 0 0 0 16 125 163 188 25 216 18 75 50 70 157 149 113 247 26 143 0 1 16 125 163 188 25 216 18 75 50 70 157 149 113 247 26 143 0 0 12 178 36 11 168 110 204 18 55 17 174 31 2 1 12 178 36 11 168 110 204 18 55 17 174 31 2 0 8 54 253 119 216 234 173 18 0 1 8 54 253 119 216 234 173 18 0 0 16 58 138 90 25 198 44 141 36 21 50 150 6 116 188 7 0 1 16 58 138 90 25 198 44 141 36 21 50 150 6 116 188 7 0 0 8 48 232 209 253 50 174 219 0 1 8 48 232 209 253 50 174 219 0 0 16 98 231 108 128 132 248 24 45 51 233 172 99 10 48 164 6 1 16 98 231 108 128 132 248 24 45 51 233 172 99 10 48 164 6 0 12 63 148 202 142 42 126 95 240 217 3 0 0 1 12 63 148 202 142 42 126 95 240 217 3 0 0 0 12 211 178 116 92 43 40 217 152 60 0 0 0 1 12 211 178 116 92 43 40 217 152 60 0 0 0 0 4 173 137 40 0 1 4 173 137 40 0 0 4 205 61 6 0 1 4 205 61 6 0 0 16 88 56 246 47 152 18 79 21 156 80 31 84 2 0 0 0 1 16 88 56 246 47 152 18 79 21 156 80 31 84 2 0 0 0 0 4 47 61 12 0 1 4 47 61 12 0 0 4 160 13 53 81 1 4 160 13 53 81 0 8 32 187 228 46 5 0 0 0 1 8 32 187 228 46 5 0 0 0 0 16 182 2 196 123 7 142 61 89 72 17 68 180 113 1 0 0 1 16 182 2 196 123 7 142 61 89 72 17 68 180 113 1 0 0 0 16 120 38 117 243 129 114 66 195 74 148 250 9 85 2 0 0 1 16 120 38 117 243 129 114 66 195 74 148 250 9 85 2 0 0 0 16 233 65 214 75 155 124 3 9 180 156 12 179 244 180 184 111 1 16 233 65 214 75 155 124 3 9 180 156 12 179 244 180 184 111 0 8 23 43 78 31 7 0 0 0 1 8 23 43 78 31 7 0 0 0 0 8 229 205 68 230 125 8 0 0 1 8 229 205 68 230 125 8 0 0 0 16 141 13 91 38 76 112 200 170 250 212 26 1 124 1 0 0 1 16 141 13 91 38 76 112 200 170 250 212 26 1 124 1 0 0 0 8 41 127 133 106 252 0 0 0 1 8 41 127 133 106 252 0 0 0 0 8 60 152 174 163 1 0 0 0 1 8 60 152 174 163 1 0 0 0 0 4 15 0 0 0 1 4 15 0 0 0 0 16 24 134 100 43 20 248 31 252 145 239 220 39 16 158 117 0 1 16 24 134 100 43 20 248 31 252 145 239 220 39 16 158 117 0 0 4 175 72 124 35 1 4 175 72 124 35 0 8 244 49 63 40 249 6 0 0 1 8 244 49 63 40 249 6 0 0 0 16 200 70 212 56 217 96 254 3 156 68 43 183 192 143 8 0 1 16 200 70 212 56 217 96 254 3 156 68 43 183 192 143 8 0 0 4 219 122 30 5 1 4 219 122 30 5 0 16 152 26 100 200 15 32 129 3 69 217 98 106 201 17 0 0 1 16 152 26 100 200 15 32 129 3 69 217 98 106 201 17 0 0 0 4 220 43 90 166 1 4 220 43 90 166 0 16 1 74 237 23 159 49 174 181 39 193 105 137 206 197 208 2 1 16 1 74 237 23 159 49 174 181 39 193 105 137 206 197 208 2 0 12 2 162 116 55 83 71 3 224 58 31 0 0 1 12 2 162 116 55 83 71 3 224 58 31 0 0 0 16 219 109 251 155 10 110 246 132 227 114 221 29 13 0 0 0 1 16 219 109 251 155 10 110 246 132 227 114 221 29 13 0 0 0 0 8 142 91 8 37 228 217 181 55 1 8 142 91 8 37 228 217 181 55 0 16 189 154 57 63 85 92 144 161 46 212 177 53 47 4 29 90 1 16 189 154 57 63 85 92 144 161 46 212 177 53 47 4 29 90 0 8 14 190 95 210 115 71 0 0 1 8 14 190 95 210 115 71 0 0 0 4 47 2 0 0 1 4 47 2 0 0 0 16 174 101 211 131 68 66 216 221 166 22 253 95 142 0 0 0 1 16 174 101 211 131 68 66 216 221 166 22 253 95 142 0 0 0 0 16 198 1 17 204 40 96 166 196 65 117 215 34 58 0 0 0 1 16 198 1 17 204 40 96 166 196 65 117 215 34 58 0 0 0 0 12 155 139 7 253 130 3 210 83 54 12 0 0 1 12 155 139 7 253 130 3 210 83 54 12 0 0 0 12 164 44 176 210 229 112 131 132 31 15 0 0 1 12 164 44 176 210 229 112 131 132 31 15 0 0 0 12 197 192 242 64 16 33 210 29 215 0 0 0 1 12 197 192 242 64 16 33 210 29 215 0 0 0 0 12 247 202 39 209 87 88 199 30 93 71 125 42 1 12 247 202 39 209 87 88 199 30 93 71 125 42 0 16 4 91 228 117 233 235 177 229 123 87 8 196 42 243 50 0 1 16 4 91 228 117 233 235 177 229 123 87 8 196 42 243 50 0 0 12 177 254 109 38 43 208 254 238 71 49 150 0 1 12 177 254 109 38 43 208 254 238 71 49 150 0 0 8 66 45 234 248 31 0 0 0 1 8 66 45 234 248 31 0 0 0 0 12 105 210 161 233 29 116 129 70 143 74 88 0 1 12 105 210 161 233 29 116 129 70 143 74 88 0 0 16 43 147 216 50 132 234 9 232 69 151 33 92 3 0 0 0 1 16 43 147 216 50 132 234 9 232 69 151 33 92 3 0 0 0 0 8 205 117 182 80 150 98 9 0 1 8 205 117 182 80 150 98 9 0 0 16 58 110 227 57 169 95 102 122 66 27 229 232 1 0 0 0 1 16 58 110 227 57 169 95 102 122 66 27 229 232 1 0 0 0 0 12 230 26 192 136 251 74 228 31 223 1 0 0 1 12 230 26 192 136 251 74 228 31 223 1 0 0 0 8 27 77 126 125 205 208 0 0 1 8 27 77 126 125 205 208 0 0 0 4 105 207 185 22 1 4 105 207 185 22 0 12 177 81 106 231 133 43 4 174 118 0 0 0 1 12 177 81 106 231 133 43 4 174 118 0 0 0 0 12 151 193 51 229 154 159 106 17 13 0 0 0 1 12 151 193 51 229 154 159 106 17 13 0 0 0 0 4 9 5 0 0 1 4 9 5 0 0 0 8 154 3 91 22 110 99 13 0 1 8 154 3 91 22 110 99 13 0 0 4 46 0 0 0 1 4 46 0 0 0 0 8 165 178 204 139 226 102 0 0 1 8 165 178 204 139 226 102 0 0 0 12 255 166 141 198 137 1 215 240 13 0 0 0 1 12 255 166 141 198 137 1 215 240 13 0 0 0 0 12 240 214 172 107 207 30 49 24 165 26 0 0 1 12 240 214 172 107 207 30 49 24 165 26 0 0 0 16 169 62 163 160 84 45 148 118 196 244 39 206 4 0 0 0 1 16 169 62 163 160 84 45 148 118 196 244 39 206 4 0 0 0 0 8 51 45 245 18 221 94 0 0 1 8 51 45 245 18 221 94 0 0 0 16 56 138 53 228 133 56 250 127 145 126 56 71 96 42 205 0 1 16 56 138 53 228 133 56 250 127 145 126 56 71 96 42 205 0 0 16 96 10 238 153 254 99 179 181 215 150 183 141 204 183 59 15 1 16 96 10 238 153 254 99 179 181 215 150 183 141 204 183 59 15 0 4 234 122 2 0 1 4 234 122 2 0 0 4 171 166 2 0 1 4 171 166 2 0 0 12 70 249 164 0 38 67 121 141 34 1 0 0 1 12 70 249 164 0 38 67 121 141 34 1 0 0 0 8 114 2 113 130 156 93 2 0 1 8 114 2 113 130 156 93 2 0 0 8 128 254 47 66 253 230 215 9 1 8 128 254 47 66 253 230 215 9 0 8 128 118 25 126 97 184 0 0 1 8 128 118 25 126 97 184 0 0 0 4 6 0 0 0 1 4 6 0 0 0 0 12 98 121 37 228 245 254 160 122 192 239 13 51 1 12 98 121 37 228 245 254 160 122 192 239 13 51 0 8 32 22 37 123 21 27 0 0 1 8 32 22 37 123 21 27 0 0 0 8 128 162 228 118 64 127 3 0 1 8 128 162 228 118 64 127 3 0 0 4 166 181 11 0 1 4 166 181 11 0 0 16 28 166 115 28 45 10 239 211 13 246 240 137 229 3 80 0 1 16 28 166 115 28 45 10 239 211 13 246 240 137 229 3 80 0 0 16 234 15 55 214 194 155 139 231 81 180 44 125 14 0 0 0 1 16 234 15 55 214 194 155 139 231 81 180 44 125 14 0 0 0 0 8 177 167 106 207 184 208 150 0 1 8 177 167 106 207 184 208 150 0 0 8 13 195 217 57 88 2 0 0 1 8 13 195 217 57 88 2 0 0 0 16 54 96 61 217 136 240 218 168 74 235 61 179 94 124 0 0 1 16 54 96 61 217 136 240 218 168 74 235 61 179 94 124 0 0 0 8 133 19 3 202 163 74 201 191 1 8 133 19 3 202 163 74 201 191 0 12 76 246 211 13 154 46 92 228 43 105 0 0 1 12 76 246 211 13 154 46 92 228 43 105 0 0 0 4 238 231 7 0 1 4 238 231 7 0 0 4 121 5 0 0 1 4 121 5 0 0 0 12 254 32 157 147 246 229 100 39 232 13 0 0 1 12 254 32 157 147 246 229 100 39 232 13 0 0 0 8 148 204 30 203 96 118 103 26 1 8 148 204 30 203 96 118 103 26 0 8 86 94 188 134 7 0 0 0 1 8 86 94 188 134 7 0 0 0 0 8 190 236 210 228 178 0 0 0 1 8 190 236 210 228 178 0 0 0 0 12 159 29 240 26 162 129 48 140 42 98 6 0 1 12 159 29 240 26 162 129 48 140 42 98 6 0 0 12 201 94 127 117 141 245 104 70 17 0 0 0 1 12 201 94 127 117 141 245 104 70 17 0 0 0 0 12 186 185 167 145 50 174 180 1 50 29 53 1 1 12 186 185 167 145 50 174 180 1 50 29 53 1 0 12 104 112 112 189 66 154 31 214 228 234 171 7 1 12 104 112 112 189 66 154 31 214 228 234 171 7 0 12 165 159 159 174 251 240 214 4 220 88 34 125 1 12 165 159 159 174 251 240 214 4 220 88 34 125 0 16 231 72 142 22 2 169 79 36 221 251 129 37 230 30 25 38 1 16 231 72 142 22 2 169 79 36 221 251 129 37 230 30 25 38 0 8 95 25 73 135 187 21 41 2 1 8 95 25 73 135 187 21 41 2 0 12 203 77 25 62 42 39 26 203 12 34 248 30 1 12 203 77 25 62 42 39 26 203 12 34 248 30 0 4 19 6 0 0 1 4 19 6 0 0 0 16 68 151 207 206 205 132 15 184 12 208 217 190 252 148 29 0 1 16 68 151 207 206 205 132 15 184 12 208 217 190 252 148 29 0 0 4 172 170 222 106 1 4 172 170 222 106 0 12 255 209 208 122 18 160 62 50 2 0 0 0 1 12 255 209 208 122 18 160 62 50 2 0 0 0 0 16 71 17 98 35 48 147 54 205 13 239 235 222 162 130 39 0 1 16 71 17 98 35 48 147 54 205 13 239 235 222 162 130 39 0 0 12 123 91 181 63 20 138 251 142 208 1 0 0 1 12 123 91 181 63 20 138 251 142 208 1 0 0 0 4 223 195 7 0 1 4 223 195 7 0 0 12 46 37 83 84 120 104 86 18 1 0 0 0 1 12 46 37 83 84 120 104 86 18 1 0 0 0 0 16 11 123 221 123 22 39 126 107 97 71 79 173 196 6 0 0 1 16 11 123 221 123 22 39 126 107 97 71 79 173 196 6 0 0 0 8 53 164 236 57 255 127 20 4 1 8 53 164 236 57 255 127 20 4 0 12 35 197 22 114 86 55 189 134 3 0 0 0 1 12 35 197 22 114 86 55 189 134 3 0 0 0 0 12 77 141 58 157 14 215 57 68 1 0 0 0 1 12 77 141 58 157 14 215 57 68 1 0 0 0 0 16 102 255 109 147 11 143 27 213 47 176 30 89 64 94 213 66 1 16 102 255 109 147 11 143 27 213 47 176 30 89 64 94 213 66 0 8 190 247 33 10 138 0 6 6 1 8 190 247 33 10 138 0 6 6 0 4 110 2 0 0 1 4 110 2 0 0 0 16 223 83 113 107 137 221 86 37 48 2 144 161 169 28 0 0 1 16 223 83 113 107 137 221 86 37 48 2 144 161 169 28 0 0 0 8 189 254 123 237 246 176 128 2 1 8 189 254 123 237 246 176 128 2 0 12 243 132 245 46 238 29 255 200 206 118 0 0 1 12 243 132 245 46 238 29 255 200 206 118 0 0 0 4 239 125 0 0 1 4 239 125 0 0 0 12 127 161 236 25 121 208 120 214 1 0 0 0 1 12 127 161 236 25 121 208 120 214 1 0 0 0 0 16 228 98 93 251 246 45 27 244 12 210 234 8 62 105 184 6 1 16 228 98 93 251 246 45 27 244 12 210 234 8 62 105 184 6 0 16 113 250 216 245 216 14 84 151 148 66 63 170 143 150 213 62 1 16 113 250 216 245 216 14 84 151 148 66 63 170 143 150 213 62 0 4 7 0 0 0 1 4 7 0 0 0 0 4 97 0 0 0 1 4 97 0 0 0 0 16 82 196 148 115 94 248 196 4 103 173 17 224 1 0 0 0 1 16 82 196 148 115 94 248 196 4 103 173 17 224 1 0 0 0 0 16 185 187 181 2 210 30 161 158 53 90 42 42 63 15 50 26 1 16 185 187 181 2 210 30 161 158 53 90 42 42 63 15 50 26 0 16 92 251 45 61 79 154 189 99 62 231 106 244 104 0 0 0 1 16 92 251 45 61 79 154 189 99 62 231 106 244 104 0 0 0 0 8 200 11 39 38 1 71 0 0 1 8 200 11 39 38 1 71 0 0 0 16 78 168 146 148 101 102 80 36 225 226 239 154 140 83 0 0 1 16 78 168 146 148 101 102 80 36 225 226 239 154 140 83 0 0 0 12 245 138 45 63 143 110 236 183 77 53 123 0 1 12 245 138 45 63 143 110 236 183 77 53 123 0 0 4 243 27 0 0 1 4 243 27 0 0 0 8 2 242 30 180 34 49 0 0 1 8 2 242 30 180 34 49 0 0 0 8 153 218 239 31 13 11 23 0 1 8 153 218 239 31 13 11 23 0 0 16 114 73 75 167 80 26 136 206 243 161 150 47 210 18 0 0 1 16 114 73 75 167 80 26 136 206 243 161 150 47 210 18 0 0 0 8 152 52 243 192 4 0 0 0 1 8 152 52 243 192 4 0 0 0 0 4 129 0 0 0 1 4 129 0 0 0 0 16 18 75 75 202 113 21 113 107 89 238 2 38 55 0 0 0 1 16 18 75 75 202 113 21 113 107 89 238 2 38 55 0 0 0 0 12 248 15 6 162 79 31 165 111 116 213 2 0 1 12 248 15 6 162 79 31 165 111 116 213 2 0 0 8 131 38 69 53 220 0 194 1 1 8 131 38 69 53 220 0 194 1 0 16 74 116 239 154 166 169 107 46 39 173 51 0 1 0 0 0 1 16 74 116 239 154 166 169 107 46 39 173 51 0 1 0 0 0 0 16 216 204 156 85 182 172 130 76 251 193 13 135 156 80 17 0 1 16 216 204 156 85 182 172 130 76 251 193 13 135 156 80 17 0 0 4 230 159 4 0 1 4 230 159 4 0 0 4 240 94 116 1 1 4 240 94 116 1 0 16 186 26 109 17 247 224 109 236 131 235 91 201 8 59 206 53 1 16 186 26 109 17 247 224 109 236 131 235 91 201 8 59 206 53 0 8 213 56 129 36 10 0 0 0 1 8 213 56 129 36 10 0 0 0 0 4 150 105 0 0 1 4 150 105 0 0 0 4 24 96 0 0 1 4 24 96 0 0 0 8 125 198 15 213 57 0 0 0 1 8 125 198 15 213 57 0 0 0 0 4 72 171 5 0 1 4 72 171 5 0 0 16 125 217 106 251 35 137 192 207 157 60 119 110 60 0 0 0 1 16 125 217 106 251 35 137 192 207 157 60 119 110 60 0 0 0 0 16 40 33 166 229 75 32 114 134 8 182 91 119 101 246 0 0 1 16 40 33 166 229 75 32 114 134 8 182 91 119 101 246 0 0 0 4 50 6 0 0 1 4 50 6 0 0 0 12 46 7 188 46 21 139 235 139 174 6 0 0 1 12 46 7 188 46 21 139 235 139 174 6 0 0 0 12 122 184 52 227 177 59 175 38 160 93 2 0 1 12 122 184 52 227 177 59 175 38 160 93 2 0 0 12 51 236 9 239 42 71 1 118 244 0 0 0 1 12 51 236 9 239 42 71 1 118 244 0 0 0 0 4 9 0 0 0 1 4 9 0 0 0 0 4 112 253 24 0 1 4 112 253 24 0 0 12 170 155 98 70 194 229 34 226 165 82 10 0 1 12 170 155 98 70 194 229 34 226 165 82 10 0 0 16 141 162 219 102 243 250 189 2 52 69 45 8 37 48 0 0 1 16 141 162 219 102 243 250 189 2 52 69 45 8 37 48 0 0 0 12 114 76 220 134 106 96 50 45 46 0 0 0 1 12 114 76 220 134 106 96 50 45 46 0 0 0 0 12 83 216 166 163 69 55 198 40 4 192 0 0 1 12 83 216 166 163 69 55 198 40 4 192 0 0 0 8 33 162 20 8 117 90 28 1 1 8 33 162 20 8 117 90 28 1 0 8 196 49 182 125 208 15 0 0 1 8 196 49 182 125 208 15 0 0 0 4 133 3 165 3 1 4 133 3 165 3 0 12 35 198 36 50 11 227 67 35 5 0 0 0 1 12 35 198 36 50 11 227 67 35 5 0 0 0 0 4 217 58 6 0 1 4 217 58 6 0 0 8 27 199 198 6 169 98 3 0 1 8 27 199 198 6 169 98 3 0 0 8 208 172 62 88 120 203 5 0 1 8 208 172 62 88 120 203 5 0 0 4 90 8 0 0 1 4 90 8 0 0 0 16 72 150 61 92 250 232 245 163 67 167 172 175 2 0 0 0 1 16 72 150 61 92 250 232 245 163 67 167 172 175 2 0 0 0 0 4 109 255 102 254 1 4 109 255 102 254 0 4 36 0 0 0 1 4 36 0 0 0 0 4 235 105 3 0 1 4 235 105 3 0 0 8 157 43 115 210 3 0 0 0 1 8 157 43 115 210 3 0 0 0 0 4 227 128 137 1 1 4 227 128 137 1 0 12 21 49 26 107 236 12 129 206 3 0 0 0 1 12 21 49 26 107 236 12 129 206 3 0 0 0 0 8 129 32 189 16 1 0 0 0 1 8 129 32 189 16 1 0 0 0 0 16 146 130 114 247 111 207 165 146 3 137 7 108 202 3 0 0 1 16 146 130 114 247 111 207 165 146 3 137 7 108 202 3 0 0 0 8 39 239 53 138 178 87 103 0 1 8 39 239 53 138 178 87 103 0 0 16 93 101 243 102 175 163 130 167 97 174 190 36 53 183 138 34 1 16 93 101 243 102 175 163 130 167 97 174 190 36 53 183 138 34 0 4 248 0 0 0 1 4 248 0 0 0 0 16 62 103 144 183 253 247 47 175 131 2 146 108 70 0 0 0 1 16 62 103 144 183 253 247 47 175 131 2 146 108 70 0 0 0 0 16 242 249 139 183 120 173 114 251 225 239 132 139 200 207 5 0 1 16 242 249 139 183 120 173 114 251 225 239 132 139 200 207 5 0 0 8 155 82 241 50 32 1 0 0 1 8 155 82 241 50 32 1 0 0 0 16 60 134 203 255 253 239 75 71 228 52 78 20 210 216 164 3 1 16 60 134 203 255 253 239 75 71 228 52 78 20 210 216 164 3 0 4 240 0 0 0 1 4 240 0 0 0 0 8 74 91 152 79 191 112 95 219 1 8 74 91 152 79 191 112 95 219 0 4 225 143 234 246 1 4 225 143 234 246 0 8 59 117 218 172 152 176 204 177 1 8 59 117 218 172 152 176 204 177 0 12 24 92 218 89 248 53 68 137 80 0 0 0 1 12 24 92 218 89 248 53 68 137 80 0 0 0 0 8 135 175 3 193 49 7 0 0 1 8 135 175 3 193 49 7 0 0 0 16 84 36 200 56 126 134 172 99 144 135 104 167 75 161 1 0 1 16 84 36 200 56 126 134 172 99 144 135 104 167 75 161 1 0 0 16 32 97 136 27 224 36 111 146 219 92 164 16 135 119 12 0 1 16 32 97 136 27 224 36 111 146 219 92 164 16 135 119 12 0 0 8 150 186 205 101 122 21 0 0 1 8 150 186 205 101 122 21 0 0 0 8 61 0 74 249 72 64 1 0 1 8 61 0 74 249 72 64 1 0 0 4 5 0 0 0 1 4 5 0 0 0 0 4 85 231 0 0 1 4 85 231 0 0 0 4 7 53 39 0 1 4 7 53 39 0 0 16 184 113 56 241 136 99 250 169 41 38 17 218 6 0 0 0 1 16 184 113 56 241 136 99 250 169 41 38 17 218 6 0 0 0 0 16 76 17 162 144 32 230 52 94 118 23 68 114 229 89 0 0 1 16 76 17 162 144 32 230 52 94 118 23 68 114 229 89 0 0 0 8 89 183 34 241 180 158 11 0 1 8 89 183 34 241 180 158 11 0 0 4 71 186 244 17 1 4 71 186 244 17 0 4 63 193 206 147 1 4 63 193 206 147 0 8 65 67 174 89 21 0 0 0 1 8 65 67 174 89 21 0 0 0 0 8 24 124 240 73 208 51 10 0 1 8 24 124 240 73 208 51 10 0 0 8 127 149 228 141 130 187 206 212 1 8 127 149 228 141 130 187 206 212 0 4 150 21 0 0 1 4 150 21 0 0 0 4 36 148 234 13 1 4 36 148 234 13 0 4 22 10 2 0 1 4 22 10 2 0 0 8 112 48 196 1 161 60 78 227 1 8 112 48 196 1 161 60 78 227 0 16 141 191 62 222 54 255 93 191 23 154 244 121 104 127 150 0 1 16 141 191 62 222 54 255 93 191 23 154 244 121 104 127 150 0 0 16 1 239 62 155 92 171 183 88 243 250 73 64 154 209 61 6 1 16 1 239 62 155 92 171 183 88 243 250 73 64 154 209 61 6 0 16 226 241 36 137 89 204 106 60 252 68 23 9 46 14 188 7 1 16 226 241 36 137 89 204 106 60 252 68 23 9 46 14 188 7 0 12 168 243 51 12 205 84 127 124 104 103 17 0 1 12 168 243 51 12 205 84 127 124 104 103 17 0 0 12 199 246 222 200 216 155 75 134 115 5 0 0 1 12 199 246 222 200 216 155 75 134 115 5 0 0 0 12 205 246 227 212 19 202 146 146 12 32 222 104 1 12 205 246 227 212 19 202 146 146 12 32 222 104 0 4 231 2 0 0 1 4 231 2 0 0 0 8 112 223 182 198 202 220 170 0 1 8 112 223 182 198 202 220 170 0 0 4 0 212 75 197 1 4 0 212 75 197 0 12 138 108 72 105 190 154 118 34 30 0 0 0 1 12 138 108 72 105 190 154 118 34 30 0 0 0 0 8 48 85 228 16 168 11 0 0 1 8 48 85 228 16 168 11 0 0 0 4 62 1 0 0 1 4 62 1 0 0 0 16 6 102 249 196 237 58 2 184 77 192 3 21 141 0 0 0 1 16 6 102 249 196 237 58 2 184 77 192 3 21 141 0 0 0 0 8 8 78 34 173 18 4 0 0 1 8 8 78 34 173 18 4 0 0 0 4 7 0 0 0 1 4 7 0 0 0 0 8 239 135 16 50 170 2 57 0 1 8 239 135 16 50 170 2 57 0 0 4 183 0 0 0 1 4 183 0 0 0 0 16 177 22 53 249 155 145 101 251 26 74 122 154 45 100 11 0 1 16 177 22 53 249 155 145 101 251 26 74 122 154 45 100 11 0 0 4 80 56 225 0 1 4 80 56 225 0 0 16 76 235 10 21 204 158 27 14 68 131 188 49 79 0 0 0 1 16 76 235 10 21 204 158 27 14 68 131 188 49 79 0 0 0 0 12 251 170 198 48 126 70 130 132 60 154 11 0 1 12 251 170 198 48 126 70 130 132 60 154 11 0 0 8 191 30 191 254 3 0 0 0 1 8 191 30 191 254 3 0 0 0 0 12 54 216 58 148 106 237 238 143 196 75 61 50 1 12 54 216 58 148 106 237 238 143 196 75 61 50 0 4 179 134 5 0 1 4 179 134 5 0 0 12 241 40 126 116 35 208 214 118 64 224 2 0 1 12 241 40 126 116 35 208 214 118 64 224 2 0 0 8 192 249 163 87 76 23 44 169 1 8 192 249 163 87 76 23 44 169 0 8 20 54 151 190 175 212 60 7 1 8 20 54 151 190 175 212 60 7 0 8 216 96 161 160 23 138 1 0 1 8 216 96 161 160 23 138 1 0 0 12 229 209 203 219 86 233 187 99 117 0 0 0 1 12 229 209 203 219 86 233 187 99 117 0 0 0 0 12 245 229 198 81 226 138 11 41 33 213 8 22 1 12 245 229 198 81 226 138 11 41 33 213 8 22 0 8 123 178 141 23 108 0 0 0 1 8 123 178 141 23 108 0 0 0 0 8 209 241 222 253 33 0 0 0 1 8 209 241 222 253 33 0 0 0 0 12 220 85 110 10 15 95 4 6 252 132 103 77 1 12 220 85 110 10 15 95 4 6 252 132 103 77 0 12 189 132 98 150 159 168 163 157 176 8 1 0 1 12 189 132 98 150 159 168 163 157 176 8 1 0 0 4 226 130 140 1 1 4 226 130 140 1 0 16 143 231 15 168 10 112 155 62 246 19 188 101 111 0 0 0 1 16 143 231 15 168 10 112 155 62 246 19 188 101 111 0 0 0 0 12 90 83 73 223 21 149 198 225 16 118 121 1 1 12 90 83 73 223 21 149 198 225 16 118 121 1 0 8 250 107 147 104 78 3 0 0 1 8 250 107 147 104 78 3 0 0 0 4 112 132 221 2 1 4 112 132 221 2 0 8 233 38 129 60 112 9 2 0 1 8 233 38 129 60 112 9 2 0 0 8 31 200 44 22 247 29 0 0 1 8 31 200 44 22 247 29 0 0 0 8 64 140 226 178 63 3 0 0 1 8 64 140 226 178 63 3 0 0 0 12 102 203 87 33 78 209 7 212 252 71 0 0 1 12 102 203 87 33 78 209 7 212 252 71 0 0 0 16 124 235 50 2 230 251 163 236 12 65 16 16 124 0 0 0 1 16 124 235 50 2 230 251 163 236 12 65 16 16 124 0 0 0 0 16 150 159 188 85 64 141 109 45 11 90 81 64 1 0 0 0 1 16 150 159 188 85 64 141 109 45 11 90 81 64 1 0 0 0 0 12 167 59 70 31 206 169 7 64 31 128 72 0 1 12 167 59 70 31 206 169 7 64 31 128 72 0 0 4 44 3 0 0 1 4 44 3 0 0 0 8 245 254 182 131 34 27 3 0 1 8 245 254 182 131 34 27 3 0 0 16 127 105 58 125 131 87 50 215 211 128 179 128 247 65 82 0 1 16 127 105 58 125 131 87 50 215 211 128 179 128 247 65 82 0 0 8 201 118 45 227 189 189 136 2 1 8 201 118 45 227 189 189 136 2 0 16 73 205 21 184 2 160 55 216 156 146 207 246 12 0 0 0 1 16 73 205 21 184 2 160 55 216 156 146 207 246 12 0 0 0 0 8 88 131 129 83 59 1 0 0 1 8 88 131 129 83 59 1 0 0 0 8 118 58 124 202 93 158 94 84 1 8 118 58 124 202 93 158 94 84 0 16 114 144 11 78 137 113 34 58 211 201 128 28 24 49 27 0 1 16 114 144 11 78 137 113 34 58 211 201 128 28 24 49 27 0 0 8 227 62 145 88 15 34 21 0 1 8 227 62 145 88 15 34 21 0 0 8 144 79 175 34 58 184 155 52 1 8 144 79 175 34 58 184 155 52 0 8 169 92 48 156 119 52 152 6 1 8 169 92 48 156 119 52 152 6 0 16 64 241 66 116 157 84 90 13 43 150 240 179 1 0 0 0 1 16 64 241 66 116 157 84 90 13 43 150 240 179 1 0 0 0 0 8 249 36 108 106 67 0 0 0 1 8 249 36 108 106 67 0 0 0 0 4 24 219 0 0 1 4 24 219 0 0 0 12 132 220 144 75 157 31 158 221 3 0 0 0 1 12 132 220 144 75 157 31 158 221 3 0 0 0 0 8 22 51 150 54 80 88 15 0 1 8 22 51 150 54 80 88 15 0 0 12 254 143 211 239 187 165 87 122 3 0 0 0 1 12 254 143 211 239 187 165 87 122 3 0 0 0 0 16 90 132 24 254 5 211 89 38 55 116 158 144 100 66 0 0 1 16 90 132 24 254 5 211 89 38 55 116 158 144 100 66 0 0 0 16 119 186 36 149 246 36 59 35 232 254 155 141 203 2 0 0 1 16 119 186 36 149 246 36 59 35 232 254 155 141 203 2 0 0 0 8 203 46 49 133 154 163 0 0 1 8 203 46 49 133 154 163 0 0 0 16 173 84 223 120 95 131 253 29 244 109 99 100 18 0 0 0 1 16 173 84 223 120 95 131 253 29 244 109 99 100 18 0 0 0 0 16 163 90 76 225 185 170 229 28 217 73 104 176 75 142 57 0 1 16 163 90 76 225 185 170 229 28 217 73 104 176 75 142 57 0 0 12 253 112 155 58 247 162 195 140 168 20 3 0 1 12 253 112 155 58 247 162 195 140 168 20 3 0 0 12 249 122 124 0 146 109 174 30 4 0 0 0 1 12 249 122 124 0 146 109 174 30 4 0 0 0 0 8 144 2 45 119 93 56 2 0 1 8 144 2 45 119 93 56 2 0 0 4 45 33 10 0 1 4 45 33 10 0 0 16 186 27 85 177 145 135 52 106 165 148 53 70 246 1 0 0 1 16 186 27 85 177 145 135 52 106 165 148 53 70 246 1 0 0 0 4 68 52 17 4 1 4 68 52 17 4 0 12 241 159 13 20 11 64 214 104 47 0 0 0 1 12 241 159 13 20 11 64 214 104 47 0 0 0 0 16 32 95 224 178 8 58 144 200 201 145 83 22 116 60 79 2 1 16 32 95 224 178 8 58 144 200 201 145 83 22 116 60 79 2 0 8 215 108 179 124 111 116 0 0 1 8 215 108 179 124 111 116 0 0 0 16 72 135 153 119 46 195 147 13 252 2 59 0 117 125 64 77 1 16 72 135 153 119 46 195 147 13 252 2 59 0 117 125 64 77 0 16 93 46 81 15 142 242 250 221 79 61 178 228 143 87 244 0 1 16 93 46 81 15 142 242 250 221 79 61 178 228 143 87 244 0 0 4 139 93 95 57 1 4 139 93 95 57 0 16 76 36 152 198 40 178 106 21 207 164 31 24 28 10 1 0 1 16 76 36 152 198 40 178 106 21 207 164 31 24 28 10 1 0 0 4 19 0 0 0 1 4 19 0 0 0 0 12 9 25 202 138 170 88 179 0 75 0 0 0 1 12 9 25 202 138 170 88 179 0 75 0 0 0 0 8 169 231 136 224 45 30 2 0 1 8 169 231 136 224 45 30 2 0 0 12 54 251 180 193 77 7 254 217 190 81 0 0 1 12 54 251 180 193 77 7 254 217 190 81 0 0 0 16 167 75 62 7 42 70 13 12 21 5 163 135 11 0 0 0 1 16 167 75 62 7 42 70 13 12 21 5 163 135 11 0 0 0 0 12 138 166 227 194 104 244 199 0 232 12 0 0 1 12 138 166 227 194 104 244 199 0 232 12 0 0 0 8 203 27 84 77 12 139 18 28 1 8 203 27 84 77 12 139 18 28 0 4 159 124 135 1 1 4 159 124 135 1 0 12 211 117 92 112 68 205 243 46 127 0 0 0 1 12 211 117 92 112 68 205 243 46 127 0 0 0 0 8 173 148 132 161 87 0 0 0 1 8 173 148 132 161 87 0 0 0 0 4 9 0 0 0 1 4 9 0 0 0 0 8 133 26 216 191 172 89 213 40 1 8 133 26 216 191 172 89 213 40 0 16 211 26 153 111 42 16 37 94 105 14 57 163 225 193 0 0 1 16 211 26 153 111 42 16 37 94 105 14 57 163 225 193 0 0 0 4 128 164 207 191 1 4 128 164 207 191 0 4 133 171 31 6 1 4 133 171 31 6 0 16 58 142 105 140 176 184 239 208 55 131 225 185 144 11 0 0 1 16 58 142 105 140 176 184 239 208 55 131 225 185 144 11 0 0 0 16 69 153 92 71 249 203 122 156 39 73 222 95 210 32 1 0 1 16 69 153 92 71 249 203 122 156 39 73 222 95 210 32 1 0 0 4 230 66 104 5 1 4 230 66 104 5 0 8 161 45 37 11 195 19 140 0 1 8 161 45 37 11 195 19 140 0 0 4 234 74 122 82 1 4 234 74 122 82 0 4 177 246 13 0 1 4 177 246 13 0 0 4 49 224 136 0 1 4 49 224 136 0 0 8 125 71 166 1 1 0 0 0 1 8 125 71 166 1 1 0 0 0 0 4 141 121 130 15 1 4 141 121 130 15 0 16 86 207 74 133 184 161 240 207 34 130 144 107 83 0 0 0 1 16 86 207 74 133 184 161 240 207 34 130 144 107 83 0 0 0 0 8 35 48 213 98 222 69 132 0 1 8 35 48 213 98 222 69 132 0 0 8 182 209 82 82 113 25 178 59 1 8 182 209 82 82 113 25 178 59 0 8 180 86 59 54 31 2 0 0 1 8 180 86 59 54 31 2 0 0 0 4 45 45 0 0 1 4 45 45 0 0 0 16 21 185 217 174 9 133 26 231 15 65 115 190 75 64 49 0 1 16 21 185 217 174 9 133 26 231 15 65 115 190 75 64 49 0 0 12 165 110 209 80 73 74 135 193 159 99 14 0 1 12 165 110 209 80 73 74 135 193 159 99 14 0 0 8 212 39 10 198 84 40 188 1 1 8 212 39 10 198 84 40 188 1 0 12 229 117 144 57 201 122 60 120 207 235 3 0 1 12 229 117 144 57 201 122 60 120 207 235 3 0 0 4 219 123 115 0 1 4 219 123 115 0 0 12 191 142 53 119 168 100 219 47 160 3 0 0 1 12 191 142 53 119 168 100 219 47 160 3 0 0 0 16 227 12 18 159 53 213 206 140 179 189 209 125 126 174 21 0 1 16 227 12 18 159 53 213 206 140 179 189 209 125 126 174 21 0 0 12 108 182 247 254 150 50 85 5 140 125 196 22 1 12 108 182 247 254 150 50 85 5 140 125 196 22 0 16 92 126 28 210 248 52 158 233 246 129 152 227 129 228 4 25 1 16 92 126 28 210 248 52 158 233 246 129 152 227 129 228 4 25 0 8 211 136 158 83 43 95 0 0 1 8 211 136 158 83 43 95 0 0 0 8 83 253 195 70 35 14 7 1 1 8 83 253 195 70 35 14 7 1 0 12 105 111 185 175 206 124 63 83 199 79 41 0 1 12 105 111 185 175 206 124 63 83 199 79 41 0 0 4 6 50 0 0 1 4 6 50 0 0 0 12 183 89 151 17 18 108 172 173 36 98 141 13 1 12 183 89 151 17 18 108 172 173 36 98 141 13 0 8 218 149 242 52 5 0 0 0 1 8 218 149 242 52 5 0 0 0 0 4 84 210 0 0 1 4 84 210 0 0 0 8 227 16 100 125 154 10 22 0 1 8 227 16 100 125 154 10 22 0 0 4 99 11 2 0 1 4 99 11 2 0 0 12 59 200 146 111 178 201 210 58 7 10 0 0 1 12 59 200 146 111 178 201 210 58 7 10 0 0 0 8 245 98 135 241 52 234 83 2 1 8 245 98 135 241 52 234 83 2 0 8 111 24 151 152 13 0 0 0 1 8 111 24 151 152 13 0 0 0 0 4 214 0 0 0 1 4 214 0 0 0 0 12 107 171 142 230 68 214 222 6 143 20 0 0 1 12 107 171 142 230 68 214 222 6 143 20 0 0 0 16 31 138 93 248 13 219 151 196 232 112 179 55 114 0 0 0 1 16 31 138 93 248 13 219 151 196 232 112 179 55 114 0 0 0 0 12 126 160 35 63 198 30 3 106 28 63 3 6 1 12 126 160 35 63 198 30 3 106 28 63 3 6 0 4 104 8 59 0 1 4 104 8 59 0 0 4 211 64 154 42 1 4 211 64 154 42 0 16 190 175 183 140 51 33 188 44 220 15 129 79 197 5 0 0 1 16 190 175 183 140 51 33 188 44 220 15 129 79 197 5 0 0 0 4 58 149 0 0 1 4 58 149 0 0 0 8 168 78 159 61 141 1 0 0 1 8 168 78 159 61 141 1 0 0 0 8 50 34 114 75 132 0 0 0 1 8 50 34 114 75 132 0 0 0 0 12 228 96 210 155 189 131 157 123 187 84 8 0 1 12 228 96 210 155 189 131 157 123 187 84 8 0 0 8 105 43 140 252 152 3 0 0 1 8 105 43 140 252 152 3 0 0 0 8 93 153 83 251 251 19 6 0 1 8 93 153 83 251 251 19 6 0 0 8 59 202 65 95 133 34 100 0 1 8 59 202 65 95 133 34 100 0 0 16 175 130 225 146 216 107 99 14 39 177 93 74 28 0 0 0 1 16 175 130 225 146 216 107 99 14 39 177 93 74 28 0 0 0 0 12 60 102 67 81 214 180 246 82 1 0 0 0 1 12 60 102 67 81 214 180 246 82 1 0 0 0 0 4 29 156 0 0 1 4 29 156 0 0 0 4 144 22 0 0 1 4 144 22 0 0 0 16 126 85 237 254 119 29 6 190 202 60 208 130 101 7 221 121 1 16 126 85 237 254 119 29 6 190 202 60 208 130 101 7 221 121 0 8 109 138 127 241 6 0 0 0 1 8 109 138 127 241 6 0 0 0 0 4 104 29 47 0 1 4 104 29 47 0 0 16 105 197 115 163 120 218 156 57 157 204 105 245 2 0 0 0 1 16 105 197 115 163 120 218 156 57 157 204 105 245 2 0 0 0 0 16 43 62 73 147 228 196 140 60 148 83 16 164 4 0 0 0 1 16 43 62 73 147 228 196 140 60 148 83 16 164 4 0 0 0 0 4 31 0 0 0 1 4 31 0 0 0 0 8 241 157 192 68 3 0 0 0 1 8 241 157 192 68 3 0 0 0 0 16 108 147 5 178 33 167 30 134 205 25 105 66 48 22 245 0 1 16 108 147 5 178 33 167 30 134 205 25 105 66 48 22 245 0 0 8 129 42 147 65 1 0 0 0 1 8 129 42 147 65 1 0 0 0 0 12 246 130 162 45 151 113 85 86 26 158 229 111 1 12 246 130 162 45 151 113 85 86 26 158 229 111 0 4 169 64 0 0 1 4 169 64 0 0 0 8 239 189 219 253 42 82 213 153 1 8 239 189 219 253 42 82 213 153 0 8 3 41 244 12 23 4 0 0 1 8 3 41 244 12 23 4 0 0 0 12 45 29 75 228 251 90 142 140 229 6 0 0 1 12 45 29 75 228 251 90 142 140 229 6 0 0 0 8 46 253 114 12 61 0 0 0 1 8 46 253 114 12 61 0 0 0 0 4 182 105 196 214 1 4 182 105 196 214 0 16 85 197 138 192 105 13 137 11 199 237 60 146 247 3 63 24 1 16 85 197 138 192 105 13 137 11 199 237 60 146 247 3 63 24 0 8 62 83 233 195 226 186 158 9 1 8 62 83 233 195 226 186 158 9 0 4 255 213 102 22 1 4 255 213 102 22 diff --git a/src/boost/libs/multiprecision/test/serial_txts/cpp_int128_serial64.txt b/src/boost/libs/multiprecision/test/serial_txts/cpp_int128_serial64.txt new file mode 100644 index 00000000..f5c841c5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/serial_txts/cpp_int128_serial64.txt @@ -0,0 +1 @@ +22 serialization::archive 10 0 0 0 0 0 16 37 8 254 63 21 239 57 20 229 108 249 176 89 1 0 0 1 16 37 8 254 63 21 239 57 20 229 108 249 176 89 1 0 0 0 8 44 53 2 0 0 0 0 0 1 8 44 53 2 0 0 0 0 0 0 16 255 227 23 91 116 215 6 77 105 216 187 1 221 183 7 0 1 16 255 227 23 91 116 215 6 77 105 216 187 1 221 183 7 0 0 16 215 97 73 133 223 240 209 70 227 76 76 44 42 9 0 0 1 16 215 97 73 133 223 240 209 70 227 76 76 44 42 9 0 0 0 8 26 205 1 0 0 0 0 0 1 8 26 205 1 0 0 0 0 0 0 16 171 248 220 122 202 115 96 223 240 82 153 66 149 194 43 14 1 16 171 248 220 122 202 115 96 223 240 82 153 66 149 194 43 14 0 16 73 169 70 111 188 124 78 80 182 195 40 65 247 218 58 0 1 16 73 169 70 111 188 124 78 80 182 195 40 65 247 218 58 0 0 8 55 1 42 59 0 0 0 0 1 8 55 1 42 59 0 0 0 0 0 16 112 146 42 85 255 28 14 50 168 228 0 0 0 0 0 0 1 16 112 146 42 85 255 28 14 50 168 228 0 0 0 0 0 0 0 8 3 132 142 0 89 0 0 0 1 8 3 132 142 0 89 0 0 0 0 8 59 31 0 0 0 0 0 0 1 8 59 31 0 0 0 0 0 0 0 16 128 184 17 143 213 41 148 184 91 0 0 0 0 0 0 0 1 16 128 184 17 143 213 41 148 184 91 0 0 0 0 0 0 0 0 8 52 43 163 205 58 0 0 0 1 8 52 43 163 205 58 0 0 0 0 8 7 136 199 3 0 0 0 0 1 8 7 136 199 3 0 0 0 0 0 16 103 144 142 223 219 161 68 75 104 0 0 0 0 0 0 0 1 16 103 144 142 223 219 161 68 75 104 0 0 0 0 0 0 0 0 16 231 211 175 248 223 4 118 100 4 104 73 218 45 121 30 164 1 16 231 211 175 248 223 4 118 100 4 104 73 218 45 121 30 164 0 16 64 136 51 28 35 115 186 14 0 15 31 170 194 137 96 1 1 16 64 136 51 28 35 115 186 14 0 15 31 170 194 137 96 1 0 16 6 253 75 10 176 96 217 180 15 153 73 162 221 96 13 175 1 16 6 253 75 10 176 96 217 180 15 153 73 162 221 96 13 175 0 16 9 195 227 5 98 90 197 22 123 173 13 24 184 217 65 14 1 16 9 195 227 5 98 90 197 22 123 173 13 24 184 217 65 14 0 16 36 207 83 207 252 162 46 155 216 62 210 211 118 157 254 13 1 16 36 207 83 207 252 162 46 155 216 62 210 211 118 157 254 13 0 8 48 115 9 0 0 0 0 0 1 8 48 115 9 0 0 0 0 0 0 16 18 132 205 178 240 43 208 33 177 56 170 10 0 0 0 0 1 16 18 132 205 178 240 43 208 33 177 56 170 10 0 0 0 0 0 16 0 134 168 204 110 75 199 196 245 20 142 108 179 194 4 27 1 16 0 134 168 204 110 75 199 196 245 20 142 108 179 194 4 27 0 16 137 40 185 28 226 228 143 223 62 177 68 144 87 133 253 16 1 16 137 40 185 28 226 228 143 223 62 177 68 144 87 133 253 16 0 16 241 205 249 80 146 210 1 55 43 173 109 143 84 117 209 0 1 16 241 205 249 80 146 210 1 55 43 173 109 143 84 117 209 0 0 8 171 208 0 0 0 0 0 0 1 8 171 208 0 0 0 0 0 0 0 8 131 223 243 126 121 98 88 88 1 8 131 223 243 126 121 98 88 88 0 16 34 183 141 118 51 30 229 127 23 141 157 166 11 0 0 0 1 16 34 183 141 118 51 30 229 127 23 141 157 166 11 0 0 0 0 16 58 245 156 2 19 251 183 255 219 45 27 253 9 0 0 0 1 16 58 245 156 2 19 251 183 255 219 45 27 253 9 0 0 0 0 8 153 44 205 37 255 0 0 0 1 8 153 44 205 37 255 0 0 0 0 8 246 238 8 0 0 0 0 0 1 8 246 238 8 0 0 0 0 0 0 8 7 0 0 0 0 0 0 0 1 8 7 0 0 0 0 0 0 0 0 8 8 53 135 13 104 37 51 0 1 8 8 53 135 13 104 37 51 0 0 8 89 148 1 0 0 0 0 0 1 8 89 148 1 0 0 0 0 0 0 16 220 42 79 160 82 149 191 194 119 33 248 143 15 159 45 0 1 16 220 42 79 160 82 149 191 194 119 33 248 143 15 159 45 0 0 16 85 100 42 49 80 139 191 189 106 176 0 0 0 0 0 0 1 16 85 100 42 49 80 139 191 189 106 176 0 0 0 0 0 0 0 16 244 148 210 156 57 140 123 241 227 171 90 25 5 0 0 0 1 16 244 148 210 156 57 140 123 241 227 171 90 25 5 0 0 0 0 16 11 118 127 38 199 175 117 18 23 63 204 177 158 199 1 0 1 16 11 118 127 38 199 175 117 18 23 63 204 177 158 199 1 0 0 16 133 146 81 4 4 226 254 92 139 68 104 13 103 27 212 5 1 16 133 146 81 4 4 226 254 92 139 68 104 13 103 27 212 5 0 16 32 198 99 47 231 25 151 81 1 0 0 0 0 0 0 0 1 16 32 198 99 47 231 25 151 81 1 0 0 0 0 0 0 0 0 16 137 233 68 65 94 40 65 221 33 159 2 0 0 0 0 0 1 16 137 233 68 65 94 40 65 221 33 159 2 0 0 0 0 0 0 16 83 34 240 62 72 73 173 41 206 111 192 80 37 0 0 0 1 16 83 34 240 62 72 73 173 41 206 111 192 80 37 0 0 0 0 8 97 0 0 0 0 0 0 0 1 8 97 0 0 0 0 0 0 0 0 8 138 189 92 247 169 147 0 0 1 8 138 189 92 247 169 147 0 0 0 16 161 190 61 94 114 107 106 245 122 129 25 170 59 22 0 0 1 16 161 190 61 94 114 107 106 245 122 129 25 170 59 22 0 0 0 8 2 130 235 26 0 0 0 0 1 8 2 130 235 26 0 0 0 0 0 16 109 53 53 179 152 230 103 254 224 148 134 9 132 15 236 0 1 16 109 53 53 179 152 230 103 254 224 148 134 9 132 15 236 0 0 16 213 70 114 188 144 14 234 210 9 163 24 0 0 0 0 0 1 16 213 70 114 188 144 14 234 210 9 163 24 0 0 0 0 0 0 16 33 107 225 17 111 28 212 164 73 197 193 0 0 0 0 0 1 16 33 107 225 17 111 28 212 164 73 197 193 0 0 0 0 0 0 8 146 173 184 73 148 56 4 0 1 8 146 173 184 73 148 56 4 0 0 16 44 163 145 53 213 144 139 110 48 114 127 219 0 0 0 0 1 16 44 163 145 53 213 144 139 110 48 114 127 219 0 0 0 0 0 16 173 188 229 221 105 34 146 117 254 239 166 51 0 0 0 0 1 16 173 188 229 221 105 34 146 117 254 239 166 51 0 0 0 0 0 16 4 69 232 58 38 108 238 203 253 199 77 145 0 0 0 0 1 16 4 69 232 58 38 108 238 203 253 199 77 145 0 0 0 0 0 8 107 215 91 159 76 215 198 33 1 8 107 215 91 159 76 215 198 33 0 8 11 77 137 244 167 98 1 0 1 8 11 77 137 244 167 98 1 0 0 8 186 129 52 47 127 178 152 0 1 8 186 129 52 47 127 178 152 0 0 16 201 180 214 22 110 46 55 229 64 200 26 0 0 0 0 0 1 16 201 180 214 22 110 46 55 229 64 200 26 0 0 0 0 0 0 8 208 223 215 0 0 0 0 0 1 8 208 223 215 0 0 0 0 0 0 8 64 29 111 0 0 0 0 0 1 8 64 29 111 0 0 0 0 0 0 8 189 214 205 206 195 1 0 0 1 8 189 214 205 206 195 1 0 0 0 16 186 181 125 189 118 38 122 114 34 230 100 1 0 0 0 0 1 16 186 181 125 189 118 38 122 114 34 230 100 1 0 0 0 0 0 16 48 214 190 50 128 72 169 213 65 189 101 126 93 0 0 0 1 16 48 214 190 50 128 72 169 213 65 189 101 126 93 0 0 0 0 8 30 0 0 0 0 0 0 0 1 8 30 0 0 0 0 0 0 0 0 8 13 245 224 15 53 1 0 0 1 8 13 245 224 15 53 1 0 0 0 8 202 238 193 147 15 0 0 0 1 8 202 238 193 147 15 0 0 0 0 16 128 116 52 14 187 110 131 0 144 16 182 41 228 82 0 0 1 16 128 116 52 14 187 110 131 0 144 16 182 41 228 82 0 0 0 8 100 0 0 0 0 0 0 0 1 8 100 0 0 0 0 0 0 0 0 8 89 180 24 0 0 0 0 0 1 8 89 180 24 0 0 0 0 0 0 8 34 124 0 0 0 0 0 0 1 8 34 124 0 0 0 0 0 0 0 16 250 39 95 39 67 1 167 94 233 155 216 3 100 183 116 118 1 16 250 39 95 39 67 1 167 94 233 155 216 3 100 183 116 118 0 16 128 143 58 104 102 58 4 109 40 213 225 112 135 3 0 0 1 16 128 143 58 104 102 58 4 109 40 213 225 112 135 3 0 0 0 16 182 167 174 164 204 91 160 188 128 28 213 237 236 1 0 0 1 16 182 167 174 164 204 91 160 188 128 28 213 237 236 1 0 0 0 16 198 204 232 165 163 187 202 201 158 244 103 2 0 0 0 0 1 16 198 204 232 165 163 187 202 201 158 244 103 2 0 0 0 0 0 8 52 41 2 0 0 0 0 0 1 8 52 41 2 0 0 0 0 0 0 8 95 141 198 19 2 2 0 0 1 8 95 141 198 19 2 2 0 0 0 16 254 2 20 231 85 24 126 151 177 138 78 145 2 0 0 0 1 16 254 2 20 231 85 24 126 151 177 138 78 145 2 0 0 0 0 16 127 34 155 130 248 106 222 183 31 216 113 190 213 220 134 3 1 16 127 34 155 130 248 106 222 183 31 216 113 190 213 220 134 3 0 8 185 223 116 102 248 10 180 190 1 8 185 223 116 102 248 10 180 190 0 8 28 0 0 0 0 0 0 0 1 8 28 0 0 0 0 0 0 0 0 16 152 5 232 129 30 191 73 187 48 122 16 0 0 0 0 0 1 16 152 5 232 129 30 191 73 187 48 122 16 0 0 0 0 0 0 8 22 174 151 82 172 15 209 0 1 8 22 174 151 82 172 15 209 0 0 8 167 181 0 0 0 0 0 0 1 8 167 181 0 0 0 0 0 0 0 8 34 164 28 2 70 207 0 0 1 8 34 164 28 2 70 207 0 0 0 8 73 175 2 31 0 0 0 0 1 8 73 175 2 31 0 0 0 0 0 16 191 123 4 56 221 89 117 10 45 163 68 188 6 0 0 0 1 16 191 123 4 56 221 89 117 10 45 163 68 188 6 0 0 0 0 8 32 0 0 0 0 0 0 0 1 8 32 0 0 0 0 0 0 0 0 16 153 114 240 104 169 142 230 72 169 205 183 45 29 0 0 0 1 16 153 114 240 104 169 142 230 72 169 205 183 45 29 0 0 0 0 8 104 0 0 0 0 0 0 0 1 8 104 0 0 0 0 0 0 0 0 8 250 4 201 0 0 0 0 0 1 8 250 4 201 0 0 0 0 0 0 8 235 69 188 51 63 136 32 0 1 8 235 69 188 51 63 136 32 0 0 8 194 197 163 82 68 56 132 186 1 8 194 197 163 82 68 56 132 186 0 8 209 149 168 103 172 0 245 13 1 8 209 149 168 103 172 0 245 13 0 8 95 103 181 13 108 192 162 0 1 8 95 103 181 13 108 192 162 0 0 8 203 201 28 164 225 153 81 140 1 8 203 201 28 164 225 153 81 140 0 16 61 213 68 146 15 4 91 15 163 73 1 0 0 0 0 0 1 16 61 213 68 146 15 4 91 15 163 73 1 0 0 0 0 0 0 16 94 145 165 53 103 5 192 143 85 206 43 169 47 0 0 0 1 16 94 145 165 53 103 5 192 143 85 206 43 169 47 0 0 0 0 16 50 151 92 208 203 159 144 76 92 251 123 11 0 0 0 0 1 16 50 151 92 208 203 159 144 76 92 251 123 11 0 0 0 0 0 16 190 5 157 205 191 246 224 1 231 37 151 216 251 10 66 0 1 16 190 5 157 205 191 246 224 1 231 37 151 216 251 10 66 0 0 16 77 149 133 65 141 196 79 8 138 249 60 120 0 0 0 0 1 16 77 149 133 65 141 196 79 8 138 249 60 120 0 0 0 0 0 16 220 86 90 254 157 201 65 199 11 135 199 91 106 0 0 0 1 16 220 86 90 254 157 201 65 199 11 135 199 91 106 0 0 0 0 8 204 151 79 174 7 0 0 0 1 8 204 151 79 174 7 0 0 0 0 16 24 141 202 136 150 117 206 49 76 1 63 7 0 0 0 0 1 16 24 141 202 136 150 117 206 49 76 1 63 7 0 0 0 0 0 16 119 133 5 211 186 190 56 29 220 201 21 0 0 0 0 0 1 16 119 133 5 211 186 190 56 29 220 201 21 0 0 0 0 0 0 8 7 0 0 0 0 0 0 0 1 8 7 0 0 0 0 0 0 0 0 16 72 15 156 17 9 105 177 79 67 146 0 0 0 0 0 0 1 16 72 15 156 17 9 105 177 79 67 146 0 0 0 0 0 0 0 16 249 168 160 82 66 6 134 143 40 37 107 13 0 0 0 0 1 16 249 168 160 82 66 6 134 143 40 37 107 13 0 0 0 0 0 8 4 185 65 0 0 0 0 0 1 8 4 185 65 0 0 0 0 0 0 16 12 112 73 235 143 130 15 35 185 148 4 0 0 0 0 0 1 16 12 112 73 235 143 130 15 35 185 148 4 0 0 0 0 0 0 8 245 60 0 0 0 0 0 0 1 8 245 60 0 0 0 0 0 0 0 8 42 49 128 144 182 3 210 10 1 8 42 49 128 144 182 3 210 10 0 16 213 148 0 33 85 171 97 185 1 0 0 0 0 0 0 0 1 16 213 148 0 33 85 171 97 185 1 0 0 0 0 0 0 0 0 16 54 54 252 21 199 151 88 16 3 233 15 10 1 0 0 0 1 16 54 54 252 21 199 151 88 16 3 233 15 10 1 0 0 0 0 16 34 61 250 8 165 194 32 79 231 214 230 190 194 240 114 7 1 16 34 61 250 8 165 194 32 79 231 214 230 190 194 240 114 7 0 16 104 245 221 84 173 227 229 31 19 5 0 0 0 0 0 0 1 16 104 245 221 84 173 227 229 31 19 5 0 0 0 0 0 0 0 8 240 84 253 169 3 21 0 0 1 8 240 84 253 169 3 21 0 0 0 16 178 134 22 38 169 249 193 201 236 162 74 212 159 200 1 0 1 16 178 134 22 38 169 249 193 201 236 162 74 212 159 200 1 0 0 16 188 15 207 107 111 126 74 110 184 12 0 0 0 0 0 0 1 16 188 15 207 107 111 126 74 110 184 12 0 0 0 0 0 0 0 16 135 53 52 188 239 136 188 128 108 91 237 149 155 0 0 0 1 16 135 53 52 188 239 136 188 128 108 91 237 149 155 0 0 0 0 8 214 243 150 104 0 0 0 0 1 8 214 243 150 104 0 0 0 0 0 8 28 0 0 0 0 0 0 0 1 8 28 0 0 0 0 0 0 0 0 16 176 32 111 181 139 147 85 223 223 124 248 32 1 0 0 0 1 16 176 32 111 181 139 147 85 223 223 124 248 32 1 0 0 0 0 16 220 111 201 142 140 206 56 69 169 37 41 8 209 2 0 0 1 16 220 111 201 142 140 206 56 69 169 37 41 8 209 2 0 0 0 8 49 22 111 81 3 0 0 0 1 8 49 22 111 81 3 0 0 0 0 16 12 25 137 51 170 194 60 198 250 154 97 254 184 1 0 0 1 16 12 25 137 51 170 194 60 198 250 154 97 254 184 1 0 0 0 16 69 58 72 167 111 230 201 95 3 0 0 0 0 0 0 0 1 16 69 58 72 167 111 230 201 95 3 0 0 0 0 0 0 0 0 16 125 163 188 25 216 18 75 50 70 157 149 113 247 26 143 0 1 16 125 163 188 25 216 18 75 50 70 157 149 113 247 26 143 0 0 16 178 36 11 168 110 204 18 55 17 174 31 2 0 0 0 0 1 16 178 36 11 168 110 204 18 55 17 174 31 2 0 0 0 0 0 8 54 253 119 216 234 173 18 0 1 8 54 253 119 216 234 173 18 0 0 16 58 138 90 25 198 44 141 36 21 50 150 6 116 188 7 0 1 16 58 138 90 25 198 44 141 36 21 50 150 6 116 188 7 0 0 8 48 232 209 253 50 174 219 0 1 8 48 232 209 253 50 174 219 0 0 16 98 231 108 128 132 248 24 45 51 233 172 99 10 48 164 6 1 16 98 231 108 128 132 248 24 45 51 233 172 99 10 48 164 6 0 16 63 148 202 142 42 126 95 240 217 3 0 0 0 0 0 0 1 16 63 148 202 142 42 126 95 240 217 3 0 0 0 0 0 0 0 16 211 178 116 92 43 40 217 152 60 0 0 0 0 0 0 0 1 16 211 178 116 92 43 40 217 152 60 0 0 0 0 0 0 0 0 8 173 137 40 0 0 0 0 0 1 8 173 137 40 0 0 0 0 0 0 8 205 61 6 0 0 0 0 0 1 8 205 61 6 0 0 0 0 0 0 16 88 56 246 47 152 18 79 21 156 80 31 84 2 0 0 0 1 16 88 56 246 47 152 18 79 21 156 80 31 84 2 0 0 0 0 8 47 61 12 0 0 0 0 0 1 8 47 61 12 0 0 0 0 0 0 8 160 13 53 81 0 0 0 0 1 8 160 13 53 81 0 0 0 0 0 8 32 187 228 46 5 0 0 0 1 8 32 187 228 46 5 0 0 0 0 16 182 2 196 123 7 142 61 89 72 17 68 180 113 1 0 0 1 16 182 2 196 123 7 142 61 89 72 17 68 180 113 1 0 0 0 16 120 38 117 243 129 114 66 195 74 148 250 9 85 2 0 0 1 16 120 38 117 243 129 114 66 195 74 148 250 9 85 2 0 0 0 16 233 65 214 75 155 124 3 9 180 156 12 179 244 180 184 111 1 16 233 65 214 75 155 124 3 9 180 156 12 179 244 180 184 111 0 8 23 43 78 31 7 0 0 0 1 8 23 43 78 31 7 0 0 0 0 8 229 205 68 230 125 8 0 0 1 8 229 205 68 230 125 8 0 0 0 16 141 13 91 38 76 112 200 170 250 212 26 1 124 1 0 0 1 16 141 13 91 38 76 112 200 170 250 212 26 1 124 1 0 0 0 8 41 127 133 106 252 0 0 0 1 8 41 127 133 106 252 0 0 0 0 8 60 152 174 163 1 0 0 0 1 8 60 152 174 163 1 0 0 0 0 8 15 0 0 0 0 0 0 0 1 8 15 0 0 0 0 0 0 0 0 16 24 134 100 43 20 248 31 252 145 239 220 39 16 158 117 0 1 16 24 134 100 43 20 248 31 252 145 239 220 39 16 158 117 0 0 8 175 72 124 35 0 0 0 0 1 8 175 72 124 35 0 0 0 0 0 8 244 49 63 40 249 6 0 0 1 8 244 49 63 40 249 6 0 0 0 16 200 70 212 56 217 96 254 3 156 68 43 183 192 143 8 0 1 16 200 70 212 56 217 96 254 3 156 68 43 183 192 143 8 0 0 8 219 122 30 5 0 0 0 0 1 8 219 122 30 5 0 0 0 0 0 16 152 26 100 200 15 32 129 3 69 217 98 106 201 17 0 0 1 16 152 26 100 200 15 32 129 3 69 217 98 106 201 17 0 0 0 8 220 43 90 166 0 0 0 0 1 8 220 43 90 166 0 0 0 0 0 16 1 74 237 23 159 49 174 181 39 193 105 137 206 197 208 2 1 16 1 74 237 23 159 49 174 181 39 193 105 137 206 197 208 2 0 16 2 162 116 55 83 71 3 224 58 31 0 0 0 0 0 0 1 16 2 162 116 55 83 71 3 224 58 31 0 0 0 0 0 0 0 16 219 109 251 155 10 110 246 132 227 114 221 29 13 0 0 0 1 16 219 109 251 155 10 110 246 132 227 114 221 29 13 0 0 0 0 8 142 91 8 37 228 217 181 55 1 8 142 91 8 37 228 217 181 55 0 16 189 154 57 63 85 92 144 161 46 212 177 53 47 4 29 90 1 16 189 154 57 63 85 92 144 161 46 212 177 53 47 4 29 90 0 8 14 190 95 210 115 71 0 0 1 8 14 190 95 210 115 71 0 0 0 8 47 2 0 0 0 0 0 0 1 8 47 2 0 0 0 0 0 0 0 16 174 101 211 131 68 66 216 221 166 22 253 95 142 0 0 0 1 16 174 101 211 131 68 66 216 221 166 22 253 95 142 0 0 0 0 16 198 1 17 204 40 96 166 196 65 117 215 34 58 0 0 0 1 16 198 1 17 204 40 96 166 196 65 117 215 34 58 0 0 0 0 16 155 139 7 253 130 3 210 83 54 12 0 0 0 0 0 0 1 16 155 139 7 253 130 3 210 83 54 12 0 0 0 0 0 0 0 16 164 44 176 210 229 112 131 132 31 15 0 0 0 0 0 0 1 16 164 44 176 210 229 112 131 132 31 15 0 0 0 0 0 0 0 16 197 192 242 64 16 33 210 29 215 0 0 0 0 0 0 0 1 16 197 192 242 64 16 33 210 29 215 0 0 0 0 0 0 0 0 16 247 202 39 209 87 88 199 30 93 71 125 42 0 0 0 0 1 16 247 202 39 209 87 88 199 30 93 71 125 42 0 0 0 0 0 16 4 91 228 117 233 235 177 229 123 87 8 196 42 243 50 0 1 16 4 91 228 117 233 235 177 229 123 87 8 196 42 243 50 0 0 16 177 254 109 38 43 208 254 238 71 49 150 0 0 0 0 0 1 16 177 254 109 38 43 208 254 238 71 49 150 0 0 0 0 0 0 8 66 45 234 248 31 0 0 0 1 8 66 45 234 248 31 0 0 0 0 16 105 210 161 233 29 116 129 70 143 74 88 0 0 0 0 0 1 16 105 210 161 233 29 116 129 70 143 74 88 0 0 0 0 0 0 16 43 147 216 50 132 234 9 232 69 151 33 92 3 0 0 0 1 16 43 147 216 50 132 234 9 232 69 151 33 92 3 0 0 0 0 8 205 117 182 80 150 98 9 0 1 8 205 117 182 80 150 98 9 0 0 16 58 110 227 57 169 95 102 122 66 27 229 232 1 0 0 0 1 16 58 110 227 57 169 95 102 122 66 27 229 232 1 0 0 0 0 16 230 26 192 136 251 74 228 31 223 1 0 0 0 0 0 0 1 16 230 26 192 136 251 74 228 31 223 1 0 0 0 0 0 0 0 8 27 77 126 125 205 208 0 0 1 8 27 77 126 125 205 208 0 0 0 8 105 207 185 22 0 0 0 0 1 8 105 207 185 22 0 0 0 0 0 16 177 81 106 231 133 43 4 174 118 0 0 0 0 0 0 0 1 16 177 81 106 231 133 43 4 174 118 0 0 0 0 0 0 0 0 16 151 193 51 229 154 159 106 17 13 0 0 0 0 0 0 0 1 16 151 193 51 229 154 159 106 17 13 0 0 0 0 0 0 0 0 8 9 5 0 0 0 0 0 0 1 8 9 5 0 0 0 0 0 0 0 8 154 3 91 22 110 99 13 0 1 8 154 3 91 22 110 99 13 0 0 8 46 0 0 0 0 0 0 0 1 8 46 0 0 0 0 0 0 0 0 8 165 178 204 139 226 102 0 0 1 8 165 178 204 139 226 102 0 0 0 16 255 166 141 198 137 1 215 240 13 0 0 0 0 0 0 0 1 16 255 166 141 198 137 1 215 240 13 0 0 0 0 0 0 0 0 16 240 214 172 107 207 30 49 24 165 26 0 0 0 0 0 0 1 16 240 214 172 107 207 30 49 24 165 26 0 0 0 0 0 0 0 16 169 62 163 160 84 45 148 118 196 244 39 206 4 0 0 0 1 16 169 62 163 160 84 45 148 118 196 244 39 206 4 0 0 0 0 8 51 45 245 18 221 94 0 0 1 8 51 45 245 18 221 94 0 0 0 16 56 138 53 228 133 56 250 127 145 126 56 71 96 42 205 0 1 16 56 138 53 228 133 56 250 127 145 126 56 71 96 42 205 0 0 16 96 10 238 153 254 99 179 181 215 150 183 141 204 183 59 15 1 16 96 10 238 153 254 99 179 181 215 150 183 141 204 183 59 15 0 8 234 122 2 0 0 0 0 0 1 8 234 122 2 0 0 0 0 0 0 8 171 166 2 0 0 0 0 0 1 8 171 166 2 0 0 0 0 0 0 16 70 249 164 0 38 67 121 141 34 1 0 0 0 0 0 0 1 16 70 249 164 0 38 67 121 141 34 1 0 0 0 0 0 0 0 8 114 2 113 130 156 93 2 0 1 8 114 2 113 130 156 93 2 0 0 8 128 254 47 66 253 230 215 9 1 8 128 254 47 66 253 230 215 9 0 8 128 118 25 126 97 184 0 0 1 8 128 118 25 126 97 184 0 0 0 8 6 0 0 0 0 0 0 0 1 8 6 0 0 0 0 0 0 0 0 16 98 121 37 228 245 254 160 122 192 239 13 51 0 0 0 0 1 16 98 121 37 228 245 254 160 122 192 239 13 51 0 0 0 0 0 8 32 22 37 123 21 27 0 0 1 8 32 22 37 123 21 27 0 0 0 8 128 162 228 118 64 127 3 0 1 8 128 162 228 118 64 127 3 0 0 8 166 181 11 0 0 0 0 0 1 8 166 181 11 0 0 0 0 0 0 16 28 166 115 28 45 10 239 211 13 246 240 137 229 3 80 0 1 16 28 166 115 28 45 10 239 211 13 246 240 137 229 3 80 0 0 16 234 15 55 214 194 155 139 231 81 180 44 125 14 0 0 0 1 16 234 15 55 214 194 155 139 231 81 180 44 125 14 0 0 0 0 8 177 167 106 207 184 208 150 0 1 8 177 167 106 207 184 208 150 0 0 8 13 195 217 57 88 2 0 0 1 8 13 195 217 57 88 2 0 0 0 16 54 96 61 217 136 240 218 168 74 235 61 179 94 124 0 0 1 16 54 96 61 217 136 240 218 168 74 235 61 179 94 124 0 0 0 8 133 19 3 202 163 74 201 191 1 8 133 19 3 202 163 74 201 191 0 16 76 246 211 13 154 46 92 228 43 105 0 0 0 0 0 0 1 16 76 246 211 13 154 46 92 228 43 105 0 0 0 0 0 0 0 8 238 231 7 0 0 0 0 0 1 8 238 231 7 0 0 0 0 0 0 8 121 5 0 0 0 0 0 0 1 8 121 5 0 0 0 0 0 0 0 16 254 32 157 147 246 229 100 39 232 13 0 0 0 0 0 0 1 16 254 32 157 147 246 229 100 39 232 13 0 0 0 0 0 0 0 8 148 204 30 203 96 118 103 26 1 8 148 204 30 203 96 118 103 26 0 8 86 94 188 134 7 0 0 0 1 8 86 94 188 134 7 0 0 0 0 8 190 236 210 228 178 0 0 0 1 8 190 236 210 228 178 0 0 0 0 16 159 29 240 26 162 129 48 140 42 98 6 0 0 0 0 0 1 16 159 29 240 26 162 129 48 140 42 98 6 0 0 0 0 0 0 16 201 94 127 117 141 245 104 70 17 0 0 0 0 0 0 0 1 16 201 94 127 117 141 245 104 70 17 0 0 0 0 0 0 0 0 16 186 185 167 145 50 174 180 1 50 29 53 1 0 0 0 0 1 16 186 185 167 145 50 174 180 1 50 29 53 1 0 0 0 0 0 16 104 112 112 189 66 154 31 214 228 234 171 7 0 0 0 0 1 16 104 112 112 189 66 154 31 214 228 234 171 7 0 0 0 0 0 16 165 159 159 174 251 240 214 4 220 88 34 125 0 0 0 0 1 16 165 159 159 174 251 240 214 4 220 88 34 125 0 0 0 0 0 16 231 72 142 22 2 169 79 36 221 251 129 37 230 30 25 38 1 16 231 72 142 22 2 169 79 36 221 251 129 37 230 30 25 38 0 8 95 25 73 135 187 21 41 2 1 8 95 25 73 135 187 21 41 2 0 16 203 77 25 62 42 39 26 203 12 34 248 30 0 0 0 0 1 16 203 77 25 62 42 39 26 203 12 34 248 30 0 0 0 0 0 8 19 6 0 0 0 0 0 0 1 8 19 6 0 0 0 0 0 0 0 16 68 151 207 206 205 132 15 184 12 208 217 190 252 148 29 0 1 16 68 151 207 206 205 132 15 184 12 208 217 190 252 148 29 0 0 8 172 170 222 106 0 0 0 0 1 8 172 170 222 106 0 0 0 0 0 16 255 209 208 122 18 160 62 50 2 0 0 0 0 0 0 0 1 16 255 209 208 122 18 160 62 50 2 0 0 0 0 0 0 0 0 16 71 17 98 35 48 147 54 205 13 239 235 222 162 130 39 0 1 16 71 17 98 35 48 147 54 205 13 239 235 222 162 130 39 0 0 16 123 91 181 63 20 138 251 142 208 1 0 0 0 0 0 0 1 16 123 91 181 63 20 138 251 142 208 1 0 0 0 0 0 0 0 8 223 195 7 0 0 0 0 0 1 8 223 195 7 0 0 0 0 0 0 16 46 37 83 84 120 104 86 18 1 0 0 0 0 0 0 0 1 16 46 37 83 84 120 104 86 18 1 0 0 0 0 0 0 0 0 16 11 123 221 123 22 39 126 107 97 71 79 173 196 6 0 0 1 16 11 123 221 123 22 39 126 107 97 71 79 173 196 6 0 0 0 8 53 164 236 57 255 127 20 4 1 8 53 164 236 57 255 127 20 4 0 16 35 197 22 114 86 55 189 134 3 0 0 0 0 0 0 0 1 16 35 197 22 114 86 55 189 134 3 0 0 0 0 0 0 0 0 16 77 141 58 157 14 215 57 68 1 0 0 0 0 0 0 0 1 16 77 141 58 157 14 215 57 68 1 0 0 0 0 0 0 0 0 16 102 255 109 147 11 143 27 213 47 176 30 89 64 94 213 66 1 16 102 255 109 147 11 143 27 213 47 176 30 89 64 94 213 66 0 8 190 247 33 10 138 0 6 6 1 8 190 247 33 10 138 0 6 6 0 8 110 2 0 0 0 0 0 0 1 8 110 2 0 0 0 0 0 0 0 16 223 83 113 107 137 221 86 37 48 2 144 161 169 28 0 0 1 16 223 83 113 107 137 221 86 37 48 2 144 161 169 28 0 0 0 8 189 254 123 237 246 176 128 2 1 8 189 254 123 237 246 176 128 2 0 16 243 132 245 46 238 29 255 200 206 118 0 0 0 0 0 0 1 16 243 132 245 46 238 29 255 200 206 118 0 0 0 0 0 0 0 8 239 125 0 0 0 0 0 0 1 8 239 125 0 0 0 0 0 0 0 16 127 161 236 25 121 208 120 214 1 0 0 0 0 0 0 0 1 16 127 161 236 25 121 208 120 214 1 0 0 0 0 0 0 0 0 16 228 98 93 251 246 45 27 244 12 210 234 8 62 105 184 6 1 16 228 98 93 251 246 45 27 244 12 210 234 8 62 105 184 6 0 16 113 250 216 245 216 14 84 151 148 66 63 170 143 150 213 62 1 16 113 250 216 245 216 14 84 151 148 66 63 170 143 150 213 62 0 8 7 0 0 0 0 0 0 0 1 8 7 0 0 0 0 0 0 0 0 8 97 0 0 0 0 0 0 0 1 8 97 0 0 0 0 0 0 0 0 16 82 196 148 115 94 248 196 4 103 173 17 224 1 0 0 0 1 16 82 196 148 115 94 248 196 4 103 173 17 224 1 0 0 0 0 16 185 187 181 2 210 30 161 158 53 90 42 42 63 15 50 26 1 16 185 187 181 2 210 30 161 158 53 90 42 42 63 15 50 26 0 16 92 251 45 61 79 154 189 99 62 231 106 244 104 0 0 0 1 16 92 251 45 61 79 154 189 99 62 231 106 244 104 0 0 0 0 8 200 11 39 38 1 71 0 0 1 8 200 11 39 38 1 71 0 0 0 16 78 168 146 148 101 102 80 36 225 226 239 154 140 83 0 0 1 16 78 168 146 148 101 102 80 36 225 226 239 154 140 83 0 0 0 16 245 138 45 63 143 110 236 183 77 53 123 0 0 0 0 0 1 16 245 138 45 63 143 110 236 183 77 53 123 0 0 0 0 0 0 8 243 27 0 0 0 0 0 0 1 8 243 27 0 0 0 0 0 0 0 8 2 242 30 180 34 49 0 0 1 8 2 242 30 180 34 49 0 0 0 8 153 218 239 31 13 11 23 0 1 8 153 218 239 31 13 11 23 0 0 16 114 73 75 167 80 26 136 206 243 161 150 47 210 18 0 0 1 16 114 73 75 167 80 26 136 206 243 161 150 47 210 18 0 0 0 8 152 52 243 192 4 0 0 0 1 8 152 52 243 192 4 0 0 0 0 8 129 0 0 0 0 0 0 0 1 8 129 0 0 0 0 0 0 0 0 16 18 75 75 202 113 21 113 107 89 238 2 38 55 0 0 0 1 16 18 75 75 202 113 21 113 107 89 238 2 38 55 0 0 0 0 16 248 15 6 162 79 31 165 111 116 213 2 0 0 0 0 0 1 16 248 15 6 162 79 31 165 111 116 213 2 0 0 0 0 0 0 8 131 38 69 53 220 0 194 1 1 8 131 38 69 53 220 0 194 1 0 16 74 116 239 154 166 169 107 46 39 173 51 0 1 0 0 0 1 16 74 116 239 154 166 169 107 46 39 173 51 0 1 0 0 0 0 16 216 204 156 85 182 172 130 76 251 193 13 135 156 80 17 0 1 16 216 204 156 85 182 172 130 76 251 193 13 135 156 80 17 0 0 8 230 159 4 0 0 0 0 0 1 8 230 159 4 0 0 0 0 0 0 8 240 94 116 1 0 0 0 0 1 8 240 94 116 1 0 0 0 0 0 16 186 26 109 17 247 224 109 236 131 235 91 201 8 59 206 53 1 16 186 26 109 17 247 224 109 236 131 235 91 201 8 59 206 53 0 8 213 56 129 36 10 0 0 0 1 8 213 56 129 36 10 0 0 0 0 8 150 105 0 0 0 0 0 0 1 8 150 105 0 0 0 0 0 0 0 8 24 96 0 0 0 0 0 0 1 8 24 96 0 0 0 0 0 0 0 8 125 198 15 213 57 0 0 0 1 8 125 198 15 213 57 0 0 0 0 8 72 171 5 0 0 0 0 0 1 8 72 171 5 0 0 0 0 0 0 16 125 217 106 251 35 137 192 207 157 60 119 110 60 0 0 0 1 16 125 217 106 251 35 137 192 207 157 60 119 110 60 0 0 0 0 16 40 33 166 229 75 32 114 134 8 182 91 119 101 246 0 0 1 16 40 33 166 229 75 32 114 134 8 182 91 119 101 246 0 0 0 8 50 6 0 0 0 0 0 0 1 8 50 6 0 0 0 0 0 0 0 16 46 7 188 46 21 139 235 139 174 6 0 0 0 0 0 0 1 16 46 7 188 46 21 139 235 139 174 6 0 0 0 0 0 0 0 16 122 184 52 227 177 59 175 38 160 93 2 0 0 0 0 0 1 16 122 184 52 227 177 59 175 38 160 93 2 0 0 0 0 0 0 16 51 236 9 239 42 71 1 118 244 0 0 0 0 0 0 0 1 16 51 236 9 239 42 71 1 118 244 0 0 0 0 0 0 0 0 8 9 0 0 0 0 0 0 0 1 8 9 0 0 0 0 0 0 0 0 8 112 253 24 0 0 0 0 0 1 8 112 253 24 0 0 0 0 0 0 16 170 155 98 70 194 229 34 226 165 82 10 0 0 0 0 0 1 16 170 155 98 70 194 229 34 226 165 82 10 0 0 0 0 0 0 16 141 162 219 102 243 250 189 2 52 69 45 8 37 48 0 0 1 16 141 162 219 102 243 250 189 2 52 69 45 8 37 48 0 0 0 16 114 76 220 134 106 96 50 45 46 0 0 0 0 0 0 0 1 16 114 76 220 134 106 96 50 45 46 0 0 0 0 0 0 0 0 16 83 216 166 163 69 55 198 40 4 192 0 0 0 0 0 0 1 16 83 216 166 163 69 55 198 40 4 192 0 0 0 0 0 0 0 8 33 162 20 8 117 90 28 1 1 8 33 162 20 8 117 90 28 1 0 8 196 49 182 125 208 15 0 0 1 8 196 49 182 125 208 15 0 0 0 8 133 3 165 3 0 0 0 0 1 8 133 3 165 3 0 0 0 0 0 16 35 198 36 50 11 227 67 35 5 0 0 0 0 0 0 0 1 16 35 198 36 50 11 227 67 35 5 0 0 0 0 0 0 0 0 8 217 58 6 0 0 0 0 0 1 8 217 58 6 0 0 0 0 0 0 8 27 199 198 6 169 98 3 0 1 8 27 199 198 6 169 98 3 0 0 8 208 172 62 88 120 203 5 0 1 8 208 172 62 88 120 203 5 0 0 8 90 8 0 0 0 0 0 0 1 8 90 8 0 0 0 0 0 0 0 16 72 150 61 92 250 232 245 163 67 167 172 175 2 0 0 0 1 16 72 150 61 92 250 232 245 163 67 167 172 175 2 0 0 0 0 8 109 255 102 254 0 0 0 0 1 8 109 255 102 254 0 0 0 0 0 8 36 0 0 0 0 0 0 0 1 8 36 0 0 0 0 0 0 0 0 8 235 105 3 0 0 0 0 0 1 8 235 105 3 0 0 0 0 0 0 8 157 43 115 210 3 0 0 0 1 8 157 43 115 210 3 0 0 0 0 8 227 128 137 1 0 0 0 0 1 8 227 128 137 1 0 0 0 0 0 16 21 49 26 107 236 12 129 206 3 0 0 0 0 0 0 0 1 16 21 49 26 107 236 12 129 206 3 0 0 0 0 0 0 0 0 8 129 32 189 16 1 0 0 0 1 8 129 32 189 16 1 0 0 0 0 16 146 130 114 247 111 207 165 146 3 137 7 108 202 3 0 0 1 16 146 130 114 247 111 207 165 146 3 137 7 108 202 3 0 0 0 8 39 239 53 138 178 87 103 0 1 8 39 239 53 138 178 87 103 0 0 16 93 101 243 102 175 163 130 167 97 174 190 36 53 183 138 34 1 16 93 101 243 102 175 163 130 167 97 174 190 36 53 183 138 34 0 8 248 0 0 0 0 0 0 0 1 8 248 0 0 0 0 0 0 0 0 16 62 103 144 183 253 247 47 175 131 2 146 108 70 0 0 0 1 16 62 103 144 183 253 247 47 175 131 2 146 108 70 0 0 0 0 16 242 249 139 183 120 173 114 251 225 239 132 139 200 207 5 0 1 16 242 249 139 183 120 173 114 251 225 239 132 139 200 207 5 0 0 8 155 82 241 50 32 1 0 0 1 8 155 82 241 50 32 1 0 0 0 16 60 134 203 255 253 239 75 71 228 52 78 20 210 216 164 3 1 16 60 134 203 255 253 239 75 71 228 52 78 20 210 216 164 3 0 8 240 0 0 0 0 0 0 0 1 8 240 0 0 0 0 0 0 0 0 8 74 91 152 79 191 112 95 219 1 8 74 91 152 79 191 112 95 219 0 8 225 143 234 246 0 0 0 0 1 8 225 143 234 246 0 0 0 0 0 8 59 117 218 172 152 176 204 177 1 8 59 117 218 172 152 176 204 177 0 16 24 92 218 89 248 53 68 137 80 0 0 0 0 0 0 0 1 16 24 92 218 89 248 53 68 137 80 0 0 0 0 0 0 0 0 8 135 175 3 193 49 7 0 0 1 8 135 175 3 193 49 7 0 0 0 16 84 36 200 56 126 134 172 99 144 135 104 167 75 161 1 0 1 16 84 36 200 56 126 134 172 99 144 135 104 167 75 161 1 0 0 16 32 97 136 27 224 36 111 146 219 92 164 16 135 119 12 0 1 16 32 97 136 27 224 36 111 146 219 92 164 16 135 119 12 0 0 8 150 186 205 101 122 21 0 0 1 8 150 186 205 101 122 21 0 0 0 8 61 0 74 249 72 64 1 0 1 8 61 0 74 249 72 64 1 0 0 8 5 0 0 0 0 0 0 0 1 8 5 0 0 0 0 0 0 0 0 8 85 231 0 0 0 0 0 0 1 8 85 231 0 0 0 0 0 0 0 8 7 53 39 0 0 0 0 0 1 8 7 53 39 0 0 0 0 0 0 16 184 113 56 241 136 99 250 169 41 38 17 218 6 0 0 0 1 16 184 113 56 241 136 99 250 169 41 38 17 218 6 0 0 0 0 16 76 17 162 144 32 230 52 94 118 23 68 114 229 89 0 0 1 16 76 17 162 144 32 230 52 94 118 23 68 114 229 89 0 0 0 8 89 183 34 241 180 158 11 0 1 8 89 183 34 241 180 158 11 0 0 8 71 186 244 17 0 0 0 0 1 8 71 186 244 17 0 0 0 0 0 8 63 193 206 147 0 0 0 0 1 8 63 193 206 147 0 0 0 0 0 8 65 67 174 89 21 0 0 0 1 8 65 67 174 89 21 0 0 0 0 8 24 124 240 73 208 51 10 0 1 8 24 124 240 73 208 51 10 0 0 8 127 149 228 141 130 187 206 212 1 8 127 149 228 141 130 187 206 212 0 8 150 21 0 0 0 0 0 0 1 8 150 21 0 0 0 0 0 0 0 8 36 148 234 13 0 0 0 0 1 8 36 148 234 13 0 0 0 0 0 8 22 10 2 0 0 0 0 0 1 8 22 10 2 0 0 0 0 0 0 8 112 48 196 1 161 60 78 227 1 8 112 48 196 1 161 60 78 227 0 16 141 191 62 222 54 255 93 191 23 154 244 121 104 127 150 0 1 16 141 191 62 222 54 255 93 191 23 154 244 121 104 127 150 0 0 16 1 239 62 155 92 171 183 88 243 250 73 64 154 209 61 6 1 16 1 239 62 155 92 171 183 88 243 250 73 64 154 209 61 6 0 16 226 241 36 137 89 204 106 60 252 68 23 9 46 14 188 7 1 16 226 241 36 137 89 204 106 60 252 68 23 9 46 14 188 7 0 16 168 243 51 12 205 84 127 124 104 103 17 0 0 0 0 0 1 16 168 243 51 12 205 84 127 124 104 103 17 0 0 0 0 0 0 16 199 246 222 200 216 155 75 134 115 5 0 0 0 0 0 0 1 16 199 246 222 200 216 155 75 134 115 5 0 0 0 0 0 0 0 16 205 246 227 212 19 202 146 146 12 32 222 104 0 0 0 0 1 16 205 246 227 212 19 202 146 146 12 32 222 104 0 0 0 0 0 8 231 2 0 0 0 0 0 0 1 8 231 2 0 0 0 0 0 0 0 8 112 223 182 198 202 220 170 0 1 8 112 223 182 198 202 220 170 0 0 8 0 212 75 197 0 0 0 0 1 8 0 212 75 197 0 0 0 0 0 16 138 108 72 105 190 154 118 34 30 0 0 0 0 0 0 0 1 16 138 108 72 105 190 154 118 34 30 0 0 0 0 0 0 0 0 8 48 85 228 16 168 11 0 0 1 8 48 85 228 16 168 11 0 0 0 8 62 1 0 0 0 0 0 0 1 8 62 1 0 0 0 0 0 0 0 16 6 102 249 196 237 58 2 184 77 192 3 21 141 0 0 0 1 16 6 102 249 196 237 58 2 184 77 192 3 21 141 0 0 0 0 8 8 78 34 173 18 4 0 0 1 8 8 78 34 173 18 4 0 0 0 8 7 0 0 0 0 0 0 0 1 8 7 0 0 0 0 0 0 0 0 8 239 135 16 50 170 2 57 0 1 8 239 135 16 50 170 2 57 0 0 8 183 0 0 0 0 0 0 0 1 8 183 0 0 0 0 0 0 0 0 16 177 22 53 249 155 145 101 251 26 74 122 154 45 100 11 0 1 16 177 22 53 249 155 145 101 251 26 74 122 154 45 100 11 0 0 8 80 56 225 0 0 0 0 0 1 8 80 56 225 0 0 0 0 0 0 16 76 235 10 21 204 158 27 14 68 131 188 49 79 0 0 0 1 16 76 235 10 21 204 158 27 14 68 131 188 49 79 0 0 0 0 16 251 170 198 48 126 70 130 132 60 154 11 0 0 0 0 0 1 16 251 170 198 48 126 70 130 132 60 154 11 0 0 0 0 0 0 8 191 30 191 254 3 0 0 0 1 8 191 30 191 254 3 0 0 0 0 16 54 216 58 148 106 237 238 143 196 75 61 50 0 0 0 0 1 16 54 216 58 148 106 237 238 143 196 75 61 50 0 0 0 0 0 8 179 134 5 0 0 0 0 0 1 8 179 134 5 0 0 0 0 0 0 16 241 40 126 116 35 208 214 118 64 224 2 0 0 0 0 0 1 16 241 40 126 116 35 208 214 118 64 224 2 0 0 0 0 0 0 8 192 249 163 87 76 23 44 169 1 8 192 249 163 87 76 23 44 169 0 8 20 54 151 190 175 212 60 7 1 8 20 54 151 190 175 212 60 7 0 8 216 96 161 160 23 138 1 0 1 8 216 96 161 160 23 138 1 0 0 16 229 209 203 219 86 233 187 99 117 0 0 0 0 0 0 0 1 16 229 209 203 219 86 233 187 99 117 0 0 0 0 0 0 0 0 16 245 229 198 81 226 138 11 41 33 213 8 22 0 0 0 0 1 16 245 229 198 81 226 138 11 41 33 213 8 22 0 0 0 0 0 8 123 178 141 23 108 0 0 0 1 8 123 178 141 23 108 0 0 0 0 8 209 241 222 253 33 0 0 0 1 8 209 241 222 253 33 0 0 0 0 16 220 85 110 10 15 95 4 6 252 132 103 77 0 0 0 0 1 16 220 85 110 10 15 95 4 6 252 132 103 77 0 0 0 0 0 16 189 132 98 150 159 168 163 157 176 8 1 0 0 0 0 0 1 16 189 132 98 150 159 168 163 157 176 8 1 0 0 0 0 0 0 8 226 130 140 1 0 0 0 0 1 8 226 130 140 1 0 0 0 0 0 16 143 231 15 168 10 112 155 62 246 19 188 101 111 0 0 0 1 16 143 231 15 168 10 112 155 62 246 19 188 101 111 0 0 0 0 16 90 83 73 223 21 149 198 225 16 118 121 1 0 0 0 0 1 16 90 83 73 223 21 149 198 225 16 118 121 1 0 0 0 0 0 8 250 107 147 104 78 3 0 0 1 8 250 107 147 104 78 3 0 0 0 8 112 132 221 2 0 0 0 0 1 8 112 132 221 2 0 0 0 0 0 8 233 38 129 60 112 9 2 0 1 8 233 38 129 60 112 9 2 0 0 8 31 200 44 22 247 29 0 0 1 8 31 200 44 22 247 29 0 0 0 8 64 140 226 178 63 3 0 0 1 8 64 140 226 178 63 3 0 0 0 16 102 203 87 33 78 209 7 212 252 71 0 0 0 0 0 0 1 16 102 203 87 33 78 209 7 212 252 71 0 0 0 0 0 0 0 16 124 235 50 2 230 251 163 236 12 65 16 16 124 0 0 0 1 16 124 235 50 2 230 251 163 236 12 65 16 16 124 0 0 0 0 16 150 159 188 85 64 141 109 45 11 90 81 64 1 0 0 0 1 16 150 159 188 85 64 141 109 45 11 90 81 64 1 0 0 0 0 16 167 59 70 31 206 169 7 64 31 128 72 0 0 0 0 0 1 16 167 59 70 31 206 169 7 64 31 128 72 0 0 0 0 0 0 8 44 3 0 0 0 0 0 0 1 8 44 3 0 0 0 0 0 0 0 8 245 254 182 131 34 27 3 0 1 8 245 254 182 131 34 27 3 0 0 16 127 105 58 125 131 87 50 215 211 128 179 128 247 65 82 0 1 16 127 105 58 125 131 87 50 215 211 128 179 128 247 65 82 0 0 8 201 118 45 227 189 189 136 2 1 8 201 118 45 227 189 189 136 2 0 16 73 205 21 184 2 160 55 216 156 146 207 246 12 0 0 0 1 16 73 205 21 184 2 160 55 216 156 146 207 246 12 0 0 0 0 8 88 131 129 83 59 1 0 0 1 8 88 131 129 83 59 1 0 0 0 8 118 58 124 202 93 158 94 84 1 8 118 58 124 202 93 158 94 84 0 16 114 144 11 78 137 113 34 58 211 201 128 28 24 49 27 0 1 16 114 144 11 78 137 113 34 58 211 201 128 28 24 49 27 0 0 8 227 62 145 88 15 34 21 0 1 8 227 62 145 88 15 34 21 0 0 8 144 79 175 34 58 184 155 52 1 8 144 79 175 34 58 184 155 52 0 8 169 92 48 156 119 52 152 6 1 8 169 92 48 156 119 52 152 6 0 16 64 241 66 116 157 84 90 13 43 150 240 179 1 0 0 0 1 16 64 241 66 116 157 84 90 13 43 150 240 179 1 0 0 0 0 8 249 36 108 106 67 0 0 0 1 8 249 36 108 106 67 0 0 0 0 8 24 219 0 0 0 0 0 0 1 8 24 219 0 0 0 0 0 0 0 16 132 220 144 75 157 31 158 221 3 0 0 0 0 0 0 0 1 16 132 220 144 75 157 31 158 221 3 0 0 0 0 0 0 0 0 8 22 51 150 54 80 88 15 0 1 8 22 51 150 54 80 88 15 0 0 16 254 143 211 239 187 165 87 122 3 0 0 0 0 0 0 0 1 16 254 143 211 239 187 165 87 122 3 0 0 0 0 0 0 0 0 16 90 132 24 254 5 211 89 38 55 116 158 144 100 66 0 0 1 16 90 132 24 254 5 211 89 38 55 116 158 144 100 66 0 0 0 16 119 186 36 149 246 36 59 35 232 254 155 141 203 2 0 0 1 16 119 186 36 149 246 36 59 35 232 254 155 141 203 2 0 0 0 8 203 46 49 133 154 163 0 0 1 8 203 46 49 133 154 163 0 0 0 16 173 84 223 120 95 131 253 29 244 109 99 100 18 0 0 0 1 16 173 84 223 120 95 131 253 29 244 109 99 100 18 0 0 0 0 16 163 90 76 225 185 170 229 28 217 73 104 176 75 142 57 0 1 16 163 90 76 225 185 170 229 28 217 73 104 176 75 142 57 0 0 16 253 112 155 58 247 162 195 140 168 20 3 0 0 0 0 0 1 16 253 112 155 58 247 162 195 140 168 20 3 0 0 0 0 0 0 16 249 122 124 0 146 109 174 30 4 0 0 0 0 0 0 0 1 16 249 122 124 0 146 109 174 30 4 0 0 0 0 0 0 0 0 8 144 2 45 119 93 56 2 0 1 8 144 2 45 119 93 56 2 0 0 8 45 33 10 0 0 0 0 0 1 8 45 33 10 0 0 0 0 0 0 16 186 27 85 177 145 135 52 106 165 148 53 70 246 1 0 0 1 16 186 27 85 177 145 135 52 106 165 148 53 70 246 1 0 0 0 8 68 52 17 4 0 0 0 0 1 8 68 52 17 4 0 0 0 0 0 16 241 159 13 20 11 64 214 104 47 0 0 0 0 0 0 0 1 16 241 159 13 20 11 64 214 104 47 0 0 0 0 0 0 0 0 16 32 95 224 178 8 58 144 200 201 145 83 22 116 60 79 2 1 16 32 95 224 178 8 58 144 200 201 145 83 22 116 60 79 2 0 8 215 108 179 124 111 116 0 0 1 8 215 108 179 124 111 116 0 0 0 16 72 135 153 119 46 195 147 13 252 2 59 0 117 125 64 77 1 16 72 135 153 119 46 195 147 13 252 2 59 0 117 125 64 77 0 16 93 46 81 15 142 242 250 221 79 61 178 228 143 87 244 0 1 16 93 46 81 15 142 242 250 221 79 61 178 228 143 87 244 0 0 8 139 93 95 57 0 0 0 0 1 8 139 93 95 57 0 0 0 0 0 16 76 36 152 198 40 178 106 21 207 164 31 24 28 10 1 0 1 16 76 36 152 198 40 178 106 21 207 164 31 24 28 10 1 0 0 8 19 0 0 0 0 0 0 0 1 8 19 0 0 0 0 0 0 0 0 16 9 25 202 138 170 88 179 0 75 0 0 0 0 0 0 0 1 16 9 25 202 138 170 88 179 0 75 0 0 0 0 0 0 0 0 8 169 231 136 224 45 30 2 0 1 8 169 231 136 224 45 30 2 0 0 16 54 251 180 193 77 7 254 217 190 81 0 0 0 0 0 0 1 16 54 251 180 193 77 7 254 217 190 81 0 0 0 0 0 0 0 16 167 75 62 7 42 70 13 12 21 5 163 135 11 0 0 0 1 16 167 75 62 7 42 70 13 12 21 5 163 135 11 0 0 0 0 16 138 166 227 194 104 244 199 0 232 12 0 0 0 0 0 0 1 16 138 166 227 194 104 244 199 0 232 12 0 0 0 0 0 0 0 8 203 27 84 77 12 139 18 28 1 8 203 27 84 77 12 139 18 28 0 8 159 124 135 1 0 0 0 0 1 8 159 124 135 1 0 0 0 0 0 16 211 117 92 112 68 205 243 46 127 0 0 0 0 0 0 0 1 16 211 117 92 112 68 205 243 46 127 0 0 0 0 0 0 0 0 8 173 148 132 161 87 0 0 0 1 8 173 148 132 161 87 0 0 0 0 8 9 0 0 0 0 0 0 0 1 8 9 0 0 0 0 0 0 0 0 8 133 26 216 191 172 89 213 40 1 8 133 26 216 191 172 89 213 40 0 16 211 26 153 111 42 16 37 94 105 14 57 163 225 193 0 0 1 16 211 26 153 111 42 16 37 94 105 14 57 163 225 193 0 0 0 8 128 164 207 191 0 0 0 0 1 8 128 164 207 191 0 0 0 0 0 8 133 171 31 6 0 0 0 0 1 8 133 171 31 6 0 0 0 0 0 16 58 142 105 140 176 184 239 208 55 131 225 185 144 11 0 0 1 16 58 142 105 140 176 184 239 208 55 131 225 185 144 11 0 0 0 16 69 153 92 71 249 203 122 156 39 73 222 95 210 32 1 0 1 16 69 153 92 71 249 203 122 156 39 73 222 95 210 32 1 0 0 8 230 66 104 5 0 0 0 0 1 8 230 66 104 5 0 0 0 0 0 8 161 45 37 11 195 19 140 0 1 8 161 45 37 11 195 19 140 0 0 8 234 74 122 82 0 0 0 0 1 8 234 74 122 82 0 0 0 0 0 8 177 246 13 0 0 0 0 0 1 8 177 246 13 0 0 0 0 0 0 8 49 224 136 0 0 0 0 0 1 8 49 224 136 0 0 0 0 0 0 8 125 71 166 1 1 0 0 0 1 8 125 71 166 1 1 0 0 0 0 8 141 121 130 15 0 0 0 0 1 8 141 121 130 15 0 0 0 0 0 16 86 207 74 133 184 161 240 207 34 130 144 107 83 0 0 0 1 16 86 207 74 133 184 161 240 207 34 130 144 107 83 0 0 0 0 8 35 48 213 98 222 69 132 0 1 8 35 48 213 98 222 69 132 0 0 8 182 209 82 82 113 25 178 59 1 8 182 209 82 82 113 25 178 59 0 8 180 86 59 54 31 2 0 0 1 8 180 86 59 54 31 2 0 0 0 8 45 45 0 0 0 0 0 0 1 8 45 45 0 0 0 0 0 0 0 16 21 185 217 174 9 133 26 231 15 65 115 190 75 64 49 0 1 16 21 185 217 174 9 133 26 231 15 65 115 190 75 64 49 0 0 16 165 110 209 80 73 74 135 193 159 99 14 0 0 0 0 0 1 16 165 110 209 80 73 74 135 193 159 99 14 0 0 0 0 0 0 8 212 39 10 198 84 40 188 1 1 8 212 39 10 198 84 40 188 1 0 16 229 117 144 57 201 122 60 120 207 235 3 0 0 0 0 0 1 16 229 117 144 57 201 122 60 120 207 235 3 0 0 0 0 0 0 8 219 123 115 0 0 0 0 0 1 8 219 123 115 0 0 0 0 0 0 16 191 142 53 119 168 100 219 47 160 3 0 0 0 0 0 0 1 16 191 142 53 119 168 100 219 47 160 3 0 0 0 0 0 0 0 16 227 12 18 159 53 213 206 140 179 189 209 125 126 174 21 0 1 16 227 12 18 159 53 213 206 140 179 189 209 125 126 174 21 0 0 16 108 182 247 254 150 50 85 5 140 125 196 22 0 0 0 0 1 16 108 182 247 254 150 50 85 5 140 125 196 22 0 0 0 0 0 16 92 126 28 210 248 52 158 233 246 129 152 227 129 228 4 25 1 16 92 126 28 210 248 52 158 233 246 129 152 227 129 228 4 25 0 8 211 136 158 83 43 95 0 0 1 8 211 136 158 83 43 95 0 0 0 8 83 253 195 70 35 14 7 1 1 8 83 253 195 70 35 14 7 1 0 16 105 111 185 175 206 124 63 83 199 79 41 0 0 0 0 0 1 16 105 111 185 175 206 124 63 83 199 79 41 0 0 0 0 0 0 8 6 50 0 0 0 0 0 0 1 8 6 50 0 0 0 0 0 0 0 16 183 89 151 17 18 108 172 173 36 98 141 13 0 0 0 0 1 16 183 89 151 17 18 108 172 173 36 98 141 13 0 0 0 0 0 8 218 149 242 52 5 0 0 0 1 8 218 149 242 52 5 0 0 0 0 8 84 210 0 0 0 0 0 0 1 8 84 210 0 0 0 0 0 0 0 8 227 16 100 125 154 10 22 0 1 8 227 16 100 125 154 10 22 0 0 8 99 11 2 0 0 0 0 0 1 8 99 11 2 0 0 0 0 0 0 16 59 200 146 111 178 201 210 58 7 10 0 0 0 0 0 0 1 16 59 200 146 111 178 201 210 58 7 10 0 0 0 0 0 0 0 8 245 98 135 241 52 234 83 2 1 8 245 98 135 241 52 234 83 2 0 8 111 24 151 152 13 0 0 0 1 8 111 24 151 152 13 0 0 0 0 8 214 0 0 0 0 0 0 0 1 8 214 0 0 0 0 0 0 0 0 16 107 171 142 230 68 214 222 6 143 20 0 0 0 0 0 0 1 16 107 171 142 230 68 214 222 6 143 20 0 0 0 0 0 0 0 16 31 138 93 248 13 219 151 196 232 112 179 55 114 0 0 0 1 16 31 138 93 248 13 219 151 196 232 112 179 55 114 0 0 0 0 16 126 160 35 63 198 30 3 106 28 63 3 6 0 0 0 0 1 16 126 160 35 63 198 30 3 106 28 63 3 6 0 0 0 0 0 8 104 8 59 0 0 0 0 0 1 8 104 8 59 0 0 0 0 0 0 8 211 64 154 42 0 0 0 0 1 8 211 64 154 42 0 0 0 0 0 16 190 175 183 140 51 33 188 44 220 15 129 79 197 5 0 0 1 16 190 175 183 140 51 33 188 44 220 15 129 79 197 5 0 0 0 8 58 149 0 0 0 0 0 0 1 8 58 149 0 0 0 0 0 0 0 8 168 78 159 61 141 1 0 0 1 8 168 78 159 61 141 1 0 0 0 8 50 34 114 75 132 0 0 0 1 8 50 34 114 75 132 0 0 0 0 16 228 96 210 155 189 131 157 123 187 84 8 0 0 0 0 0 1 16 228 96 210 155 189 131 157 123 187 84 8 0 0 0 0 0 0 8 105 43 140 252 152 3 0 0 1 8 105 43 140 252 152 3 0 0 0 8 93 153 83 251 251 19 6 0 1 8 93 153 83 251 251 19 6 0 0 8 59 202 65 95 133 34 100 0 1 8 59 202 65 95 133 34 100 0 0 16 175 130 225 146 216 107 99 14 39 177 93 74 28 0 0 0 1 16 175 130 225 146 216 107 99 14 39 177 93 74 28 0 0 0 0 16 60 102 67 81 214 180 246 82 1 0 0 0 0 0 0 0 1 16 60 102 67 81 214 180 246 82 1 0 0 0 0 0 0 0 0 8 29 156 0 0 0 0 0 0 1 8 29 156 0 0 0 0 0 0 0 8 144 22 0 0 0 0 0 0 1 8 144 22 0 0 0 0 0 0 0 16 126 85 237 254 119 29 6 190 202 60 208 130 101 7 221 121 1 16 126 85 237 254 119 29 6 190 202 60 208 130 101 7 221 121 0 8 109 138 127 241 6 0 0 0 1 8 109 138 127 241 6 0 0 0 0 8 104 29 47 0 0 0 0 0 1 8 104 29 47 0 0 0 0 0 0 16 105 197 115 163 120 218 156 57 157 204 105 245 2 0 0 0 1 16 105 197 115 163 120 218 156 57 157 204 105 245 2 0 0 0 0 16 43 62 73 147 228 196 140 60 148 83 16 164 4 0 0 0 1 16 43 62 73 147 228 196 140 60 148 83 16 164 4 0 0 0 0 8 31 0 0 0 0 0 0 0 1 8 31 0 0 0 0 0 0 0 0 8 241 157 192 68 3 0 0 0 1 8 241 157 192 68 3 0 0 0 0 16 108 147 5 178 33 167 30 134 205 25 105 66 48 22 245 0 1 16 108 147 5 178 33 167 30 134 205 25 105 66 48 22 245 0 0 8 129 42 147 65 1 0 0 0 1 8 129 42 147 65 1 0 0 0 0 16 246 130 162 45 151 113 85 86 26 158 229 111 0 0 0 0 1 16 246 130 162 45 151 113 85 86 26 158 229 111 0 0 0 0 0 8 169 64 0 0 0 0 0 0 1 8 169 64 0 0 0 0 0 0 0 8 239 189 219 253 42 82 213 153 1 8 239 189 219 253 42 82 213 153 0 8 3 41 244 12 23 4 0 0 1 8 3 41 244 12 23 4 0 0 0 16 45 29 75 228 251 90 142 140 229 6 0 0 0 0 0 0 1 16 45 29 75 228 251 90 142 140 229 6 0 0 0 0 0 0 0 8 46 253 114 12 61 0 0 0 1 8 46 253 114 12 61 0 0 0 0 8 182 105 196 214 0 0 0 0 1 8 182 105 196 214 0 0 0 0 0 16 85 197 138 192 105 13 137 11 199 237 60 146 247 3 63 24 1 16 85 197 138 192 105 13 137 11 199 237 60 146 247 3 63 24 0 8 62 83 233 195 226 186 158 9 1 8 62 83 233 195 226 186 158 9 0 8 255 213 102 22 0 0 0 0 1 8 255 213 102 22 0 0 0 0 diff --git a/src/boost/libs/multiprecision/test/serial_txts/cpp_int64_serial32.txt b/src/boost/libs/multiprecision/test/serial_txts/cpp_int64_serial32.txt new file mode 100644 index 00000000..c5becf8a --- /dev/null +++ b/src/boost/libs/multiprecision/test/serial_txts/cpp_int64_serial32.txt @@ -0,0 +1 @@ +22 serialization::archive 10 0 0 0 0 0 8 154 227 28 82 91 187 17 0 1 8 154 227 28 82 91 187 17 0 0 4 238 2 0 0 1 4 238 2 0 0 0 8 179 21 191 74 120 31 195 5 1 8 179 21 191 74 120 31 195 5 0 8 38 72 203 241 222 183 7 0 1 8 38 72 203 241 222 183 7 0 0 4 225 3 0 0 1 4 225 3 0 0 0 8 242 170 246 107 183 113 31 11 1 8 242 170 246 107 183 113 31 11 0 8 159 2 53 187 36 166 22 4 1 8 159 2 53 187 36 166 22 4 0 4 26 205 0 0 1 4 26 205 0 0 0 8 177 10 45 114 95 1 0 0 1 8 177 10 45 114 95 1 0 0 0 4 231 42 31 0 1 4 231 42 31 0 0 4 228 0 0 0 1 4 228 0 0 0 0 8 161 235 183 0 9 0 0 0 1 8 161 235 183 0 9 0 0 0 0 4 161 84 9 0 1 4 161 84 9 0 0 4 17 21 0 0 1 4 17 21 0 0 0 8 132 60 177 2 3 0 0 0 1 8 132 60 177 2 3 0 0 0 0 8 112 146 42 85 255 28 14 50 1 8 112 146 42 85 255 28 14 50 0 8 56 155 123 75 170 217 61 52 1 8 56 155 123 75 170 217 61 52 0 8 128 184 17 143 213 41 148 184 1 8 128 184 17 143 213 41 148 184 0 8 211 92 36 214 185 177 216 48 1 8 211 92 36 214 185 177 216 48 0 8 103 144 142 223 219 161 68 11 1 8 103 144 142 223 219 161 68 11 0 4 136 9 0 0 1 4 136 9 0 0 0 8 110 109 102 36 76 159 0 0 1 8 110 109 102 36 76 159 0 0 0 8 212 44 7 134 98 246 52 74 1 8 212 44 7 134 98 246 52 74 0 8 5 18 148 245 212 213 152 2 1 8 5 18 148 245 212 213 152 2 0 8 215 29 169 9 145 141 144 10 1 8 215 29 169 9 145 141 144 10 0 4 205 0 0 0 1 4 205 0 0 0 0 8 242 218 75 187 1 0 0 0 1 8 242 218 75 187 1 0 0 0 0 8 196 242 164 7 110 253 8 0 1 8 196 242 164 7 110 253 8 0 0 8 87 7 181 132 51 102 13 0 1 8 87 7 181 132 51 102 13 0 0 4 18 228 18 0 1 4 18 228 18 0 0 4 190 5 0 0 1 4 190 5 0 0 0 4 7 0 0 0 1 4 7 0 0 0 0 4 89 137 26 12 1 4 89 137 26 12 0 4 130 0 0 0 1 4 130 0 0 0 0 8 128 249 218 245 47 115 9 1 1 8 128 249 218 245 47 115 9 1 0 8 162 100 122 44 193 2 0 0 1 8 162 100 122 44 193 2 0 0 0 8 101 75 177 242 99 85 12 0 1 8 101 75 177 242 99 85 12 0 0 8 240 219 82 212 216 69 123 0 1 8 240 219 82 212 216 69 123 0 0 8 0 241 147 64 173 200 15 13 1 8 0 241 147 64 173 200 15 13 0 8 123 176 87 114 3 0 0 0 1 8 123 176 87 114 3 0 0 0 0 8 199 125 85 138 128 0 0 0 1 8 199 125 85 138 128 0 0 0 0 8 212 151 16 161 84 117 1 0 1 8 212 151 16 161 84 117 1 0 0 4 6 0 0 0 1 4 6 0 0 0 0 4 3 195 58 0 1 4 3 195 58 0 0 8 97 114 34 212 170 208 45 0 1 8 97 114 34 212 170 208 45 0 0 4 146 232 0 0 1 4 146 232 0 0 0 8 133 179 117 190 9 133 28 13 1 8 133 179 117 190 9 133 28 13 0 8 73 171 130 38 191 22 0 0 1 8 73 171 130 38 191 22 0 0 0 8 18 152 190 20 249 26 0 0 1 8 18 152 190 20 249 26 0 0 0 4 252 198 62 5 1 4 252 198 62 5 0 8 73 97 191 10 234 239 1 0 1 8 73 97 191 10 234 239 1 0 0 8 153 44 205 37 255 196 0 0 1 8 153 44 205 37 255 196 0 0 0 8 81 132 37 54 246 238 0 0 1 8 81 132 37 54 246 238 0 0 0 4 8 53 135 13 1 4 8 53 135 13 0 4 89 148 169 6 1 4 89 148 169 6 0 4 17 159 173 20 1 4 17 159 173 20 0 8 201 182 183 82 169 6 0 0 1 8 201 182 183 82 169 6 0 0 0 4 182 0 0 0 1 4 182 0 0 0 0 4 108 16 0 0 1 4 108 16 0 0 0 4 39 236 0 0 1 4 39 236 0 0 0 8 181 1 156 121 15 32 0 0 1 8 181 1 156 121 15 32 0 0 0 8 29 56 214 10 51 145 14 0 1 8 29 56 214 10 51 145 14 0 0 4 6 0 0 0 1 4 6 0 0 0 0 4 161 199 49 0 1 4 161 199 49 0 0 4 248 149 1 0 1 4 248 149 1 0 0 8 180 167 79 137 212 132 35 1 1 8 180 167 79 137 212 132 35 1 0 4 8 0 0 0 1 4 8 0 0 0 0 4 195 6 0 0 1 4 195 6 0 0 0 4 82 1 0 0 1 4 82 1 0 0 0 8 33 248 118 22 198 96 57 183 1 8 33 248 118 22 198 96 57 183 0 8 94 181 212 144 197 233 13 0 1 8 94 181 212 144 197 233 13 0 0 8 102 74 34 111 163 102 6 0 1 8 102 74 34 111 163 102 6 0 0 8 26 210 173 182 38 49 0 0 1 8 26 210 173 182 38 49 0 0 0 4 86 0 0 0 1 4 86 0 0 0 0 4 143 140 20 0 1 4 143 140 20 0 0 8 73 116 37 159 96 31 0 0 1 8 73 116 37 159 96 31 0 0 0 8 8 37 96 156 51 81 22 12 1 8 8 37 96 156 51 81 22 12 0 4 237 236 131 159 1 4 237 236 131 159 0 4 10 0 0 0 1 4 10 0 0 0 0 8 130 141 0 7 2 2 0 0 1 8 130 141 0 7 2 2 0 0 0 4 109 195 74 15 1 4 109 195 74 15 0 4 230 2 0 0 1 4 230 2 0 0 0 4 106 192 15 1 1 4 106 192 15 1 0 4 10 163 0 0 1 4 10 163 0 0 0 8 203 163 89 123 164 84 3 0 1 8 203 163 89 123 164 84 3 0 0 4 10 0 0 0 1 4 10 0 0 0 0 8 215 165 31 197 2 167 7 0 1 8 215 165 31 197 2 167 7 0 0 4 21 0 0 0 1 4 21 0 0 0 0 4 39 38 0 0 1 4 39 38 0 0 0 4 57 137 152 9 1 4 57 137 152 9 0 8 5 3 11 74 1 0 0 0 1 8 5 3 11 74 1 0 0 0 0 4 160 216 17 103 1 4 160 216 17 103 0 4 29 8 124 52 1 4 29 8 124 52 0 8 154 188 176 41 1 0 0 0 1 8 154 188 176 41 1 0 0 0 0 8 76 178 160 131 39 5 0 0 1 8 76 178 160 131 39 5 0 0 0 8 184 146 71 183 150 91 6 0 1 8 184 146 71 183 150 91 6 0 0 8 171 6 120 246 94 47 0 0 1 8 171 6 120 246 94 47 0 0 0 8 146 132 93 2 22 222 211 5 1 8 146 132 93 2 22 222 211 5 0 8 204 2 222 46 179 175 0 0 1 8 204 2 222 46 179 175 0 0 0 8 9 148 45 199 56 52 13 0 1 8 9 148 45 199 56 52 13 0 0 4 241 190 12 0 1 4 241 190 12 0 0 8 88 52 207 19 120 43 0 0 1 8 88 52 207 19 120 43 0 0 0 8 132 70 133 92 64 29 0 0 1 8 132 70 133 92 64 29 0 0 0 4 1 0 0 0 1 4 1 0 0 0 0 8 153 12 223 211 34 6 0 0 1 8 153 12 223 211 34 6 0 0 0 8 140 14 165 245 82 66 0 0 1 8 140 14 165 245 82 66 0 0 0 4 221 15 0 0 1 4 221 15 0 0 0 8 50 119 85 166 157 1 0 0 1 8 50 119 85 166 157 1 0 0 0 4 30 3 0 0 1 4 30 3 0 0 0 4 13 245 224 15 1 4 13 245 224 15 0 8 202 238 193 147 1 0 0 0 1 8 202 238 193 147 1 0 0 0 0 8 91 182 236 7 230 82 3 0 1 8 91 182 236 7 230 82 3 0 0 8 63 175 86 139 154 53 6 37 1 8 63 175 86 139 154 53 6 37 0 8 201 71 17 19 25 0 0 0 1 8 201 71 17 19 25 0 0 0 0 4 14 211 37 0 1 4 14 211 37 0 0 8 202 176 13 183 153 3 12 1 1 8 202 176 13 183 153 3 12 1 0 8 34 164 43 13 117 0 0 0 1 8 34 164 43 13 117 0 0 0 0 8 55 100 235 195 135 199 4 0 1 8 55 100 235 195 135 199 4 0 0 4 77 59 0 0 1 4 77 59 0 0 0 4 6 0 0 0 1 4 6 0 0 0 0 8 91 176 44 141 237 201 1 0 1 8 91 176 44 141 237 201 1 0 0 8 91 247 129 23 149 242 13 0 1 8 91 247 129 23 149 242 13 0 0 4 159 244 3 0 1 4 159 244 3 0 0 8 39 216 128 123 225 164 26 0 1 8 39 216 128 123 225 164 26 0 0 8 206 236 127 202 3 0 0 0 1 8 206 236 127 202 3 0 0 0 0 8 227 22 89 80 97 163 24 23 1 8 227 22 89 80 97 163 24 23 0 8 6 163 204 40 124 57 0 0 1 8 6 163 204 40 124 57 0 0 0 4 72 96 82 7 1 4 72 96 82 7 0 8 205 145 127 61 215 220 134 3 1 8 205 145 127 61 215 220 134 3 0 4 187 177 86 19 1 4 187 177 86 19 0 8 195 158 155 140 132 204 144 36 1 8 195 158 155 140 132 204 144 36 0 8 141 29 202 70 15 0 0 0 1 8 141 29 202 70 15 0 0 0 0 8 80 57 26 165 1 0 0 0 1 8 80 57 26 165 1 0 0 0 0 4 232 14 0 0 1 4 232 14 0 0 0 4 172 7 0 0 1 4 172 7 0 0 0 8 229 247 251 162 193 189 0 0 1 8 229 247 251 162 193 189 0 0 0 4 70 15 0 0 1 4 70 15 0 0 0 4 104 115 1 0 1 4 104 115 1 0 0 4 73 175 2 0 1 4 73 175 2 0 0 8 139 107 110 161 47 228 20 0 1 8 139 107 110 161 47 228 20 0 0 8 52 16 150 150 195 76 61 0 1 8 52 16 150 150 195 76 61 0 0 8 3 233 1 255 93 196 239 229 1 8 3 233 1 255 93 196 239 229 0 4 210 243 2 0 1 4 210 243 2 0 0 4 136 103 92 0 1 4 136 103 92 0 0 8 146 79 153 7 104 181 15 0 1 8 146 79 153 7 104 181 15 0 0 4 63 136 0 0 1 4 63 136 0 0 0 4 42 206 0 0 1 4 42 206 0 0 0 4 0 0 0 0 0 4 0 0 0 0 0 8 10 253 104 129 179 201 249 12 1 8 10 253 104 129 179 201 249 12 0 4 173 0 0 0 1 4 173 0 0 0 0 4 126 150 157 0 1 4 126 150 157 0 0 8 95 103 181 13 108 192 162 0 1 8 95 103 181 13 108 192 162 0 0 4 8 34 0 0 1 4 8 34 0 0 0 8 195 39 2 201 240 221 6 0 1 8 195 39 2 201 240 221 6 0 0 4 164 73 1 0 1 4 164 73 1 0 0 8 24 150 136 250 66 244 117 28 1 8 24 150 136 250 66 244 117 28 0 8 188 211 235 56 103 1 0 0 1 8 188 211 235 56 103 1 0 0 0 8 147 116 238 204 203 134 5 0 1 8 147 116 238 204 203 134 5 0 0 4 212 155 224 212 1 4 212 155 224 212 0 8 162 39 186 255 226 48 217 253 1 8 162 39 186 255 226 48 217 253 0 4 96 45 87 0 1 4 96 45 87 0 0 4 43 0 0 0 1 4 43 0 0 0 0 8 21 190 140 128 8 199 26 0 1 8 21 190 140 128 8 199 26 0 0 8 223 96 39 236 140 66 12 0 1 8 223 96 39 236 140 66 12 0 0 8 168 80 9 35 78 0 0 0 1 8 168 80 9 35 78 0 0 0 0 8 88 244 56 44 112 0 0 0 1 8 88 244 56 44 112 0 0 0 0 8 57 42 143 22 20 0 0 0 1 8 57 42 143 22 20 0 0 0 0 8 203 139 139 233 47 120 0 0 1 8 203 139 139 233 47 120 0 0 0 8 151 136 78 80 220 201 21 3 1 8 151 136 78 80 220 201 21 3 0 8 41 214 136 67 14 14 0 0 1 8 41 214 136 67 14 14 0 0 0 4 68 146 0 0 1 4 68 146 0 0 0 8 4 125 187 175 144 13 0 0 1 8 4 125 187 175 144 13 0 0 0 8 107 43 241 204 40 37 1 0 1 8 107 43 241 204 40 37 1 0 0 4 100 212 145 7 1 4 100 212 145 7 0 8 181 219 82 238 3 185 1 0 1 8 181 219 82 238 3 185 1 0 0 8 83 219 52 188 1 0 0 0 1 8 83 219 52 188 1 0 0 0 0 4 245 60 150 2 1 4 245 60 150 2 0 4 182 3 0 0 1 4 182 3 0 0 0 8 35 242 99 17 31 0 0 0 1 8 35 242 99 17 31 0 0 0 0 8 210 109 74 20 3 0 0 0 1 8 210 109 74 20 3 0 0 0 0 4 113 0 0 0 1 4 113 0 0 0 0 4 215 146 221 1 1 4 215 146 221 1 0 4 33 0 0 0 1 4 33 0 0 0 0 4 241 68 169 0 1 4 241 68 169 0 0 8 109 184 204 61 3 0 0 0 1 8 109 184 204 61 3 0 0 0 0 8 181 132 45 203 59 0 0 0 1 8 181 132 45 203 59 0 0 0 0 8 193 232 39 3 20 5 2 0 1 8 193 232 39 3 20 5 2 0 0 4 41 222 5 0 1 4 41 222 5 0 0 8 240 84 253 169 3 245 134 14 1 8 240 84 253 169 3 245 134 14 0 8 53 101 132 186 140 107 194 48 1 8 53 101 132 186 140 107 194 48 0 4 231 3 0 0 1 4 231 3 0 0 0 4 185 12 0 0 1 4 185 12 0 0 0 8 3 35 9 8 33 0 0 0 1 8 3 35 9 8 33 0 0 0 0 4 156 36 211 5 1 4 156 36 211 5 0 4 92 228 169 22 1 4 92 228 169 22 0 4 127 62 177 0 1 4 127 62 177 0 0 4 2 0 0 0 1 4 2 0 0 0 0 8 164 101 187 91 120 0 0 0 1 8 164 101 187 91 120 0 0 0 0 4 33 58 42 0 1 4 33 58 42 0 0 4 65 43 119 4 1 4 65 43 119 4 0 4 171 27 0 0 1 4 171 27 0 0 0 8 151 115 89 236 58 107 231 6 1 8 151 115 89 236 58 107 231 6 0 8 53 244 97 77 30 194 11 0 1 8 53 244 97 77 30 194 11 0 0 4 227 66 108 47 1 4 227 66 108 47 0 4 67 137 26 0 1 4 67 137 26 0 0 8 70 250 222 204 115 159 137 0 1 8 70 250 222 204 115 159 137 0 0 8 164 93 158 196 7 0 0 0 1 8 164 93 158 196 7 0 0 0 0 8 113 106 97 177 105 0 0 0 1 8 113 106 97 177 105 0 0 0 0 4 38 28 0 0 1 4 38 28 0 0 0 4 144 3 0 0 1 4 144 3 0 0 0 8 55 211 179 66 249 0 0 0 1 8 55 211 179 66 249 0 0 0 0 4 70 208 8 215 1 4 70 208 8 215 0 4 17 174 7 0 1 4 17 174 7 0 0 4 145 40 82 0 1 4 145 40 82 0 0 8 185 14 149 132 50 7 0 0 1 8 185 14 149 132 50 7 0 0 0 4 84 17 37 245 1 4 84 17 37 245 0 8 218 94 35 43 115 7 0 0 1 8 218 94 35 43 115 7 0 0 0 8 170 8 238 147 136 37 0 0 1 8 170 8 238 147 136 37 0 0 0 8 169 153 246 116 99 150 1 0 1 8 169 153 246 116 99 150 1 0 0 8 110 23 17 63 97 104 44 241 1 8 110 23 17 63 97 104 44 241 0 4 219 131 208 47 1 4 219 131 208 47 0 8 100 16 250 222 223 5 0 0 1 8 100 16 250 222 223 5 0 0 0 4 189 0 0 0 1 4 189 0 0 0 0 8 22 198 182 249 164 1 85 6 1 8 22 198 182 249 164 1 85 6 0 4 173 137 0 0 1 4 173 137 0 0 0 4 111 190 230 246 1 4 111 190 230 246 0 8 51 99 110 105 78 69 86 3 1 8 51 99 110 105 78 69 86 3 0 8 104 165 202 140 7 0 0 0 1 8 104 165 202 140 7 0 0 0 0 4 136 13 0 0 1 4 136 13 0 0 0 8 5 138 36 135 3 0 0 0 1 8 5 138 36 135 3 0 0 0 0 8 39 105 124 108 77 96 30 0 1 8 39 105 124 108 77 96 30 0 0 4 78 159 129 13 1 4 78 159 129 13 0 8 223 6 27 79 8 0 0 0 1 8 223 6 27 79 8 0 0 0 0 8 203 6 61 205 13 0 0 0 1 8 203 6 61 205 13 0 0 0 0 8 111 62 45 160 194 14 103 96 1 8 111 62 45 160 194 14 103 96 0 4 82 143 196 30 1 4 82 143 196 30 0 4 54 0 0 0 1 4 54 0 0 0 0 8 37 180 24 111 34 94 97 0 1 8 37 180 24 111 34 94 97 0 0 4 94 61 200 42 1 4 94 61 200 42 0 8 229 205 68 230 125 0 0 0 1 8 229 205 68 230 125 0 0 0 0 4 125 1 0 0 1 4 125 1 0 0 0 4 70 69 227 171 1 4 70 69 227 171 0 8 121 93 176 157 92 133 17 34 1 8 121 93 176 157 92 133 17 34 0 8 211 207 179 76 229 87 229 73 1 8 211 207 179 76 229 87 229 73 0 4 0 0 0 0 0 4 0 0 0 0 0 4 3 0 0 0 1 4 3 0 0 0 0 8 101 90 156 136 105 177 2 0 1 8 101 90 156 136 105 177 2 0 0 8 163 122 187 139 155 245 97 88 1 8 163 122 187 139 155 245 97 88 0 8 31 100 188 227 193 143 8 0 1 8 31 100 188 227 193 143 8 0 0 4 85 153 46 1 1 4 85 153 46 1 0 8 221 254 215 194 253 123 70 0 1 8 221 254 215 194 253 123 70 0 0 8 215 60 213 115 201 17 0 0 1 8 215 60 213 115 201 17 0 0 0 4 245 0 0 0 1 4 245 0 0 0 0 4 182 69 1 0 1 4 182 69 1 0 0 4 16 115 202 1 1 4 16 115 202 1 0 8 229 38 172 10 236 158 36 0 1 8 229 38 172 10 236 158 36 0 0 4 152 18 4 0 1 4 152 18 4 0 0 4 29 0 0 0 1 4 29 0 0 0 0 8 164 28 2 236 150 2 6 0 1 8 164 28 2 236 150 2 6 0 0 8 199 130 156 17 201 5 0 0 1 8 199 130 156 17 201 5 0 0 0 4 13 53 72 26 1 4 13 53 72 26 0 8 238 224 211 162 10 18 0 0 1 8 238 224 211 162 10 18 0 0 0 8 120 226 140 214 213 131 23 1 1 8 120 226 140 214 213 131 23 1 0 4 127 6 0 0 1 4 127 6 0 0 0 4 191 27 0 0 1 4 191 27 0 0 0 8 27 167 239 216 56 139 31 36 1 8 27 167 239 216 56 139 31 36 0 4 82 31 0 0 1 4 82 31 0 0 0 4 244 0 0 0 1 4 244 0 0 0 0 4 116 7 0 0 1 4 116 7 0 0 0 4 130 5 6 0 1 4 130 5 6 0 0 4 47 2 0 0 1 4 47 2 0 0 0 8 196 55 144 21 143 144 9 0 1 8 196 55 144 21 143 144 9 0 0 8 234 45 67 110 61 33 47 0 1 8 234 45 67 110 61 33 47 0 0 4 124 0 0 0 1 4 124 0 0 0 0 8 105 213 125 231 51 0 0 0 1 8 105 213 125 231 51 0 0 0 0 8 11 175 154 185 42 1 0 0 1 8 11 175 154 185 42 1 0 0 0 8 101 255 202 218 14 0 0 0 1 8 101 255 202 218 14 0 0 0 0 4 0 0 0 0 0 4 0 0 0 0 0 4 37 7 0 0 1 4 37 7 0 0 0 8 47 33 204 49 169 12 0 0 1 8 47 33 204 49 169 12 0 0 0 8 237 178 210 116 191 60 18 0 1 8 237 178 210 116 191 60 18 0 0 8 226 16 6 156 2 0 0 0 1 8 226 16 6 156 2 0 0 0 0 8 21 186 33 53 89 1 0 0 1 8 21 186 33 53 89 1 0 0 0 4 43 243 242 11 1 4 43 243 242 11 0 4 253 48 225 0 1 4 253 48 225 0 0 4 98 116 0 0 1 4 98 116 0 0 0 4 180 159 4 1 1 4 180 159 4 1 0 4 187 2 0 0 1 4 187 2 0 0 0 4 36 0 3 2 1 4 36 0 3 2 0 4 160 47 250 0 1 4 160 47 250 0 0 4 98 0 0 0 1 4 98 0 0 0 0 8 174 190 217 68 144 74 0 0 1 8 174 190 217 68 144 74 0 0 0 4 23 145 1 0 1 4 23 145 1 0 0 4 13 0 0 0 1 4 13 0 0 0 0 4 44 1 0 0 1 4 44 1 0 0 0 4 245 250 2 0 1 4 245 250 2 0 0 4 65 32 0 0 1 4 65 32 0 0 0 8 205 117 182 80 2 0 0 0 1 8 205 117 182 80 2 0 0 0 0 4 186 246 0 0 1 4 186 246 0 0 0 8 234 122 75 99 110 255 9 0 1 8 234 122 75 99 110 255 9 0 0 4 222 223 37 8 1 4 222 223 37 8 0 8 230 26 192 136 251 74 228 31 1 8 230 26 192 136 251 74 228 31 0 4 14 0 0 0 1 4 14 0 0 0 0 8 128 177 66 193 232 29 55 0 1 8 128 177 66 193 232 29 55 0 0 8 253 35 145 164 119 248 140 2 1 8 253 35 145 164 119 248 140 2 0 4 174 117 27 0 1 4 174 117 27 0 0 8 8 228 105 75 109 68 255 25 1 8 8 228 105 75 109 68 255 25 0 4 31 0 0 0 1 4 31 0 0 0 0 8 101 158 131 43 1 0 0 0 1 8 101 158 131 43 1 0 0 0 0 4 8 103 0 0 1 4 8 103 0 0 0 4 181 252 244 53 1 4 181 252 244 53 0 8 39 186 76 130 8 0 0 0 1 8 39 186 76 130 8 0 0 0 0 4 231 168 14 0 1 4 231 168 14 0 0 8 111 30 175 61 55 124 64 1 1 8 111 30 175 61 55 124 64 1 0 8 74 60 189 200 26 84 16 2 1 8 74 60 189 200 26 84 16 2 0 4 103 99 236 0 1 4 103 99 236 0 0 4 248 30 237 0 1 4 248 30 237 0 0 4 15 0 0 0 1 4 15 0 0 0 0 4 39 0 0 0 1 4 39 0 0 0 0 4 221 30 0 0 1 4 221 30 0 0 0 8 83 158 61 244 15 140 7 0 1 8 83 158 61 244 15 140 7 0 0 8 21 183 50 199 183 253 159 0 1 8 21 183 50 199 183 253 159 0 0 4 176 107 53 5 1 4 176 107 53 5 0 4 53 53 0 0 1 4 53 53 0 0 0 4 162 140 0 0 1 4 162 140 0 0 0 4 126 253 1 0 1 4 126 253 1 0 0 4 233 141 234 3 1 4 233 141 234 3 0 8 178 136 48 203 1 0 0 0 1 8 178 136 48 203 1 0 0 0 0 4 171 0 0 0 1 4 171 0 0 0 0 4 35 241 0 0 1 4 35 241 0 0 0 4 107 5 0 0 1 4 107 5 0 0 0 8 15 48 198 223 1 0 0 0 1 8 15 48 198 223 1 0 0 0 0 8 203 94 65 224 14 96 19 27 1 8 203 94 65 224 14 96 19 27 0 8 187 120 141 217 244 218 89 38 1 8 187 120 141 217 244 218 89 38 0 8 185 95 188 66 117 96 49 6 1 8 185 95 188 66 117 96 49 6 0 8 181 238 174 109 232 4 0 0 1 8 181 238 174 109 232 4 0 0 0 8 241 227 21 206 37 0 0 0 1 8 241 227 21 206 37 0 0 0 0 8 11 46 148 129 54 81 1 0 1 8 11 46 148 129 54 81 1 0 0 4 1 0 0 0 1 4 1 0 0 0 0 4 166 181 139 21 1 4 166 181 139 21 0 4 231 3 0 0 1 4 231 3 0 0 0 8 58 0 224 93 1 0 0 0 1 8 58 0 224 93 1 0 0 0 0 4 61 170 163 0 1 4 61 170 163 0 0 4 16 0 0 0 1 4 16 0 0 0 0 8 19 80 184 100 0 136 17 0 1 8 19 80 184 100 0 136 17 0 0 4 141 166 59 0 1 4 141 166 59 0 0 4 1 0 0 0 1 4 1 0 0 0 0 4 106 120 1 0 1 4 106 120 1 0 0 4 24 0 0 0 1 4 24 0 0 0 0 8 250 206 237 235 100 45 220 2 1 8 250 206 237 235 100 45 220 2 0 4 104 0 0 0 1 4 104 0 0 0 0 8 45 124 107 88 59 188 20 0 1 8 45 124 107 88 59 188 20 0 0 8 133 86 244 174 225 3 0 0 1 8 133 86 244 174 225 3 0 0 0 4 10 106 7 0 1 4 10 106 7 0 0 8 198 151 96 192 44 105 0 0 1 8 198 151 96 192 44 105 0 0 0 4 18 6 0 0 1 4 18 6 0 0 0 8 139 29 156 22 238 7 0 0 1 8 139 29 156 22 238 7 0 0 0 4 223 115 28 171 1 4 223 115 28 171 0 4 221 148 185 62 1 4 221 148 185 62 0 4 61 47 108 1 1 4 61 47 108 1 0 8 87 157 178 141 10 0 0 0 1 8 87 157 178 141 10 0 0 0 0 8 86 94 188 134 23 82 0 0 1 8 86 94 188 134 23 82 0 0 0 4 179 64 23 0 1 4 179 64 23 0 0 4 113 45 10 0 1 4 113 45 10 0 0 8 204 227 150 219 42 98 0 0 1 8 204 227 150 219 42 98 0 0 0 8 72 207 3 4 107 1 0 0 1 8 72 207 3 4 107 1 0 0 0 4 242 22 0 0 1 4 242 22 0 0 0 8 43 248 193 8 8 37 19 0 1 8 43 248 193 8 8 37 19 0 0 8 135 156 114 210 151 8 0 0 1 8 135 156 114 210 151 8 0 0 0 4 126 63 25 0 1 4 126 63 25 0 0 4 94 41 0 0 1 4 94 41 0 0 0 4 132 46 67 3 1 4 132 46 67 3 0 4 12 53 213 1 1 4 12 53 213 1 0 4 224 181 149 0 1 4 224 181 149 0 0 8 214 73 249 129 122 0 0 0 1 8 214 73 249 129 122 0 0 0 0 8 141 160 27 51 90 159 14 0 1 8 141 160 27 51 90 159 14 0 0 8 123 185 72 150 135 30 2 0 1 8 123 185 72 150 135 30 2 0 0 8 132 79 251 109 16 13 0 0 1 8 132 79 251 109 16 13 0 0 0 4 187 0 0 0 1 4 187 0 0 0 0 4 26 47 114 1 1 4 26 47 114 1 0 8 36 142 132 192 11 54 198 0 1 8 36 142 132 192 11 54 198 0 0 4 167 191 148 125 1 4 167 191 148 125 0 8 234 206 244 113 18 198 0 0 1 8 234 206 244 113 18 198 0 0 0 4 3 143 18 0 1 4 3 143 18 0 0 4 62 157 58 195 1 4 62 157 58 195 0 8 172 170 222 106 83 163 194 4 1 8 172 170 222 106 83 163 194 4 0 4 88 220 20 57 1 4 88 220 20 57 0 8 167 245 187 129 1 0 0 0 1 8 167 245 187 129 1 0 0 0 0 4 164 130 167 36 1 4 164 130 167 36 0 8 61 130 34 172 248 118 0 0 1 8 61 130 34 172 248 118 0 0 0 4 40 22 12 0 1 4 40 22 12 0 0 4 209 1 0 0 1 4 209 1 0 0 0 8 170 133 218 207 1 0 0 0 1 8 170 133 218 207 1 0 0 0 0 4 223 195 71 3 1 4 223 195 71 3 0 8 197 87 218 147 1 0 0 0 1 8 197 87 218 147 1 0 0 0 0 8 210 1 234 57 242 124 45 0 1 8 210 1 234 57 242 124 45 0 0 8 119 110 205 24 176 195 21 0 1 8 119 110 205 24 176 195 21 0 0 4 71 104 194 0 1 4 71 104 194 0 0 8 53 164 236 57 255 127 4 0 1 8 53 164 236 57 255 127 4 0 0 8 218 132 146 91 132 77 213 4 1 8 218 132 146 91 132 77 213 4 0 8 133 79 247 151 252 1 0 0 1 8 133 79 247 151 252 1 0 0 0 8 203 243 153 55 2 0 0 0 1 8 203 243 153 55 2 0 0 0 0 4 197 193 53 2 1 4 197 193 53 2 0 4 84 5 0 0 1 4 84 5 0 0 0 8 177 187 206 97 141 85 1 0 1 8 177 187 206 97 141 85 1 0 0 4 166 94 0 0 1 4 166 94 0 0 0 8 190 247 33 10 10 0 0 0 1 8 190 247 33 10 10 0 0 0 0 8 61 186 120 114 110 34 74 14 1 8 61 186 120 114 110 34 74 14 0 4 48 152 216 0 1 4 48 152 216 0 0 8 157 24 37 230 113 32 156 61 1 8 157 24 37 230 113 32 156 61 0 8 26 71 250 167 179 175 252 27 1 8 26 71 250 167 179 175 252 27 0 4 138 11 1 0 1 4 138 11 1 0 0 8 64 228 47 79 174 153 235 1 1 8 64 228 47 79 174 153 235 1 0 4 12 0 0 0 1 4 12 0 0 0 0 8 227 20 33 239 16 0 0 0 1 8 227 20 33 239 16 0 0 0 0 4 89 117 39 6 1 4 89 117 39 6 0 8 56 143 170 210 159 0 0 0 1 8 56 143 170 210 159 0 0 0 0 8 83 94 139 170 42 227 7 0 1 8 83 94 139 170 42 227 7 0 0 8 158 24 234 182 90 0 0 0 1 8 158 24 234 182 90 0 0 0 0 4 184 250 218 70 1 4 184 250 218 70 0 4 199 13 0 0 1 4 199 13 0 0 0 8 162 245 210 10 15 0 0 0 1 8 162 245 210 10 15 0 0 0 0 4 163 218 24 0 1 4 163 218 24 0 0 4 14 0 0 0 1 4 14 0 0 0 0 4 167 97 145 202 1 4 167 97 145 202 0 8 207 69 56 26 219 188 172 2 1 8 207 69 56 26 219 188 172 2 0 4 19 245 0 0 1 4 19 245 0 0 0 4 101 116 0 0 1 4 101 116 0 0 0 8 144 67 225 251 217 0 96 0 1 8 144 67 225 251 217 0 96 0 0 8 141 129 40 88 123 180 46 1 1 8 141 129 40 88 123 180 46 1 0 4 83 65 0 0 1 4 83 65 0 0 0 4 1 71 241 42 1 4 1 71 241 42 0 4 201 82 0 0 1 4 201 82 0 0 0 4 143 3 0 0 1 4 143 3 0 0 0 4 140 29 0 0 1 4 140 29 0 0 0 4 209 38 0 0 1 4 209 38 0 0 0 4 34 69 0 0 1 4 34 69 0 0 0 8 221 163 103 107 78 53 11 0 1 8 221 163 103 107 78 53 11 0 0 4 210 46 149 42 1 4 210 46 149 42 0 4 48 85 36 205 1 4 48 85 36 205 0 4 37 35 35 0 1 4 37 35 35 0 0 4 13 0 0 0 1 4 13 0 0 0 0 8 46 173 250 215 165 229 166 2 1 8 46 173 250 215 165 229 166 2 0 8 67 188 30 254 109 2 0 0 1 8 67 188 30 254 109 2 0 0 0 4 137 152 11 16 1 4 137 152 11 16 0 8 152 52 243 192 36 1 0 0 1 8 152 52 243 192 36 1 0 0 0 4 129 59 0 0 1 4 129 59 0 0 0 8 201 94 53 127 56 0 0 0 1 8 201 94 53 127 56 0 0 0 0 8 73 236 21 75 203 154 66 5 1 8 73 236 21 75 203 154 66 5 0 8 196 244 167 127 116 213 0 0 1 8 196 244 167 127 116 213 0 0 0 8 63 43 243 86 100 247 101 30 1 8 63 43 243 86 100 247 101 30 0 4 179 18 79 0 1 4 179 18 79 0 0 4 62 229 32 2 1 4 62 229 32 2 0 8 191 161 29 68 10 28 0 0 1 8 191 161 29 68 10 28 0 0 0 4 157 0 0 0 1 4 157 0 0 0 0 8 177 110 144 211 209 51 0 0 1 8 177 110 144 211 209 51 0 0 0 4 38 140 6 0 1 4 38 140 6 0 0 4 230 31 0 0 1 4 230 31 0 0 0 4 240 94 116 15 1 4 240 94 116 15 0 4 182 7 0 0 1 4 182 7 0 0 0 8 1 177 12 133 96 0 0 0 1 8 1 177 12 133 96 0 0 0 0 4 240 7 185 0 1 4 240 7 185 0 0 4 243 73 7 0 1 4 243 73 7 0 0 4 26 0 0 0 1 4 26 0 0 0 0 8 103 9 1 204 46 0 0 0 1 8 103 9 1 204 46 0 0 0 0 8 98 214 177 103 24 96 0 0 1 8 98 214 177 103 24 96 0 0 0 8 81 174 115 76 247 124 0 0 1 8 81 174 115 76 247 124 0 0 0 4 61 12 0 0 1 4 61 12 0 0 0 4 85 161 0 0 1 4 85 161 0 0 0 8 101 4 40 150 22 103 32 0 1 8 101 4 40 150 22 103 32 0 0 4 103 2 0 0 1 4 103 2 0 0 0 4 60 153 25 0 1 4 60 153 25 0 0 4 143 111 7 0 1 4 143 111 7 0 0 8 80 120 24 232 225 5 0 0 1 8 80 120 24 232 225 5 0 0 0 4 174 134 41 0 1 4 174 134 41 0 0 4 113 152 62 21 1 4 113 152 62 21 0 4 241 24 81 31 1 4 241 24 81 31 0 8 82 153 37 103 160 93 6 0 1 8 82 153 37 103 160 93 6 0 0 8 40 224 161 201 3 0 0 0 1 8 40 224 161 201 3 0 0 0 0 4 19 3 0 0 1 4 19 3 0 0 0 4 82 0 0 0 1 4 82 0 0 0 0 8 64 200 218 23 94 23 70 119 1 8 64 200 218 23 94 23 70 119 0 4 15 139 7 0 1 4 15 139 7 0 0 4 18 20 0 0 1 4 18 20 0 0 0 8 128 37 176 212 38 112 1 0 1 8 128 37 176 212 38 112 1 0 0 8 13 125 43 146 204 213 0 0 1 8 13 125 43 146 204 213 0 0 0 4 14 0 0 0 1 4 14 0 0 0 0 4 70 145 5 0 1 4 70 145 5 0 0 8 186 122 94 51 73 69 56 8 1 8 186 122 94 51 73 69 56 8 0 4 77 183 3 0 1 4 77 183 3 0 0 8 217 138 24 241 155 207 0 0 1 8 217 138 24 241 155 207 0 0 0 4 150 0 0 0 1 4 150 0 0 0 0 4 196 49 182 125 1 4 196 49 182 125 0 4 133 3 165 0 1 4 133 3 165 0 0 8 0 245 2 102 53 0 0 0 1 8 0 245 2 102 53 0 0 0 0 4 35 187 7 0 1 4 35 187 7 0 0 4 217 58 0 0 1 4 217 58 0 0 0 8 93 4 23 102 114 100 3 1 1 8 93 4 23 102 114 100 3 1 0 4 18 224 241 10 1 4 18 224 241 10 0 4 100 120 0 0 1 4 100 120 0 0 diff --git a/src/boost/libs/multiprecision/test/serial_txts/cpp_int64_serial64.txt b/src/boost/libs/multiprecision/test/serial_txts/cpp_int64_serial64.txt new file mode 100644 index 00000000..7a42fa02 --- /dev/null +++ b/src/boost/libs/multiprecision/test/serial_txts/cpp_int64_serial64.txt @@ -0,0 +1 @@ +22 serialization::archive 10 0 0 0 0 0 8 154 227 28 82 91 187 17 0 1 8 154 227 28 82 91 187 17 0 0 8 238 2 0 0 0 0 0 0 1 8 238 2 0 0 0 0 0 0 0 8 179 21 191 74 120 31 195 5 1 8 179 21 191 74 120 31 195 5 0 8 38 72 203 241 222 183 7 0 1 8 38 72 203 241 222 183 7 0 0 8 225 3 0 0 0 0 0 0 1 8 225 3 0 0 0 0 0 0 0 8 242 170 246 107 183 113 31 11 1 8 242 170 246 107 183 113 31 11 0 8 159 2 53 187 36 166 22 4 1 8 159 2 53 187 36 166 22 4 0 8 26 205 0 0 0 0 0 0 1 8 26 205 0 0 0 0 0 0 0 8 177 10 45 114 95 1 0 0 1 8 177 10 45 114 95 1 0 0 0 8 231 42 31 0 0 0 0 0 1 8 231 42 31 0 0 0 0 0 0 8 228 0 0 0 0 0 0 0 1 8 228 0 0 0 0 0 0 0 0 8 161 235 183 0 9 0 0 0 1 8 161 235 183 0 9 0 0 0 0 8 161 84 9 0 0 0 0 0 1 8 161 84 9 0 0 0 0 0 0 8 17 21 0 0 0 0 0 0 1 8 17 21 0 0 0 0 0 0 0 8 132 60 177 2 3 0 0 0 1 8 132 60 177 2 3 0 0 0 0 8 112 146 42 85 255 28 14 50 1 8 112 146 42 85 255 28 14 50 0 8 56 155 123 75 170 217 61 52 1 8 56 155 123 75 170 217 61 52 0 8 128 184 17 143 213 41 148 184 1 8 128 184 17 143 213 41 148 184 0 8 211 92 36 214 185 177 216 48 1 8 211 92 36 214 185 177 216 48 0 8 103 144 142 223 219 161 68 11 1 8 103 144 142 223 219 161 68 11 0 8 136 9 0 0 0 0 0 0 1 8 136 9 0 0 0 0 0 0 0 8 110 109 102 36 76 159 0 0 1 8 110 109 102 36 76 159 0 0 0 8 212 44 7 134 98 246 52 74 1 8 212 44 7 134 98 246 52 74 0 8 5 18 148 245 212 213 152 2 1 8 5 18 148 245 212 213 152 2 0 8 215 29 169 9 145 141 144 10 1 8 215 29 169 9 145 141 144 10 0 8 205 0 0 0 0 0 0 0 1 8 205 0 0 0 0 0 0 0 0 8 242 218 75 187 1 0 0 0 1 8 242 218 75 187 1 0 0 0 0 8 196 242 164 7 110 253 8 0 1 8 196 242 164 7 110 253 8 0 0 8 87 7 181 132 51 102 13 0 1 8 87 7 181 132 51 102 13 0 0 8 18 228 18 0 0 0 0 0 1 8 18 228 18 0 0 0 0 0 0 8 190 5 0 0 0 0 0 0 1 8 190 5 0 0 0 0 0 0 0 8 7 0 0 0 0 0 0 0 1 8 7 0 0 0 0 0 0 0 0 8 89 137 26 12 0 0 0 0 1 8 89 137 26 12 0 0 0 0 0 8 130 0 0 0 0 0 0 0 1 8 130 0 0 0 0 0 0 0 0 8 128 249 218 245 47 115 9 1 1 8 128 249 218 245 47 115 9 1 0 8 162 100 122 44 193 2 0 0 1 8 162 100 122 44 193 2 0 0 0 8 101 75 177 242 99 85 12 0 1 8 101 75 177 242 99 85 12 0 0 8 240 219 82 212 216 69 123 0 1 8 240 219 82 212 216 69 123 0 0 8 0 241 147 64 173 200 15 13 1 8 0 241 147 64 173 200 15 13 0 8 123 176 87 114 3 0 0 0 1 8 123 176 87 114 3 0 0 0 0 8 199 125 85 138 128 0 0 0 1 8 199 125 85 138 128 0 0 0 0 8 212 151 16 161 84 117 1 0 1 8 212 151 16 161 84 117 1 0 0 8 6 0 0 0 0 0 0 0 1 8 6 0 0 0 0 0 0 0 0 8 3 195 58 0 0 0 0 0 1 8 3 195 58 0 0 0 0 0 0 8 97 114 34 212 170 208 45 0 1 8 97 114 34 212 170 208 45 0 0 8 146 232 0 0 0 0 0 0 1 8 146 232 0 0 0 0 0 0 0 8 133 179 117 190 9 133 28 13 1 8 133 179 117 190 9 133 28 13 0 8 73 171 130 38 191 22 0 0 1 8 73 171 130 38 191 22 0 0 0 8 18 152 190 20 249 26 0 0 1 8 18 152 190 20 249 26 0 0 0 8 252 198 62 5 0 0 0 0 1 8 252 198 62 5 0 0 0 0 0 8 73 97 191 10 234 239 1 0 1 8 73 97 191 10 234 239 1 0 0 8 153 44 205 37 255 196 0 0 1 8 153 44 205 37 255 196 0 0 0 8 81 132 37 54 246 238 0 0 1 8 81 132 37 54 246 238 0 0 0 8 8 53 135 13 0 0 0 0 1 8 8 53 135 13 0 0 0 0 0 8 89 148 169 6 0 0 0 0 1 8 89 148 169 6 0 0 0 0 0 8 17 159 173 20 0 0 0 0 1 8 17 159 173 20 0 0 0 0 0 8 201 182 183 82 169 6 0 0 1 8 201 182 183 82 169 6 0 0 0 8 182 0 0 0 0 0 0 0 1 8 182 0 0 0 0 0 0 0 0 8 108 16 0 0 0 0 0 0 1 8 108 16 0 0 0 0 0 0 0 8 39 236 0 0 0 0 0 0 1 8 39 236 0 0 0 0 0 0 0 8 181 1 156 121 15 32 0 0 1 8 181 1 156 121 15 32 0 0 0 8 29 56 214 10 51 145 14 0 1 8 29 56 214 10 51 145 14 0 0 8 6 0 0 0 0 0 0 0 1 8 6 0 0 0 0 0 0 0 0 8 161 199 49 0 0 0 0 0 1 8 161 199 49 0 0 0 0 0 0 8 248 149 1 0 0 0 0 0 1 8 248 149 1 0 0 0 0 0 0 8 180 167 79 137 212 132 35 1 1 8 180 167 79 137 212 132 35 1 0 8 8 0 0 0 0 0 0 0 1 8 8 0 0 0 0 0 0 0 0 8 195 6 0 0 0 0 0 0 1 8 195 6 0 0 0 0 0 0 0 8 82 1 0 0 0 0 0 0 1 8 82 1 0 0 0 0 0 0 0 8 33 248 118 22 198 96 57 183 1 8 33 248 118 22 198 96 57 183 0 8 94 181 212 144 197 233 13 0 1 8 94 181 212 144 197 233 13 0 0 8 102 74 34 111 163 102 6 0 1 8 102 74 34 111 163 102 6 0 0 8 26 210 173 182 38 49 0 0 1 8 26 210 173 182 38 49 0 0 0 8 86 0 0 0 0 0 0 0 1 8 86 0 0 0 0 0 0 0 0 8 143 140 20 0 0 0 0 0 1 8 143 140 20 0 0 0 0 0 0 8 73 116 37 159 96 31 0 0 1 8 73 116 37 159 96 31 0 0 0 8 8 37 96 156 51 81 22 12 1 8 8 37 96 156 51 81 22 12 0 8 237 236 131 159 0 0 0 0 1 8 237 236 131 159 0 0 0 0 0 8 10 0 0 0 0 0 0 0 1 8 10 0 0 0 0 0 0 0 0 8 130 141 0 7 2 2 0 0 1 8 130 141 0 7 2 2 0 0 0 8 109 195 74 15 0 0 0 0 1 8 109 195 74 15 0 0 0 0 0 8 230 2 0 0 0 0 0 0 1 8 230 2 0 0 0 0 0 0 0 8 106 192 15 1 0 0 0 0 1 8 106 192 15 1 0 0 0 0 0 8 10 163 0 0 0 0 0 0 1 8 10 163 0 0 0 0 0 0 0 8 203 163 89 123 164 84 3 0 1 8 203 163 89 123 164 84 3 0 0 8 10 0 0 0 0 0 0 0 1 8 10 0 0 0 0 0 0 0 0 8 215 165 31 197 2 167 7 0 1 8 215 165 31 197 2 167 7 0 0 8 21 0 0 0 0 0 0 0 1 8 21 0 0 0 0 0 0 0 0 8 39 38 0 0 0 0 0 0 1 8 39 38 0 0 0 0 0 0 0 8 57 137 152 9 0 0 0 0 1 8 57 137 152 9 0 0 0 0 0 8 5 3 11 74 1 0 0 0 1 8 5 3 11 74 1 0 0 0 0 8 160 216 17 103 0 0 0 0 1 8 160 216 17 103 0 0 0 0 0 8 29 8 124 52 0 0 0 0 1 8 29 8 124 52 0 0 0 0 0 8 154 188 176 41 1 0 0 0 1 8 154 188 176 41 1 0 0 0 0 8 76 178 160 131 39 5 0 0 1 8 76 178 160 131 39 5 0 0 0 8 184 146 71 183 150 91 6 0 1 8 184 146 71 183 150 91 6 0 0 8 171 6 120 246 94 47 0 0 1 8 171 6 120 246 94 47 0 0 0 8 146 132 93 2 22 222 211 5 1 8 146 132 93 2 22 222 211 5 0 8 204 2 222 46 179 175 0 0 1 8 204 2 222 46 179 175 0 0 0 8 9 148 45 199 56 52 13 0 1 8 9 148 45 199 56 52 13 0 0 8 241 190 12 0 0 0 0 0 1 8 241 190 12 0 0 0 0 0 0 8 88 52 207 19 120 43 0 0 1 8 88 52 207 19 120 43 0 0 0 8 132 70 133 92 64 29 0 0 1 8 132 70 133 92 64 29 0 0 0 8 1 0 0 0 0 0 0 0 1 8 1 0 0 0 0 0 0 0 0 8 153 12 223 211 34 6 0 0 1 8 153 12 223 211 34 6 0 0 0 8 140 14 165 245 82 66 0 0 1 8 140 14 165 245 82 66 0 0 0 8 221 15 0 0 0 0 0 0 1 8 221 15 0 0 0 0 0 0 0 8 50 119 85 166 157 1 0 0 1 8 50 119 85 166 157 1 0 0 0 8 30 3 0 0 0 0 0 0 1 8 30 3 0 0 0 0 0 0 0 8 13 245 224 15 0 0 0 0 1 8 13 245 224 15 0 0 0 0 0 8 202 238 193 147 1 0 0 0 1 8 202 238 193 147 1 0 0 0 0 8 91 182 236 7 230 82 3 0 1 8 91 182 236 7 230 82 3 0 0 8 63 175 86 139 154 53 6 37 1 8 63 175 86 139 154 53 6 37 0 8 201 71 17 19 25 0 0 0 1 8 201 71 17 19 25 0 0 0 0 8 14 211 37 0 0 0 0 0 1 8 14 211 37 0 0 0 0 0 0 8 202 176 13 183 153 3 12 1 1 8 202 176 13 183 153 3 12 1 0 8 34 164 43 13 117 0 0 0 1 8 34 164 43 13 117 0 0 0 0 8 55 100 235 195 135 199 4 0 1 8 55 100 235 195 135 199 4 0 0 8 77 59 0 0 0 0 0 0 1 8 77 59 0 0 0 0 0 0 0 8 6 0 0 0 0 0 0 0 1 8 6 0 0 0 0 0 0 0 0 8 91 176 44 141 237 201 1 0 1 8 91 176 44 141 237 201 1 0 0 8 91 247 129 23 149 242 13 0 1 8 91 247 129 23 149 242 13 0 0 8 159 244 3 0 0 0 0 0 1 8 159 244 3 0 0 0 0 0 0 8 39 216 128 123 225 164 26 0 1 8 39 216 128 123 225 164 26 0 0 8 206 236 127 202 3 0 0 0 1 8 206 236 127 202 3 0 0 0 0 8 227 22 89 80 97 163 24 23 1 8 227 22 89 80 97 163 24 23 0 8 6 163 204 40 124 57 0 0 1 8 6 163 204 40 124 57 0 0 0 8 72 96 82 7 0 0 0 0 1 8 72 96 82 7 0 0 0 0 0 8 205 145 127 61 215 220 134 3 1 8 205 145 127 61 215 220 134 3 0 8 187 177 86 19 0 0 0 0 1 8 187 177 86 19 0 0 0 0 0 8 195 158 155 140 132 204 144 36 1 8 195 158 155 140 132 204 144 36 0 8 141 29 202 70 15 0 0 0 1 8 141 29 202 70 15 0 0 0 0 8 80 57 26 165 1 0 0 0 1 8 80 57 26 165 1 0 0 0 0 8 232 14 0 0 0 0 0 0 1 8 232 14 0 0 0 0 0 0 0 8 172 7 0 0 0 0 0 0 1 8 172 7 0 0 0 0 0 0 0 8 229 247 251 162 193 189 0 0 1 8 229 247 251 162 193 189 0 0 0 8 70 15 0 0 0 0 0 0 1 8 70 15 0 0 0 0 0 0 0 8 104 115 1 0 0 0 0 0 1 8 104 115 1 0 0 0 0 0 0 8 73 175 2 0 0 0 0 0 1 8 73 175 2 0 0 0 0 0 0 8 139 107 110 161 47 228 20 0 1 8 139 107 110 161 47 228 20 0 0 8 52 16 150 150 195 76 61 0 1 8 52 16 150 150 195 76 61 0 0 8 3 233 1 255 93 196 239 229 1 8 3 233 1 255 93 196 239 229 0 8 210 243 2 0 0 0 0 0 1 8 210 243 2 0 0 0 0 0 0 8 136 103 92 0 0 0 0 0 1 8 136 103 92 0 0 0 0 0 0 8 146 79 153 7 104 181 15 0 1 8 146 79 153 7 104 181 15 0 0 8 63 136 0 0 0 0 0 0 1 8 63 136 0 0 0 0 0 0 0 8 42 206 0 0 0 0 0 0 1 8 42 206 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 8 10 253 104 129 179 201 249 12 1 8 10 253 104 129 179 201 249 12 0 8 173 0 0 0 0 0 0 0 1 8 173 0 0 0 0 0 0 0 0 8 126 150 157 0 0 0 0 0 1 8 126 150 157 0 0 0 0 0 0 8 95 103 181 13 108 192 162 0 1 8 95 103 181 13 108 192 162 0 0 8 8 34 0 0 0 0 0 0 1 8 8 34 0 0 0 0 0 0 0 8 195 39 2 201 240 221 6 0 1 8 195 39 2 201 240 221 6 0 0 8 164 73 1 0 0 0 0 0 1 8 164 73 1 0 0 0 0 0 0 8 24 150 136 250 66 244 117 28 1 8 24 150 136 250 66 244 117 28 0 8 188 211 235 56 103 1 0 0 1 8 188 211 235 56 103 1 0 0 0 8 147 116 238 204 203 134 5 0 1 8 147 116 238 204 203 134 5 0 0 8 212 155 224 212 0 0 0 0 1 8 212 155 224 212 0 0 0 0 0 8 162 39 186 255 226 48 217 253 1 8 162 39 186 255 226 48 217 253 0 8 96 45 87 0 0 0 0 0 1 8 96 45 87 0 0 0 0 0 0 8 43 0 0 0 0 0 0 0 1 8 43 0 0 0 0 0 0 0 0 8 21 190 140 128 8 199 26 0 1 8 21 190 140 128 8 199 26 0 0 8 223 96 39 236 140 66 12 0 1 8 223 96 39 236 140 66 12 0 0 8 168 80 9 35 78 0 0 0 1 8 168 80 9 35 78 0 0 0 0 8 88 244 56 44 112 0 0 0 1 8 88 244 56 44 112 0 0 0 0 8 57 42 143 22 20 0 0 0 1 8 57 42 143 22 20 0 0 0 0 8 203 139 139 233 47 120 0 0 1 8 203 139 139 233 47 120 0 0 0 8 151 136 78 80 220 201 21 3 1 8 151 136 78 80 220 201 21 3 0 8 41 214 136 67 14 14 0 0 1 8 41 214 136 67 14 14 0 0 0 8 68 146 0 0 0 0 0 0 1 8 68 146 0 0 0 0 0 0 0 8 4 125 187 175 144 13 0 0 1 8 4 125 187 175 144 13 0 0 0 8 107 43 241 204 40 37 1 0 1 8 107 43 241 204 40 37 1 0 0 8 100 212 145 7 0 0 0 0 1 8 100 212 145 7 0 0 0 0 0 8 181 219 82 238 3 185 1 0 1 8 181 219 82 238 3 185 1 0 0 8 83 219 52 188 1 0 0 0 1 8 83 219 52 188 1 0 0 0 0 8 245 60 150 2 0 0 0 0 1 8 245 60 150 2 0 0 0 0 0 8 182 3 0 0 0 0 0 0 1 8 182 3 0 0 0 0 0 0 0 8 35 242 99 17 31 0 0 0 1 8 35 242 99 17 31 0 0 0 0 8 210 109 74 20 3 0 0 0 1 8 210 109 74 20 3 0 0 0 0 8 113 0 0 0 0 0 0 0 1 8 113 0 0 0 0 0 0 0 0 8 215 146 221 1 0 0 0 0 1 8 215 146 221 1 0 0 0 0 0 8 33 0 0 0 0 0 0 0 1 8 33 0 0 0 0 0 0 0 0 8 241 68 169 0 0 0 0 0 1 8 241 68 169 0 0 0 0 0 0 8 109 184 204 61 3 0 0 0 1 8 109 184 204 61 3 0 0 0 0 8 181 132 45 203 59 0 0 0 1 8 181 132 45 203 59 0 0 0 0 8 193 232 39 3 20 5 2 0 1 8 193 232 39 3 20 5 2 0 0 8 41 222 5 0 0 0 0 0 1 8 41 222 5 0 0 0 0 0 0 8 240 84 253 169 3 245 134 14 1 8 240 84 253 169 3 245 134 14 0 8 53 101 132 186 140 107 194 48 1 8 53 101 132 186 140 107 194 48 0 8 231 3 0 0 0 0 0 0 1 8 231 3 0 0 0 0 0 0 0 8 185 12 0 0 0 0 0 0 1 8 185 12 0 0 0 0 0 0 0 8 3 35 9 8 33 0 0 0 1 8 3 35 9 8 33 0 0 0 0 8 156 36 211 5 0 0 0 0 1 8 156 36 211 5 0 0 0 0 0 8 92 228 169 22 0 0 0 0 1 8 92 228 169 22 0 0 0 0 0 8 127 62 177 0 0 0 0 0 1 8 127 62 177 0 0 0 0 0 0 8 2 0 0 0 0 0 0 0 1 8 2 0 0 0 0 0 0 0 0 8 164 101 187 91 120 0 0 0 1 8 164 101 187 91 120 0 0 0 0 8 33 58 42 0 0 0 0 0 1 8 33 58 42 0 0 0 0 0 0 8 65 43 119 4 0 0 0 0 1 8 65 43 119 4 0 0 0 0 0 8 171 27 0 0 0 0 0 0 1 8 171 27 0 0 0 0 0 0 0 8 151 115 89 236 58 107 231 6 1 8 151 115 89 236 58 107 231 6 0 8 53 244 97 77 30 194 11 0 1 8 53 244 97 77 30 194 11 0 0 8 227 66 108 47 0 0 0 0 1 8 227 66 108 47 0 0 0 0 0 8 67 137 26 0 0 0 0 0 1 8 67 137 26 0 0 0 0 0 0 8 70 250 222 204 115 159 137 0 1 8 70 250 222 204 115 159 137 0 0 8 164 93 158 196 7 0 0 0 1 8 164 93 158 196 7 0 0 0 0 8 113 106 97 177 105 0 0 0 1 8 113 106 97 177 105 0 0 0 0 8 38 28 0 0 0 0 0 0 1 8 38 28 0 0 0 0 0 0 0 8 144 3 0 0 0 0 0 0 1 8 144 3 0 0 0 0 0 0 0 8 55 211 179 66 249 0 0 0 1 8 55 211 179 66 249 0 0 0 0 8 70 208 8 215 0 0 0 0 1 8 70 208 8 215 0 0 0 0 0 8 17 174 7 0 0 0 0 0 1 8 17 174 7 0 0 0 0 0 0 8 145 40 82 0 0 0 0 0 1 8 145 40 82 0 0 0 0 0 0 8 185 14 149 132 50 7 0 0 1 8 185 14 149 132 50 7 0 0 0 8 84 17 37 245 0 0 0 0 1 8 84 17 37 245 0 0 0 0 0 8 218 94 35 43 115 7 0 0 1 8 218 94 35 43 115 7 0 0 0 8 170 8 238 147 136 37 0 0 1 8 170 8 238 147 136 37 0 0 0 8 169 153 246 116 99 150 1 0 1 8 169 153 246 116 99 150 1 0 0 8 110 23 17 63 97 104 44 241 1 8 110 23 17 63 97 104 44 241 0 8 219 131 208 47 0 0 0 0 1 8 219 131 208 47 0 0 0 0 0 8 100 16 250 222 223 5 0 0 1 8 100 16 250 222 223 5 0 0 0 8 189 0 0 0 0 0 0 0 1 8 189 0 0 0 0 0 0 0 0 8 22 198 182 249 164 1 85 6 1 8 22 198 182 249 164 1 85 6 0 8 173 137 0 0 0 0 0 0 1 8 173 137 0 0 0 0 0 0 0 8 111 190 230 246 0 0 0 0 1 8 111 190 230 246 0 0 0 0 0 8 51 99 110 105 78 69 86 3 1 8 51 99 110 105 78 69 86 3 0 8 104 165 202 140 7 0 0 0 1 8 104 165 202 140 7 0 0 0 0 8 136 13 0 0 0 0 0 0 1 8 136 13 0 0 0 0 0 0 0 8 5 138 36 135 3 0 0 0 1 8 5 138 36 135 3 0 0 0 0 8 39 105 124 108 77 96 30 0 1 8 39 105 124 108 77 96 30 0 0 8 78 159 129 13 0 0 0 0 1 8 78 159 129 13 0 0 0 0 0 8 223 6 27 79 8 0 0 0 1 8 223 6 27 79 8 0 0 0 0 8 203 6 61 205 13 0 0 0 1 8 203 6 61 205 13 0 0 0 0 8 111 62 45 160 194 14 103 96 1 8 111 62 45 160 194 14 103 96 0 8 82 143 196 30 0 0 0 0 1 8 82 143 196 30 0 0 0 0 0 8 54 0 0 0 0 0 0 0 1 8 54 0 0 0 0 0 0 0 0 8 37 180 24 111 34 94 97 0 1 8 37 180 24 111 34 94 97 0 0 8 94 61 200 42 0 0 0 0 1 8 94 61 200 42 0 0 0 0 0 8 229 205 68 230 125 0 0 0 1 8 229 205 68 230 125 0 0 0 0 8 125 1 0 0 0 0 0 0 1 8 125 1 0 0 0 0 0 0 0 8 70 69 227 171 0 0 0 0 1 8 70 69 227 171 0 0 0 0 0 8 121 93 176 157 92 133 17 34 1 8 121 93 176 157 92 133 17 34 0 8 211 207 179 76 229 87 229 73 1 8 211 207 179 76 229 87 229 73 0 8 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 8 3 0 0 0 0 0 0 0 1 8 3 0 0 0 0 0 0 0 0 8 101 90 156 136 105 177 2 0 1 8 101 90 156 136 105 177 2 0 0 8 163 122 187 139 155 245 97 88 1 8 163 122 187 139 155 245 97 88 0 8 31 100 188 227 193 143 8 0 1 8 31 100 188 227 193 143 8 0 0 8 85 153 46 1 0 0 0 0 1 8 85 153 46 1 0 0 0 0 0 8 221 254 215 194 253 123 70 0 1 8 221 254 215 194 253 123 70 0 0 8 215 60 213 115 201 17 0 0 1 8 215 60 213 115 201 17 0 0 0 8 245 0 0 0 0 0 0 0 1 8 245 0 0 0 0 0 0 0 0 8 182 69 1 0 0 0 0 0 1 8 182 69 1 0 0 0 0 0 0 8 16 115 202 1 0 0 0 0 1 8 16 115 202 1 0 0 0 0 0 8 229 38 172 10 236 158 36 0 1 8 229 38 172 10 236 158 36 0 0 8 152 18 4 0 0 0 0 0 1 8 152 18 4 0 0 0 0 0 0 8 29 0 0 0 0 0 0 0 1 8 29 0 0 0 0 0 0 0 0 8 164 28 2 236 150 2 6 0 1 8 164 28 2 236 150 2 6 0 0 8 199 130 156 17 201 5 0 0 1 8 199 130 156 17 201 5 0 0 0 8 13 53 72 26 0 0 0 0 1 8 13 53 72 26 0 0 0 0 0 8 238 224 211 162 10 18 0 0 1 8 238 224 211 162 10 18 0 0 0 8 120 226 140 214 213 131 23 1 1 8 120 226 140 214 213 131 23 1 0 8 127 6 0 0 0 0 0 0 1 8 127 6 0 0 0 0 0 0 0 8 191 27 0 0 0 0 0 0 1 8 191 27 0 0 0 0 0 0 0 8 27 167 239 216 56 139 31 36 1 8 27 167 239 216 56 139 31 36 0 8 82 31 0 0 0 0 0 0 1 8 82 31 0 0 0 0 0 0 0 8 244 0 0 0 0 0 0 0 1 8 244 0 0 0 0 0 0 0 0 8 116 7 0 0 0 0 0 0 1 8 116 7 0 0 0 0 0 0 0 8 130 5 6 0 0 0 0 0 1 8 130 5 6 0 0 0 0 0 0 8 47 2 0 0 0 0 0 0 1 8 47 2 0 0 0 0 0 0 0 8 196 55 144 21 143 144 9 0 1 8 196 55 144 21 143 144 9 0 0 8 234 45 67 110 61 33 47 0 1 8 234 45 67 110 61 33 47 0 0 8 124 0 0 0 0 0 0 0 1 8 124 0 0 0 0 0 0 0 0 8 105 213 125 231 51 0 0 0 1 8 105 213 125 231 51 0 0 0 0 8 11 175 154 185 42 1 0 0 1 8 11 175 154 185 42 1 0 0 0 8 101 255 202 218 14 0 0 0 1 8 101 255 202 218 14 0 0 0 0 8 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 8 37 7 0 0 0 0 0 0 1 8 37 7 0 0 0 0 0 0 0 8 47 33 204 49 169 12 0 0 1 8 47 33 204 49 169 12 0 0 0 8 237 178 210 116 191 60 18 0 1 8 237 178 210 116 191 60 18 0 0 8 226 16 6 156 2 0 0 0 1 8 226 16 6 156 2 0 0 0 0 8 21 186 33 53 89 1 0 0 1 8 21 186 33 53 89 1 0 0 0 8 43 243 242 11 0 0 0 0 1 8 43 243 242 11 0 0 0 0 0 8 253 48 225 0 0 0 0 0 1 8 253 48 225 0 0 0 0 0 0 8 98 116 0 0 0 0 0 0 1 8 98 116 0 0 0 0 0 0 0 8 180 159 4 1 0 0 0 0 1 8 180 159 4 1 0 0 0 0 0 8 187 2 0 0 0 0 0 0 1 8 187 2 0 0 0 0 0 0 0 8 36 0 3 2 0 0 0 0 1 8 36 0 3 2 0 0 0 0 0 8 160 47 250 0 0 0 0 0 1 8 160 47 250 0 0 0 0 0 0 8 98 0 0 0 0 0 0 0 1 8 98 0 0 0 0 0 0 0 0 8 174 190 217 68 144 74 0 0 1 8 174 190 217 68 144 74 0 0 0 8 23 145 1 0 0 0 0 0 1 8 23 145 1 0 0 0 0 0 0 8 13 0 0 0 0 0 0 0 1 8 13 0 0 0 0 0 0 0 0 8 44 1 0 0 0 0 0 0 1 8 44 1 0 0 0 0 0 0 0 8 245 250 2 0 0 0 0 0 1 8 245 250 2 0 0 0 0 0 0 8 65 32 0 0 0 0 0 0 1 8 65 32 0 0 0 0 0 0 0 8 205 117 182 80 2 0 0 0 1 8 205 117 182 80 2 0 0 0 0 8 186 246 0 0 0 0 0 0 1 8 186 246 0 0 0 0 0 0 0 8 234 122 75 99 110 255 9 0 1 8 234 122 75 99 110 255 9 0 0 8 222 223 37 8 0 0 0 0 1 8 222 223 37 8 0 0 0 0 0 8 230 26 192 136 251 74 228 31 1 8 230 26 192 136 251 74 228 31 0 8 14 0 0 0 0 0 0 0 1 8 14 0 0 0 0 0 0 0 0 8 128 177 66 193 232 29 55 0 1 8 128 177 66 193 232 29 55 0 0 8 253 35 145 164 119 248 140 2 1 8 253 35 145 164 119 248 140 2 0 8 174 117 27 0 0 0 0 0 1 8 174 117 27 0 0 0 0 0 0 8 8 228 105 75 109 68 255 25 1 8 8 228 105 75 109 68 255 25 0 8 31 0 0 0 0 0 0 0 1 8 31 0 0 0 0 0 0 0 0 8 101 158 131 43 1 0 0 0 1 8 101 158 131 43 1 0 0 0 0 8 8 103 0 0 0 0 0 0 1 8 8 103 0 0 0 0 0 0 0 8 181 252 244 53 0 0 0 0 1 8 181 252 244 53 0 0 0 0 0 8 39 186 76 130 8 0 0 0 1 8 39 186 76 130 8 0 0 0 0 8 231 168 14 0 0 0 0 0 1 8 231 168 14 0 0 0 0 0 0 8 111 30 175 61 55 124 64 1 1 8 111 30 175 61 55 124 64 1 0 8 74 60 189 200 26 84 16 2 1 8 74 60 189 200 26 84 16 2 0 8 103 99 236 0 0 0 0 0 1 8 103 99 236 0 0 0 0 0 0 8 248 30 237 0 0 0 0 0 1 8 248 30 237 0 0 0 0 0 0 8 15 0 0 0 0 0 0 0 1 8 15 0 0 0 0 0 0 0 0 8 39 0 0 0 0 0 0 0 1 8 39 0 0 0 0 0 0 0 0 8 221 30 0 0 0 0 0 0 1 8 221 30 0 0 0 0 0 0 0 8 83 158 61 244 15 140 7 0 1 8 83 158 61 244 15 140 7 0 0 8 21 183 50 199 183 253 159 0 1 8 21 183 50 199 183 253 159 0 0 8 176 107 53 5 0 0 0 0 1 8 176 107 53 5 0 0 0 0 0 8 53 53 0 0 0 0 0 0 1 8 53 53 0 0 0 0 0 0 0 8 162 140 0 0 0 0 0 0 1 8 162 140 0 0 0 0 0 0 0 8 126 253 1 0 0 0 0 0 1 8 126 253 1 0 0 0 0 0 0 8 233 141 234 3 0 0 0 0 1 8 233 141 234 3 0 0 0 0 0 8 178 136 48 203 1 0 0 0 1 8 178 136 48 203 1 0 0 0 0 8 171 0 0 0 0 0 0 0 1 8 171 0 0 0 0 0 0 0 0 8 35 241 0 0 0 0 0 0 1 8 35 241 0 0 0 0 0 0 0 8 107 5 0 0 0 0 0 0 1 8 107 5 0 0 0 0 0 0 0 8 15 48 198 223 1 0 0 0 1 8 15 48 198 223 1 0 0 0 0 8 203 94 65 224 14 96 19 27 1 8 203 94 65 224 14 96 19 27 0 8 187 120 141 217 244 218 89 38 1 8 187 120 141 217 244 218 89 38 0 8 185 95 188 66 117 96 49 6 1 8 185 95 188 66 117 96 49 6 0 8 181 238 174 109 232 4 0 0 1 8 181 238 174 109 232 4 0 0 0 8 241 227 21 206 37 0 0 0 1 8 241 227 21 206 37 0 0 0 0 8 11 46 148 129 54 81 1 0 1 8 11 46 148 129 54 81 1 0 0 8 1 0 0 0 0 0 0 0 1 8 1 0 0 0 0 0 0 0 0 8 166 181 139 21 0 0 0 0 1 8 166 181 139 21 0 0 0 0 0 8 231 3 0 0 0 0 0 0 1 8 231 3 0 0 0 0 0 0 0 8 58 0 224 93 1 0 0 0 1 8 58 0 224 93 1 0 0 0 0 8 61 170 163 0 0 0 0 0 1 8 61 170 163 0 0 0 0 0 0 8 16 0 0 0 0 0 0 0 1 8 16 0 0 0 0 0 0 0 0 8 19 80 184 100 0 136 17 0 1 8 19 80 184 100 0 136 17 0 0 8 141 166 59 0 0 0 0 0 1 8 141 166 59 0 0 0 0 0 0 8 1 0 0 0 0 0 0 0 1 8 1 0 0 0 0 0 0 0 0 8 106 120 1 0 0 0 0 0 1 8 106 120 1 0 0 0 0 0 0 8 24 0 0 0 0 0 0 0 1 8 24 0 0 0 0 0 0 0 0 8 250 206 237 235 100 45 220 2 1 8 250 206 237 235 100 45 220 2 0 8 104 0 0 0 0 0 0 0 1 8 104 0 0 0 0 0 0 0 0 8 45 124 107 88 59 188 20 0 1 8 45 124 107 88 59 188 20 0 0 8 133 86 244 174 225 3 0 0 1 8 133 86 244 174 225 3 0 0 0 8 10 106 7 0 0 0 0 0 1 8 10 106 7 0 0 0 0 0 0 8 198 151 96 192 44 105 0 0 1 8 198 151 96 192 44 105 0 0 0 8 18 6 0 0 0 0 0 0 1 8 18 6 0 0 0 0 0 0 0 8 139 29 156 22 238 7 0 0 1 8 139 29 156 22 238 7 0 0 0 8 223 115 28 171 0 0 0 0 1 8 223 115 28 171 0 0 0 0 0 8 221 148 185 62 0 0 0 0 1 8 221 148 185 62 0 0 0 0 0 8 61 47 108 1 0 0 0 0 1 8 61 47 108 1 0 0 0 0 0 8 87 157 178 141 10 0 0 0 1 8 87 157 178 141 10 0 0 0 0 8 86 94 188 134 23 82 0 0 1 8 86 94 188 134 23 82 0 0 0 8 179 64 23 0 0 0 0 0 1 8 179 64 23 0 0 0 0 0 0 8 113 45 10 0 0 0 0 0 1 8 113 45 10 0 0 0 0 0 0 8 204 227 150 219 42 98 0 0 1 8 204 227 150 219 42 98 0 0 0 8 72 207 3 4 107 1 0 0 1 8 72 207 3 4 107 1 0 0 0 8 242 22 0 0 0 0 0 0 1 8 242 22 0 0 0 0 0 0 0 8 43 248 193 8 8 37 19 0 1 8 43 248 193 8 8 37 19 0 0 8 135 156 114 210 151 8 0 0 1 8 135 156 114 210 151 8 0 0 0 8 126 63 25 0 0 0 0 0 1 8 126 63 25 0 0 0 0 0 0 8 94 41 0 0 0 0 0 0 1 8 94 41 0 0 0 0 0 0 0 8 132 46 67 3 0 0 0 0 1 8 132 46 67 3 0 0 0 0 0 8 12 53 213 1 0 0 0 0 1 8 12 53 213 1 0 0 0 0 0 8 224 181 149 0 0 0 0 0 1 8 224 181 149 0 0 0 0 0 0 8 214 73 249 129 122 0 0 0 1 8 214 73 249 129 122 0 0 0 0 8 141 160 27 51 90 159 14 0 1 8 141 160 27 51 90 159 14 0 0 8 123 185 72 150 135 30 2 0 1 8 123 185 72 150 135 30 2 0 0 8 132 79 251 109 16 13 0 0 1 8 132 79 251 109 16 13 0 0 0 8 187 0 0 0 0 0 0 0 1 8 187 0 0 0 0 0 0 0 0 8 26 47 114 1 0 0 0 0 1 8 26 47 114 1 0 0 0 0 0 8 36 142 132 192 11 54 198 0 1 8 36 142 132 192 11 54 198 0 0 8 167 191 148 125 0 0 0 0 1 8 167 191 148 125 0 0 0 0 0 8 234 206 244 113 18 198 0 0 1 8 234 206 244 113 18 198 0 0 0 8 3 143 18 0 0 0 0 0 1 8 3 143 18 0 0 0 0 0 0 8 62 157 58 195 0 0 0 0 1 8 62 157 58 195 0 0 0 0 0 8 172 170 222 106 83 163 194 4 1 8 172 170 222 106 83 163 194 4 0 8 88 220 20 57 0 0 0 0 1 8 88 220 20 57 0 0 0 0 0 8 167 245 187 129 1 0 0 0 1 8 167 245 187 129 1 0 0 0 0 8 164 130 167 36 0 0 0 0 1 8 164 130 167 36 0 0 0 0 0 8 61 130 34 172 248 118 0 0 1 8 61 130 34 172 248 118 0 0 0 8 40 22 12 0 0 0 0 0 1 8 40 22 12 0 0 0 0 0 0 8 209 1 0 0 0 0 0 0 1 8 209 1 0 0 0 0 0 0 0 8 170 133 218 207 1 0 0 0 1 8 170 133 218 207 1 0 0 0 0 8 223 195 71 3 0 0 0 0 1 8 223 195 71 3 0 0 0 0 0 8 197 87 218 147 1 0 0 0 1 8 197 87 218 147 1 0 0 0 0 8 210 1 234 57 242 124 45 0 1 8 210 1 234 57 242 124 45 0 0 8 119 110 205 24 176 195 21 0 1 8 119 110 205 24 176 195 21 0 0 8 71 104 194 0 0 0 0 0 1 8 71 104 194 0 0 0 0 0 0 8 53 164 236 57 255 127 4 0 1 8 53 164 236 57 255 127 4 0 0 8 218 132 146 91 132 77 213 4 1 8 218 132 146 91 132 77 213 4 0 8 133 79 247 151 252 1 0 0 1 8 133 79 247 151 252 1 0 0 0 8 203 243 153 55 2 0 0 0 1 8 203 243 153 55 2 0 0 0 0 8 197 193 53 2 0 0 0 0 1 8 197 193 53 2 0 0 0 0 0 8 84 5 0 0 0 0 0 0 1 8 84 5 0 0 0 0 0 0 0 8 177 187 206 97 141 85 1 0 1 8 177 187 206 97 141 85 1 0 0 8 166 94 0 0 0 0 0 0 1 8 166 94 0 0 0 0 0 0 0 8 190 247 33 10 10 0 0 0 1 8 190 247 33 10 10 0 0 0 0 8 61 186 120 114 110 34 74 14 1 8 61 186 120 114 110 34 74 14 0 8 48 152 216 0 0 0 0 0 1 8 48 152 216 0 0 0 0 0 0 8 157 24 37 230 113 32 156 61 1 8 157 24 37 230 113 32 156 61 0 8 26 71 250 167 179 175 252 27 1 8 26 71 250 167 179 175 252 27 0 8 138 11 1 0 0 0 0 0 1 8 138 11 1 0 0 0 0 0 0 8 64 228 47 79 174 153 235 1 1 8 64 228 47 79 174 153 235 1 0 8 12 0 0 0 0 0 0 0 1 8 12 0 0 0 0 0 0 0 0 8 227 20 33 239 16 0 0 0 1 8 227 20 33 239 16 0 0 0 0 8 89 117 39 6 0 0 0 0 1 8 89 117 39 6 0 0 0 0 0 8 56 143 170 210 159 0 0 0 1 8 56 143 170 210 159 0 0 0 0 8 83 94 139 170 42 227 7 0 1 8 83 94 139 170 42 227 7 0 0 8 158 24 234 182 90 0 0 0 1 8 158 24 234 182 90 0 0 0 0 8 184 250 218 70 0 0 0 0 1 8 184 250 218 70 0 0 0 0 0 8 199 13 0 0 0 0 0 0 1 8 199 13 0 0 0 0 0 0 0 8 162 245 210 10 15 0 0 0 1 8 162 245 210 10 15 0 0 0 0 8 163 218 24 0 0 0 0 0 1 8 163 218 24 0 0 0 0 0 0 8 14 0 0 0 0 0 0 0 1 8 14 0 0 0 0 0 0 0 0 8 167 97 145 202 0 0 0 0 1 8 167 97 145 202 0 0 0 0 0 8 207 69 56 26 219 188 172 2 1 8 207 69 56 26 219 188 172 2 0 8 19 245 0 0 0 0 0 0 1 8 19 245 0 0 0 0 0 0 0 8 101 116 0 0 0 0 0 0 1 8 101 116 0 0 0 0 0 0 0 8 144 67 225 251 217 0 96 0 1 8 144 67 225 251 217 0 96 0 0 8 141 129 40 88 123 180 46 1 1 8 141 129 40 88 123 180 46 1 0 8 83 65 0 0 0 0 0 0 1 8 83 65 0 0 0 0 0 0 0 8 1 71 241 42 0 0 0 0 1 8 1 71 241 42 0 0 0 0 0 8 201 82 0 0 0 0 0 0 1 8 201 82 0 0 0 0 0 0 0 8 143 3 0 0 0 0 0 0 1 8 143 3 0 0 0 0 0 0 0 8 140 29 0 0 0 0 0 0 1 8 140 29 0 0 0 0 0 0 0 8 209 38 0 0 0 0 0 0 1 8 209 38 0 0 0 0 0 0 0 8 34 69 0 0 0 0 0 0 1 8 34 69 0 0 0 0 0 0 0 8 221 163 103 107 78 53 11 0 1 8 221 163 103 107 78 53 11 0 0 8 210 46 149 42 0 0 0 0 1 8 210 46 149 42 0 0 0 0 0 8 48 85 36 205 0 0 0 0 1 8 48 85 36 205 0 0 0 0 0 8 37 35 35 0 0 0 0 0 1 8 37 35 35 0 0 0 0 0 0 8 13 0 0 0 0 0 0 0 1 8 13 0 0 0 0 0 0 0 0 8 46 173 250 215 165 229 166 2 1 8 46 173 250 215 165 229 166 2 0 8 67 188 30 254 109 2 0 0 1 8 67 188 30 254 109 2 0 0 0 8 137 152 11 16 0 0 0 0 1 8 137 152 11 16 0 0 0 0 0 8 152 52 243 192 36 1 0 0 1 8 152 52 243 192 36 1 0 0 0 8 129 59 0 0 0 0 0 0 1 8 129 59 0 0 0 0 0 0 0 8 201 94 53 127 56 0 0 0 1 8 201 94 53 127 56 0 0 0 0 8 73 236 21 75 203 154 66 5 1 8 73 236 21 75 203 154 66 5 0 8 196 244 167 127 116 213 0 0 1 8 196 244 167 127 116 213 0 0 0 8 63 43 243 86 100 247 101 30 1 8 63 43 243 86 100 247 101 30 0 8 179 18 79 0 0 0 0 0 1 8 179 18 79 0 0 0 0 0 0 8 62 229 32 2 0 0 0 0 1 8 62 229 32 2 0 0 0 0 0 8 191 161 29 68 10 28 0 0 1 8 191 161 29 68 10 28 0 0 0 8 157 0 0 0 0 0 0 0 1 8 157 0 0 0 0 0 0 0 0 8 177 110 144 211 209 51 0 0 1 8 177 110 144 211 209 51 0 0 0 8 38 140 6 0 0 0 0 0 1 8 38 140 6 0 0 0 0 0 0 8 230 31 0 0 0 0 0 0 1 8 230 31 0 0 0 0 0 0 0 8 240 94 116 15 0 0 0 0 1 8 240 94 116 15 0 0 0 0 0 8 182 7 0 0 0 0 0 0 1 8 182 7 0 0 0 0 0 0 0 8 1 177 12 133 96 0 0 0 1 8 1 177 12 133 96 0 0 0 0 8 240 7 185 0 0 0 0 0 1 8 240 7 185 0 0 0 0 0 0 8 243 73 7 0 0 0 0 0 1 8 243 73 7 0 0 0 0 0 0 8 26 0 0 0 0 0 0 0 1 8 26 0 0 0 0 0 0 0 0 8 103 9 1 204 46 0 0 0 1 8 103 9 1 204 46 0 0 0 0 8 98 214 177 103 24 96 0 0 1 8 98 214 177 103 24 96 0 0 0 8 81 174 115 76 247 124 0 0 1 8 81 174 115 76 247 124 0 0 0 8 61 12 0 0 0 0 0 0 1 8 61 12 0 0 0 0 0 0 0 8 85 161 0 0 0 0 0 0 1 8 85 161 0 0 0 0 0 0 0 8 101 4 40 150 22 103 32 0 1 8 101 4 40 150 22 103 32 0 0 8 103 2 0 0 0 0 0 0 1 8 103 2 0 0 0 0 0 0 0 8 60 153 25 0 0 0 0 0 1 8 60 153 25 0 0 0 0 0 0 8 143 111 7 0 0 0 0 0 1 8 143 111 7 0 0 0 0 0 0 8 80 120 24 232 225 5 0 0 1 8 80 120 24 232 225 5 0 0 0 8 174 134 41 0 0 0 0 0 1 8 174 134 41 0 0 0 0 0 0 8 113 152 62 21 0 0 0 0 1 8 113 152 62 21 0 0 0 0 0 8 241 24 81 31 0 0 0 0 1 8 241 24 81 31 0 0 0 0 0 8 82 153 37 103 160 93 6 0 1 8 82 153 37 103 160 93 6 0 0 8 40 224 161 201 3 0 0 0 1 8 40 224 161 201 3 0 0 0 0 8 19 3 0 0 0 0 0 0 1 8 19 3 0 0 0 0 0 0 0 8 82 0 0 0 0 0 0 0 1 8 82 0 0 0 0 0 0 0 0 8 64 200 218 23 94 23 70 119 1 8 64 200 218 23 94 23 70 119 0 8 15 139 7 0 0 0 0 0 1 8 15 139 7 0 0 0 0 0 0 8 18 20 0 0 0 0 0 0 1 8 18 20 0 0 0 0 0 0 0 8 128 37 176 212 38 112 1 0 1 8 128 37 176 212 38 112 1 0 0 8 13 125 43 146 204 213 0 0 1 8 13 125 43 146 204 213 0 0 0 8 14 0 0 0 0 0 0 0 1 8 14 0 0 0 0 0 0 0 0 8 70 145 5 0 0 0 0 0 1 8 70 145 5 0 0 0 0 0 0 8 186 122 94 51 73 69 56 8 1 8 186 122 94 51 73 69 56 8 0 8 77 183 3 0 0 0 0 0 1 8 77 183 3 0 0 0 0 0 0 8 217 138 24 241 155 207 0 0 1 8 217 138 24 241 155 207 0 0 0 8 150 0 0 0 0 0 0 0 1 8 150 0 0 0 0 0 0 0 0 8 196 49 182 125 0 0 0 0 1 8 196 49 182 125 0 0 0 0 0 8 133 3 165 0 0 0 0 0 1 8 133 3 165 0 0 0 0 0 0 8 0 245 2 102 53 0 0 0 1 8 0 245 2 102 53 0 0 0 0 8 35 187 7 0 0 0 0 0 1 8 35 187 7 0 0 0 0 0 0 8 217 58 0 0 0 0 0 0 1 8 217 58 0 0 0 0 0 0 0 8 93 4 23 102 114 100 3 1 1 8 93 4 23 102 114 100 3 1 0 8 18 224 241 10 0 0 0 0 1 8 18 224 241 10 0 0 0 0 0 8 100 120 0 0 0 0 0 0 1 8 100 120 0 0 0 0 0 0 diff --git a/src/boost/libs/multiprecision/test/sincos.ipp b/src/boost/libs/multiprecision/test/sincos.ipp new file mode 100644 index 00000000..863d13dc --- /dev/null +++ b/src/boost/libs/multiprecision/test/sincos.ipp @@ -0,0 +1,360 @@ +// Copyright John Maddock 2006. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef SC_ +#define SC_(x) static_cast<T>(BOOST_STRINGIZE(x)) +#endif +static const boost::array<boost::array<T, 3>, 351> sincos = {{{{SC_(0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00)}}, + {{SC_(1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-45), SC_(1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818790351457308800340787773674912766449462132584452348391040651604302709449379239880726512478831381302725264182410989377719891632824721505923538954718756787336781717738534589892517841597367279244325993758027159471887458619888927468693858915842127431596637785499217667152866164893680003868553832956009253404298979008131545708840033018263781326433505544641583562700173344804674499926293464492880691980275690339365803e-45), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999018181306940454689380845609002744871404956897500110086977690176562578949055656828707980423353194933884755560203023626611533678706648719853431695157198205786802969097792096779337651473648106366274410397508094269252694850980143248502445340096430658555215811691593841493933838124949891785030283170868447315870535323338409489664710335241993056422950940322493204196544853978533985277190092235175175166662055024795932e-01)}}, + {{SC_(2.80259692864963414184745916657983226256052388375303154351413656777958216537172120297327637672424316406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-45), SC_(2.80259692864963414184745916657983226256052388375303154351413656777958216537172120297327637305538709251652726302189399302131595697060675618787128325212834421675595033919045812099830759114965997778797780834590216037028749734324604341671062262121984141170908506261795217328399995070051694207174852643747661007471491085388153950316454056337188894731416167834304541739657820299760902499844561410566938370733275087498466575935335388483418932214377317214724719142755203142240541630547874210971000852044930167e-45), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999996072725227761818757523382436010979485619827590000440347910760706250315796222627314831921695340715627621329535004694534216141863971398843021645158093032804874254958679377217097895883419963322632791960267614868367018464110751226843336329749526804502021446103686642277447920958483566966767779163022051468729743460838565621454431717928897730690691764161059400654765666575293764292473950159219386917758286295006197205e-01)}}, + {{SC_(4.20389539297445121277118874986974839384078582562954731527120485166937324805758180445991456508636474609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-45), SC_(4.20389539297445121277118874986974839384078582562954731527120485166937324805758180445991455270397550462609201269889222644694135477579780213406558097593316173155133239476779615836929419876071343120971532989314549209781635141154879822077216303667702093239942499810993653083491071372581441825986232094472955340205971243975796884028319908471468409203092484306028848922723223269266129671649514061121265458553966701648599990935430386904212713721653207641489661037980396865125821447766865757966623202011002481e-45), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999991163631762464092204427610481024703842644612077500990782799211589063210541500911458371823821746369757456643806982812806123846003228662260328395521200223742443485215609381850897310524629291344568956530530262684105635460612822223837210330705593721872335387821404502143865865987389605653700871033897311375196441706482504472066650591798878127657289137553615069304296604544940870015086975449211081356049236357710750027e-01)}}, + {{SC_(8.40779078594890242554237749973949678768157165125909463054240970333874649611516360891982913017272949218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-45), SC_(8.40779078594890242554237749973949678768157165125909463054240970333874649611516360891982903111361556044623610159113781157553083820638241707252464780746529385241065915814236926695461618692810291645026043369651421342028007962602533874712596930401059391166595777353132351354736336704190050078910834200567500725387522401892079463643692576146069143395731578179123995246777807445028382991342302004768477178958229712964263884786053770003966369485261014589712284700049082525146041017974355650133493523666604208e-45), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999964654527049856368817710441924098815370578448310003963131196846356252842166003645833487295443148286288493466057531853473865963093643770093554970659404333489664430527782442632013409169209372509621725822822280428683194964710409099655027231809772830542963187159283687376144462766563252564386045904505129129380699890638470353691133935782709516334660181819672442049363705097682342862579067086527667395708957625728010687e-01)}}, + {{SC_(1.54142831075729877801610254161890774440828813606416734893277511227877019095444666163530200719833374023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-44), SC_(1.54142831075729877801610254161890774440828813606416734893277511227877019095444666163530194615774084988825358852676130889214423409846990607570847510728532690627712376828124698811004373805554947945445940658982587165803101327925691022042340834793945730630651714551646267709027625314258120286618611628110979879120205714434111724186618983889316034414274293110435526057786113651996476163163956546218796793849755436659001175560988905437079489045957123605234732369555892588189553152777884400882221479823702315e-44), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999881199938139795017415082318689332129439999784597513320524300511364072052835734476273665633558539016419647248757611892421704225588717291067846471845751360789925288829565527986759623768975753575997773800645970067273825398960965781570222907333052180870307750101932061092875046215001474627990763755720004253005726220961181931360340566888859898469699692960128833946501406695399631850637468380933106599429434314849425374e-01)}}, + {{SC_(3.22298646794707926312457804156680710194460246631598627504125705294651949017747938341926783323287963867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-44), SC_(3.22298646794707926312457804156680710194460246631598627504125705294651949017747938341926727524573185742374636484230266362939060576715503172287379160806955106587059721162879947735886748511328881312314826032585123373233873715409532159887503072282395082993219295587670117698205854346930405798097420936363731431238400620602531307113293335307369886473931872251669066838685519427524997065747532725008631793788181680132189938777240459148366970187452325085041054979389568689596347966804174842938247660756550437e-44), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999480617911371500530682467327162452036973222198777558236011198103401604264050442462386521688828475944132820270974357744852187719530274229740373520595807665539873553993080745823439955253622478543514458940785554677862703585578090996659264673716399020742597191730642633179383457364996748943881349656994930909983016269956721448068004898707766137974729184023442461006739874323489203375832554602730784179556189605934184419e-01)}}, + {{SC_(7.42688186092153047589576679143655549578538829194553359031246190461589273823506118787918239831924438476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-44), SC_(7.42688186092153047589576679143655549578538829194553359031246190461589273823506118787917557071567734039333546138139998793069657391277551227141295908889377447469523309572292100019331359631334318174561609698634784357031155321301439148398735485598083156201912789699437880499952454662251467269128292323182720318781277898618615138713234960798201648044045228024517817220298333488925242202864692124191272173879533829613886485347072065635916938540096866697115628808888824427591990485826501618370545748403779575e-44), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999997242071291195737222470795315688710343776523925077809234320331705964284267897340031840718276442954050335356685171447220544117279261490357334686649206295189130909786729091199045220985992676527516309991379539048035055704301070927384372207584878961173246105601002640718234285492270478202155019800902822073363446671078460482683530262882597940421207717144002253386046652555081637431410126935539589794505731025710676379063e-01)}}, + {{SC_(1.05097384824361280319279718746743709846019645640738682881780121291734331201439545111497864127159118652343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-43), SC_(1.05097384824361280319279718746743709846019645640738682881780121291734331201439545111497670652327220720187698420191038233458668371840658344774702748955652055489568668246814974626901822859305738995281066066448198114020751344649620709960208002064198384905117235274182583546441284941429826369890146228651398698659788539187660433894685192269471013358968568537625675802567571975922807099858605616052408037138909868535400231927588666795931021281563837169514777440278854726220318571799562403632573245982136141e-43), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999994477269851540057627767256550640439901652882548438119239249507243164506588438069661482394963882717005084354341383831108371223875714348110550375875361891735468092383465608580594392203699927961133554924574448443357107180124203598756077136385300580115685171857809418195803009471462689144883556767944584573067238540300397625512326425856193876988499074312589335443468863296988797494008557816054949653946346405265614466521e-01)}}, + {{SC_(2.10194769648722560638559437493487419692039291281477365763560242583468662402879090222995728254318237304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-43), SC_(2.10194769648722560638559437493487419692039291281477365763560242583468662402879090222994180455663053847439087361528305867669346974725266758197621991645216443916549345974519799579636871892676112526648444061630875432364581411034670256488408102709411987031842685229809521678287117433846120945714500267214729465233728758289015332663555356907038138247888801679347356008669703897840194824797666053047570787305557626392462396479147321595075220703366096193472213477456408514532068165552987454832784517598469370e-43), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999977909079406160230511069026202561759606611530193752476956998028972658026353752278645929640856627453437091647678270578093867348912670303473993915455915738774094895059219945425455712948260097287167402615818858938341377297396988942875681514508702249864150447882439620069730994781383325744667145025187907937825146056513256418433787478833229590937485750976313958959995857469736815601150524811999423397557967975094145663405e-01)}}, + {{SC_(4.66632388620164084617601951235542071716327226644879751995103738535300430534391580295050516724586486816406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-43), SC_(4.66632388620164084617601951235542071716327226644879751995103738535300430534391580295033582185205789161845419398674547856851973379123930414244575696445912083280274388675828051112459855219307669660923033393959195552402701380143007212075019536866539095886456124694103812914692592186813095161949784665763547067799123307190932094852262291743854239589467068246000091236672783966432440796514865312222994728751652343905850683285452371439099763686518414140487338867024165200326852923049841093249444705198793873e-43), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999891127106945320080050752588736705376045224265406889707434869085988847817081832730078601216698537208723978870828429426132354223033640845300085418977379720396588632501949070635779461038749299328050727369251003094322938028991998378771012224015911587313333701442922100083787345533568931010184906661307603865664516617509537152983462675147192472775815030334087089321785263057861128893065942146589055914769708614295112037282e-01)}}, + {{SC_(1.22333355935556530291641592621209678260766867525819826874392061183578761518475630509783513844013214111328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-42), SC_(1.22333355935556530291641592621209678260766867525819826874392061183578761518475630509753000948705533479418866027375467625129135687610161180897162329185595954402814970753825051091958713527722375174828431644619848284971925661141095511345836491236689334826010659371679330787292070314641713965540731707275304824222335038176768345388241694945900470602965316849261159010127304761857501611899200514651777047976437164422797344832678448893012684055590664977502888862432076111336870979449510638233456440392092154e-42), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999251727501277221791963134483143652946098988395334861400478220036573461731864838683206477730569359918994418110092459071692590420954258112913054863293511313821049032279840033133091972315123462424997068552908251488888835340014765762041910447767748264144555345710012367897821701950047391724289924099438289720106542049969731533631374438421776311556603444490337372131933655486205390154608413468747459621886432625215014782084e-01)}}, + {{SC_(2.57838917435766341049966243325344568155568197305278902003300564235721559214198350673541426658630371093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-42), SC_(2.57838917435766341049966243325344568155568197305278902003300564235721559214198350673255737238966372051888799258963778247990152783376242111381303331610145725745772353945427357361145486695541184381321338742142669770269495102860756614147260496795107861458914054023077958024860025506704682782268721894529111699275425956795744932455234081018984532485402586765516884392364011034682787867594623024532922588091056836292782026784274713857015966608080506950980879305590087445073079381675098230575099138827876112e-42), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999996675954632777603396367790893839693036628622072176372710471667861770267289922831759275580067027867234722228430080471552582226415723987626237690981128512381741567675223648396297701756050725932395149173824330771267008371869876795254391227451236964243860781777838348733979424414018273387935180620881558052018364492093238348499691354984306857440378153948514582513764076650823260920930404915003875414931338093385440488610425e-01)}}, + {{SC_(2.96094365511833847086184060949159278539519348318507782572268528385912855771522345094126649200916290283203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-42), SC_(2.96094365511833847086184060949159278539519348318507782572268528385912855771522345093693996739342932663804846651085820195898433848681112306343912274946090956703290365385602078892224342391181399780345406462574604119522592402659502072571781680123040917209154609109171457264508074993793451528626299861129351462001440897361404823166962990209615925574365137246754984870857324607933605053121269918918153614170251284286175857951281402587778087901842648839202937674178237986130813368757321932975610351978531701e-42), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999995616406335607226943052228668861576216757838002294669012925294791921129051796275883456903694979322501329971375447753971251773961247808436603020996111873404733070017197845470310705625912309526290295374073656496025387323329294558782671483807734805753414994834876374099993858561755751805408888198323439213097646998312370490782535190924653242809107848005183955596913373155062584166537545022162737405001739308072239264970136e-01)}}, + {{SC_(7.55720261810373846349167364268251769599445265254004955708586925501764330892484622381743974983692169189453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-42), SC_(7.55720261810373846349167364268251769599445265254004955708586925501764330892484622374550612448373730191413193303431049794041304644123408793084820745811028793562333348916456519265465336696463122961996291323668438209924140273844864059538944318277976227762678517671975595479579453080897835805446525198108109753026208669175956600936390166668134897501291587095007074691843131333212682512579039986401027805480348350886360241751644496932510052072285282083099768297529183165722660597082513542981408056777981617e-42), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999971444344294463000450108045691914274072389027232540179319088194078035322752282849196194896756803855580175797043645074196213887410097135181896784101900962704236324186319009789568789941181425532234149392153366432424993544410950289613464726947532233749725913910743043679099530150918947846596008589510245917814356607023762433721080260938839286761529865612309642958368349089189032058662245374996383379270059613802426143510423e-01)}}, + {{SC_(1.46589832353019113789331351707958126493228201739702314883506913177711045159767877521517220884561538696289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-41), SC_(1.46589832353019113789331351707958126493228201739702314883506913177711045159767877516267208908427393861721504907325171929472720865773006275638632426304933510409951261954656218026260776426755670372542025774879490868328477422522654282360896480461898264393728557122541481302896883438232050290492523787110495425540325854976498628867329722408191317623181418915019006160748335621352766125413675429734653791931135071630025587791482079495664566178902236522056278966690016735464045305629073387162733493980906882e-41), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999892557105253568753545217864104950667197665245189775644595497906778178128656691096078303466467187938459594167417463818916417117358473643785540714442073012942743717914732037748071998704147219159170063017358513712449206088197946521436940697640711296900126660913421258179104561251733958995998165062617805307831291519562109920870718679948001278826555255838735691382758937227438223290700605918762038729941060805254738926364578e-01)}}, + {{SC_(4.29890342885567381017981761561680470754158758528877508459633408131710108346368315324070863425731658935546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-41), SC_(4.29890342885567381017981761561680470754158758528877508459633408131710108346368315191660548910487698640593276555287590068274126080495796600691159804102586379685177760662635437114892933360460302490297861538787485499296789402780765824215676091815381268645071433103144568224470731467136203368744072106184460077740479824007144285177878600537935639122698858220342265906528947489376413420658288715001310209384236877493329408364270388530486494392325150006115430411152539355170867002025305337772612859827428934e-41), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999999075971465468646533180207192109630863406681770546873997223395847820009758339292966324975612532967466820309355879235997759431321194583616980614121361748306696010139554876844921925965078471560618240863429559876295366367257626963436982144381690256088162065634034183526734308381551083435025308855773105012914069158476743241978619938658527251068183076619854877720409206737387349288732114126976152205371577160652967630617123599e-01)}}, + {{SC_(4.80379126555190540083363738447616148964186596294688371716040578400259281055539872795634437352418899536132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-41), SC_(4.80379126555190540083363738447616148964186596294688371716040578400259281055539872610877338501347601219175270676662869099033699415241762387976667404536927935589076831672632599089820124680009011322734319715118623320805661025510875584717953950495972701008862867740843426026356222430890016125676658201558709582791616384491466268886310743277365390744757660647471861857386539703251775817308401899230677444627869562185725283076582085060518200835494958195542251512378077909637116291984512266293918513338503809e-41), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999998846179473850361154371674922854129986084727096709142870280757393394130581463291168610112704406499060352403499469291720728306994847837600250563158304798680794177527403425268942921796278460653093888122873284053643989868791585401086238273954075339473301544992488839606468292179655865318731156652793808004127813501461466101819147627941309038766551940761100509140381914523658200325453837791357981873672885699155514487958255331e-01)}}, + {{SC_(1.05528984751373323977124227458397004014453966318836649739481298323172386854906790176755748689174652099609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-40), SC_(1.05528984751373323977124227458397004014453966318836649739481298323172386854906789980887504771187332364132636109487217929208679431907543158803628082268875678333496411512923906603472445334327299722485190443927742726521958136503063744853505202494039957387234555933593281644632395449538000337461647675827932577828286596180344814422872806232066066010815495542783741497903180129364783147090148024196900445602757951656729695080517991132336449993528257155261985896406981415684240794679489860063828342392027328e-40), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999994431816688672208233710305042314219151101272516933748775711167580922607168373864227965541361289251010654534999802989928735915119413129451470140853636658987643574157298081896981245127358297596889192754078582247331884307559147751318090642104769338421104440133007218078588778511425272289353063257890140890461661561004041429851910440417566678968240145321910415990690683553710637026739594965677666802372650596926643292041996638e-01)}}, + {{SC_(2.01510923065301669250045085265839809426495508027668597525981690428203627063474812075583031401038169860839843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-40), SC_(2.01510923065301669250045085265839809426495508027668597525981690428203627063474810711802373032594699969810619116841404970861472887256166386048754834748113391268197763832955073628906392784795381155976046065612198436366710288821444973028946646023484366577270255382565430666890873219733228088428497141478307604678164851586001801533760898750558581710818483297283897358606526238189016006778424780680200657251336858863806486367993844372954164133250632883143114958449643914391396931717830204115391769145546484e-40), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999979696673942685035853850543073045777707954868946997951599446982788522244825490912223945146237649836813044005513754448276849194256842083656687070132896763547132020424839753567770743006368670904848300067578350340653279036966460909408461382429991769872604279825699445913799875847014991026905964403318089265513005878651764666517348099896382056900530127079726632856823997344435810758823451691867992445903154064288120383150987671e-01)}}, + {{SC_(7.32504950151904601935173936261887729052525165662936718917887575242562162025627969796914840117096900939941406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-40), SC_(7.32504950151904601935173936261887729052525165662936718917887575242562162025627904291011292837720144593431126597367515998989153198457015902750071695137835990685604892263621831515557060246307131984841519212710373547750063546014290419636943710720132280288244343650374997981943021052969538830344386792052372151384906422960252069039716388381803899141518571399834733857022053723510925721401160619649691446479064067028054989737014742554510760352969761538081403146605616293590611767277714260566785874599515793e-40), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999731718249001477877143168008532640917534029873632032252120957303589649904151885305973799269888934534909136198437925454757554860783321503630302312105520970158621889109299625562988285780953907400410390020639968947017260622162867366315832821549484018469877658751307945502656509972585482311806680315543936811858642849279465528279655411048214732456565842865876212846439566194454456637005298750822183817695104506210394947373953085e-01)}}, + {{SC_(1.33966515396841864169329118502807575007816218088696097856787714955946640149608839465145138092339038848876953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-39), SC_(1.33966515396841864169329118502807575007816218088696097856787714955946640149608799393466769935160071827043264942041685242847448108284494427393761948492846509916986077875292923082077469184325721717857533402797270511306605163459987343262256569264007349244333444115764051413257529668304213835300075569972339881302618317393221832794373332099017592930269066115891486986577472025784928127713471885695681145572611164474622978513975703266720143131891946646092594745882505672457515555881327346483090258133109813e-39), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999999102648637621386587238987552746272043013454101628689499407841187184948605476876334955279870868767750800059575163137784626164589056798852834142555490085645186899015547757002677276114759208540303733026521153564543719479878946956818853456708417790933960103537105155253735839010002786196075719602911681185910630157610492301675225607916036307950416287870173505934149096254870905146725805112841309456550280335897354832252188484699e-01)}}, + {{SC_(2.67704619143998783156097669083538893686233753480866323642779027781619244352739883652247954159975051879882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-39), SC_(2.67704619143998783156097669083538893686233753480866323642779027781619244352739563897984299105902128855302251894710143801990277685086036288881537114672707533483727518555424527302608356036356217986356197792739366250414583736898340317558602513631529933174608625249495997042977955438961972134324708577539931088346231802431204407452780232261732489676314940425767518677852657613399447450394975134408614300034765724426388230494398863554338885318201348491063100048984565134316337355192798205904718373408055959e-39), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999996416711844448328010836543119598472240469572030882370560576310418964309618728328179940611074428491474999154941510527197897854270875982495690413621119770434170978547360806493132985478957649761646330066648315631863124058757356730994348799421077276380735378148156663760085371571182147899917776000626572381366357642100541978640426148495871453988769629317000167837866856830562597160012881170553619814677812429087684105533480604824e-01)}}, + {{SC_(4.98065334862973353780613406637193167431914166341694440226118064331717501247442925205177743919193744659423828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-39), SC_(4.98065334862973353780613406637193167431914166341694440226118064331717501247440865961706082185262300907349748068968430289329142149112388324350697105735066444850117781308977214384632246495516203852364550923245875264911126054830285447794666051901956355872882436639418664467404450121285880935039406673241090924270460939631836024048762290640271473049067456927214532714526797251300223483202814869269567316784928514501511005074814011991880011042729877301864770711496955945630526292405050391715830741638832339e-39), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999987596546110391710994379711623068869451337606096342108625478131918320009488445778250750401876191182731266979269973303293901478710089771515180173918644613342792395295337150147962833559157614103818968508131256797025993480612649131131295014985392720460404345935117219910238516012744511524766168411644949909022868757584567938463480609599435179942543723898381721040096255576605436773910863929161497154264218514163673674788342460421e-01)}}, + {{SC_(6.61322911799904004220047059873593201348655443749046971956789426212155666440217771651077782735228538513183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-39), SC_(6.61322911799904004220047059873593201348655443749046971956789426212155666440212951180267037989278011390446684321888716336223066517279132166898428654774534689211293208975697927510796390180089112434958835354241993947050884854802882807109910568964641743255696216900096606365458624787210152018106794407805871136753532283305154054797825092007339353096964641783328787428804217368758985796365133796747731180160659350716972790789978702678899730892531705668567399746853894977141121012996122009020944132722807189e-39), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999978132600316424819458871898582377151976877276609840945795779220166843198812911241921361184270437776491458291901247500946988256003349588053268643044761577809440194145005106845400574711621718945974528696979467351650861357365416040731658845738292066488483990916744859113297684359767658520832922218399521682790249135386599957375066859000568645217385839964246827971397420685997824501311319875532430117958365665071740834286896688200e-01)}}, + {{SC_(1.54824254492961749846859045383652994857147779383512446982767538392966946703133146456821123138070106506347656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-38), SC_(1.54824254492961749846859045383652994857147779383512446982767538392966946703126961085988845194765016677224573150759279990907005138172280344305822762129830974739861817563548607584336183614347338206829196446854499415600946091562886397948974153134147914359866606123722979808726587858809602661796413993286599443541318127541811836618562120619935933142937927283356718969340037803418384915663635421018050240390063399173057203977102865070796348392652096890020237829272597410682790525617612157766125616287252744e-38), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999880147251103493067079197906492851642489951807612675096101071372809763052176814238098234757914806141252740340867410432612444896212338592468868178773649165288944334267569037833785705287027561088840334981533388491347173126442412363399111551633509256874317164512773006907444197207798073824215723487854515014273420120927829877512313201892373536931918844370906211898732256730679347491689855151383360496535317453280786049708294692770e-01)}}, + {{SC_(4.14655650189182261793630321328885828961460755538706729231614042880185722061980868602404370903968811035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-38), SC_(4.14655650189182261793630321328885828961460755538706729231614042880185722061862042592989753985866613511536161784732505728534611917389621675815565806216456733797635229753667377166650970990553431464073848921448167545536686761492234778689910956124468888048028352079425119895491432133576643928937349140475648209132764234915780601666168316129135579051679358350888091833066751395602947699623976228467139520969584938853923527081219369788343445865866087636551945529117194090170963755429299772957394707033664947e-38), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999999140303458830932562495970891609851434141169762625227468703921261555172214042553364993994634622966419016883421920787233269568087911528717371496834529990991021120129680362470105835559303793013244274628533900046317008176792327455914771957236528289495804030764115202483608113943926547285214664218148302982221883326127385930775038463435090571400891500003663643560192259356160907398291267541063405411124424549800043463320847909557477e-01)}}, + {{SC_(9.16989984771782597788130033192388394290674988675850299695759145456042116251182960695587098598480224609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-38), SC_(9.16989984771782597788130033192388394290674988675850299695759145456042116249897844115270071964291065187070451428162205117773893965556440691457216154310897806331075177813107720146501971323479067623584326457128542356781061897017124711295344504641604649164572504676902618542136026936516116875011868845410581154011041055005068165526312569371383835954064173376238455385938643029758029883725569938873704091787777011093003754252650660888047134772339268203354903543272132734204180304904382006508458834331093434e-38), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999995795646839141229597049600163486950487961160605966971207927639433117443286573917272952598730352586395213231378556612129809781665455673803791882078391445491798305436834690788293112765270306893834416062496422378540679879435567787167675258265803526815917323453636547446953905378952509733862550508155185660036566272965610345657669309817400942905631053083173596575938300954384335741012857888893148639864847391669179906074771423380675e-01)}}, + {{SC_(1.40174284409382375691326091641536902948381353854352365243860788538397821323400194160058163106441497802734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-37), SC_(1.40174284409382375691326091641536902948381353854352365243860788538397821322941150712376691297505221433850032159236497718292753220163294157274980746057268308682402443770033257716345829685049988934416666205697588973059884017465980900504040551091151637072348559801709457371522176034711208838536663456112005139845564302752800851586255173206233829429750479632089286711032500609176606849490519569468727094188589180524908936230012972908141632433602684418792195948582158744208296995186130664849282559534747283e-37), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999990175584995158790521452395330292149934987246293181315818289498140837852990983340598997291574198506644414638962922288593792275112076522551276639205559930026303787875160133236787445628969231440689003816906777605687862518569148148349736607073003542934036846197242745708929670399344795068969975702827824659694309674652879251454493737996840612211561985346098039062629674466776090326736274135796172249813160074647258847047218550681667e-01)}}, + {{SC_(1.94557624033383353951438702124371913986437597061599651205892247320811128119544264336582273244857788085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-37), SC_(1.94557624033383353951438702124371913986437597061599651205892247320811128118316843443667798911811276260782979573655043471811433560953937347381596636250270351757320824484922352524345495092588725917950183456096195479396095297149816723715887520239499660954344948495823620417694122747792675711464880383881647242003709193872670297166532991944589140423445905575281550707206772623747725383628200116441780614927532794556312983397464198282523328334749316987456840895529998261299646887219234662348063597570361594e-37), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999981073665465242325973499850572514928918968773433476252290727706213747142412896890402940728348529719295299594618859825128431836531924921078163936256958737028704143307321875801616577679750689234365062786505605378356205461533046996279728442748616071759347859462543457969102284480550870641847873336874142813399784209309858808036665885184827443870158113940056434388089580250524388193858351108489442281034092467002540157658438751846360e-01)}}, + {{SC_(6.25778729623775298048262176417037819653492494267247379139395559947273151024660364782903343439102172851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-37), SC_(6.25778729623775298048262176417037819653492494267247379139395559947273150983817975401690962877507381485954149692981033327650991617834865104519184119130061428188738093774975277921899654100143262904731856281487753604601557753455546117850172891385055603321634400101181307965562370267510834301717555763528082516451060689486995693578669148903908270920118745103309628202998328094040623530190880768011165490634231906351433112453170352587798690643432435729816389805275266302654200777080302116699928186436416280e-37), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999804200490775226966111214503355373143794475289458519970663519021821882302293192082627747880642626873706396542685764556638857367505201946491497647523599633143848708648597649676052358311232218277829371003261111576758376332700582495048660141665559358151192500767632875806022243667932552701370660858833078445158658650315371959830990489689133490741796408732580215105542936306741728965736925282835297914658845693947125055548101972328355e-01)}}, + {{SC_(1.08239073560602090995217585692806369173691892430234761217807120271122700572163921606261283159255981445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-36), SC_(1.08239073560602090995217585692806369173691892430234761217807120271122700551028985034672156536838775060537851211158634395935548306255588517499841223461589544558196181625229089645208230094515808394044610446532031934838322012297783463544971778652121566632444020332699464984967424106583836820627443079249218431496439763226943699593605710951086552042194684093571682506350566713599585362101737015819290889457768321375371619193837339682475558478823722791771452951524569087148988620542200906995110022069839836e-36), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999999414215147737128469167864887720746679277344361554323001931299657738560350385993270574167093724891580864281120375306410266364949815767159380406106349373771695612577895176379716706515330135955237783460936144953034420281108932351416421393064032426483755702763946710102993202761795407302174421831510588548964721554672431413244801666849243141372241714766821101374200896460046332817068614637339045853629713469603736177193274739125474695e-01)}}, + {{SC_(1.69406069903391450739476895874772531773020353068657868999386494068826181091935723088681697845458984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-36), SC_(1.69406069903391450739476895874772531773020353068657868999386494068826181010907623836633953419580256640864513774823628873707949104515727247109331100403413891290300709523854457848706858116029524709018232091056506435291372700659313907652389536318026768678059554060588900632671169691115979901437413522298032403609565133598996394311329293506372714835392975912718206936295166137569549996347175694398582596884916164647798625653170932974980454711118715400166890733722244368752314502042796902887081917869423252e-36), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999998565079173994362465396001931894411364393220606475206715927476216753773288096464547196783798237465369184337707326956679899579250402430116331781856535753325581983852597538161877588948904446302891805591165493406298635982122739131855419006169860034975915041849599506141381562127259826196852690691935014842448052582785680360758805244541197319297101970723393414590425744716094952004261652430364851834943964098519682976590628698821905236e-01)}}, + {{SC_(4.15747613699065532685928122715139996054660257193228334398574664448888782430913124699145555496215820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-36), SC_(4.15747613699065532685928122715139996054660257193228334398574664448888781233240714882509337727250115653085990578082365934763746608796598027817817403401461047679675712170611380828783971391822261067802809536400457345024480713629655636200059306305344565998169640785290567657819069495209506513879092612549199675733793897404446425995581237641738804282966499303539895482161907154840024757495882276282239646780995340616670801737107926048021853177442090405674446382967308057029828089451182423912906080446301645e-36), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999991357696085176628871090559479687924742457625998376218971921267372616718383844949588137456909796500905937687155045180713696605882356605141845708585115529311992066558444828324343695453901931401333937064875027623092193879640543740281736662900057499119419568523976952025817917330364180443654367979292006373325784480983727857210671247058000389980104063249629948415515037996578331323999224928160405646611251354255937726429113087375434086e-01)}}, + {{SC_(7.28367983015663846905417378314883240316980135196070300998300722783440619423345196992158889770507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-36), SC_(7.28367983015663846905417378314883240316980135196070300998300722783440612983116478321067269269552308077493978289889202693267062792028217262679594799658402831534524488850105100944772764063369876205824531656366687705105223061889202677601008770250436737657307404663067598694505137070363243354865573283915190217134660161868686059432339437177299032222560991940423832159892424897426322085372898507971392663686985246163580637451954849520995735087906076886949281806248923115176051266427223525387444974822188331e-36), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999973474004065884681092335767433370237858027851321456659743937462071520016274972595345712838831068927056324434283196754695183381625754321780334336941984724512744537129286325405215594299982932720024848636604144040397744749234633858822500707447887371424947606546560076781166070773896632315222333445267419206441770719310077458761071140435155108660069240335296609374518753267631061279679348531496176734798021898607900054696705595585834697e-01)}}, + {{SC_(2.12516349467652166437607482766014955572619379291278811395257773014799695943111146334558725357055664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-35), SC_(2.12516349467652166437607482766014955572619379291278811395257773014799679946580917405606737529904973622759508384432023182892335044923493007532938776076021675357752206257108287956169574764984778204026048822274447050733368944371230550045017655124033941820725414467102677098724735986282971546316360184957916240826596403661388999867239776163371097109947879294702830424203436319213220983022808349976076039486046869137974826650175930349065434734116373586647276765562985583562832443119253244361340883240441062e-35), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999774184006044713683773900470805922150932250054980379582662128503096057808845185235527786487472856932618201965360896707252655627980442148963128043654276596608302237896826278499952875156492510369808863542269935941777674888168571205797103443085578125711094779798379963949265068579368931957701357361326476145671210315141516694776450386623526577296405590662971296035440956921410316901837494666387892421775940274748625097808888274273886927e-01)}}, + {{SC_(2.53071076762576381696050568408073626122257552718503248673567740389955815771827474236488342285156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-35), SC_(2.53071076762576381696050568408073626122257552718503248673567740389955788758611653831292769789020166483010759970222136556385108151865059794457635671929591006389256386912362204985190361367849653914692349249660353344507347124549418382882966230813006834337598876272906754108025215894180395623651246082863891038037258220096650540393960954745608563649602644462517562149795780631117951814592950632076254125100378944378612616648449108475867033852063670662261449078443752015576717559948578847287912367450188387e-35), SC_(9.99999999999999999999999999999999999999999999999999999999999999999999679775150531150862612324087422368961581536597039422383152126708901047347940304146276116283666506430133777448923147529348926857835369585229245501288249005852911543348998007660604853568806160045133561007206980521854122283010742632980337999371272670810643167591287325720576566145125174718484145644918457200064131979165887596637731687390351612705444505957008226887752046771682765148512429504692651191887187474974604465117914715417737883e-01)}}, + {{SC_(8.64357296960196048049463886033217008510050159920791504997812301769322118616400985047221183776855468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-35), SC_(8.64357296960196048049463886033217008510050159920791504997812301769321042328005655004380652466252000805353736975177627305689102897263689458460558483905184538823511276614613879037974542294557763642845332403887710155638310471047995839486930032353911469131857519161973191263919662124863592037455099841121434453263204523757117696307125405556392707606083229317021124606853797280595140779847922679683860621633533580470006084570869328567023511427290495777006546862741888593675678753734706727091765908497226790e-35), SC_(9.99999999999999999999999999999999999999999999999999999999999999999996264432315958317318170910958737722004540033486380110083998546410044791571639359001045000390165257415777237093860585996520548881515148587137444154873492144978975716761135704715068314007809110467706034696558926322998865776056244797839299023107292117589896179835013332775610172777676182558538012867578344415855072459321045720088178567198565080237600962243652912204402124151596300356253263256122139223449122695528077428547738849446992392e-01)}}, + {{SC_(9.98056233630547948377202558654806807390245378474739594717134172352501764180487953126430511474609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-35), SC_(9.98056233630547948377202558654806807390245378474739594717134172352500107213774235211520366087753993326665312083888782751842897484262816852301203303461018681653919301907168238595958554638307471117620123755538957953333151205635414773328841023242129782657905930623401544810100924035706284091402411873695041620447824159545092622198222137489682714360461036541587882003436623206649000290867227071217854957074912804962012941175988955433888661010676438557159248028493582668925712339840773429543419954418016701e-35), SC_(9.99999999999999999999999999999999999999999999999999999999999999999995019418772556025452179753936296723190620561787496251708691401075923962934222261393282794216532984558739824698172829691185955595995089041577202174812312947856501006713170529287477350411350868128826538380042853030454395774427817996996972615435833753547763126950693322514112229274794236400050824445172812668516611850872983573938547300630346487402262543251741159012770284460576903327602326016046183371595735415925160127128817835623068688e-01)}}, + {{SC_(2.28583325383040341115984344956726956942648839173021717936437613438727112225024029612541198730468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-34), SC_(2.28583325383040341115984344956726956942648839173021717936437613438725121632406983133997779856371235469800960484094688446211707494308823723702511129954566803322521144774271849538557931309348505755177198991392479394688991152239758824965009950771960366476022856124052233499690226825352494698918049373160506861871032682154872340811445877852985420557422813230494867182881063793147826094622998366088820877495792124626334108720159346279352639830014634233819658689195810426400524416487075106577081762959804327e-34), SC_(9.99999999999999999999999999999999999999999999999999999999999999999973874831678415552645214136320719547515304986065715399671015948522117357521386822474945821385174233689548253591575756766508400490826265582618706311906049075954729995626366958081761228787732882417823878421236061267588485487036165146284349698162478575358442590632990892375447104360565217621089582310412890703562600854348719569212910573217175396813750336931826089876644954945470721952677819309500120155038935270482632452051218728106534190e-01)}}, + {{SC_(5.42623437031930140219487755133755705879730231824934987938484354241808205188135616481304168701171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-34), SC_(5.42623437031930140219487755133755705879730231824934987938484354241781576829753192001504542670578168514322574346362411838697558294055698060256643491044626864706023229351509292462926224529701979980092636352965151156855735493539697229126183525244673254444594932743813340713277981673283478626960530386752618274460408012086120450381392347958398326330449608398379219370083483268351133688476999510593296289238728648271061550800714334372631288774732378360955680765670890145329863879353773268761484500941680668e-34), SC_(9.99999999999999999999999999999999999999999999999999999999999999999852779902791827473069699853002689009383385697232980632967935862458237014302008822313290073227392761021824999598806655046675355022913174279103879824846548509249049870612992964381556241095616833742905956965264034731825567461408179336671461735669309570725949353784032168729737514901374614918492020733323657326776972378228052939461852740662884848942182183850537408756939752311876936201545716136909239650842326963967558877840074472028373156e-01)}}, + {{SC_(1.14767260359023175444419398476720241433534365304121115753874238230025639495579525828361511230468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-33), SC_(1.14767260359023175444419398476720241433534365304121115753874238230000445166746063656515559841089289105607686539825978861594544159895336596964422134771640137572553567078243138888530843580152233779636754650662243824370534098475025420547383932421683776941031164647482102775065775891998610842166179191292338275465136314733106299902048187444411004404558040659067390216180114189607920889347076280704914251579487942983549927641405688544915035199870167862655069055588251673922237588302101782819511491910735654e-33), SC_(9.99999999999999999999999999999999999999999999999999999999999999999341423797484209381329588309288146803267822324076796870775252179426174205035478581780473549580911343948996844459479379323793574583702208105912195692041827294007298447777379983852214659915146476246650306684196241377878426909383663765219628801085832023184448671086794319720603937760883119648546708413620967469776165374332966612650640592032647489688329087738368543536541785457409887376144297548884705846677582389852083943727803618460003560e-01)}}, + {{SC_(2.24638807152062302597056753414010558790018579564078381747074808494346598308766260743141174316406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-33), SC_(2.24638807152062302597056753414010558790018579564078381747074808494157667361269882569441673060651915437664267383350810846419364777111420950445674141352657892653029864814464928712480345882096155199766282054160037261290793618209567223822474205025102444332810773106250060132178243200876493509840693909890022305266515863453984042974449133489686322410570709426572392159303858270564017974265942192514778239674771168343975398653578155273192682439379656676210238904588026596239307200791791903087670175397447691e-33), SC_(9.99999999999999999999999999999999999999999999999999999999999999997476870316064928124336269726622406446098767475833498791397615072417963776006183762747986076321718823234433302205664070428488474365161284533503805124055838617058588428710575226216649561390342676237713905134207296393773422163114041458550176660590328481590273828588141315198970622646050350164026489967133824488059763316031263167042511671805434119993909381688766722661327619081391469360750198917897989810671842667975179843263514510070805364e-01)}}, + {{SC_(4.45455641359219790147891656069310138539319495403506917428904099409692207700572907924652099609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-33), SC_(4.45455641359219790147891656069310138539319495403506917428904099408219006244020355341019923416458691646791783382968221703942437110847236298490017165119347209547953248371396373134888130108963826910897009132512935868074403092848118118664348760003373801795767345559897877338293545883678173435890964691395009506069309003543166240667253840198108859444636305560559966548986023314855939971070573945498737110851520499021749551723015354411711372545551098465273329330533003046029281429836758805400309819773473594e-33), SC_(9.99999999999999999999999999999999999999999999999999999999999999990078463579062307755526600873014625216226284609280745739844840338725476993691131021921643887307732286631053281933853188844559271647726836118909431359129252865878843629812349803224098882677865802701318090937633055526915899392674220081478796481818247514342288829051175946144134849997283314619395790196378587070000606077549331566177326361432397781171544675801887712953061428639817708889966799537670086563002303589097210837017109439496973892e-01)}}, + {{SC_(9.16785088874388950633683172059419126693105638377124253293737332626278657699003815650939941406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-33), SC_(9.16785088874388950633683172059419126693105638377124253293737332613436104518246704921369229928400760527355642289946851996779146737350255733633661964290512225435043234556399487444290802165698462256421277014798059769310983640659437713092187875796959432270158150107717786562565837537819205647372788133354445767003351222939549690095319817221458619710368607102404725417014793188796707925380868001635367674953089171550791669153185795146352256358389658293075151223426432691016855045414346008882486947094640909e-33), SC_(9.99999999999999999999999999999999999999999999999999999999999999957975255040878937656479309884424948105529598925238666019539098203884358858925757483714325117607223046140184112647307315076184737530446206798662621567798660251616524997044561301533332545638798527755946852445727867891941468188937777228366606532547501859733408033893918556168750942201731744749872794943260463802390118755564820664666033161746287816363441616184896748936552044324961750117806166223424101518916285648897331999217064683807662234e-01)}}, + {{SC_(2.02923708991490176840630238442216715768751725200674633498021393052113126032054424285888671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-32), SC_(2.02923708991490176840630238442216715768751725200674633498021393038186461172686811541995622938699502131970339437751250339238625815957020497240862068215740583517496640248330164143489558982862806234162766064849533848215436080242913357931665996587857021941752158058508684563520436602915924175811991614599975795835696422654161032468437709940060988366827698300610082819892290092277729920515375436926078407908932472437573715334908580131664447785618965945457668393933348454041625387066589186615396751622114360e-32), SC_(9.99999999999999999999999999999999999999999999999999999999999999794109841645685043783972015726491288792978131514713708274780330025533629205662944646785839549634108447687840508965230119113963615379532190188313923611545568771941825154090178302130626216188195315323190824517446123383168919123080013332622969893566616492877927920852006877324669233583154264978656000830597138317838869261407433049633324695624794836488665265011978772645136673545407262195618625203203879355393108059137267873193617971618206698e-01)}}, + {{SC_(4.42248951544894130940528341232594713442514066697910501274604300192549999337643384933471679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-32), SC_(4.42248951544894130940528341232594713442514066697910501274604300048388534828291368248000655277014127617817653398762581638618471290886802883726483863468949945059593381263242533391933794414525027070259790107407224559765775467901539274939302993231312884256750489422970198786159487386816526747486926456510926612894986997421618922394129244673415939823811066890368994392267277208762239811855012666341819077599352572997378141194070253849874766309784441344604549424903684138514279694274951881061702927451533603e-32), SC_(9.99999999999999999999999999999999999999999999999999999999999999022079324287209415370398907373981182933279508453789790467938655245533487930528343294733428329788530035987276746814790251459059570475803121922243235079973116073514685919176080150643624530110566284954847483072464101496311828806947357045503519156870663380634223091627304382316385761985476332723633210730619607992350388299054957290493063137783934349241860638349612314464275086378115025201466548731296891098091234203131949150016181066415051698e-01)}}, + {{SC_(8.42781959567806922798262160232246372270599330117093160585906019832691526971757411956787109375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-32), SC_(8.42781959567806922798262160232246372270599330117093160585906018835004232676551216143003605835844772147804482341293060488809656855003982170735014827047357433688375956609359388189092785186417532268577724207998474793422062770690091917194630921025260130856747865767201476228381150045632490922495973100197965054663802088799118777412336195112563548331738071270545429477078683972801812259741537598080482468263547598192155653292206810106055756883930340550445588346208476969664176558588870371296008188404710029e-32), SC_(9.99999999999999999999999999999999999999999999999999999999999996448592843135237286091165040150796849379871624458670791989980554559338381716042829887191705426916341372304104795261882687098993621618405551393901151195570801163017101515947641613510338321872649883018859071285949307351409094849353881167676920664229923088157852833707315319923101074787754717513588395159959367332602241142957127421028949816954472640924253155665536273295336649713952163746432483241108913079712957120243617036879037622622538037e-01)}}, + {{SC_(1.89412859041783001573039493180153157286866659770869884826804963040558504872024059295654296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-31), SC_(1.89412859041783001573039493180153157286866659770869884826804961907957016457841277954170997663148947571036531047064431642805896330034930759416956199694978572815071058666731651254768105525868477310032596108285663712491486474491896466539021451298126209786462442787863272306809927492774070601577999434654525757637079097488311727900888155525874031426502421362589400618004106762210198078372938517086882765433014405633112910490353995497880955390232007103552263077517753158222400047231218622431738026725272418e-31), SC_(9.99999999999999999999999999999999999999999999999999999999999982061384414808821713576182666609878039644939897865544835638329686226491649739125933554321013717333433543099378073396608435514337600944379023047880002410158175418957761934774609458632133813775338538191876152234049430980809741103774734281423982888311235989789454329730656135971743728618766288067162172679182963181306945338676336790805660620388426574235413302344008441196805499833894731982742214073379793623068582638800144759140434822835913240e-01)}}, + {{SC_(3.46050866712583180197896586726244593923755962967554050679908073107071686536073684692382812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-31), SC_(3.46050866712583180197896586726244593923755962967554050679908066200403792541583724962851495560867343528889054708442883895437380069508042546263121005899818228653002696895607035375445728524805997740154069184308371395573413789830700635471324814652145015259054050169279264095836039055979403561200832628862682451061731921571819799737972148041901006837971648529611564412861696678853896181077926408637564058833153119920148214522871342104651385797073097865150211968077592727269349107621909741517960544590382880e-31), SC_(9.99999999999999999999999999999999999999999999999999999999999940124398823734995141596440434464974244751219327466265222844766372889104327611054096738756247812175767192010639298145667851662065738236651240834717361592738914549129079886068280561353392857420537536300576737568342768883135775136819101106849626431205672726699464031722219512428433261205505914094665663811986532588686230507896059311487599466477815387106085624087151762903302249300390003946296093093177327727085105725378839624124939177394646318e-01)}}, + {{SC_(7.12945223095754899355092259734822137087975601614812590223202448669326258823275566101074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-31), SC_(7.12945223095754899355092259734822137087975601614812590223202388272065795852880530528435299296317544556995760601773638283325379911939903571836900644291057434079192040898145963464340595581666825670240485504766212435730089156718952356796619997620039045659579302729635035567455305579146178793297109327080700792525691652378010535659270634655634013027160489309630069697235358853454120303144972828027427254757612960692804314735367184926239135471939473377997839560418095284241361294625201102079699096990572732e-31), SC_(9.99999999999999999999999999999999999999999999999999999999999745854554432472137421356692322531386578841747106553826521261980051976928390485982266924922342534221178591468128649396587806039752619666583832562943361036177992729075795731069740929600978682292406399805423201293360461699738011150346793081043613496064788228338205920715197760196407916778244101828803632524670630307241142534473468033170125491021690127096505836902793573414646811153356864292269712182133970687352333716996429072607598331767709150e-01)}}, + {{SC_(1.00660609334360197519983437147660781896478392508868099364249815153016243129968643188476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(1.00660609334360197519983437147660781896478392508868099364249798153858080936425448600591621973115560627855028065799333409897140200148885265679992467534852739850747222248848665862299107073399715300687099710849976158206422869350105977308451559506740322700159209742272248262592820712485642826574623775858899478336761127748047538148686933386140802062852176507997090596741478401266909560861459265729175839805366572371876499841116246530566431597941796152044187875578150097604630566317951712723436689304568110e-30), SC_(9.99999999999999999999999999999999999999999999999999999999999493372086421765833637980670400207365226394547668810490027357326776425074585947177784858615439332893124808170043124363608559227850238712400015608276209944227241371157871528353635158551830209899099887818354190139598879685295083420474600602830379027159206760470992231414350386011266309174227316415267053139521691420556930484870500945966743591236097202666761572417847833809770025888795274828592890925562550291716301144729756151134542208118283223e-01)}}, + {{SC_(2.69123732824149938499603597762300694489537414332350206969124428724171593785285949707031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(2.69123732824149938499603597762300694489537414332350206969124103857810767495828489737054207251410808681122731739619467712601906527210049295464295960467277692977312706695955670199037202229435671253476370879184247206949097764210253125222013745966690247740273959101002078101052320702153894889859044028323293872207281921255575141740576311042337948417604760956103213467396410826888372613668017898457988437785165324322263668128076427321715842253774774380207618971473886124995752335661990322188081682637137051e-30), SC_(9.99999999999999999999999999999999999999999999999999999999996378620821539778048380463868513259194760492255182104854568796688266675419704926830251200252632342648903096548444973065272476104135551570767481529019631860487682694750175649684483265805174607079594632937085836760739509644610706339030789270993126743782828796190161346910749433340546847615059025085175720807259788804205543021767204242455348546537131091713872864499858332506952229596524693375212327814887803800604671074080458111672965192708371657e-01)}}, + {{SC_(5.30020735520228274850637769744228460379981918842995369800519256386905908584594726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(5.30020735520228274850637769744228460379981918842995369800516774812330799508872620617326099181025241896326476412624958350438975815287228970877366059626972050598486044218179842460188871993307555735477910166154701843990230147811148075605205091149734124143879074762687642121485251530463684000397680784373909121287180220939449768835664018563015958901955939555918594959423810252278527245000330437175671279082182637911185388106902742727326345838543927260707806207862430587227020039893101942369841931004649392e-30), SC_(9.99999999999999999999999999999999999999999999999999999999985953900995929811476056422508436791230644190302525234876496203862361441479979240671670817582863831522397601477746273094063148971169325819181895476334047231053156486905486717389993270360728698723956084136276022973880242228876164041350147859316688277903051550256604857765735403446100822161708518544520756766090021113367159495627025122118690418451701542634453971356787032615030419972024177419316747536463094706047989637284849247688069026501348549e-01)}}, + {{SC_(6.32867200109829532437439231857584752559277676327992301352765025512780994176864624023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-30), SC_(6.32867200109829532437439231857584752559277676327992301352760800903845619423737196357325304747879745252873925358692900533140087584092061056776880998418078436771366792172130615694441224553869516110696285113308449364458806503815478080022339617731335765279640230991043561567239417391539877766804593198543949855172745230422656638678997874589593384074934687600773210894288303473880880254886959958423405253748955161866378820004589056363559043842961556034121326086780978328676846776257244124423169029634234790e-30), SC_(9.99999999999999999999999999999999999999999999999999999999979973955351257249132297739506642628067608253815179906562758766893326508515403412089617957779132649053803366485188789846458854195389563078655816683639618659725133411639581407050701846126217909940232813138092643766517480225563453507972750436168378046481952469724013530977441367994976024552595817659400560646993221229292530320553163338423431159999401088147155330538375065693349415455291381281036874541221154864146711221686283124563061261693337961e-01)}}, + {{SC_(2.08902732172766892127202343465273188850850078629450834455383301246911287307739257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(2.08902732172766892127202343465273188850850078629450834455368106932472518003442533444738013732972172524170504867713481295574699984488179497595556954982281159191426600611772457907280094472444446526906097767318461694106205023057515992153019190053074846913307319672878369674337703391926853006361756591941459322392837227726860734677796478409587068863467227336540796851320837042413120494689218187960655610792406908260360300781784460111226939154153768203634470611331753015040253727623101116831042856283118737e-29), SC_(9.99999999999999999999999999999999999999999999999999999999781798242453766122205539394256558981790035011916738210146764717850083017498869117986917334140105874547601883683652419246819349707324007233935785604229116661629866992858972496907635417802504686787088280017984569335880144104083641246079269870478846963689107325438580421100904625789353960763259740089364026058421956654839479843921798486264811522911491001083265611400386002109215984073917186677818137057726212767013088500337178286110333927786429660e-01)}}, + {{SC_(4.31842364003957104364921550167833797346950293859213498848248491412959992885589599609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(4.31842364003957104364921550167833797346950293859213498848114269172593077298696397899384798838469892604707488011054598848283893536902678591236546102866040861584529410483678727842807847433276833855057760891318416503206022097303343679891225538057159244788369859928195264108640659876740964493397865972409304816791167231373348176915544777281551742557768615955019905703834857959520663077576140020595051789049976167763123526754999503968171424626064916365589309758779241063972711828380772013755486183258900870e-29), SC_(9.99999999999999999999999999999999999999999999999999999999067560863257369066964497297635006156021568522300783335967250349740344844534901319880357791301580333260447029645502188247052834316118747766647184283669573773641111448016551204104749489651931198788083105585218464325948673207669756192754134996490766498322067651248143532506188091467780057358394263396564140986264242252659898448085877812703282546394684396353711386913629178399462666156391453909336437084126881865332207056585053550245704827076211059e-01)}}, + {{SC_(5.86968798787057500194131613525764999377749863741782210269093411625362932682037353515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-29), SC_(5.86968798787057500194131613525764999377749863741782210268756362039026093347106681700963005204298316540799263712160813295023896788923210038131231729359910124024765152092781848816743835790982793322692254018995150489459244698543524531669960364412839353464649104249374340424306627305738083722440141133394562858285415561309401781003468538863799032963287355962286330816653282615903419003646871305120817164223024587131178361020150902537655163124117909209753651581353015255478297486067561986868484183383569950e-29), SC_(9.99999999999999999999999999999999999999999999999999999998277338146252394028444360458490634338533730868520104582523076964233154042946023028494376942979900160655182099281740037312428247080456080860951235873560774799992734471072154703739778110386566354490103567627438668795477210527514123549952245254446118613994019388628262616959375892007364702781185996020488769149346311118578328013836346363736051454653074172300840059947623326863459329086865473983250909431232338050346477348291583646141405082621767203e-01)}}, + {{SC_(1.65997635243685806687162489251543212019385665351167702397106040734797716140747070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(1.65997635243685806687162489251543212019385665351167702396343690649279406622208185685772371642042635555657583382378567496299367580435665007816699412063990899032379692904556199031912037097150817151154762330970404285436867965385550288164480644118405526519591867746797880459162436006007266307611893562468623609119099257581069356747154476895543024656480280895695912472010571599599251032231654652201571896290995321311302562791814134762167132281252046632937215018876055369435169910753443600501786404783549568e-28), SC_(9.99999999999999999999999999999999999999999999999999999986222392546752119877172455733144343422153617716843213233849865061714702604533008336989045404338076431604109019139656871515896458952331043568257115104563145716224299069433954165917783579195574952398453239275963477090613342763588712548617716508144008331395635254149169622982507056455120676580525624478841644805727152863309836112876912207670086636480279108601885879827013844946332071421481944537385339435290404473361071594632126459317753099739416686e-01)}}, + {{SC_(2.25979760396654073712664394284379480891595572134011860043756314553320407867431640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(2.25979760396654073712664394284379480891595572134011860041832968719355876869835044365217455203766587679052924363945885330138781175699004356886326461315878508574607801535429369621662329867639012659170124626841944542706693024456895004571467368859613474653967637621966840269279943579469768147537831957760369296897132611902967456488220425778743950737821192336748172296951691608578178031434568917471992763881726196647605940577327234678663760031433853057319001482300725159609161191240732209972248840097545236e-28), SC_(9.99999999999999999999999999999999999999999999999999999974466573945535407540722564122644653730270335778455508418466529045718513922718886100912534895818253373538618832955035269339985226660671223323808402289012470979235802920473617365901795722590739424739236939849121464098738027239360011902586924503160858852829389284193017042389742359089925155636590521137424815290123425666004266451656277708781560088189215777182758042202386192993769288859261071925760207238131324480206028779549590623894468388349431566e-01)}}, + {{SC_(5.88086945564520119649519587919781243555710122106194859270544839091598987579345703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-28), SC_(5.88086945564520119649519587919781243555710122106194859236646894415357551059141397023458417833062577359029564844162033204609590305835423056545498867121176126632793246793268385945281614118548944015360500160615375605964890179073630375449490595805026103275679829933163846946616206245364280259248011174962758311505159562522228739210437400034854052649377248021474372845818354013318994192752570529497471637831883781636591363767499659621054484652363632372161010655718223400880672351441357302327184778736180752e-28), SC_(9.99999999999999999999999999999999999999999999999999999827076872228296574784938072078042987632777779373212220013320421186320701890213115370714655904269996795936752835087158978849132030314481520851372148162220392252024392951130066198535869599322556283299011074244533964223971169725705069975036856966893929235747080621358676048032547928046779776545537078204166025672077226387013907373034921452470080143973339745452949777298353904218157467268717719840861266286404603250029803805345314117460010988128655782e-01)}}, + {{SC_(1.21036877729163561187004806421015787165206423897645393594757479149848222732543945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(1.21036877729163561187004806421015787165206423897645393565204457912911701264816571244794535317959218134225014169958552523736788409114122297436868181226815279034412881321169642223875674097709647855827604375031824358241944144366445573929416470439005395503117973503734219418534728301453626181057303958103351724877851168203264142250990894413861772049242226503921506225025537467821476224063452800660679037557087017705664155277109587372310479616565458246051267877346509591647754710506255296568393163396173146e-27), SC_(9.99999999999999999999999999999999999999999999999999999267503711478775496588677576535325086227779597221002886707252402490327884747951115784517104936932808165900808724915631123641727203222861050150147651933871354484108448566090657978758580039215062735042774308027967501555759664924302333070164047939619478223553520745268511199171340924464150362396855520866386718959618607407989478385259566952042271426836234189920618059223328393025465752381963814589296901671905473668692059934918608470334521245869322388e-01)}}, + {{SC_(2.86591780197233630096266787463117576092606550441921342553541762754321098327636718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(2.86591780197233630096266787463117576092606550441921342161222222068580800966682544137566943916529202244565026849165917689115339968634607993403360769926559200369755774662937525267563059791287293737522918628091563802893224163219102022651770299219230186791956803248299632691991093629314199684333347897102830548237298315010311044730195485193084923892424338781964874235326160341226843298953815233839005737913847063012077767968705624320802625055333001429140528531401876618817093286023128173313511518783122757e-27), SC_(9.99999999999999999999999999999999999999999999999999995893257576169026285539877760558795157391162603540944407935916752527193049445428999402129117183211740466656201917911860186104101449147091696064423853526679157666560883407610819215488170224094967395802687764835506335828313831539244774700666124123869631956899323558688233804969117908091547146856294231360568401947557943242277643217697037895388293183516766769220683181080990896035663431905961308406527737489186974575173159921544827293300371415469682081e-01)}}, + {{SC_(6.33227430861452581999484454611910693827255339205528628099273191764950752258300781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-27), SC_(6.33227430861452581999484454611910693827255339205528623867446152256841631469412291633417546931889160651496054333610986284102110667946485950432616582676312411355058576717839739682518159345923185634501417664843880718577905491906539705931182725375625919372975202996361570514461776634408433338966339797977448297118474782218211957190056184522273280748144857873967637259418048395430304299989325085162205248868175909572286327797137877060354856008237080835087356877357082257080856918051114008265455655019487099e-27), SC_(9.99999999999999999999999999999999999999999999999999979951151040230214506255192196435889986395782955668070169865274515021265153938340100074828753410630959573723255540421525879853083440370617587321442949822080689241095717596747689845651905140383728830851240780714315821784210013927509314368353073945711513577750238180546786612592987994333639727450312140879771130424423234759366739932350666350848077167008448715281548827725389679678867019894421671713832098020861648755429255119400453235121566672119643836e-01)}}, + {{SC_(1.01701488645048351742362491418610868671324604095573818085540551692247390747070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(1.01701488645048351742362491418610868671324604095573816332343711105452574091957492464881609874155310766863692744462832576724333201541154072346766765699382330455449328670000824693475330729476850648504622116357428393638924348684334202734614590150864624972747190059777114682884495479107547683836964389876682263545801218406797696755174002666675010845868456246670653754593640444430031302545894854186512936706715445970111851394306952403843392018334017630380881701135995898449745556206987272254860458827723014e-26), SC_(9.99999999999999999999999999999999999999999999999999948284036036905505878106539445707420537760789527302038597212359467142829365208706753583480314769727080472930841251769546963351409456940449361362239231140121358175313406601933249214221483709738384955034161941181642229311966635264585411192939606100913693988068970849472839854304825457917976633971331888622416264553414786998678093087237386348505398600997287141943187035373529035889477280544420651863692708964270806259470409468261873182906215372422322967e-01)}}, + {{SC_(1.73240757319454876321712945561046080415745773706248655798844993114471435546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(1.73240757319454876321712945561046080415745773706248647133238368517372669601990330799556402527637951741269169384293128872046197615617540226667834356423933205107188427326680610133548185919626864593914565621395409502576131328917183920809007874826137124733497023570796764712055352074351571474372289601075075459499674205118343075830673541226595909902574436976139978649084117906201588021595106776245227150460713535970276671005189606139692578545494385608927634920188540193618266875767223076936884045301799348e-26), SC_(9.99999999999999999999999999999999999999999999999999849938200016908708476593647714441301333449917232983935589882430679475416544954876348553925397810778869587095531333583024361182841302517003625488202943023609471017988004115329958801794805283413883069329219120736694877350703706015755371121018859116819175362600531729848030448359027909259268091751758805481267322816409703379926304051989443909674842437962170262660244896591208386339631691590295468623127273625017019234604902092688257738783189975410798798e-01)}}, + {{SC_(4.85130351485873938948550752347723088770022059623698851282824762165546417236328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(4.85130351485873938948550752347723088770022059623698660989265579405845396658976637442438125095176181951006434441217066488647145239434103050209020997217669861406942499104808384488564017630082119257664238877191868992490954837514807928987158262879297403583333129860768534505794967430677313206771592868244951747851027162098997296373643704928156139018724130712676417846050295071919943533977576706542066029275753906933389163939680811922115873915597763149085735550761292088164447226954970021899306732669714194e-26), SC_(9.99999999999999999999999999999999999999999999999998823242710335962048381002602975450120082698125730821275809015238732858397978522600912421317625034506185283381041247245315231181192704687177080652677909957736806277323440788586701520356870644612503456121454600655994784709816767064317307696249210126595367499329958169688760532631401384290402120831004217069063591636817019515117344034470106663201743497588043798600260081810421172904526658043913027664092737590681657820960431067605822773898751239148465316e-01)}}, + {{SC_(8.19564111209312229576920614539122222344177948194499094825005158782005310058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-26), SC_(8.19564111209312229576920614539122222344177948194498177343017748383200491809918243048394658985146309801342070172798129317060732100471869081924638003843624841659291147365005979573125412883269496938888583134207844882906967296703010454542313998295672651631067077118755715916679489586784469054418026434594124039687091670610435199200304712425457430048065297796755899235763622284756849628419660523825486359434729527454908615511257896148281635239454700199639016349821193759549082236859911041071907943324237564e-26), SC_(9.99999999999999999999999999999999999999999999999996641573338088450481234573457024398606724972860597787690528561595250368010475731147865565852358362282402377731027222818029922533458270416761219423731258201786579933778187649172980926082987949990044126602969665006020738715662221823288423516963711294782279533044098884502137714956876894483635745762291452505629096708868676483888239131082349750859024725134237454070937690955419743758388472674956943081664624739705487388292808532654231504313310874444108604e-01)}}, + {{SC_(1.86960971309704747834098596399691609741197662053480144095374271273612976074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(1.86960971309704747834098596399691609741197662053479054910462327167331615239418817962503081932931890340451634960464660216606441811761316234081177905303605337200742387367688910565800341036275956637563852160531953554325135475392833468257948608563494113749585234371551757071694130223915334283493584239200027621276364767514754042741892585251741381911793055254059951345608157552222810997419824596284086600442530807235414227929183812497937283829173203837683555094044436168127344942265592102254286969191292399e-25), SC_(9.99999999999999999999999999999999999999999999999982522797603465879073668264091885252923350791268663373238222024647977933941949502217305685050899028063005846531020583588854912080275336499194509169417049847433982967267356038709929706560291564375320329012735750986169796551989634393672397269192191279813362016633847875037003261985025832287816083936612617230687954205533933721331308570516151542799667874668414065625948662726592275792037922673887795272658210791962804009894010101881541472393674935408472853e-01)}}, + {{SC_(2.53078312700865749726688023205126403924331013328696826647501438856124877929687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(2.53078312700865749726688023205126403924331013328694125094200048076230080016126218639853303928255377939259690268714396613122787433650320374366030227782619269823933735767013246863110450196910284239084879826785393682811763209776116521693720560912939421095526746825545988905306566110534284089078542855109778438346269505715388785102546321876470210562584375169773147320543891026884940507054819007154856530305963667169008200395231091814305437937091075813019418756767568761605780308796701014080661492368159784e-25), SC_(9.99999999999999999999999999999999999999999999999967975683820241406874948934166653533511172092156534116443975462625617239327288391590664122021589352522847665373016292962519418353924774489444379168931261935483162281553621603433472072728977349555072109712109824679883539871447602535796929172730022419399714416003150322948950527704596047738139301910101594105207474101086184045874651597158224030689372875979961705537903665460088130392611988152756381550782800594641836041649779034851910713684757134469554580e-01)}}, + {{SC_(4.20941306621815835944433538670569070264115829616002883994951844215393066406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-25), SC_(4.20941306621815835944433538670569070264115829615990452785496578506081955278927818933546242324234408087507662277600473802576457412134611750078738527194410669419929668722322908268897559932584917418004310810500892339693081122324922113982951012729749899983238419472551739293314611185990890280330838588407393840465717473935700337993507898010621074737807869345998925750153486451144321089261659824774170196857387514016640452953177352954598344864951502174653356419210290498586955274100732171430477016287905719e-25), SC_(9.99999999999999999999999999999999999999999999999911404208189759211732740935886171809403395266911806078856652711466436054573598817523340373110699177394159623578955057382297355014218133635413780957701638933946157411062927243877093033139217823648280095519300316420682551404000074847744014121081615342707317521112431516941533674300297570189514239618931688209087596074231043314980205424667058883669569048269145955246279078436197081567963182117436875444286563920537464570946709214553473195719248157805826855e-01)}}, + {{SC_(1.44861407368038454520845469252141317524629204882558042299933731555938720703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-24), SC_(1.44861407368038454520845469252141317524629204882507377439558379548241143060497886024742974552920942134169066357766969543557906176014900674357628857983142696780673746415247742955494485041233510432503498990662670897583220950378641223845696741332846886381559562313740385981778631874554601554942505433775616570972824832253816067914468693529837886615045250367325077108821183878776735677428964476732317113820955012707665146207822278999507004827271272406590842128507252382490865908958483246235481037761488907e-24), SC_(9.99999999999999999999999999999999999999999999998950758632767560708027866249151335156844582811589392427860365058124782731991642089310632824187653159631590934407076009545286555100782968710117672092259681922314774131655526310297215642116091062577441465725300669936944717371937199769171206287422313565977915692312983930643989022024956769092957221565563347010333758283732976918733369635806586213023769317382137590042397624049523931052552394023183946141838267360143101307042809763499173544335923553929609545e-01)}}, + {{SC_(3.01299821836738389893191302236946692641450518124202062608674168586730957031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-24), SC_(3.01299821836738389893191302236946692641450518123746188030755122968582984350853696020509762314198657323081151588680108336846788546232411715077963117750110231668656877141980560982390492028458072325781199487427547774731142002830348058895360123183367536673133622884929051386045183595019288409884649664003307670889826073917169193783491732886154383548786467650171746923041854625144214891691798636889671240986472559884025759608696658369677102207417841369481807012979833164166774827934061044684944062744673202e-24), SC_(9.99999999999999999999999999999999999999999999995460920868057485205128768495672594971913871863330321340890939584043333958542050402215331205051475347664198466408074500213177974669224638083289662049237142284601195838742716676332740373469330245058121848911657687577461695268645535074585543539333588005818218743916760513910839394682596564857909507975555965083387737997577009316309396894895609075395636625325378660457230047137085278175267168516376809105349281309907762284048847679978876273402954417505488514e-01)}}, + {{SC_(4.15276102030971139663869209978990740955717697602267435286194086074829101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-24), SC_(4.15276102030971139663869209978990740955717697601073833203741542064934510510526957950581204331883394005715948630901471997927439830104941785824048551884364735290037184153144384976775028148587726371183017979938291113875193364207150284386535169050781429892659177118027944006608871228821244248916843584207889779509611438747449459759079063415836045186956388107365399108205187418470142097577403806506074170019542654504392938836798968994724336717205552118408671854359307226530571092950101315722654561248196480e-24), SC_(9.99999999999999999999999999999999999999999999991377287954098122384541119849606577690137712663052237626484886226624201275179099557875928787292869332016691331690451970323191229894147818897508450900230579748333236740459401315242524613097017574548920324066573787146553420482969984795794990966084403222750515621558455241429579692068429292194601611839618597431386451583256294712361622373650212144590915969048413769735033165732778792781611903036592449421019558254266016509793355137641614746928246864257491767e-01)}}, + {{SC_(1.20493139018354050396364738592701673636220505159144522622227668762207031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(1.20493139018354050396364738592701673636220505156228870501377072546140795785448934637384040780928123818418711832097125695859823774786298584802644665761440524674007808622689693328364348533020413848466175206888319008516841831958103380116912523837504422147239730460369364452006526848629731486262997785608581521207131727962356854878661708837843815080362453410963071299076782169063239102687079062367604358347170690882963033237329507516340046341643171849692271577906500225569305343548250042626451511137175974e-23), SC_(9.99999999999999999999999999999999999999999999927407017247518023542093828750747845440983680844635722123270981180494686023648655779582416049950013567041075891205074926299102616026352240680612367089833234497949938042589987204061624971059683439238296677903567701771646424710727595867914797338473188745190462628716359293458300735139756066056975915457284798104540693807472391874216930264612444057558096322941234802484276390976287104651130487501202428300210798836385845155461653897798462137129023634158590048e-01)}}, + {{SC_(1.99311766155840730007938784094077312725179496055716299451887607574462890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(1.99311766155840730007938784094077312725179496042520139764883300439646816368720456092676944471103322025451567911795284173614337721246228874587063409912507756393062952430611259118958267626461375511088224904898160946614122052834853089132640900055314485320719145583388248429835054532103183976418847870032408144871456509905573547188366856627559148136421454622564586651099490169128108968885059694779125622376422565777874605339289879857280154803293613940677047193724163580178692359761986787333499982011811429e-23), SC_(9.99999999999999999999999999999999999999999999801374099359197308752453603576131047516452927368262379188764120720199355009182464606310796438364009611630012891309259500469404587018398076111559503245120051103061305045948094247341241375812558792771202649745420669737550570148968618631069359581952924771812453743995708795765361659351053384477330821156187950952631834801216235080165212423381265856687853670463014423100331979948561859656233260381056967971933208534465447750912285880093439696195128696304586474e-01)}}, + {{SC_(5.13533303169498441896371390810640406021647663692419882863759994506835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(5.13533303169498441896371390810640406021647663466707913784420626786848577539948342073166036025847669329695284322217298918716071238698651343415598538250431670607803501970517843218886621847266716883178140747653725502209568774513395235783269558998316168037717740076267726591747242174767979952117276381002699472649174616077021164949081299164057659469591297012095580504483012733964983651613576630595686881098039543282200671710571050264000758620846664833057717433853732634155777995430743343236699023074748072e-23), SC_(9.99999999999999999999999999999999999999999998681417732679120007652379550596591905492960756265988856401363474370065856842250691051795682600125230378048035765792891449165989441598706811070177528273711549839200259564336326789936789663320974251530646924695649992972236365657484978287531578871981209060244121480491480455181587957340654196842168225043432465945367410684908910349873995251736646698623346087505106038789446124069111779751785632824564972863033165113004579223400794734193596445597759923144733830e-01)}}, + {{SC_(8.99483690375495720736892890190099236757959033639053814113140106201171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-23), SC_(8.99483690375495720736892890190099236757959032426143668731447440639681167212721719527797171146780064711290139936822813266107297096694010903437273253094169778604003578411890116254167896394141888066597915323804162041623834369780877656788545758984751109328238605945538232424708584063182474390962559554571796521681751272081700883661854119875893085070506261886828332864936080100484756483393062273557319802835697341546617168723437273949322628005639380524256721160529017905511793830342834237004895799326242479e-23), SC_(9.99999999999999999999999999999999999999999995954645453742396734618715458511854104184495562420188515421533916537429226097460026264036467110741766607883632933956617708518701079643688565847361956144214137931960590472723950498992697567682863075293755919249786604882766977536693359519182877477328890563527188345220444160685396409938384931861947484586479429357220482338242240751400752299436874559164364125531924378724032958139179940023509176370945771016673914300929823722007356528898870479147557517389880506e-01)}}, + {{SC_(1.49571864649346833307485258625357804618261070572771131992340087890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(1.49571864649346833307485258625357804618261070015073920275828586139803697397329298876247049292767823930721928664646280396175986573307948574603167029053759708351340408089861830842252368692479328806151926456552410054517442049843084891325733155703329349183805644836512051216479326535756519496287734545419385841272613869470168116766771158038584407332321007611244158281808509334596772913678187565743057031292080255305715499421711913564786019743391589274653289046523695017001553101130979725615147741949041976e-22), SC_(9.99999999999999999999999999999999999999999988814128652658735548876489751653632066463267199996838874546485861024170068076642439321865577096911069193054009247807397756338385789586245178053759530459206338181619982472545153142325507508933237793989645350340818618149342431112261373507784681306094710396664115931177436350260577400393592421996537588766274656159350651739114480607092171421786422551162853697491835876809865771806493320077450117619067382134770625366483400794642466254424303591567538322745697378e-01)}}, + {{SC_(4.00414284431856607422728851794317683765456195033038966357707977294921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(4.00414284431856607422728851794317683765456184333195206973700974720833412827561349111534903317556817980656128133092602553419958729122900514959804969013869789265787235423095621762770597973981276641935386442897542439663060611413606555088682296544134840138357497567048333704772308885787535702653546815581320437704238908588978564235210861558437389754925738927476835434441948940351078398962913317672503714060148888943703109003041746013446735945490894076945108816272231149038872655535603285151831784811543159e-22), SC_(9.99999999999999999999999999999999999999999919834200411462117654908876795301697180266696942853917756660287008811612236377008009142526634798790119600335365087275113255748079314394274449251893378218614737201859271607325227251618933738225971941576528112220435253954268170625581637995387933236258130147349469103017765108522242360528131339039562505036202933980339528694872687238244385449943371413059087702123057738972040998513745694679298693657755065316883784332064415470726309308364222995539698254590438048e-01)}}, + {{SC_(6.02733756338251593561397041623819981204235318728024140000343322753906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-22), SC_(6.02733756338251593561397041623819981204235282233702566913401486791426775103687110889263957618410039087048941273101200938463614468150120827800477838018770842674180469716485597405584815675135794066416744168771828736855620073291330239928662617195730049089107104830809640584583111672877743068233572354141431173358317923356008888890653111138300825081984365317849191686467019463412431488925669936662236278811783071074301446313585328727814832562767268810726343613563857416015442117253317601957010597175231649e-22), SC_(9.99999999999999999999999999999999999999999818356009485190578482546674221374375368594114174739562163693168458498108577433869958984955063014426674897062191529113188079524114052399013805667164356230849740333628262774905524309526854466619324671312571709022034295074629727972637948818437287458343367815594474164798876904156995774092308942455185318540096020442411397041128497181895394926057420958628716609903020544774920207736406633265904254545071924231990748168185969288263033548644250093223918969099078529e-01)}}, + {{SC_(1.65958441830993022957262063472871904679095678147859871387481689453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(1.65958441830993022957262063472871904679095601966837716399153948392276724593103434089562172080458838515273187060992126227997153192115202457915692129454356735235073605400638134357917784912674110778169847461470040894546633501732110449696587200201476723266357619796046417510134449764621599988613996516194544816998146347299996219407734259110701663299055122630130899519332113285313562567033295883655605951290101055589376890732579582152046564923167765874119374947074868067671814401094675259499614273388721205e-21), SC_(9.99999999999999999999999999999999999999998622889779251445258286087621577479547730371095511636431074447800273010019756467107497424395835806730657399701787227830411590271458867465739237101448115269271934522847684554002785566502858274779864682062462477972492848515295469837308173201281626304797879259332255094869310728677490420013760396455577678362901935667125091682248666889454008184912936448873641174478629627505364119977753174642851612726858065476553313586172210586359118094844336594068254853430507605e-01)}}, + {{SC_(2.67824441797191267011934057325206470778766743023879826068878173828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(2.67824441797191267011934057325206470778766422840064870362843454282670987808803755436755298645156076250838104729082319930570856455235081015866539151471601249584165034579417886690930391378085994351144416093816921745155989539888869178642665734024688215770730792957971897714485926300053104010312217702497787762000600178131123822923068207178324331870556717556692047768757211314761404695899857873185399678411750902389980370316784652673933225122309449058964813115616837222131094170241529694767641836586628848e-21), SC_(9.99999999999999999999999999999999999999996413503418801145372469006266796825097449079547965742050312045236434812687615811480409477306286249752257313861368005502632923824453712494844206966792030996008614656490931107917279164562515860009828987762299164627454998237092918265924072060166259081213225845889343552482167314807271969366924784558616790588874124263514421653083849971429085957566186712099445800428991117097329072977627279324265465922751250506427025739354053214371066179711645306025175538222679648e-01)}}, + {{SC_(5.24216989034958268735996849210789783057862223358824849128723144531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(5.24216989034958268735996849210789783057859822414858675259055095569448734151215398339726766096146349230311025214806431942041459877604214955154666281316195630230528893276830669442194807933628997209391753590753098673586783891123345377730826919565725420391992871094492091262542401201132150073945320046259477580799694273254959986871822615719799353804620716184323201856322354973907153381511764701918797819267745133531796918951528706196881213538080733436799921765950225419130205065909600439051039676665358438e-21), SC_(9.99999999999999999999999999999999999999986259827420356122112195185551672366624073250839599194457507453628742642408825539587574321988663070531346665091210332453377213607635910430558804237795524086420616498779687994004617113416213076016284649087888750760030455121073468191914791665942367281561547327106767288655797810569336941648083751909818487275941957413272284668887599357964225376383967099007378119631322072540336535338653135115635982689717806180965476057119726371592548750686453644217463638771365051e-01)}}, + {{SC_(7.84730091257718428828730593965756767715902242343872785568237304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-21), SC_(7.84730091257718428828730593965756767715894188380156124455910983891034423640868297767263887550182849297147132094175148945302076002226638259291036091716141789071639833073009348733004619542248113421569210924255758451199583877546268516634378160445786592474784984436341844165522203578314841448712063415108370957352428729953649018180131244898775199678867336912535166488038811707208498065945628369299057350240961931251506328297565689454548369226193613688346870644768191552015883873931768088354532679931063997e-21), SC_(9.99999999999999999999999999999999999999969209934193732645335964382330379290253067743257178776587771145954358465579435678655286836941465589087619806854778963332640469273241540043384000734386835119884823229777143085980583844451626007518535647962371164606341778086677564382803208102585069159214424081238283097552554678548608898040886644227817986624770310493880047109975878179083799382082128737216670025250465946842362679942603966581060757152365990866172573014876004863001409841826665676884523747998078108e-01)}}, + {{SC_(1.54312352729357272495300072712165473376444424502551555633544921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(1.54312352729357272495300072712165473376438300281922995823465878950244844409842644794531288751261732596721610642491316018434358307548274540483643794160847070741795459748461895642004476272062795755403849847880564677825579599934784750161452649688717239208196143024661915646344740414093963827975105765370910223327211058618438109286320788031834316649009892069350043756814202077019809570433098648537089622715106088352747705828628681809819934794959540948429448184341283146097311426691570520373285761288995802e-20), SC_(9.99999999999999999999999999999999999999880938488975652115669643213631230248126799838296779591231609801204436699360836757494663576140036341768217196428279881453755452963024766965773560507122795822076000780692881366245754195533398857596255693285795829751852318699096142023830350334754364808624892439333710684341795169466561692893207551567117843822386554921700320723066779416814835120422295083102698726676136546837592879162164887645156563225574180182790368161855975114174502212139974273411738602866251571e-01)}}, + {{SC_(4.77518184435850312824695974855959690330564626492559909820556640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(4.77518184435850312824695974855959690330383150786986950012496836930074878631240804035124319738780013645083375077544616898561908312065941430347802463107453041858495671583762741096029923257079257302968047790550769792307128713580082994690133797370824117510373959841609896448673241459037898046030086145115469025705353364577688588250562688270970666695785406307428035312168024680392843053488776735857595501213628466833516667726158422967395113793626911252805964855127321974455583739901636298003420464827010385e-20), SC_(9.99999999999999999999999999999999999998859881917665446220291365201399797968099921727881847815426248931197078614981311072035724421911759715979094472457981523507074663281668078107427532373671551387866380649320442592003200200431377322948753077746077574202454027025945646595207601239042527395341917368022264491271985293624469146381728776687435996883164233298131425702484520495446810290560085866721990974101137184112839486463835447743589853836128729569230456404847333286069284701906153131312047203315148300e-01)}}, + {{SC_(6.23033471350706135997738616127961108759336639195680618286132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-20), SC_(6.23033471350706135997738616127961108758933566957847999289308558170784132778968965056317879231412769917679771449539438348439187932432493322547267013194531309417671787810003677479319468323294595854503684255557491537731045988638721316770431599974491396281662487780560416719890123465165060033082902143555001286051776247690298863659447671949751100979523780429285085076607036433377399469725034990238965854157158763546494845113581705197635768323514084271939558504928218466777087816118281922669032194856920486e-20), SC_(9.99999999999999999999999999999999999998059146467883444182268334649298276434564976929585548792314224542993928933951083639699574277795394564312994424625369164959037371172773384747232025021592402636011483717441355967233675768383537538357257986806020531720706435789906784405523339574569102482506955066894177094965148419682062923055222829644783438538549051815255067258408435937976971922027519308509543595916785909437447704234765230356260327291111447155186396159452978437353554256394464351228571434927304711e-01)}}, + {{SC_(1.33373774787437629268591066100668740546097978949546813964843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(1.33373774787437629268591066100668740545702557632514609637109354894670795671905012891418174238222956443457378985272098537652333132013350163148619347266169535428935790271959785854155452128955268040415297439974798617332131470285817296376813372025095563270334709839436920485315163295216999970532915024196623990234556546750213339892672121031667423931247372788485766146488884304258726675821256736326005518351249552597350782054581090216636090655004539684401347254213062238979175599528628149953908411989598459e-19), SC_(9.99999999999999999999999999999999999991105718099474933284806139857400813352589827517564927043682648978728764758259157548540521229982370103779386138188937766605887502378218907747175575340569525702100714564339935788891685749871866514578306868104810273210249836494289529105147374405359061719026715925340956119852852492996601324880989891212817101225911122299495377327270035416555776310547611050503379101499527525151298272309849046993736994837320252913021267626530928647167494021867650980452641151659034895e-01)}}, + {{SC_(2.72678641362033605222928850375652132242976222187280654907226562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(2.72678641362033605222928850375652132239597113865233767282496812811434547903471145444426860140849165730840154443142045026389042524606225536996273431225195010565142182031866043832827369044609848704703782132802561090043295900410238999861579888039814092986414773412351284654281044246052360633441869568298727826155909328956857265054324941267888898815042029695822947856553640688900715106569954380462969592595043533559140576168918044774278564716729030098230376601726176338392887493576556803716314240985244825e-19), SC_(9.99999999999999999999999999999999999962823179272477727965947093384519089206611732778459619581048522840843983255738245207282856356470053984205037855894718532833271990791091133588186765379675456288234980220490650098675151780551707568969447539905274856216620993281787677779454733403694016219238223636757761450274748937793228503165450442613649588268034562597918498086592965280705305942919433851691464387890013808565426437488525566307607542416920601654752739157313437038398177564522256160039491363191017743e-01)}}, + {{SC_(7.84847163163788824526839738027206294646020978689193725585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-19), SC_(7.84847163163788824526839738027206294565445289627706367397044516728216502661445392300478006248633939386640842420482995279705186836498615499704063686315382015944481417124956438069937893001716889658824383315836128859850145896671561869807159580264109008218390919771400485087005083932708363507903306384325767738641480522946290564444209005855639377332161802587036895543893713301102591999134123077217638518756971205307741607894644129433547698592923260994621866931698355071283092718360372159939763148236356081e-19), SC_(9.99999999999999999999999999999999999692007465236876521225591624733741973580413992094514864951948409477638354994860924045902686945655537440822272877755997184065488715073530826515341419594655069460256313924726013950095489865778611313502990595501567365333328403336978055022497339264912331540809314218388716961805500397317409139244048139568851551974274994613766476680949014369225330326153094075670488566570809659965208296833269543942839437306713455429886097267390826909886913799325068151515675401821307784e-01)}}, + {{SC_(1.59656777006820041215490180164238154247868806123733520507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(1.59656777006820041215490180164238154180040523146025537688153328547760359499813760904753192863253468773626712297698660124388326296138121710134471432406051440808915749048856231483953159574219728203962113030610855651177879388716588720129915042261664035793682631272244330593879603534062436307902756624026615456937074668685614020808807209201572426546153680945500170264414397099342062973442361578952380032313799737733204426677060914568817376985131352291265491571136049590994403151805024530900585006882465838e-18), SC_(9.99999999999999999999999999999999998725485677789726970050441887873791324802821873863599682065675369351546184000866507009103149360549935240237154588525165432757567980472696826283523224052289490749011903664848152710996398754070605570284221534583084155424171763973302026291361113216315086799683804698865388858367703071408534692832158042217078221374921429321228108536764324255608445406900297031772562838405852406675264021549234730524961286458631341099514706834735141229319185038708420515965497634457920545e-01)}}, + {{SC_(3.44953506024823770663434441274830533075146377086639404296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(3.44953506024823770663434441274830532391029287068934228996677746001591898296589668811859099135418230183368869090360366169316970324064915891904038980287950101288861517367153994714618453877419868135863495400888589151982726942060284747289611794798919706164618774056608179851652058360068165608781457601308274531931492985898183893679408914979686066252487633256264623427099975969033776016116820081774952167052659583745697715204840936711313869898247097390719918108455249924815936377403504970454933340960681185e-18), SC_(9.99999999999999999999999999999999994050353934059093527720023368612070391851891406718440574162266209027406523980686123351044050966467299673133404524778194021524254214740402040008906435126427498618501963733597360987556318089420367195395956628391426699039046618616479253844852188916292966502183910384510396500722228980724697185501358054419824202059485672658948142353306536149886006393532789623679836881982922548558194712986003534069955762666111663959634870672560092573427252698709721428977646938742506195e-01)}}, + {{SC_(4.35166485374347011307050170358934337855316698551177978515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(4.35166485374347011307050170358934336481859685873216140703808138876914884948876331316739925647147193023892864511114548238457128487754654556216343738493227753816508527036822424078877053377450262892442522287960679598399216373675467067420960306212074773556400362052082955699418548571551788254097519705082720856063393741663277035047125589079587783198416413169663797774698575716466933356398467157205064339327846149216696847465253262085226226554946659832296405255702874805050585475448565274780032487961906445e-18), SC_(9.99999999999999999999999999999999990531506500346911434918787920899098195107223890450668484205227829549023183287220398482022387187471783874651026967044131244719811336026254678190222733416033489289005400050123232478835262944811994584478096472240564710057918847691506763403668556132046747246126505680179175030370996427156273193469951062786344533187975157358909776771548110773203090274293899180349800394539287346096992143426016937645719411397808886142140406571702228451300533351648334028048315509115370507e-01)}}, + {{SC_(9.24571534386041068466488557220372968004085123538970947265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-18), SC_(9.24571534386041068466488557220372954831521512026783180405754354097886633909666420259426993221137091279535065321898200088264236523724424960040430570024492732801486261174800152674655450605909216450153664375989066460839592611461245370445914423958469134702623836585450775145273632179167068159633632516565206133697650089607101943944658893386809234746268745218644974101782367190994926519199092662771524309633358926212213660561746092502239714663634109325449891669735443584060620900381198034818129697477437067e-18), SC_(9.99999999999999999999999999999999957258373890152083906642579378593893901713675765098318926413104745110870584186071073407804185704163908348012520912780573078297733751798245590050762285702888909088013591367509411470242468260490885859347433147346225932292893244796521699179017915375269683211891843022671906243123097650437828622789131762134264796168556176234658033104766744814914904339713894114835117307900457700205766539066206181496361808280227525595233858167413695522317781531300493715242483817542972307e-01)}}, + {{SC_(2.51782594979259907296692544420579906727652996778488159179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-17), SC_(2.51782594979259907296692544420579880124943902261708085063966052958947147187189514241614449776830904431946870970159260360455691937092075466222889953840855771868704636118588224163624330062909301674972199987289150997146172863151668928438934140556411036253155163667282032912833405760303498275742772716593021336311752096063104868665845591806232654630920833411198402563942100933397822310625608203804916226388547452865994565194163622537436968388997541774348017060507709506033121197774674300740105857149675366e-17), SC_(9.99999999999999999999999999999999683027624327549818611642405259627277734545779576176956905635223388012474302610177483603851865686459231081769991335822870837867041940841659622753593655014713940872093638971093240790482102143812831175709620648245763558424105881217295782262911565235585052686966682126499325038194102297320702415146289036055973821432912093687266500152913802057369103672457993874673452831732722685075424587280286221673083152862430730343082806366094609467948165260813432090271885255078181302e-01)}}, + {{SC_(3.60775684432840075543946767311354051344096660614013671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-17), SC_(3.60775684432840075543946767311353973080369334858269134898134738756735710959677046218904765558906885492364334061087292000344970193513481403662883440148912074435103556813083982898635787234571361755716055018572586190298430906370378661560335191704015720371244055660846998368129007455709209071804971663274582300937117518716033394923135198118931181280814242888345084797455361388619932190727294536114690351832821038660288193236381399279391092707971406328888496938832156195246642052265826811660109189638402499e-17), SC_(9.99999999999999999999999999999999349204527610078975893456674652126360120817771889688340590968406061460125038582488754724017627375833001324771430239571028894899497567383218424464834879205022318861495316028975968435726716609929616209942133436466398134427112551311140669580095176152342696145945467540112296016461483911736978651291905258534879989907261687437286731511535258583610086316346495465395414349916862854388934045881989849797218994179829942041721541151900222125391260679662481266724801598694735986e-01)}}, + {{SC_(6.90295059018608417669704557795284927124157547950744628906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-17), SC_(6.90295059018608417669704557795284378906469154946034628615057275758767580827917168872394030586141560531872074234809560204671436693044343425840391457010301504740137412171139792833213101802925834324490824649737298051601026361059699458213672597472671940024151452085874111882881940096147836064982443543053856840493763963733305482754535226167817708959873515901950734304015397820960143176206034587501435625778875628979453297551205219863495406983015780361797852016321617748926259009982380223123180180635317112e-17), SC_(9.99999999999999999999999999999997617463657472479607266215131600498895145019962619817073610305785121833967037170438681582573928284612137780747419863832305571281883014950124752373550795955181129976650681557447404026625564572824730218895963758905602539829994766072456089977592244417787627088492524928818145775370505461217658955536144756735086815718595245350443425602386634810449310841322556872457206827318110637949603603506259040330724057028251216694224515414944270384104053076948461167522911334233852695e-01)}}, + {{SC_(1.12525415366977613387811096856694348389282822608947753906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(1.12525415366977613387811096856694110923727366543178991248424063936367102797106855871236693745998067792183896492313740966698000926384509124609429426947250949336737827454663845525972326893699060730973692704401099534341951883068691454285910587103533107303005237227528372401263431557132330403274340519948918314428351859975268429373327658293293126940989855765542949901183195688709343608094809310090493938946747815402871007789220671491796635682024533321624753650618068739379453108842797651045201761667915069e-16), SC_(9.99999999999999999999999999999993669015448244579190490716020688404404988716129435608800138080386131101191985387656303059757501675622372081366205214275299789803844591657957023425966901002289779390222862063087950428709151159887731980350511804536405521204092863537711731089301980213111230626506493072162164721222427263528034471459447079943925573395807997966484588698625396806888099131723626070423844207983223693719453345905264650308583103241187401206619743563779615806788459652582739288156225108227298238e-01)}}, + {{SC_(4.28382572030007718194566379565912939142435789108276367187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(4.28382572030007718194566379565899836945234420371503713724232371619461518506013953070308907657022223120432356779587799651917208455464125023945619250322620734440739272636606036542794988782854081250549762246318356169949227702350611711099210997039015438674073645627935319092938030223129482110154686819363861357190498576723741502657507450107991097688652505486877417543163721810816380539353617200530000879082221365523977016071919655819686183525162967504230324883441039688604036630737533267004970821556250520e-16), SC_(9.99999999999999999999999999999908244185990477624499510226321205119721095058075021258431213944274724107301289007609545750918897774273978402826099822688602645967625721552721825145710869947821878494892043502042886386779524528742129041553615891060311231387090458943405060106557011131937219960743403970810197762094709961812604268256488146909044474591554749049806787202591299579515547894789910550353470898790744771998924472207450437412320226664359385981163518398216312240317301698499316137407872077789696500e-01)}}, + {{SC_(5.40562027377591153287639258451235946267843246459960937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16), SC_(5.40562027377591153287639258451209620238935816537673386849100638573507598699570776586306494386496157492458850686285616875867925541474335159799779780220955316889931213510702441069443159194380992809790714268610391273861815905903687389829176851624715712613059046143861758161875814504643502656660200767189812949905736607262048197843805032721613684327373616908312542190461280141634492118337843627241511563352346923911175072722072966072193177907657314017778251100684093567096339022512256463459212982758053313e-16), SC_(9.99999999999999999999999999999853896347278714196230278468886281830155045973395275720923575499461975468393288308375635985943289405969943879734175052611227437313547948709681018548507712575189908929527549469183969349762222426533435169077447468058380028005061025510296067919339408665667471629938407525632912450465661014944423084708195510683442318106580092132004438775938913243626094924308943984839739704805512183838281324880895887413435530914721449115971797745548216512359146565268873966691648325262937751e-01)}}, + {{SC_(1.19902638233177101512172413322332431562244892120361328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(1.19902638233177101512172413322303701605856504819416313943283595900895124055620076170199817791086158982821414571245272957941067225878881094777635192202973211099821708998113732307880722055342305354709198635269006039158481945297350819140843635049214167947460796264522687764348740281409248135258544749282489911854318186620606384911450658827884693894389423867972448049092242216854615433791135706385760735336705625212816403060778777341209622092144231524514644426177053425586224941858192290734691115813095637e-15), SC_(9.99999999999999999999999999999281167867236192838031095819701787916028865373804359002593710111142773221681390652606310884830906788286803616120473194438083063522759231894313363861617725958310805741867501842807266210988030666684760768277264807533625085500984705089723638296262863615123643927659844348026277776487148412530668062202507750370540981950803485371381729535175337385633187123449179301997596140088990341420027197666179279421047422739289730401845124093351489448033951720102033987005033127759823277e-01)}}, + {{SC_(3.38815974110446074818447925736109027639031410217285156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(3.38815974110446074818447925735460780837077250405121624908912811375492279012837756694433825794177369571316423181623747722330627012456802421253043560253125336775562990091975356520362422074333107111588703197523535255218079359281180279158607447962967751462269796380368108394244242041512896847324483778833671068785773032575465047510854277006905770126219090406640414242106898982323451003943735814733493683579617533872767857670925391333276393152162297673266479295833057475252401519711564655129713657767572827e-15), SC_(9.99999999999999999999999999994260186784379476757981152515209436341728036663980357387443440104175124376831511468547287382319416060748994665608544177190490182579191009837162920485796578048138194041887008869736016572866833834735218013371717851707589665383762610511843580510574079870970128972241540922984155443035750300251011010520308198519163161300610750853200215747579653236184803757849345278234749183060179873847789020021279061575836422283909676225842553638445293397586781889264388759259817414925829082e-01)}}, + {{SC_(4.25116010644745190294457870550104416906833648681640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-15), SC_(4.25116010644745190294457870548823941816346457251046944865032376488142333896402551791579276032444896639851938619033815895833657540967584273977907877502009276953580855032699870807772322822936877320097590315344887937786915492201615767133292963150490357076868487302662214735366771516923521663480453249471739343125382720393628673678394339909114917543444697211149317158220603255176901419974392387577177162511580101616906659855126508349098308950139220756875144978090282917331368796288438131844298023787069363e-15), SC_(9.99999999999999999999999999990963818874674844702748116475486084707856461295907339275469937291571802782088108504905557783890708671134426482936133958851489468696392146303515035649204741944920865406162487979478067491792560183921011153079063283495854040944848891001128521367934055151737110438100017484244794529588617295000506752734482974861081634028579480845943553032127333374137833767657979137594352600945447012794293469082855519756029637064798338827033317993968438364908937482910493816043402620465161846e-01)}}, + {{SC_(1.31341538664973833672178216147585771977901458740234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(1.31341538664973833672178216143809571448147914551861945315022842811990408652297041461885743682766018864667058821901627898580410140220884869293241356915777926528623138687971777326704302793043310182526965205603774385653311969321173331212835547392587296845221807206335638843928749849510457947938612432868241044749076353621407488410073206207551248333799609881930000055823209165036193354244804208920991065276559411758752154294001775378226648844516156477334427467299485263229160154290869729898721568604402964e-14), SC_(9.99999999999999999999999999913747001105585917346448255468667731418020687259389117642182162355936270894492609327035751577975781905511260534442528906521602550843864551447652777416530770961671413078170413492886975664947160713180489434110163702311286988054098578657891174616776498835271527908985423746559334439292604676555187684744172862013311889242392247626156810700173294404002606146758360658265157997396113740487595634539444440222461918086708882309162207691177052462629678972670037494736536100439792893e-01)}}, + {{SC_(1.77789708411153768441437250658054836094379425048828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(1.77789708411153768441437250648688524478645580912315036422418839735129736561800912560835961982067194327873729369871016834742639611520196204396728785664128662482147177652003174719147456642995536688761494047602027150333731314226281909251891742919393899761767420368792123139583925661503462304784697391744091122115805322210363460646928593577702071795280277818846269272559540733486786538784857222816733384344097244591858184250197335472047542795560179495424920330227962994053357077457931707468603426251460959e-14), SC_(9.99999999999999999999999999841954097915384594811735454538004302545016037022517780490173741435795675944555929465406170133641921828986499358904005969797819484344239424979764763194041013420519497310559183944490160788417032999948756260634473243130077692082484694343666135596322405044585526223426948443120980873050098596571808877217666689185784054062839744405474537113202401718707617992954377641581966966545840927315700676622358215732909299904758018931589113524600079145027881524323334695454152651376769920e-01)}}, + {{SC_(5.55649412115402641099137781566241756081581115722656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(5.55649412115402641099137781280317284473213695030346303590402303931988046396190338269482149660999168475038150256800723829505660449059395231364201161042275163348508537606449304494069682810716375693279805579082802414158216642122510822165563995802863552100344122494366921663968851214429922913820743999886335738338311045421972245807345175726774597818626362833446973328909358428881598965762081042586774106378896781546245534530618913971744589459335901893304147242918115216617276790851847223349497418927973733e-14), SC_(9.99999999999999999999999998456268654079037183233581732191235680025315867467018181588237226553648078402104412568966357460261758140705807969848157060264373212772583437857468570864009272459824286929152662453086520176402045732499654604160968831934723473454758968594200776188249690085254846050117019853832573195081897863789261857952979012801346898762681231872848791491800971643317036237879893584845809194076325524610955276649279179513732336594657763035295367706519084046186378639813891200730024664881194352e-01)}}, + {{SC_(9.18614956237767676938688055088277906179428100585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-14), SC_(9.18614956237767676938688053796317258083557235212189163208541269091999669666251862949510205364812241435932602713540901656517151026883360600451742706846201757354337788307438543330054149104803715768067518620042425775420550383928117557120515122638131395055608328341320860695875103112009754385279107344430056107313863250016820433118759295567727218114604325934665604906406791475823429379313212052101226211800542137836625027013187029262562420815009289990239523883555061206469585943421229829445523451696682896e-14), SC_(9.99999999999999999999999995780732810881420878824781237756494428642216774906860674262521495747901019476422529053067054804076342588867228309892313842590968737438559958533351462306136561566035343161310449667786137339299678900922238922396965259978293416064425654849017060386290453490593319953991014716853265314390480621748175217352424683886712175702607549061234175218581612412946946694618730133735506473462495392167916885413468468240891287057630611654063369552363308029777319668075166154464106813717530309e-01)}}, + {{SC_(2.02237261225785003304622478026431053876876831054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(2.02237261225785003304622476647850095873909180892287918519663670291105892549106786498699240038550543980803346111571520530796485649985741199932123859242106953735865135143891664110901496277566279720106785214896873432294102853816490874908943796259151346566606797734844804871424841376931757109413046850801530240143016207449719658356785167896334666388493819143310669816981411875825762085981881153178256115280842466820922870399927388430970328517846034743061348720046367396642901249562006592204193360151806314e-13), SC_(9.99999999999999999999999979550045085946798831307767615967815728269180214484619036252790909403641537946797064418773421399496826527484740300031970118682423523800911121951712600720523023938618836373759218286510508286981245064681398402091026119540125145271144222176557855414254314889883573284827385379124690381427040558491108917124358629047794540691235512374459271544852802999945917447080468309969091217719526175112209317700651086548969987910493118357567850475532204275002096398789155408595057632731154652e-01)}}, + {{SC_(3.34987029435018790479716699337586760520935058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(3.34987029435018790479716693072418709836017910929437771667989352195765848457801327380537239173197201180176080218346985650892495774035295932905608250406042601982574423542358371694291944969185689340470978450488775476762384924785167574380484450959985723643696985669647726067536240145655995029501448315267496689967102955915125920689511406179578883297420325275705419734245616104771318170311735879077910111632963840985257248968295796101579049149898595541297275950413245232396232327962777768734503394067078556e-13), SC_(9.99999999999999999999999943891845055150927223405544616685223412194532018312352112927452321976910999098948049508814822499116849784098962082807247240354662341685818269245714571156296285694028218930934948908556886283919439083377260618552964932511197054219874122814829581002165311372499459672863965236873628437256914247926307351641680837638533400251705920788307072678111781083295027335002395879798438407459058176503673480726665421302397190962673216184108932938297777524721561087126288972933983518946155179e-01)}}, + {{SC_(9.03792015186088981693046662257984280586242675781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-13), SC_(9.03792015186088981693046539215738321788986007042365699492396320316279543704656553385920212950890969400392613697102194394333089009302293356880420539828722393281429459440756798252690496493026357977966088511646078696519216849028481527689534601133226590775882871940037713146444153208116387342034744131483842449184313713683684639667347361681889679947544099071968736411359531118781695435946215982692488955315854459642225183570337034144595721581924901891009381696599056233108436380627927215964786584791618908e-13), SC_(9.99999999999999999999999591579996642934151749028718876204266336384518057312270158991179501722094007867269513312491970576830983231405458466598365896114293073967915021543855661308978854719200666851617736145918857326995797691540025815161748308738637322261149646675082385639820462296143823539613814818378533729566185263398193570914921475394320955027638215702854032556452121005120074292215838023871081463612153498469043881103912304300914513522689206406089987405856445764613561621916375162684097661929892747e-01)}}, + {{SC_(1.22932697008137914451708638807758688926696777343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(1.22932697008137914451708607844192184591614021773791940328070305907562272284382223300433745269608192105599620144790494124731585172304253064904889570512798966856390838847723038950322727570967216489506463988189696586088552862576676302458507583018378239538011152581276602465391085652348792218000095574348738110188831812197308238926987928796802995971775221419386158715740692175212354148929975079049190330152422027211799955068768549451248468523076997234543234379586454572701565848445729465086417448959545618e-12), SC_(9.99999999999999999999999244377600315267972846306889896038052955037247802621151442469870443181687549662547384392242168552551586198987635666377667288491218214785084557964246070182324401939504153389732646676456576169283311877256893335438670498971513103206528391739503987826941965462689634528631382329044690235509449552819606620554284030388025785016998747768833817596505441782759764113304742100788573487452340669666205903502531701419783346606301970952783643261289551845395097138033771960548299748561183193e-01)}}, + {{SC_(1.94194400143787859747135371435433626174926757812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(1.94194400143787859747135249379511403083044871897362511037050124806754061275336835830905725762621394550968235318798300478790638972487568362561464077501190661717588852425709719253847163292958680062291156470483595542128963560564633973633700109207198638475983195243424201811540606422066782547498014390464716148059784336885812875071003684709344804730966630672604654294265898013648377879784197004207883524124056780017570061779067586269124313028463274433436853556491404974636268026606448413073206266966668134e-12), SC_(9.99999999999999999999998114426747639720283878342644563204203169790716021521459251173383061511822722138542525896575482448295370211190274140784860421332669802522548665773047007513535501337737342769293246553594052155484863347990751330806127168505703238439677398058671991000759955784841064858343931841972679048717309792670368465654719670193574986504622561882465200813531019263380321051541831568937340898838311445737284611598359421546001386821750750668783594967103468706500099741033123754869005438685314915e-01)}}, + {{SC_(6.66051588882332623597903875634074211120605468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-12), SC_(6.66051588882332623597898951018257669190239027988790280537744366770877869050933103459259476608886777756579915690814859257345475034216099104871689275489156456302753285073620213598586781180228060589887702362312976118884573130740471011229159680210967244895704144448701015278817840314429220158019791909505966927759104498603516304729831106483512971261087799947245393962528955678079281745145306463990785840496109060362063486482136257417186274670623641839580128843624512912347189142131567768430005910784229570e-12), SC_(9.99999999999999999999977818764047366008251915524084203751590909615251086260955508748261875866517202782687029477624871890438384002334203109091463704378174221182722376822335534340374142555193102169681841196257200130319439394836735580276154595560504229580621565183026575699906092001065134615587575775622899658383438321484961911921543293368782124716382447335465893719947339645128446390223095375192808481543364390062737788287402811325613827202640885016945267219061070038152413660953412231060479866988215583e-01)}}, + {{SC_(1.30501373596381142760947113856673240661621093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(1.30501373596381142760943409660333560692039710197239032057112513034203903698344616901524225376776673636415296454266367127536474789531939842197697151398931051954620168734015505409490467508115402882079987820789347094140079821190591257048602505229613017427675926583289549059019839863887788014562137726446278719219792278561923255388743792279408327291728896923250516571971257379108941833199023548584100079722864916841543005155359097839080114754493639235506419010170504574954807431988824330519664424575231670e-11), SC_(9.99999999999999999999914846957447288773605522779915678255591462117418280286605417598269089175755617808165165915602683165476414345458269433948306260363854177529036902285732309503596434344904848730286616536266179648232912749254260921122177909333891770273234400774813916276696399105771617638759781892253016980274639868069042438911086857998849593859350294868259456585846305237089203682687313371760123762847165326247352229463880572729131913191062641677831432439574962099265732575505785164506006988730385090e-01)}}, + {{SC_(2.30686234004018331233965000137686729431152343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(2.30686234004018331233944539753366059849572649087610511654342255381136041764843262848250444528344180274751100392168733968453303717207105441182806117417443233943716010264058015378484280588583802181389162890492955868058516684358307750210024654293194277914609668768527570567723841110762132081932253661492542191753298326334321162262780851843772980019848390872856649462749403323629021847818806351420968299819163556526351045832094245083900470441925991571680931787416162265425757570563755456357840904233300722e-11), SC_(9.99999999999999999999733919307205216483006651477197259401080960096043483966257192343615939983066359058015411234573217891951462139195543298683130104275658252397201222054956161090902681981646889634021219639651905330486172099952446497605963028200398919937976311851278164684080724300523198038402357061425303530776059374244813248811828979039869539865200596606550574563921484875225783175485587493630243707736284879141253824075634607287034007852277416184589479502402414449884296567587929029951662730558004216e-01)}}, + {{SC_(4.64061566951556869753403589129447937011718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(4.64061566951556869753237027271728267095397991615419284758180707686003398529938108907558659049805544522166142089343687183618822183674180398802623140208567072402203228303956147191175622432634317287818984037751722759314830706093834121136985601634172326524194261532142165832914113607429591085129772083038510981278068584029585870749896926379359591566067146763734165664345664227381459809244090427239355076319156218271945168418909110785694512816165916715703898907302335334394861643407127627549255668241455228e-11), SC_(9.99999999999999999998923234310392328504314665821502918105582647737643019746695356200341919771774449617719049429392209231285890370146966327702937705005002184280017353077487902270647087318848825953575460945669274016393435239996905422988310852251085179190521532751217700605669335225363776810282826832168168254965685159520325099422292341939640480539562839299127143241281660562761636134317866645828326358737604399820142244271880315035259321648287816929497132547280897354649873459775364006169123128552913124e-01)}}, + {{SC_(9.02057872842476626829011365771293640136718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-11), SC_(9.02057872842476626827788012314974142790926916207393567000799536747528665852957940046104517610928340118743826314162253680048717597622179343740006335264696415656819212856065002452706323285773197002877181170513609645226653106034257353908933673379666374178326643605624295953803936894098093825390857002684872623073784374057517550449125474465431745573184934610421148035203590941470464984042723048840309084189771384579997243914014773511588312133450507254488274889474764456105591061347125528289764395734121383e-11), SC_(9.99999999999999999995931457970214531344382763500560740979521450298825780214945541896202189854474216844275983986675930662009739900611201068149959653449557497416940647881320682912193115325791819947936258729341672087252057416024263812703049224805890246943526656060900271910628931812153202546207245286088184201636723675366258575793036560652857802740273426903311938076552797325985907156430651556662087903430650963838535614862310585721428952766908680195035699158214593729978819602348438663666578546511487638e-01)}}, + {{SC_(2.01724303927619530441006645560264587402343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(2.01724303927619530439638527971518402895378308593167368933938083097895914105097853220949809226355195616763949665976607147482734150177406396672952859214765226945452347977564327048328471633932359706066181475253090365189727333367351575060582769461913412620214498488588122674367266769995222789306232098144726082974899810430205404009158930892774244308055687571333194471156431420346649010206696858212297365763691018084631483817683537177298301222874090599257812256350856270478846129594126378216518526591643988e-10), SC_(9.99999999999999999979653652602458691842430650820260993559156474358290259195311093915253527357327361693441729958969689754741626190671808226283208321176357071049612666759270261537258301510936970338807161008051696492329011151441024206711798673439297093922746120664076403362950701801472249600616977394476695828826008527819050665336968791102783867687569984985171685557174424584367761174767539614359167513379500439820659122737961073226213712482343940968286210986638068482869101288889181592269909589057079909e-01)}}, + {{SC_(4.46381376306703714362811297178268432617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(4.46381376306703714347987244476099027009902224539880005072561623010099356540803184148103036001396078252044944026422080138240224768254417146931017323334565624451815099945627590607391027983942120417773378104950239985323999117684804060836017845745179632044457016676450796401932538561014818518845565777874909934983679133832686623486576188630071071148938083208938499085183977246795190669480369085393999940011770378838807632321077683437611646390289967229138020819814603314833128646684632972758168720689991635e-10), SC_(9.99999999999999999900371833443266485913038040997156521730870275068640693475214820902318135015361433760915624397597203846840940746657939286081364605200713758595178692424520434822206960393490736772166491137163017541233795275517139247267410699507649970089369444931075965017855747225029199138401668188234063259525010428970267417033114000305412910864715637928080786514254241357289574781729733996541742322741084600110673688819799600144608849647324443184768061684805422295932405956450624750023427143250924393e-01)}}, + {{SC_(7.89404319689879230281803756952285766601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-10), SC_(7.89404319689879230199816332201782739529240876597684471272919980002777979484632363432465884931581298754425539385458462115986883181108643392276139302735348983421293058202757716484062137411039264846920281186219775313627007944254474745735092011358327265824752737392551192886602710943611890515757652974814780630277463419954569206290620286570655977415225582763091478596449757175244395774820571912306590264730883843056758929601320981726777511322879727946707924970966013671019646025854312852174453387563435502e-10), SC_(9.99999999999999999688420410027479475305362157778906332143894166082169936942731331015607326922677730904125008992719151667796893832292596525226080125485663687387254462074817179973188165868637583981505405306392273710095595133094657390308796486677320683162477145982344545246447461503948259405992813915821707874476148435145178882368552160954920286669801651923953245324424846942116744922945358896352588428998382245435357510599957693421002169153027160299186706875542049015760799819878960550724185779068785498e-01)}}, + {{SC_(1.19753096328167885076254606246948242187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(1.19753096328167885047632011372988366839572495166042379119878396866921535579541590222533938771802127489633885286823687436829092513169438926309539112468485901612826556554647131355737095301585331266627432715950786269002497531271856275268976492286772142534422181109956360070777230825864534228868599188286080749992690194349465150189374099100496968514528603190277672577719059890396520617292399022494599881257249461553031630617968764612470212007400625184399122708879017220672145741500373239998829273594129387e-09), SC_(9.99999999999999999282959795990827170135614551023194240930093260762829569325129878206690247961179210344290146583519020530140477449064663472153477122196148449723990947674581478397862389652720572814459349933259175702680962896596786112183582392780523594102607808197088334429511356009699288389060708476939825983150618719140382258928526048553918913632413879435283278548406386086586092090685080850137974728621832392962549756584863779090254093942057791784312747925080865351451451980136949655068387207234963197e-01)}}, + {{SC_(3.12890779952113007311709225177764892578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(3.12890779952113006801172430787239899843014121180020028987887830642136016563460269227648455367884353405820594949780478791250435270727158941605153451515613224900471744038506348092656973671581305148881839609084002562834453936791618968140360445438617378508144751389050414302328039146499148686500822713769253502370230875150664323494512343222329717689617673865658363215948765288460608585507671188522539091504719171739787225791322428333826762895704700179325887091436326383419834154611514564672051705672679729e-09), SC_(9.99999999999999995104967991047919853288257931434502650824735772704901382256708715021400393451254864039132676058501649583756462483532603552799348051856624202071636323687874357588478927990651820778386282265459606160788426873464937091160667643766602768082383907777101778047612835332747498483430187110019957772023312922681975084585702702709221851139804864228687947667854639696398886738326057666662346670866634585482424442770349811280971220063596816378250127941112472200556139543776950887869805152051636464e-01)}}, + {{SC_(6.54608101058329339139163494110107421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-09), SC_(6.54608101058329334464042270717554606519400676020573764995976115778693340979388130080022974423866935284325224591960497690969536588939452672365750379157106213853159115223232557801762788904356215610406895778680268668011973801486872457234995334787076786196667120204171752334345220791146072452816721140739938381457912498306668372885313541251070938296534995649585503668002513271906453156430650046287837268495454161895286850464882200938396384912569859073295724940016743865987946354209215048147814054560547411e-09), SC_(9.99999999999999978574411701440404233691911105547524791228756909319836684728278557912715521020318385009945375240636666743026580394412900791259090936132285225037596739865993433693958701211417830265319761760818827268301975142733786084305836633688005769082569801814452087685765102517906826744994947215969543741061484041836019692751063794459856496528591823807106900483324218512086593607216213529777612655991996245466300172132394213898662211942653694107956279418132602626108011683019257953461179914335417569e-01)}}, + {{SC_(1.03735935397253342671319842338562011718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(1.03735935397253340810790893751025841403787815856505363100476894912737720704301244348578436008313475030686333192772334627176325130192577834575419942038167479241334017482987492858923177101199753404916939468489116939860242362829280075273559017235394780006839615093480333418803996300935520495415063145607760188117015493031522213277247229248056357387542181122622768572015076371502931740140691049999730628263261329673265670764049208272952521834722647922384989326854349198917760704695926154462049679427169055e-08), SC_(9.99999999999999946194278536284405354610570430372345844458835181493008418475677210409811435500978199000936738380347156217172881551605742010246289295475642679026543821035644853655390677531816640177832243794051207478874195355431282643488079197260679386719149446309958513855351476668434360361836809340787797843883968024921763591812095900362002068091186310802402564913000326899027361620529514471492425167201427430668102330868055716754719034039207556779437459710875339678788681820457468797439539816776604272e-01)}}, + {{SC_(2.61325965311698382720351219177246093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(2.61325965311698352976552085794674873948977136797189716587867829599558705866806962643405885733038039478988642364563704357082502093947827944797367772608225883166215523823555298418758318630457963482420232556107317667605517036573551347481182888243640081567986906925549623281756915886475451174605904832849770710597096935848251100601457675358153761388535145261895383377176682130933568074601365026003928958385110319127880786379945331696265445429638709206271414191927076865306342505962011449784687607233615452e-08), SC_(9.99999999999999658543699269545087412937067564529648844277884576114957046482837719543260440895585699908131861178001643432695184748185712205336322075891023812779806400255307285635209660964682222600661763324276256706481766722094270367164876479959205752956664985241064867292918583916329838581852654001919326649998662347558813007474950774388834590480461253782550965790984460939938335780491393830813803651547817812540355485622875414796710271358731969408980506856043610689479845560715880583092274528220974819e-01)}}, + {{SC_(4.65380338710019714199006557464599609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(4.65380338710019546213101449129115033161848051306517504163852496999266647986927435990977890722124470233716535035990445228653000823387146271818720426084568211949650343484184758290087581824628001771507825912267378927562049889381022044816039337591261522072635747352493136871116429720337851950673898424910098529686862263347207701376800524528418048828250587804897579251153864192781131793938839620359474075175276829198081705127544868279759961683164164202368688955879018962498808663268299079979752869609245111e-08), SC_(9.99999999999998917105701710736827116732862038891301894759899293767055928392225272595948117206501678573317153059878167175491018649556936748464550872544907856954522933464150470681110854065542390219844974968670264625826027885525059842104573562044746263899791837945122572103192121273049517060613765582028914775681100285591918055756290567968423433583223448698871995491519052440989343536966227231794085271655176660154985346506937216237832680674055765810058625222813752209386455645318051700424429635825604558e-01)}}, + {{SC_(8.22809624878573231399059295654296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-08), SC_(8.22809624878572302974031454935391361372051682957068440610320436801540761922332609590542871910636824146618989600960676006105552258407007206307536028311773758371384227498119341523374370443380937572494475012853690439239638281798715153078626511309309040418220071090995999456749591226290293812387279580872835304139321819307678449632135824464227576504967749390956982614137103459123505807303434260206228565147222591135435434070689816927846520472271632967415936426640676428703540971888279567964898575910715123e-08), SC_(9.99999999999996614921606035909924093917868987200475849137228921444966119154931547433131311747286721713859993964713899333566061563563544320069396737088155497880063790400169176996226259767364154679636076351504706293403513289841547482443607379100708634166577212868961703960806666990381162806668658969679112306754390205132297815473144631413825060452445785272573811906319333663841292964458685149139890735787210705223580744560561707667329507023265309675234477115176492742999823352033168878910390869069602146e-01)}}, + {{SC_(1.44012915370694827288389205932617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(1.44012915370694329490470632120488821960831420625097208452760967773899621810591454782318687404722250729109496920322278038980055717492831906815698784428939225099587980269878692724152957317801702412412993718131255597355895454512166790913978083465076143342113847865164382371389644607523752931911069238459892398036303216120203753683695430935556070669486987607684338788351666960681655650102436765917243152996502890151550049144015760341535686810061218536126158179008438752649028139652964238696677459061310317e-07), SC_(9.99999999999989630140103216562700402577129540528603374109265955230536308597494067119686820392828740053320454263283957034972289792638690212984598029233291446961997991969126997116029008314129347403292717442507305281117023966514614990281472312184568218292849743703025193325667661349717298061440359197461007084458252138139784938458360221184396180949292384861603688190523134947836462720740001267066751287510670926330528553505087996619339798329208819107563086094981065297536727314006650691009272319462255730e-01)}}, + {{SC_(3.73797774955164641141891479492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(3.73797774955155936340127351088274306966945499304687351262224327036485003195399876134404030898541569452698698785128297775253846740013651700738117739570712980936632597600460893639731587793211760397741272305599435232590671004667375647855341661506518793260072662904540036197343969280257117154710542629945909475065608111305917119485608749363342549197465035729619138390679809197242810869893983371298887552954017963591067229750619536979210184968032123026629350132118672624718293514388725210602289794113281992e-07), SC_(9.99999999999930137611719284858340365115221610379236961291415554500435872388131334398788410009604492364643595965830967680631112341724704163694720399722612295634691371226329624623908442837416395690299608196223118613825405185261111911951537848971636572392818714982018974612977857238412841244788826676293170497835913653497769763927232690492490945784008368787039023716182343873542256800681402456564241935627923628431291698833219433246493125751712345703002417251750058512609170411880034738680935556902505563e-01)}}, + {{SC_(7.28307441022479906678199768066406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-07), SC_(7.28307441022415520449044890666796158134075453197296260624638167119898104724468797620569591993934165154251894245847724657348679804318367468423664871917651373448389334331503882422006453094389677135962962131469634391849918422883493755583387914729253820958027791152034299949176207111497843039802381391080335874944849745658182004855872129588827842894857367834326716640912301040886396931562001152712265979590735678629914058813142332537079465290202671615290625230647393466634240383500876112800156132201974042e-07), SC_(9.99999999999734784135675655199435477062371271904158802490932787360232684194206055502603613593047275332698707464520011088631566295631082659933586705030333526358496612387620984644750063897599725203398934908527060541521854556685436158796714198252960674419809228990516232542677961431420440764986615825562613851043943570711111775961182791307437967727617534370632679575032475835782635221622680183128935771393540477464095097827358860337546655974513824038524754934769834274209792801776761029464963487681454638e-01)}}, + {{SC_(1.02601461549056693911552429199218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(1.02601461549038692382672664367980909129797678870667768849146921712212318648724429914717031817788290760089726336692234200973914773135228261464696094871714327427696538664377177507837044850603843659343822132883729646354999890909512098529406876550302701462857600464801392168260146985374253754203891556843366488152159129130730566352444244537417884234639163162077937574407637561014227372724382633431402179130482335521222619551445219770431699554800298663104276019009351056140042392344367285483613919360270842e-06), SC_(9.99999999999473647004399918212790658478585875953442964686116107604076344236801122474185649272934613995743945730939569552300021365101719323998149781972994755931612189643480767690316499261003148488594493744111104485195102515931162213304165502158643932709516860360378708209085284952295320543183629161025237715099530969074626286839526867763366850481056477689318071063989591265436161763207215219865838561800778868728374531420305187030797150900783726793452464152222676753653006247167516863553168502906926078e-01)}}, + {{SC_(2.67831455857958644628524780273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(2.67831455857638435657005412213610982128276604639866069595480496471537739536401609653955476091173984298018333992862711537987312713316036415483747683882706275541677384782394839207289648307083009870715553463423558163889818178051780340013240706740963214040859738404485649136995119403224901763227367017966025598531866420695841491386351905041601360740252046371060654593691975685823280716565708139718098769413838914699445951082858703077317900076440435161320338733864823055555572257326477201841180943482872309e-06), SC_(9.99999999996413315562652461552002296120358356472133278078314440392542844209646953698240203500798998633549867504425862619825808196127841261566653158765476564276301681397741407108125586006528685692276874904550104105313883720338983664992978010697540996668822432388675633251819366000519391363331431034508455570735042351871115290237627556585117202107938696024469549112905592522041283932404634914222293377504740759899590438485366489707037641986399526791217155900620551904585509940641934181648230634413259265e-01)}}, + {{SC_(4.02049954573158174753189086914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-06), SC_(4.02049954572075024260087118468826429814663153315077991718901582426759064739078052407110165549578932460376560288440104449973094159762702982705468081682224630114850462597062111224598235409091240576849433101102274161969329875425199265191158999339698045252297020474662563333717095860445116915074136815808082848855273281504987601523720992152761270084812423792786748728905718724925236891423461782473311868144673066624924040595777536217052283197112160037036137391999739146035325998017752148720000605119897683e-06), SC_(9.99999999991917791701396959419313813401265180623673059179911547500949908302190117148933168329908690893202837285420822052885466203283802841353637437714044074266653743183772093591630593925853924527974309329870487833794885494542924974682749486064402670967310507687630404555758440772082780068787018846191231498609660679588396035862441583962343363796596673788481921721284934251655364564300464315956781078329012607834367762424242617511122928763782421412214474185216401731965589463411912546191521776651138922e-01)}}, + {{SC_(1.03207567008212208747863769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-05), SC_(1.03207567006379964486059135317923765178884637901450818590057242469689597001143337677447826397179538167736031048422475631735874873560436656704544669504022530773567828579863580427738546306049255238803108540550172893695386461067609240342223514481537877261996343209535310475116468606103856887738630617770362994732691906313027170715951153121602930976853364057496740031527741044543252742005164654126014924982764255443579086080334090651228364872564641844143122049086203141303222959691381228360964775537428520e-05), SC_(9.99999999946740990561699687835096311656569291167275749312185252030381383219899994380821659170492794982620386768812474172028293398252431135066349066538792647839668698102255251061620041845986018822889924627257362980746160722257168566939728109073250489334405824801674286788645760845367307942971073221727371765467748461807566364605758791097966471498518756887318016848413147180370466183250281458021428954703658743849818753824375557456108425203304608071735244045207645448919381735548782239335207831536854561e-01)}}, + {{SC_(2.33581158681772649288177490234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-05), SC_(2.33581158660532274536503743158240337737646213456952132594369654562065216097877971320195527157730193358300929564031798828711595676076842939009562163723943297244285734194006007223556382374047257979318721500414262285245856557018249968979311552508909534303598154907496279169019026232123477133854368562792522099489668676299693279861365831493384781972611843978211229882541656295508764994514877851663096566718391379871772045083068385054238623504509574501724078123943242318442223144503041840263886374089552234e-05), SC_(9.99999999727199211556806106904766880124422922887658969070618357584897186718873889930706733533737414920883255973805088255784903870503201137916841892176156804261940743581740668610287436174400116137484876377141991877409180757654824575875337907433838981829262228635400536890633592785954176621124567961998085107372061003574500599157091043708082332975297815142693186921586918415547768897948908381471877202194378061551462589503407388052810183783734976447440624694286163063940147901602691211823597158892680245e-01)}}, + {{SC_(4.86091157654300332069396972656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-05), SC_(4.86091157462873896531559848284582637784557632474682176085172337595134155904033586070379315035888134734726032766408540784812958598806994566663326780124710770377187107108833873767030923227727011909837793256232391518542423335743456454652126193064084872761224599187295590933776831599753105253666406548766772599334972756691975278667198025557000529670435088027588227931051871991509667076507311250562204649129417687068848055773179752252762878812337264258619348030050901842648799759954611402159498056590639155e-05), SC_(9.99999998818576932484137442598201473525328287104259159863210153066825931991341897043829111475228349045483285498413995323186917285933143000076937430579794115233182095826446006806557434845683429950622114857801966123846319338055787024498273217621081374284059134966187810875651505392521771289854146929405808060886179474334346367549605047691775074583245613018760263934687689325536147399232974306541392134063454728398424522096828357018128412581868706236434263323391431032449702295638869342133483754974197517e-01)}}, + {{SC_(1.08591746538877487182617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(1.08591746325455478104821136819967057961442551278838752348343355566286218686113929505011769085392722880098614840019465066786627028957464813242084556927966028282629178723699648064575453887218658547931264605554358563986502073409516676818032454066518754329792331835726580758311211146649657048162622184720605255283044527192625257797088007777099678809069788187552437063489110706836509997536602585770349259033122327371763031488856712166353836833237805897511019879417937250092100019381559125979139968316714978e-04), SC_(9.99999994103916297612061821589739247612479612887786329210914478898502255396074979076847380789538147269506577481185329419865050666328661434508868431416044477700542172646387026146164224487845332693392736684598893846596257736456069469932831303309379700235636614876092375485047676007220108087938935195867325054226395462569755020081184471649585143960785879580745133870280816789767884448864548351682712557998756420520254199770987894208326002729195396286471764230750762925411446123482196587212878858449600175e-01)}}, + {{SC_(1.65569479577243328094482421875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(1.65569478820777002278499230035423603846508955528717361183138764363130759934146907994995145252564658286590588043330672733736568088625032438281790665274851888610402105671884799890946873289097350132844056442855760778504889546783747804632166360961473335056677009872583516249083776988899488413878415770540869751761917785545042821020637486175722597418790478332983352386892602088522806462238312763565226884340025562855038735507337739183687799030444108160429127483514013497187305409079224093423840656368500111e-04), SC_(9.99999986293373747572336229637016911015215548939030428628815886701051084032403634304387592163823574064764141161745510371323667165490842320379672149455810787341804779685538532337126177529898307424160287639638228578303059367219675887486179384440818508994233187183235425117869203130395479376427352212373583179094983956677855049181936352501675476518166852524409114024864211976654505328129329141275749256228504839199221229471272083720991903424231132100498001886103604278094475959343911266474062340673953856e-01)}}, + {{SC_(4.72170533612370491027832031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(4.72170516067693075676085308284046548368287941901283849283802268407085001323603380117712993012887418320098470197820438430800375400461013742422252145872788157889745624950674378630308331446848389037105550082483516085665582028196070194038315998455738351257405359430069565974850464666742859881265494476240853811215470922001980390784076319007787055901806119150667756505054118980239535903669464580996153901994796184051966736242100731906816925205360327063389707705971734665764585696567561507749437887229461456e-04), SC_(9.99999888527495665124586181695612446896055759076554914046210391986508076349569320784929587149658215798725165235431650500548420438784030227751958358265628970993501643962381317805243477469130674237304889359122911251912706271419560285910770631706849781369467753261971106878784188494585647101027739471383693003980737319512703901979613054654768752954440845304999284188711132746818638758530113359491822833435683803246988867483208003823651051032814261010407735099449745359158953284399378090005712210474581903e-01)}}, + {{SC_(9.59456199780106544494628906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-04), SC_(9.59456052574554543206855339368821738303292144129224643533250613815319054198172995757500293034201494560266361040990132903799826087882524386271334883058570222574369362764548554621322985293459036681036350936792370263478263637436635785459960302052069887902457445187820098082690964284699226936748715963376583385063569355193783639233905746245528110402738779975078022638401708272956028719655548309901166652903956254394607665326795020988537856449664481578241990439621439369798643363472829333476806722444683316e-04), SC_(9.99999539721935661078558358877631095592475113333838978294776138905920499993032330139337421241902110329995510935282225042250995091483713765893804389358404607462625442239227727503856365590616276283533013690912228413610654893588156280765066256573917595651391760595965856427674956693283638835311400506664007482874607000520400464981164369338168028152504872866005567199753620315631853218147483048084578609267463623678894563773075053269450532221366890374338890064467167184494935898119563677811132238676494558e-01)}}, + {{SC_(1.10342400148510932922363281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(1.10342377757381395572780813465347362173848474850723949280118058196604746697019572341413318215944145126695958128785386403768383539056318668913049580511267222668786396512987355606357832079330824071633509714763000228154703805420380841226809762285320859255338411857700840437097392670248917342530077492683819354527846578272478059817224126037006797924447420234585794971684867137695895352065956771102354676254811894365161560870498206118533861539197244201894588423238917868029352924008553204725898125797159845e-03), SC_(9.99999391227798240570355499022960361310528390499881018197266455182809171966708398936554453665968911045993870299118374953720723952637206472112388139335340004035264857609225769117609578581537811200358127352219484431189085457465511011367152198078790212367556345107155050267755673291854354611601028709748042046865897310493248610005403267618655965229352763040418269822894976453122559521873062039563482824923611739885583070016982058054313658269935174171343198190502958661221270818484040408653750173203230643e-01)}}, + {{SC_(2.25476175546646118164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(2.25475984495072670616699492058592318073731947935815704559772827343957028999833639178303301437534887758577187984590048560049309194362578427803068644654064353829312571273881404656974876959933956881749270257978577085791157039068158591410681018436713818579999705850717033396103629973591002115994971570790017014579064418272908019539035645369810874787478707942360991938657434252507502080409901856172541073238790283858388760869397761626405870660463300506949260102988070042807416992646493834806872323726803835e-03), SC_(9.99997458025789982445234678521350046147570566747269097297006799068277234530960383891126934577579240030196329864154371255579971284092149965664359210957736971529173205042093081250449736372699216695844500361817207467277119512515305472466332827851429424250625947451636368646391696099091010507514309786281538269045925530297104928415277439273287729077747597056412777599320325937253062039121168242112708605401359148662225387594303232749296186979313529662443155110087020374951036032548173900426505478925101146e-01)}}, + {{SC_(4.22764755785465240478515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(4.22763496440571037285398946467322152879438013077166851167820322096781411803101602967274080802806089831791310107085441630457942728083218628874481058836415036218079015608106582663616413342942237592877795451725218582690701538322377534768805672823178514496056562910114186529938444688600571794798707451517027196106959482213808413198379234771333495250671145504358644814838320906361026604251041524455314777424351345824775387198748093231006179859065418633089177670013556478508726004901466555382091322541680881e-03), SC_(9.99991063511373452677789560050715373145149428952096904697886367712876086292035745304311300137665075775273598372499767812075771242786145874855260095826032408084979781582498496550763382567267778984462635680866130352737905116567138144457106898289831285799702043487961078500270822380587722117890745799126097012166609016750935133471076497871995927122341989914848865983119754151725078374043588790005160728009669720033867672541115407013710341252692207454447790955386571269789604798208580025842831790721417345e-01)}}, + {{SC_(6.12821616232395172119140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(6.12817780483560382808213557329119466062200876361634502126654101855994873417503462171920965026316613028274177950775049233440669665302666581845868636766440489877186411773482813665253370273946003944605695383754736936873840106381068326241720149322296111362109427697762615253610223173961747328543942833277670703533635146996505994275092106592137357930186405512884836781314222643145720639318114729066271317143669053008940304917313235596240875802807154598766141454795653291599739378818168929230008696171347580e-03), SC_(9.99981222542099697541143847070072546971828712330332098329770865072257185985031260314852113919032198468189307863786664906732595418738355515847783722029517753608046646105120123876154838707339506523033413632583032210663688541682592679914200175407756374745025341137154609317405534874067938923193059980542578882066469704789720739170867326643959200096981737568594315302314431892923592597361251855561253029981966969356407795627317125366633329796621808980454701786643444907402366202716161170312320402120775433e-01)}}, + {{SC_(7.17522576451301574707031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-03), SC_(7.17516419661267582836034142174681465204546939240119108133248205295339734270417930084308859916380512773163931881507840068416345388390221086830455795381118700976633134766870842626243909834567744533155267945294716455117405920717282899684428800209181185252677870139843050740709460388726089385203283189938165953927393351322007154426959879457092338736053974861861644896156794783787260212117683134116318158048696031746003526637450133982920320145132406951950929463951376414554776872928379361757042284269550869e-03), SC_(9.99974258178055125266307198014100123003566845596771527056984119690792340007476181043717952620624133322304853462699177805133923671700194459571450679112952110115183754067736732754526085407259235156594925752725123490577463983114254313088597337232878237130488068840714630832409931261169972643381940574573574251462173875076615043890492664417739484346470106699266972677891219384324959207370519061992691189768840015505197742750976116894509011762334997906198598219245703947633571105806140038697463949630336210e-01)}}, + {{SC_(1.08977183699607849121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(1.08975026685868225082099747945941996671381818418315536870193669678296106532928807799250909718485024339364885037800450270269491539718476844275823176938926046293973622562776303659992189903112282273804688777592450861967790592563558839055840320743745743517124801776837401121113421270015723410236272602511202037511553596347924893762020894206394739312687863922968952922066268886484510171475010251450006622524798965971270954932230608474913019167203244840780765530916268329460323782785258474769888609110757044e-02), SC_(9.99940620454828879176449810090714022793966325036551863037524364956170680998552985230627257441664425512623325862947910848780903454899838812983927846862074783892122375682062446356128198011466542914409856704675107268613669808806223468999915731471549560119508428919853126572110247471699299141816274992236135198359087865880841983233018975591367702314503088337980462078592624863043456548876665098346359209814481626968880920471651405777824085084498961422127406379393002743019949466056574181916058099651689932e-01)}}, + {{SC_(1.78531035780906677246093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(1.78521551967464525812118193536998457864178736944932839508966062490920983977913731452860386330129428988643959146499238519533510439272212211988348296443064807083049612254960715004778700987731749155310876701221314643204230414499688327215921624508990886906725847368865040147551794223030969339112865851425188756335235867433293871733996891222497034543953097408857990064751695677356390131257556267672627210868961098841308101435582396237613538685321484883810914108667403775738742025077232461429195116913304281e-02), SC_(9.99840637579225061689220616432075985634795177684838328799799378097519517291013941215385055849958064136044025335614398935312278776881615250387809724005390098759965632553311813973103549298175120350139482524465729389908312417807587194665842630539253758936784938132701160252206934489824287775250794380842975790174460246991944385024354743401221003796973051809502576452212229636093005330964395681987883595479541881975506947710338355137649374464671012035562176747997429673069797136234426619034789230719427497e-01)}}, + {{SC_(2.03086882829666137695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(2.03072922829785412764841050885782924234816249136965856784583938017611790081018736188223687999876856101493286192891127224653907316634100288250902277997512484886751200221909624555006302408389544784101560093067868425111920727574110886210515003659002049664300850730141800851166512616080332122075080697842576939296258415122768607418798187858959383049671689481354903539156410201084805224067944662577370176530609953627594786848538340329423858423683103538089020644057268289846646276221970072536489769025643200e-02), SC_(9.99793785677893519174812779480838655924731734932423234294294069992449425216385970005461481038863544081690554334303539704684132073109604649614262579053784312170241598442533216766228590091484634176673005320023682039710851136366207849186480817732574508774099889801516500622987309336021622394250832627784750051628496869920836260929136480639941940830972794464084948098223215601031017843124234960140768044637617707391949948127367933673498635487224027515795724693469515440840875190922863554670250380512890187e-01)}}, + {{SC_(2.29592248797416687011718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(2.29572078654806901956773962128873725317258199243322324833026864813543563298791582759067345370927013211131751436485373135926303545824205672100408388119836608013942723742698253158825504611525346094396821412403622255927493921481889928668837905973603383651805682086702397751093728776912507758571185200632272001319729003355651579071960733495090546994746963852360611508210301194267977533797137231602723726016493487285942976883227358425348490878104264990630653588736390691329691673892319586298997892103355891e-02), SC_(9.99736448573833438551901374069916160082285485161657935970098520489678155282193702973150207036885608526804424111064981121646464459825539846765219169457812958666384096707176259278198827616355298087054529952352895771688201169993256457977842748577431116383131563229150919282988665267307314378159810855110884585840543438664714574577985254814341262596212481955968518620628040275972941893015178582124863257398330562940280357682968567499337875321971067674002549590662525412105546099814520291879786638677849755e-01)}}, + {{SC_(2.66608446836471557617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(2.66576863716550940523643834663602903343412691027273852843135941288217001883358922665531133518750112173938256664285346400960504583060978937807117359041113160326475215921376215686647943718380783767854304202922439633733916721749843129015530644519528290494433930248285283911310398738720138221726525289062335677459212027783675235985721420722586719469315045658602049763170408429747316938170763162477214635052925244540302524248462164057897716244401861039283114010655031575267508920532761222634789689538511757e-02), SC_(9.99644620731442977071074952503756513594379179610965927674853010103238383122624249337790075531392503903192894317965358160816337306507873045677143717869693639520801697528499751699845748033476777032067833843164251267038735509848519717356813147914406232186302906853746387101025616449658340377064049192334098838427810354558514702289969721445128620523303760656579431646500448912155533543139906061180895870794100250533118584128980041772272673997087854201826597188558589194919728518908452007643217258987134441e-01)}}, + {{SC_(4.33529913425445556640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(4.33394124252182473430409877221967910797867622226492251867897610304826237176234205087236591492775301187860990482272397390755639330607447336901965105997233088160319014424029346223644238916843456763981709289162131537218519445453237404967311695686259903340466092692225153320582089587252645635191955910645798631988546760161387767229889141907691633440411944042639714942724664881391497750867101083989306287989019965318777179382753475304491095052075043277502755738012378861349287761686817900063465721264064751e-02), SC_(9.99060406247108182433110591563949184008590550285525910681138166422995597546698572115332083802970332128616627121897628062691197069398078335651999531708939350394021171461022811848765537950565221073815507985663387023414130658678517161835653671716651889105148592561400980999844972491569135768885981972484556339777089910598305278254049157000511662638183390385938716919090639856781430202246719809307852115859635342924078122187579416517698884917122716280159598299212052892821404132658413827277993111120708503e-01)}}, + {{SC_(4.77492660284042358398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(4.77311234361182370553346707381159993522127668228423471698794041916914462592971898735317849465740734845328633088053944012173225744522673856105790002415848172408214069917931220805129043473864993265296014536251765599619235474270638309161980840862577294567887230574710596674786583672806261330613179024636609581486126381444805459823476722923620864804227936605524668224800326195728143182612430137862837785368173385669325151174313653767933525960762817591648188359244076692216655226984222876231471974326328940e-02), SC_(9.98860220378970765416666292064830637521544621232664286948273469114279815643994118299261220464425608197046745838168231112925313418673671418209258128341850371322883422387259027817868426171842847565005445057442801891309920668960507045036275491752451469501935202560886734381086026356191953555384486093207040581077635167409982151341587820821452812951152750188497181793364081579598815492232851725904672864062658468093007372919440011978305101459486087741869001923855853317522336571059851757312553762759660218e-01)}}, + {{SC_(5.16691207885742187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(5.16461336987755230869002002933674117113628450460422043485783336784426247557022356731909397461110296707780131841951583578912090434140144989808173826842170096882942749374641049049281256365429658426702580621050221660498897060467282826111146984504858071976776010862044802440626983001384950620260121297069950332695775013404688865827055306077429454209895399918940351395258935654650406962823095146186230791842645841873960270123869669412376104542452754845295352322884283271557570532941474399861951518394012477e-02), SC_(9.98665447922360135213521266796851531835766163012102217203454689231482046185392838489821970734399552125784174598237931177178099063321027279880123829101090102291996800001170395479384503634523326119052750469669124649924813326825830131301210568512199084926242430541410903632134473488254399271424441248952830602871668311874043567869499006057808372210726562783173297018290349493718182960580142111841000744070620479569810216657779987098922352077088309252329258306000595216296566049509627139117579193448663272e-01)}}, + {{SC_(5.35675138235092163085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(5.35418990269726278953677792861679455376590654675816169848288105945573655682296899898869189937986681565688296738399075385825415191313522118358129631489596746430113341211856136081029311923254306994352803590375421622780891367234256434768007178556481730242780532291413026293701001237059312098409866323782729969789632460239666058895869272654313586973220036641750017933187081733418154997011863506155998863196409535077692811025064845163939795073047119520932989194866829270668217258257742446996467296239119175e-02), SC_(9.98565603778031935652835648513686708834550710265717769750310667576425570795156384080269125053377701778322103408050072703031273382230423580101177233233637046691140883620617512339519592385040904452381281257315749593686899133043996685159638851121619705365155446292409398769831758909586549766267584554212254610789481269394405823437544863448131217831503558412097043985486772933184380606483570614071708902118307606358672960875898690760212848810279332764698105509738345245083749332937066279013972721999860951e-01)}}, + {{SC_(5.46618700027465820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(5.46346531864185652266299265989588209830477972038596340046745896270965748111117915407412844957783278731133588174240048037524044875999928967753425125705682555219277190276660395984393739754427791927609984222737114058002449717593767347380412781416718720139763763560831069900217749569616097183501956486846275878732672863046892658675036070608869773474008125672567991097462136933844468402615456658577751136172272644508197808001817946107058777720287520148449437408040153565904831296703427837337651292795982606e-02), SC_(9.98506411932942854108042459383510836576611626853085805857841828589727024599578729102555269651786073170459620653723435360146680969297857326420874817490649789865110476564950683767869711247167921681531780596807917980825034133974022054580775539485597880316923766328630105414714347920762036457437458978017894386560496656019128174531675104091105815589303265933653087805554087457116460752142693192884431966173438902253445039424420104100800153312932924952674504484086634204703161803242375829959949079328371875e-01)}}, + {{SC_(6.32438659667968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(6.32017140698571553308044713212277127305580363675994643659056175266603461157186436972772935697186775584447574120250300482955852737095239398524047402605320085802360502734438527396117034710342713540059428441862943107393468247351552313105817924671750521572193181871359324500531838441102862859431500100485751200567575889152186067903542912689055820492041485586215746117964026201886764474679347399259605259899390116183549116857291416283292113855783627598795204602258349944011558929310877634929059670251343108e-02), SC_(9.98000773215447974930857087008764150802722713855075131190757826889154050945553921220661121452365560389264145143901439511281161342450172975749282079997770447047962785911737177061850743521158087304394889557567640376240963884213622716828950326306607973087843641309155595671290107453886169528964221217684412490926872530448945494986971864760658616100419196710271977256795134280916032136610315122731856424655612669204766978915937480231411079284123625076175877311308405119710061909174916588652383642106075950e-01)}}, + {{SC_(6.92570805549621582031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(6.92017280684475612902603902770438207229823809705471271479828689022445623726238799386938809349344091646528512687247043332181204378221893753409890952132644020057841217740487449401462724977326326240588555873845938412452043950543296812754149801196579464929877851745061494558924117827686964993369769544684901144441194229164891237169979061294758072061727145767674440485650023105765507606408329089425013899299577165073264823196330995405816916856144211104913426885632286552108251986044868955272626643196292768e-02), SC_(9.97602686861027172603564582943332105673127986071266218353266069809274511253146184206845366224173756081058509215281054336469951237433524652820574411529939841191369181516825328759338555257162658220329035742673409660923162322070338772130378093565233782382859190969874936467078560818088676989913102487523016799437156795510688393525166046823170397107091522702108912971248346576465497475646757504529354235293789719140147756309348702788375506713736572756372750138970931785579136687784786155541123581503410624e-01)}}, + {{SC_(7.68246352672576904296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(7.67490874173009135069880523412697822508457585502890722795865696772047729876064075442195819127967415252174730960637180479582147474309291939932982065599344583920928985188488533311881202528894182053880415621488280876401150191961474589923356376146456592619669462859281190965749024420664637455818648545745030269593390316639260811403394610404759688632573916754271685582926522678938892974475043221360555516845248432643113640807434458674577935765032643325568519227175900369858636214019202303533964419422257850e-02), SC_(9.97050438834772040838901364158313289434451716031250064153596345308272018821197676129084180229236664005399614878677876975471250325523150960303590418697802419593875967006452331656192889917521490087559820130552413382203751563210591862975073872269071197791671987098499838808586255207819747398217977453730543524500812800441363575651210847109655415586570890200280733024493168949243199540216485504542435209304533986390812843525686313059881265579087409955174014924808295795997240217218146624971087121410183716e-01)}}, + {{SC_(8.09251666069030761718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-02), SC_(8.08368672891704041856401399565977462633145541207784105195635281766371350041715608644123439493672541993789745715282339750465069529433973679063356554636481676969838531641729712415794020457592886899793165051838868222012601738089693486666663383926935917522627219438621364751646584726391558914371888319525238524046669167174017862265555593626706190460862728323563184295785235714399851325267663766041999660466314577095673142555868764898118503537742829338293948772872287161730013924554420829079124806859650838e-02), SC_(9.96727345309073504356335470880926838901535446591427240450997135536600995694562006339829380366181693066021072124078607773475760189943037842585673090508596377006890419990768006320611612165829317461737791908612725831462207730332953868156044465579321433828199753603772645372217436238602125419724170481393494192174338226617942337887718845813995926557696166708043078610521363485223670975974379541202944258805434600100105554638957533334813937130562560651036711336483875166644356875980418013651512472303074208e-01)}}, + {{SC_(1.01393043994903564453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.01219403908943933199608683876827266822331896657015119348435515995873251362892581898523969110413473057175484874945707988194700827394492484991666081694502360714551805379172398977994444953795788193400170674845605172617176911610981540681123148867173832535769953275410424339906182339005138130601396483778642126418902955006537169862336104812922619101165500080507365921158621143838037659291114217732698524358330821295373816025579728381376436689358518738815604135961883722908286779990249376227775979659081520e-01), SC_(9.94864127543212840320288377821634845647085414624812202931183041261168843158195990345771004501686363057363117868426992237675460528773854521201920483305361363360248147058939179651726098593741851629897985101915713322985077003831521906997798395547116734574812939319828244003602124162864904183647670159780723265956499501655186584470976880921550426566136335393136640881134844219644797108944868300338025473599742848702293332135126250466031987636207455199516403656090507615110967455528204674521869347233184283e-01)}}, + {{SC_(1.13781422376632690429687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.13536074842449533573056314560680541888587073396780471734416954452266370815229214023167805970244196892487614906848712576035545051060440640696937578458753351149286198659859230491031913382949861842131574007393962925506301352740569195139817573460190730933124402796432541139111274714968331991159010328143533636587905459810458085734253711085152213069238726912858320015971192029698392132381284060402446909062105834221574702578371713280266538027801135387833807187710401803421253961741020954081638053867325880e-01), SC_(9.93533874464967449063569644542184589167411915145555830925800925048382916374957718228156373711609029097586917146755989532376282173266030804470640098835579196241275798250895989878704696330453367858309552789068201155211873250074943597130122033727796915843325644852705268264420421834017375881556371386266487723607694010828247880528072888290694751350895959530491979302529696561595066224369723425657904124135240815273639834011392138971431371570459667652548016159381399021194622625664031635527048346353172978e-01)}}, + {{SC_(1.45697653293609619140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.45182726545119910896301503065513554089811635181347002919360968238106525239849127106083723447884661619491476318996100888058149769236740617553657423543246126224805640578506008942954719919879771041763841262575849284095401812024452055715104953842593111698915775744793562621776046814833194051220589433393977077573901754840253776854446283075046240949980380729523982026872467677407277506741271915544833128497503377061431926327294908631808827940530456038838245220782204713528747800140098835534702697426926175e-01), SC_(9.89404859454877012674104360255215697445250382526116686234430435111636180480363210039694164084560087713657579140601666008513347848135681345012895495404482313374018887800206381904740118067209223511554356762905416336552796599320637752873442358116522801991236920325855007630644300246736916456519031036406469453087853685796047621522776532546594623313211992046640425909727951781150478344661351442954782469918430949839815203310019596602225454055470344982907764565783793045739939149621215477845195650414185624e-01)}}, + {{SC_(1.46310567855834960937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.45789119883467940942452666599838103341359960449718828761719210957523413508589636439490441998945000690046439423719795496860975068959608833118482126752973685992497281683536728240268587587996557081304567902946969692888006023433259944486597453738216622984795412987238720174132836036097378879575428714062852373236946181672074574586946077158989655378857849435203064073233248254743027223599966958610307889622372063348070359540031851175872778387328989367308344217063459104308008467995496716837575470375139856e-01), SC_(9.89315689011148661602733208421699488607704021068618550402008672427204988986372856602489837286757458629350642286967590178573609349566514100296374300421069016400647354574847125419309106253968630534855968665549713372062563646883184246277672032915339186942154941352874559377354486407977863425325175458300408087571803444300804433696034967764795880754888144181773120850915128858590327910126025450201565492100046247582395277159945474527040466390117883445528272059409080559643218070128411416452778883832850860e-01)}}, + {{SC_(1.64792597293853759765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.64047741622927076939215271236654594127897011750093105907421204884321017294953058710221397042344470958585047103860977693513220373332344673343758494866765737962583701512149928490660206619098121564968746371244119245299480844406136712899775942646822323057929571303890179803170552756084664071910161392856844372737036778217074263519383318878308282686738767677049481400503597999505931480065837516222420967161921750298185638735643161192547265245244900149693758408851479162365892639074870266742575198789041130e-01), SC_(9.86452400508213756079085881807272936135605003947860908459482770413651759106178422243846316436626721487369742516524557342814943387245800871775776486342542756619267901007984402634148564481396767251299084570255625415724967480494452602327750220935561537677562719487800489429908078112186638391572916817894043484848106365987479384651955220754065637423636048081167989226482466763849124771027198972951029669062947310139511886934376746339774134623284767012226001205043028480105389214119654265467805704996894917e-01)}}, + {{SC_(1.68696761131286621093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.67897753381640777196490976482953588467508831683372714558795951689672127553712898036662970055721497467147460442678821010944786665039665291723031055582489572136347698523359833632507727947120936709230382289481829907710145607418756967621108259349346466686730159813704577895106354119168392929747217498250651261920149217884008242721599405476228265647737002662434987399937591531877704904771111015714073021213635766515555210055971877789318074905744443808130938693092802702033774758042610910893914411986093307e-01), SC_(9.85804414886339273471656447974713083827165382741323834224259676470752447152375593455603668369541005720264056620625978392433528478869903852378131490186154661428713627385705999552117875818397456421062795844691099250197140896284553382461330648118896559620824983015387112024605313724313404676635578899408594831199173075967069948429971307857666478428419348687818365697811430472301400125955439683148729027958378246677795263283167676059509815153284641866483046913274472527809361657130996884935738437688390849e-01)}}, + {{SC_(1.78496479988098144531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.77550142947830555217390492492207436163564856376397691603471700758805620505094698945847003802998214813652148033430104346445883849635826609851792442417372917393077225504169766027761171289816204119015355122870296588370885941402084021320650235068717288615664162092993878080601955739098755934530077051921941503847930336545118455807353704448177612457787143073152152474912906128361372592953146702018572591695826734837888565690378918416926761365428056068697441293452285112838098535915209651376327087033569747e-01), SC_(9.84111755208322331601783376284031457134510436574988472806865188081776835817350548686113681409314838853209555871734190921300414611852299784524298797341600773458233613284112776255935237880953315784741791795731746499567321404790697016686075710158398361815849761549871491374222001546515259044955559094074496617496483018774261036037936237441724292540322806453448653765063482075390934100259487001653040960036047517057244093701162162170265301510994152643519555751491036603128207767303628421845067766132528336e-01)}}, + {{SC_(1.87774121761322021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.86672607070509018200769158467157136756113545054809133514599006798341838147428337915964255447040875993446601094948338007788867131495492683573549252266794504395930828257199806193163317944026329930030276018177467799947302689747186012618665496659752413411604967342391934340345214204527433151759729624702175254292451837535550647514340490554770316288949909792125071156560813410066946473274599946447062966296654108025847480349640941090560137303957768362702065204305022159912119527935408421499721086175643635e-01), SC_(9.82422178989002337815610061337143809470232196191426172141227152440284416089850158360549098995569868789283179124826053849882848723627305374894506652402723568360198439729964565008020548646418669353974087094974102981683934246429517284904279436821871136249465341395739281782779316039327149652772606504080824861909307024955484203942865858838215635646193223373227875069545714813048165491415661891289071426040111977674591777031031991473152177396063672370564663369651796710946807883420881870357844328037459019e-01)}}, + {{SC_(1.88844919204711914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.87724475007002131192192907909575574869468107940416726140262504902012686677137623390390440018094087947975695782954301767385993337096992265831822959983588134109865279453818899378809773125976208984682808324883167608808274828949288633727230553400197642565185759119997079741072491457720275500904428836491322659017614746144708698514497655273321270625201156908314994126688002285337649091106243420898018671107461537753842230681275281559140984628635324537359567946033168059091609203607550845641421309987051017e-01), SC_(9.82221727250698436817021350854404602400242591298039572591014001362833626919487015527681343503737629906656769473041944230032084140575629753880323082381394405508949229495961813072980287617641885223163912931175425781095733566247409734381851802008224421103956525409424631620202344202770947172844441311566015165775590081462279294150426616367490190370747077080364066702877391332809076163131938938563303607706965846945894566447961844220594229365249133061197350601224127232615735975265049548774049804588028913e-01)}}, + {{SC_(1.90480232238769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.89330463273083171501356047975738454519834711328775668799269418262542693675230211169484065483867752411796711944188561819164685584819239151595903268311841262796101414713826819050365386774822672846563612883606074822171787843588864652239834264812845660497544748008612180548384351041957557898905180261997435462673216754339482806193427627037707093816679505008419641782078097220844921334245843967537368455528797062366592333764784686568744055047958612982535677498760226067950696358916937565635392744576096899e-01), SC_(9.81913425754429586682013889768017532600113847811291666387725000947456131091217295251884688576304598996117091444449076993919438338637549621415126694566727540442457041137575867954992620512786069817600004167654500318167894032291062929699694909648414253182150669496148723694315542902771679739586190635289986724110105904070094436041592234600515389991658872221604551947008209955001901499595025153606756488036807775907625811360112539768038550121486610887551305042579936830908885733477436299200628358975660870e-01)}}, + {{SC_(1.94859266281127929687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(1.93628466557083175937744864244790830668053598910620087560855663628326397918747917496701804712300389916375529322287795071844972897988282823779113733963560377794242008202198109920596762933935555585424489154825370240638238205749913867006539156012553835311920193678258151553765976847035445513869442729110946964494746309715218534610352446566786039322618340026036341364523438132919833221181717413668583176811261681042404934548226514142822649044118616453915688888690801607706237459440680955231700292236811361e-01), SC_(9.81074929319240387502184662874193366494892376995268422080911994896932188938843218100678702648454595788195800459189480677724548072115284301366906218387046613476243458332542611925311671611202355995756808329738252593319348185404315688233584739120945457255900313939696248899018740177998528759646883140416866189013968416544572880129678451134992718322404596854003353515915190671579319691512530656126775340885106148417889476553076706646054806482802741567572180944742654675167468422482141054087377709351667607e-01)}}, + {{SC_(2.03215479850769042968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.01819682646920095923757718257761476769301989665491185429289158205603248364522455384939136294409419950738281505041126361431633176654744047644395695093833382944676718163092824428861071634027022690056323106012491255936447757470753147279575163352864381221318443333004723142721489343022119668959646121865064655890154871570932168528973909882911830449156165155241550354768340210585682803959840545783404416670702497182916990422425025622036736615873006366902267886516071073081904058012469598959221005905865613e-01), SC_(9.79422695109877704279630115016162779341438729197653622653511871860857427665621496308005256225301647590150890183023870213973551366446778827045639583831856224791984674969152761667061884727276778725391290362457018194029231238622882731367668907983050807609897703313170541946017503082428616641673224025500577727237921678771503953427745799384234510120079570656146847344758019012266371807613472779375992191550902090841424078371482339253787081150785495461758875501897023881237849778458350386303488036080606616e-01)}}, + {{SC_(2.07936644554138183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.06441432111765598898622696628034638008185695872547628186034653306091137842792921910271809676733557669103553974294053328911326243602782740588214297154717533970165522331160663449357525617459935928199881831844976092566068029955259730825952855266608700751730681501576772094736417834693837749663027914778438343298984135440812456259434671197055417724040905908168521650742559047974895842842429141632802570279876313914803674312694054572490044105458254539298356949176720439807787731898038453066126598813031210e-01), SC_(9.78458959337407914880017857366240707691566796770579819059463425270298886098360523692900979968885125117268896174792597043925346271994102038730825752617956702096517615173232766171688879761539440408643776852196199211523030996935750277368506862219703970756235309064425023141236695239770048877371573690168695503939188151919945120866996252845385595169432390250574335809999951819900409720087947226987798251572790175287245792567131272039006656437435690023152451503423135850418689659516050248598574324279754693e-01)}}, + {{SC_(2.12829470634460449218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.11226371452014391278874870071073310255372702463777968786843878133124112097140473459644588680440461706449482294123265808698739331752009084647828193442025974033968649542432348123746207023993629961625392580147265129400199313735837841793972839204732752322634442996742998985161049855446603805134233954899877102074734231966641527718799921704505666685238290172987528235112149856899544215597311460808399136987719564373629445617240952996587119331927421670252293311525292408359167374526921754803210077087692532e-01), SC_(9.77437169337863700915956028138184587880119521309718402773143822868653160875229416631075342793838257456807094385135358010247340775654046653152968486378214625824585383995774198214703672411773216530432708000905914410924076763688720643025445894500247986983994857940703526076436401941590579776244250215552581924626810062975652107309232328773982583693249830181955081354965661172527831758216391460026530511489630646442106088711356971367646510599128382728363593410702655779358342814182142737020940630712872361e-01)}}, + {{SC_(2.15869307518005371093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.14196640505365112786980685694428344657244963366876302714289501728318645735513153812127852740864750088035328907097365685728621293352830777003662293698178407244178434333281299242679553774479025546337174728441787336469271585023342163534779593199490313523522509388806059835583629329411911994168179200754968369466465053277189853243691400027013334899114643882547886884557705155995062509092370819402521209651344335312028605152197178040025081548811752240491682214361328002239129021416396548559625427548307079e-01), SC_(9.76790560558513680337105210359946000639131660265038803465419549929502333210272302004423538883524995851695890751897479645727458798428416719156047191385293536035128459622583740134790612138039228883962636358032372726838818091247096202590945439186853892215507835182481988301876992478308045540062442385616914635141454198946321492170688154415464432037046812112157612157921692137918708124553009612313024458692547550071702227895302886545623596270022503303566442880581687999337288455147084218206433678719726348e-01)}}, + {{SC_(2.23670959472656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.21810624597241132842120335214517834339392143595694143128274453434000897522756707261372395934316603499717542829693748282161138714986831310993664331890086521601864106048610503690287656926479843414514538641298186870853247769165125831749677090898816822399854510209571926905148166670105459035975836926248520839912108203719166947500998176906261366299289408429302405966781907431722890616467807693626704698773283853361405226169691717078175076647095721409493977986059074455050738153382636134995510720710671481e-01), SC_(9.75089763465795884741527131038743144799709001486249188041326805783918794629379695544082151093155092077802612594232019135110813148686802535895584065956564082709443629066755383612577269625034627767644996066171592038545406563485710108199711112941937879356362448421804832671387840559048718713150354052800343295008040554106973215286388458315674666252648980563396332758055989177687609577120292484105909678934546857037299176307632935036447727717180599996592072426254255769122423991437040773975082976170615027e-01)}}, + {{SC_(2.23940968513488769531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.22073899560262365694286717947505519111283644170664206771039359926910630331073658742969412774825969687561966895608228668933631484783875397376737627105822734327244074926245206170293122854697640440913645377376408795641981619695565686182046225697863421164239415487132576368407789678491873903413263920057530744320682668616303876581465600307577735903297039997271274233170932990376623624909612289532920770987498809066596075937444420611813712211792472789626062389304386432536592499629126767217589494642390982e-01), SC_(9.75029837048127723940822139588475843177309010241646824834890251549637760943126873479985410594784222688808386101184513250743227375486680081269879083496987587993892050541293998127521838902835032687085618894862339570796558908797414825586693093266928416593647501074052462459315194898583715110932923738805350182790175717405384839937757189467422189694843791570712808954321923019264560496148035150316447485360041658090233265738607692675797783748168822650033028609970920677845305526624179703136420672529771980e-01)}}, + {{SC_(2.31657624244689941406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.29591182609749077127085238730170106706857736813427802366752664527336057726814890516348780149683921473939966330426614880926920513363391834821219987707185070310628905127220506682979261182544755412644963119149140529134513151273713405482176072789374585351910363421231659904446435482736921672058606578269611158940183557290963996010971436645314363561578915471036636427166369046120643121839806076708837377175313829976908135486291158992783623234671513494993196428199914265882626510236826919461730552972391764e-01), SC_(9.73287156428079478716002235261840740084659684284952238317074702351111144046965256073574026272435872923902375480127932863055570218099850498058845991144115236244780808787578236004823706045777816872726031536853820091469953621293211418659119493664242846692836341723477399946935585891718727826727210269898806213165073098754356297556028189303673469342497995341189516686033293401960600894424313593735029754214488412768090121108833953441556711975775178389200877887553119192408194268363451687882704343063502236e-01)}}, + {{SC_(2.36419618129730224609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.34223349413056397535012002649904436414830305844190028305435023159273725915625176126070536513473503773761443813896860179566226215030054698884364739340175429059896502302795731430829268126913758185127914230290081466116918621292797533041072984612393204017063572807293439427376418097279461665464082135412905032217137478665683141093696829006176517072236564399362165513731516388562375669839784466484294380256956425812467551879325915966779927314593002321921021618774333412509953834406188378943630420645257043e-01), SC_(9.72182813358541786002433931175590541460042986543364086630592342885383343147001536864805980731828619596937794265961718654901510514211526139141566031421543677149169475559185660751374091780739745412205256535077926002018568915189369879576144325949910721880001449576228384354311343808510925877039105192748773741470732514283534463934140640280674768143828127412493203855945797591134707019619827976778153234830092252653180994683559102578078078112922678991500372142077874616293332485901302909710329044805275133e-01)}}, + {{SC_(2.37086355686187744140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.34871488097739499325182931413505351694220593578761046285919402900396314038981468317698513784728753707678904087823880679901353228605506493220315256494105744645692747607812240920726257071852161205469905087486866758169738695197038438740564489385546672183892154520431462186791739263484418481646858664838898624946550338296059888986041536124862767319780937491163906732148464236988371556330822489239660766950561247285175680759472814930515821542521752960722919969604212826825858521092183886310338748881065702e-01), SC_(9.72026431779894251196781770060370781942232099197921106135120661810632188271447767998922653780711101087245102808499149689925215265153567962454784863549632555036609694179109787570991771070663299652723230727682947164732542496676768999691153749799756038153217247976912922241000804288378011338863184388596886818250778639888527560620930279032479989201300352288270935683655631157863204440552655928070032781156882878658304467502917435388924019356549251639438049985256013104098155541508692246870574344519742925e-01)}}, + {{SC_(2.43917584419250488281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.41506091145277088258055644639441358569817962482007100168326311125875063836098620622959651436734701882471449140478713900715909279878500129381183514118262024999806448408272050800309873272930533810785473686208836539208518972638810893445205260384153052201544122370711332024875386229654633135116430009940820660271175620311240007363471390893208722112919297060548435968682520385755428340093566044201493651538792843899162713805017257089805610227242722362452752755712664407437715881745250028492688314820749267e-01), SC_(9.70399303348744740629281777996064222428263418261615513535874548301569309382617106182778792029170310698906217117798672892846704087363302115493606289878448928850470701791100588123422811681772912832747047311027507693577117550759576184158586663998125715627678041983984746242143715742993728038685477261982457848406983044715860265386172457355491196156817728778006847646901469415351803533371713662907224869572879545133363858740762107694657156648981963196682114252505711326234507610327782656200028589799542508e-01)}}, + {{SC_(2.56780028343200683593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.53967476197974948300470152348630856437778853649046907694498691134499701923143127504469744324018390842560373525607438987081112551226067812998235100935619020567790557343921036803399849329868217689750950833215794053798842332077966448743655775706289028308203291243933883217329742193753836170798816464800183920334186820141625424226651537454752528987557134635465607564214599658805078608562467124353038044016403220286947830566599498009540891072458280195284478680372582276803344509618865939427433243186835188e-01), SC_(9.67212758928267564909913781023042850649210074113110150779555204117688346768013381733678013082194846590955208239649965969631661476988930023126634900965028238708450802408191612909963009729559467638514828430744779946263855525266081909443245556093474249189026431060834809707402911975224217225893793806041927048869332697822498929087665975883008669509854597503249122523872773752290855879726093009296214739100119212703964980457607123946633959558534528977914687915954938045274688207897907901409739771736928444e-01)}}, + {{SC_(2.60797739028930664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.57851397011684381653215493513429137796568027542563688065682683181925805410498887334830107315497716941069126625883444139803709878524172956770808697806028611481752384474693564304778209137714825262189628252311617579879431939465205565896109133223548776955538905705145912571038082487099819804976109268792901846106723571853632186612320550153956924085148492263001817363502564890939924812502952221465569860263998509729178129210248318839719688265189638258894020460309734694369100144115339691339084345644936187e-01), SC_(9.66184587467178925054039264094455111955839447116830926670726695111056480734643576588829589093151750938173095092013885475613504226596420519468505671990665350017874837095070411073494200828261854901406233203038856164661310773504995966871525893796073964171780940959271419513681242667294030646037129134794487249645323271597514346135643239350470405850128978217907312787357546601749225176561132483998559247022954834588628902720040609501476406971711684162585915398239747400812327533943923544201497396858592127e-01)}}, + {{SC_(2.80308842658996582031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.76652450296482007185109133379664986610558754140681586207688902695753779035115936420467935545647816866342460857251769261384109822160070822065813412470021999090276003650217199311308412474031531959235881402933414328774518297808848844446010593758203002690435296417019422446348869688663492867691085846932064019691350818883217102844458071500953410615967446227001405852516815294644032584384232982816378360038056258865349197065218045342401352567566701966410085468889024864179205506936222190409656968011900042e-01), SC_(9.60970042064242787586616146107116426197837340865418091095527345944895322898303059643272818932380762260288437483034417861243469274929582394086567541874872298007787708205027386061888638647875009556202948648007162736259944552779661019144892638210622883831588324760346381909877348578780965122436104866880945115333116909739647331839907523858068914185740875256136194033491002352245919072705583433053970894735852186581105174794397321295820740029624593397555262163670489560045281417159094407435052568544583826e-01)}}, + {{SC_(2.82572865486145019531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.78827397517083501471330268973793982020956043056485002311128625203480909125454608266708548153980451085052473210601286247173130026031229525696322745955073475919151565202896009717230846962853493839247625955407998823036775750704244213916449208714368364119934116691972792082838205032077422066968600200507619855517581347340368705484048290481249715689825146802325327892978911844770343056488391346810580610465544218157636626264496716159139173077724718154881144994010887526795536631047147615072038166218903597e-01), SC_(9.60341232267911267381183747437916412664206145164440808035842262775205190353599826199664529625608027776265256698881777090330134881882621301243080560629047040706379584629760415449833531862131285447677178430450969795503445162404785990634547384830535281646944622238215968178098765324782398030728384865653375265992828298473324897027995908029167111445460569023719561109308443466971207024803868610011124698023157985663134329675540970828039088533857954500329172829898440732546662708726879160639308567661975472e-01)}}, + {{SC_(2.94892787933349609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(2.90637267717841491949561104535364579480516629619465233961662088429726507862432828707755088894634084811614033440036389382302935785798227412292625877543660982096842193549591017682122950990682866966335040743620085528472443575918955519317567547115188821596525197289422532447233271171624471539630699450236545660114361779939258247443407627749697559018581819196742844858102033694745403183397812269091094587500437089812851864223611210570999251990567044704396204865960223230481030875348590845729075010947570529e-01), SC_(9.56833307642197273737587591887788902883665572636978591492719689000054294005116111584930889939634837715671167147624840625565369350659889484795889431524480465624414463011497751732807591607039510326250228891745651691444695736686228212611256519708123525260472804829095732402311433573156680016224942389308080982389958686607782516409251583788265789714265801240259587125208043655617146669163064294419760829759381222936837853395161186480505868322168426789639562818842156041662627171754918917363217994882867932e-01)}}, + {{SC_(3.12102079391479492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.07059841753405999831874709749253165600072848512992844635835215773540826519074442226231634868055680476383181767927905664549163235763421873187566026682056186067295416245364237011824046633465852367385333102571562124547765118946951955979688673963059577571404554960876833646916051947025162143308838685134878667283759479195753638922242852116176090313158946224342073520204197762440935994303058357749693323128948419047343584057635944717911926030922197584857079144392533616441138045686008248146167555714269123e-01), SC_(9.51690208829729037576840431988604462673713730884139839166679534444816195557573539853339641864393360660504275727368557568823262838299991557009265270390565138215230359107809334255713836733104929918340210504480125985259471413876980637442771471105254330498206205878359629897338212290265053486914375204242144872790154864198319326981914100262103960665203670552921064019141135434898985176613523157296876279526400987298715110843171312881802185002847789634535539274790806820388986630862009819666177780928476240e-01)}}, + {{SC_(3.15313577651977539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.10114604486452371602244148218816881223891635019324529166287448596151639111642932716934998031321887758081822105206398127173805917178421889838267708823608322091462547482629887325714398579152373118391661733631956935670424908070096598288890186299966082187457854379359428008012221981487666435201267688526933831111640545952633383495730237567915622726814523104107288235805511234197870540243163367745558344313156824938835437324606528773827062481267605862954451462115351447898439272364530965442052891672758788e-01), SC_(9.50699180647701628487396566148787086923240127099513645066330648238578006503678248562865690654153023205128969226084861843000896121071452674247004201594177477295365880682146363659658132961000098514414933707666096881539616427931595066196727129449358218571438918172767600483899976768586022179968871687915301710377855566927304861652670623702239418492743070118830570825034432808087497781397107161393707647233534139257467088129639462402890402094063987132136815195270053434040240225055479367979728606616266096e-01)}}, + {{SC_(3.17886471748352050781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.12559623651764165322212807870515013629324029147733283136368157446606778188930564445609204886499961778113105740877974322135198114141812803765994002806460822966254911867494481580789265715208254959317709157241611034313201797819867973863308003889863252875768021308953698342014871650514004286660121299147145333979151295417317040523136489794647687655750518369731036588972462596472475088750359571516960658510285090228124769299218077291363452482650542774467825115316859673619565065980798986374309452485170930e-01), SC_(9.49898142783039421065638698949823517999068885390741197315225792223882369515799723390096969334365360799651944990990126008736260456275912352502979942152551441391703277100848388597129862238754948539625430194167651244865488557343514835741689946133613892883144839999896471282632969671310466844604095590514416359901407768042119424637583642405348701870119240322957130956609821641725423853445963795969550741785845954269196961410704228281960935161638393923018793106680802489022846850256426254909441722034633798e-01)}}, + {{SC_(3.25856685638427734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.20120507353269781855753495379878039066037854006666100431875056421838413804434799538536796131401377586084756848199762002155463765917890690463278250414769080484724898769887576443647712277040855636736860793283673505250629213435263243010952510656350940830571318488977600380399190797841811306256449264920800681050590486560731400712511724653545521079473607389857426102523810827917591200372568412968363871519210398075893782835325802414254408155013444580413932023311974315726620968068870995641605931014140420e-01), SC_(9.47376831451922908762838282957157442145992857786296235784212495393301704460104847354739924979541258506937517027115869803548217365292294994683305525441088520786504133711569381042592814747227046691642156766413306928961886122517550515083018577582754286916121647946117367658688563677805002026853118734799467123603953437571908546773590375255669559554195262563484850221119526769206964645745371200283122087981568125996313543979605856609804588391661451911736704107832279674007979966459328784100364931584175637e-01)}}, + {{SC_(3.31551074981689453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.25510020620429986937042364685995969898965460442426061833759213271618775572332502534089976614218129638667760054701539234024827232341487900744015042229086883340942475886670748218967768455382802470563754576394285926348980977435867907849404743916110773490924826531389495227209664054616287863263783122017536567084703743906774484377495915058868396046672143731061243453772643054096975342187985727367782927328631174431309715560975124132906098483254874892901622307738985680021770864791926680949697814898232436e-01), SC_(9.45538590685587641765146475422348939326429323171424621391898923841241370861109699620118035342769801759409482544912117998047100210926071569675065306266069361724656534365587037037868110606988888827981568032856808887256355100408672863943230307292336810456098125754092279702826073831888005340499510809313153503087612891627341062875052751636176617417058464678078249954552097871951771955835877730404553836456812938118844431736505209097446001441186653820938292010753906907384093172264239077979415805009120406e-01)}}, + {{SC_(3.34280610084533691406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.28089685607080709228217073013829244980086878681949079724399520487633027638394190434541814538400934905081532180164816420388055285420665732864262317815475564039316355408118701761716444027112107825164951281390900576158191601679471853089452996750018086395127843764080783337257824990676149886920563849748965785244823891473305743274155685943018629644086807243531846369123999673290765390381103557636778684428308305943242684044162534423213607060046023289485555906833555493391103695531498716169793021646257608e-01), SC_(9.44646578461091414178776104696863057321576035366318900946928701896304565272753568134499944857053310401296727371998536245581622116253817033069387105765921559789265574277799055105587127575674744417653448482768341621979927800216571038767329703960510700455029704060654386415669464439544055800082527669571331791333036873476255791772619645842425077726695598719804374966376814363540378984520539528376950546852227736557661595457652530058530010384807128844351046874339155347485472200170675059489215428103783219e-01)}}, + {{SC_(3.35717916488647460937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.29447092824512814936909857333978391523033617107845224299960052310075505573523247423806894791454173014988340319577201412086373605467361183369713001711732687942338004705092653189077698811297143742952310132467187968195376507525259359760053099658177296477700127870263226898313059209834688876407522087440889041166353266203804392232463726842268818252672072718758696114963418808736803405270840450891988650029268928068267593406313414900302848492608154325818062755380535403696499569100684167144016534622448204e-01), SC_(9.44174037468451489365267088035088591308914231862690972249200442949837785950407535409027599648599285502776226478256147933109443887177193380043180048082903797204441059665700123928027068350881895026828260257751054653259489839515100869333027571748111448461762198635703731207762633225551171516871297042884419072089644553053235367393558819799679458992088965895165907796551275946174973771996164630689803536114225907566862466732519042785081005181299097377872608409782965170572073375788770099631685964443078209e-01)}}, + {{SC_(3.45234036445617675781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.38416913937733709520966757813075385353964521900390094265192777781629180976759543154906543836722578297225206900391344879893757491801180228412619362904008080592164773731715770901812124465081132683256968992983463490691796826575296603858671986156353981116073706044250214430461363924565609842848686311030235843992906274408601427805012593167720487267919576241994420803073155263941036332062580595356544207542092603981843801789150431453028466293952942033458196009466273835759200514863565639305138731359336054e-01), SC_(9.40996276486182773958200681776617930878019625164650782459989674721685786733581681932601940668534891638624819666126614999639608538389019139033792924807887873658144072477439537153459888339322514858220157931802931480799204440924867456798681215615902875232401509200568538258491816834661886375031648651053695695008518747665629066305896997139102057691144830863318193139443798505854893484971824361515308653303166230586156475304484860728890612192233269198727803441963654040189339709235023467037077230210136452e-01)}}, + {{SC_(3.65287423133850097656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.57217768507894662568204947843255675807937935600700729302012587696524783357810607397048811065814498967938226837184635262008597624722131769201971396723630579715381213329596400181363335657577351531699109052437321287680445033826034637398775827065362847680483693681794005685257771393744322277497734213843627872895529910124192773346772853342732564856818563872653596038077001555882493740980096900501269614510507341673697089464726073205061497129282810973902529861673474624188173849172105673056093274773828338e-01), SC_(9.34021127096298705697968078480829135151809558383637730911362229182562918575674304188846684078772850195185983871489264274885680433213531999184880930953027049908681630726745658816468630368765358193438388444550380824018487174292352049577694523697545985202828138906216082567906790013271192556165028307746636921068023709736571214708295379075646659675734920359518901568485358630990354123359427090885536764271109786114632830747506518916681775364286220930917538283026948726952104248202947677212055723332125159e-01)}}, + {{SC_(3.76625776290893554687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.67784841593578700750674588555290009506833785198348319721510313441501546058321463219147968315752577898440423256713691448443581574192691647704995440505255700751654076648229558941889912601977821037648184590226948590561121481406700523514552066740175676313066736046455083685677333444270219582696300014573394994875787124404609023528711412221065511192883282687720036086778754443433513428817391919934679127030005160315851412786694335867458231606781752083185163741537531916116786797423415811680704425913470479e-01), SC_(9.29910915246178956526127762996390085290835200613356307328386220167870557042453483854688920463534735704848107614579700250713670021607230520617663103835363172580954471811001208312362172610537525644872697074572921104882182234857955896468720884006442649267334904910635015379373768510723551974327520256221002373202064028482209593021722744220780901469462072704535345501354165333323228964404508546659907713114416707717373662856960688517308985925955799243302609395864738074576882921050328851524967663617819963e-01)}}, + {{SC_(3.81423234939575195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.72241801255514780141645255986938706876112807774978209509387148729169318290725606760700653681913332402962543956038634844559249660919958569216458990534120382717908857425855493941999728044814288058920926074711487206514766810508241197785036696492456712063744278868653038662478625419883184188761197478075666687066372036201467246772272514710952851151273578267666562536774184425760572090907481461965187195084739783731922123489291901533461093513997345050166140627717868911685869010459883198045391385926459228e-01), SC_(9.28135788232546194521132038364809995469390110444963627733003823836878564741627652253894760903734146992929661240763368047921077487071511504258052886480661022417869838293793674031109329225882528098987875042539736745335504700923216449394354443076336899632696517389138146947845556614246814361499391989253510866187677919616513098995303183374067848140596880185394397200828384737411722734422037179383107166780417945465829318245357854600550219827881612091297993125943808294920703332405152597090926176383075193e-01)}}, + {{SC_(3.82642626762390136718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.73373285419486584743972658295685803190680477862822134739166666187839123230941197490101744569617457178315335266166130750832991878909867576156780303116056310420466140082721299101200920702587341679821454021314334846514284242173605432831549954909671972671604204676424139437229520093260765713230589032508436314799966796028238874135487653755383689513250270278030424284694964092242438945526030368678720080221231287652171512279965394603632848669343837316862349798845015377578075793534194003618831109022953953e-01), SC_(9.27681189706387550241935391516788441140986263214363275884321094395171137913622380067740793234692019438631673928581985674669506916341156375623168665333737228363700115091027793798720619125927596016451913658533598902824347300282112219023964174055808582619361609375580562926630694475951148344747973622432995121921328491332370352018238045259859104891643718529474561294212242144058064169023705465099799598255743376952428127753351863671878368910927582778614322123906693275823239648107835571442216049845322932e-01)}}, + {{SC_(3.86262297630310058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(3.76728732695111995209787047749548789524801202873801147414647946480127764915716334061985047622063956465372047461169513840471796315532115359173336743873445306005316281253589057706496674703637936040009863228061656133466646243287601606843215898479726999791238624900548309438738434809614670759249615353685532441359840957459574816765343647633245421595235656600614508712872485696566736853933569217131361140361224346898137318046381744922966597856864444242287465346902114484239349231535780595166779044827033795e-01), SC_(9.26323627012684403552362441816766844353860232235455582510490392971499945546238943437785773235217661433283894687038938985447511929341894290408129096863458949295692036268832967955731447440343561805616333244588222790288419597665737236923593354868829890705441309176814435749719667609906194049295915307431333453326042332981889559360874887602964847967422924588792838807113367272643542930126342757662817756798637736653902160534644351581798443570915292325167093110317648605200947026727695940938373926472433313e-01)}}, + {{SC_(4.14037585258483886718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.02309022358804334757455041997461333566140505078691743879158537946197564687528817873499495932056914664975872822876541937159526309012964625414972273125477031300099908935396987856592915608056201697241267655473404418171750547283488188116580865118519309071287054397095416522184857129278271466239596660565476766442047439665102232580947339905130546605943299522702167491665865861076373670504643374092808500589913972673958794539143899968006744027676954924675483526113359150297838140830328866816034327650573685e-01), SC_(9.15503932557748805795905106327040154624309109701469277166353323330495047580465013025792659440882401238426239102234866148304120914512259428508256188143971352721134308110915372071940331370587398302755815933308805154767044792918730422938424084182623711157576329336501323833302695423872291003776628955935696475315999936581807634223263656320757954433352571965156768392318835020186996543923793469596505462054756265809715842422711159634535912628317197753269865492968844280778333139750719502353805594952751573e-01)}}, + {{SC_(4.15384411811828613281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.03541682109578222980709967440528517225985048739181053234151269824226530297613648513864625533998909524118788668236538749776089110757004324146429534716651136448541877388486900985147623171694083216557078569832275804610942289353672351183249955641829618726108926348664457812212186737762600307260074435150664091951860119867223657528500247305269729397446717578634530181642697357377164502826308277017576726140565738798396384850379134564652651902037517959442379535178746452390200652275134723487656738588814040e-01), SC_(9.14961261912312938531757251963975606171056514942473409705633306647449354976379445925883627419334645798319079684226691906378008685660573351264008078882588903388240223429432390727582752229567332000937331874060395961329538558312773141574847698110453487234957120645662388905771842480604587202066148916563834063955601294103619888302125700623333672970104702059659671918785799250960251049309415162312990259195375210720989849071824171027512824769600511128542169208024958188843927510126581850114332992578859756e-01)}}, + {{SC_(4.17747259140014648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.05702467375339262830292961509995901497692400867284402738762532834250477363835078085965934594517062125768598757766526851922833631754674647828222320869834909184759233249381727184636148778919865878136269359838089231384756518279665084042168764638527443222169694429102756136038221869866520348923978295435720362171281132579960723316488821997782812137875635001430867252792096344762654563157443481314180207819454673446288993477360064344949498458150462068431701395898113402567554058677908621209917529511274949e-01), SC_(9.14005201279271594646377346252649494298094855187886202187175311561295118776486501235354805261697066551835374680825865131418933539899994837700018314030655871117929178075445220795873239047434025597938694394502337464256413558388215077611141956094182176309111001038031202569691323194114312105868329503689334322876507456971856138524924216804206474505999929378281865606690640041390901257392444895055519693226371911181192458524126880247545501940273866502248870119369368065587202123602049180417713932024067610e-01)}}, + {{SC_(4.28758502006530761718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.15742002299706000420350747592552687972223045741113120302870426713056348785134333968622790831264865107728759354826226457922147645004178978906890466302133894988997910046095558992072339508109922275893059300684403843403469208547491053713557851579495826754053336803498111074934352037413097450601064007516266973130955034354985639275464069104775602331875698543320889524438624926558219777388682431329523910340231167389669640360911599413959164117296479251134912579386628245181559149830695067791965265989825212e-01), SC_(9.09482593304473997538693396104501021330804905259321616290965777176758565932026915430359578499551755453855018104008343574872469655100484191283971052910960684234579468489756593689367139584789587966575411667359624750619523168195322985712252979133849950930553365725100676073949846542207245503600835471380015446062680593988976586976478740651122179506841813035927991211507985430856749772714779898018916484970646645074598872686609284387685242249795194138385627188402736027247052002783295346662465818309068700e-01)}}, + {{SC_(4.45544123649597167968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.30948948363146300723121092898082664509638352166588140034727822877235815161424352108919540042044112538762724321500621101449739714554194593913009804814082214319683236683235378672131292239439017243450275920171408813452754685876072458057289815611669924772864816375713651966864094479591019632462077369132936038735863542405984367874267619758481899414566965131924850013983459072412954571431179625787390548119791714022129981306939522139524756766141242804301974521747526987847195165237002774828120929063067044e-01), SC_(9.02376309476649693441524341643113425775341759303426903412911273366445409015974195367557714002958404562092936423592261308595113855232080165919809274780820143580092975184546098062572003695941781094812237267584142325544572854177059090387904225847548546592604087162701961190008072455837295803252923772102729014511396836934627011018807054959294568326023254994571985005643935955842579796563403396030474028550374274698865457770359922325670148823411893173811002205405063320700662280071632096466284915759116824e-01)}}, + {{SC_(4.49747562408447265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.34738213556773642926680214435395136165212079597736426483577114464574954760942735244406621691382502626047930455107796986703456539799434205636585457310894775674965419564259809763663316804513179985632601467299117182000653051524824513608156808552962216189357948272785772516989094473515847766720617268987918246630121096935720033107216651369640459371086215249538380063034041248614589579006572327908496498138487884900261661990149804231843631572049720496487316635858861663215229112020031694962813171109404925e-01), SC_(9.00556875312972708386219971645514750726407028236990166826545850690241517101112402708386772819738278247821223039253372151806624483240868170703439164500972016802825899173423975206096499267656188494467490343061966750639625116172486836412318757879291167804312026689814805881985161435878128369258978791474612039898718575491126104848948833513149233754819803905446108254996077234113802957319405644663301288887608570332657255734673102012379728597740044611750650505636559769166038774171113885058050685760522703e-01)}}, + {{SC_(4.52869653701782226562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.37547710974994897584705187753064697109279998870352465729791285811775949783450984369414186976030231997903936542730772259184602150876951845237393810162537878680147493102334921792973422725128642580343784196916482216571759314951546223891751601357730521264862292717459596414748032496113998107987677978514908760965351653539082846202141162068066229715005699057270713171635519654203034142538854077714450937335807216193587516840434812114463380335247298814001603054089595274484793803913196348729067932487448869e-01), SC_(8.99195196061757399361053971564480269499531017554558188806333532790012165395566350778235469914291403214368025663247285422108383319133726403092839105467674583216419489996730319770017782834530964004420191763527478616501382056309331494135424274941738292844744198027230566152257675219107464838859525235403944781216731525975237957756110906785551166391061485422062979524846055589057024469448090864935182011774817757038151966849853878680226230008627334013666482561987510034815801678655762497740517344098508436e-01)}}, + {{SC_(4.62250471115112304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.45963521312847654864328865321710153834950250932578074080324986865345001347757477980380037307625324316996140869018244797349374314464797111971273640399940359453625448104401592160237931091521134609576373756124867133666878568292268216685175056070883653017465501384214652347965224862323686499134477315926437827890962697836714416129583317366024114625719308608134932258724707861838402087026685949036796896658072984061548484922337651296656540856877253462004253362254138979753923381025363013468060276015659293e-01), SC_(8.95051136895677751924617384872825864034823165128075186190186597441499402594610028026215446231506707482496405049193560314497720776949998204342602626498576594729080138214268311850150450912069884690009285781631057732878261831293268241590115039762894904299669089563069911684151632786373315966907384512964784420116764033039210775638548338742350110429036452439780448368390817796260243838052068698870453925512851854018094826029153391333450112576463179849305395825697902104526169507205246156780703291651512347e-01)}}, + {{SC_(4.74825620651245117187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.57183365940682599975989520970592586820486164181686091846497267559877931718112664415849754810563402264421555205308368211389019514311727090114799160111233458181110518886927325494153150458455801368383321159237832190181397017179788788565348034671792474074784951689636545848238112091715561617887192620879235113630727198916655136944495368600608371090443370159079467076296209058342329613809933283306711620704002298838140270847129213918736992399234035900728679054869995037571067012754502573122858410648385207e-01), SC_(8.89372458482467232515984882706268766316392175186312413450500984156418092064222973341734033663013416063605391090026250094816551319611263513570756366575940855133970988017874843537293831076015304335361026846863787886532344841888477575519000815281674674387373130886802697452616125647564031430432280728588072646726366057290517226076579554292387459886530913543780265990513411010099135364163024190628978406074455036483606737916437326240976630201256303072037744603889453782870568782425202552340165074002154219e-01)}}, + {{SC_(4.75649237632751464843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.57915713053557019712710571041157624420787445280707553767877608145773274376823349750814872550223275249292408134487143378104524868096954725883300351468974464179235940736798953299937073264153740357562860979284897004173565825491677916037847354653853155697330499983418051656375578206854603319061745926619692052275536816848374432279273225818616759602890929640567133790022595885478921907728424755506810023816964299739366390511572287460730643931920759167017258310322725947076324143381556431536551482912904556e-01), SC_(8.88995612890554386936750536483695852513476134588276854940621936209484798254166731221556577381797747107009996077607638797281282169756881823806605504914655485098662478733008167757208013537007605205995390767969085354280041451305854109862952210025061158261775701522354478989910552534967567504369494925409880197034305655329641794883644933639429106847302092581964216122603833735671572473609141321663618765145993837213168005923374608817688486956543652958560596935007260687185222881835947991213367235624530633e-01)}}, + {{SC_(4.98672366142272949218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.78260008103898513541770539979545252964823085593186147977805482371936090051789194883298976044663165847231099537581272151268640403450342975211569193068993143884689281956002319593954584670463486438521537593822985913643621122287101931914945599854160679995190456369532992685427878582889478807139605978076391142750636244370938945332122662246707951249901241678461593975209892588164366223696745448816630911122129541960760185263002196493023080164412082738356264476994025730867735243022611054082301179912362960e-01), SC_(8.78218289862183938423134673320051739785499965734206019255453944263680156104999722243484431478559982894433211165939525740927677802481620209787987469668196432753183348602917650360351196761705324639570894678343806174504972464616029398441977168964174542305616645585564890203491919072688843982057716214127237367286250524167686496351943954136209482432227787458499924910595283308987464828136067964950498523525151712485885751332694062133562868735135666502557385948862113323459244344865735722400659905954097980e-01)}}, + {{SC_(5.05683898925781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.84405858017577105986267760267483916585338576749856882759172895626687414023600023273330690992932111166705419294046737645663748536483800337813273369788242501381982115588238995601497093664158009612529499219498997691419631936695751958404275519240089912385757776444311694253366794224413925157246424719597851079869724407808712512352837701427411197808439056422135011271874004431323584925233546760901701318303123610840709380726059202286895071249175118205548698394421602866816959285749061736352965182903328770e-01), SC_(8.74843394395965551309879575006994293780170209819355112069780111612973176064466490116143405110208953320912424509429632141945615508727433835671823209591595840027117758435836418746698473625487160353463202211263804287657238763845717958427514637781076681465849283293563449319792496466343071382848353682561994442500049737084819031517295595081500622131788600851578430131514229865791059536905654539814085000247420280886316611742047606970990845403989012375369636742595073827358323462326594252382348796306577237e-01)}}, + {{SC_(5.10578632354736328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(4.88682163339641268740830993903499713333103251236996499716006988777878015736524923456957058032463916399381796036990599132100356276535658883546305343337696754464061676188567185777127466524069532800341427586153710719912664955598618474630711138614946373765273877760472582085430071576921952645961698653272413608503453153197806113172393198844347178330076429745969698136022573102889522545090495121172637471356210616480434202516259895560003549541729134784090264648450886179847814571572888679828103974661136166e-01), SC_(8.72461886407474060714407841408344103310566393107946054900278740601639720374550511441120502252902388979754468889400577378186176037091714805093039021955101337802634805647926475922612749821549415482888476878706213592331467661841014901258491776322643364592301082694865914465905995266182295642416483243655610737136004298484481805105164211720159011364859704660695558074043648664464886946042750820472298682202778339382014672269839699188939702066594156121240103071280379589772983226226437628463900506596443992e-01)}}, + {{SC_(5.24975538253784179687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.01191837189188332694214140970173583272072418982091171099990217528322355908701601074843574220620926568587427100106185208424141794463468318550749865198918222933452753894983168862879395093972863777587162854161341623838683267634514499273793634809539888243351153777357711863648802112720860674910650236088326557687244625352269331347752591187431084268052625047310691014416304761150712344502076944589767381122718623738029559779248541968413215734845216817629335238040083726559240958493572045375949676422640901e-01), SC_(8.65336201909365476282264952965879813708728978060751127967654913609217370202756737977950828334691199199976926417238532043794926355532947481142954461407252044813719568757784382743516894146761032400992386509481533113010581110801833850543938490300413179047145173264679839208757360189966101065499739619788796308134610685979722462447024950122740160145465326704016943161732826708923981690332630029591524534742203726563441280505345615124076805639821503843825847147963259968095571638786355692009671769162227729e-01)}}, + {{SC_(5.27489185333251953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.03365401345449383408860333424913780207988550100204590028868870029082008815431504758423586705415291104049317650359215675999850793031199068663273702222642153320423789127546017526321083163725048619710917303499008938706160379552195898338647888596408687619633428569339435377627846917599043895430679468876428984172711517157785079613456068832181981407178101377847554189494406405298668146314781890996229730542960457346820729615088234861697107177030173183731100838582070578677194620296888474892159954565273594e-01), SC_(8.64073650060187094044260451547211688700438767712561600570577794828378726394909204189762941771991578220730402396676955636744871614391751352329593543084586941879928932358923438955814670349084472219097888970353931097795949207204991643980011491931912057515838687636408011057380021854018301724623343646746214428802010107396186526576456932281434816548797579780532292096032569488952258398391121041148784934172900458255768654111061811230940022903378642763134546338073627936701731193377581008095280554682508859e-01)}}, + {{SC_(5.29143571853637695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.04794223638559654714052859357090717999622260784855409808634989078887486144940014927685708982597532834080469457507632961361574662347134140277434796217695714501665325492161428047990334644102887653883512211880498181056340765678114100867222775547658592234983367280978413240569780775952453371822485892673013027626427801396787248830744260539502204944014104375516044504428492436280713415468738598119114927622247476993647376152875728729101947432829638976206820212333445472631237675433182564095978329615664320e-01), SC_(8.63239707022993597136893322506765820034361346112663538463972414791073370154305164478378003111211836597802305631320518420581136473884404652772091008668276365589888289444996661499277415993805087615581532633652799512767943967396863329599519961592029296231874682822172954305207266939493791501493068017981697650940168348078699710912960970725464127937645010065872291814436415764998136905354545811245853507327765948785155015610075015341632933686909091119377821270677144528894661672118438512863633219124320223e-01)}}, + {{SC_(5.34517526626586914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.09425923396651827601926822928735155064088252856426082786526190845964204988316925419044872254542709621420571540784006603826411811003448639408384047769534128208911369114785800703498443321159790230667967132978923969686304217145245447891299325303801607122440580539861470662063751394859981212814864251307909808543755875881980444282277876104151040347175759486733148808186549450553664854348136500863053904875153607921232269445247407180353728071225524914373935912046274984168277951004602019741469779806341241e-01), SC_(8.60514513864506892008571077192207221249060554026029914290576312340240258880637028036909369321348861974704776026746365068619441047096898112000033846266863807610452759734582914614646277049293267980030326298443752183971203489738755455196461434851228175258681960086135023742465121275230985955002403734817537433921953870100053610664908725632388126059875337258857523149249629888488047691276578125376557074285503537637244758876151932277452200896536592707368519003989964434924497304420869045947916636586185059e-01)}}, + {{SC_(5.41940927505493164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.15799772553089175322429546804626528729984402971095986838191671437559838091400764456186303627799843763884537162041166087814106014538813389286133552707573620685136964249044596156941771605153568829089706663067154626220611610688573741181955647188194844164474728375527074823727245043102213030247601723739382886465900641274005163769190452602531242975852118536822257500909949021778880648088059230266333056383840262532179419129696109838728004168475695024970146221363032255275220888680046617773531409243514538e-01), SC_(8.56709165723223411014335237353370281255069331993132041369453793661319800459427331933541840549977376297771348346737288581359391451133900500291090244022962821184927791851021143294497495159928725343129789287753994061178720219940683024896165695812422117725701849685285221767838000418978261631909106043845565174640775546510270806417747477826212960857379830622034161031711153431645404985440073536073344356127003444050336984235043061917702296234719814367574435512053911951724834398066173178051050112431061131e-01)}}, + {{SC_(5.70668697357177734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.40194904999217521625501804690859171039067247880710746234208426075198607183471611383408202308291614394771378315161022120939361683341863245328239311080525400231914759172133604894627749585360351572238809861901598552562064229601453100001108907323135635709408318063048590299037584475217997696082682643246277303267205386540634807765892444596945715402510723540439660292036601740905303050564714747573350134003426478908063404417845734148975182487931433252466861406507785899684486691296993422451783426280298401e-01), SC_(8.41539936433730016393560004906422624915938938115325194490676417499454277363257513351717803741102759502698131899495817149812454909175331973883700436174253569027354446001310497645728117157402769598212946681008744824515769796806799794169428154993163962915010793856563617839979899789147308534322116774551895925642603030657985033808960856990336366381026392080924808370232298262132280338670172394908359719237017432710995566031980474531261480441546418187451593636619852940900815738161505085936768543613021562e-01)}}, + {{SC_(5.72337627410888671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.41598623328850393437633038062021323062155738168341351833436028051969259019802500119843827650904770820919729374704351821359078594634887244323485747368770264507358749265565856367907429518697764687039946840362229092312343189528022703643914914433562134342001022778527431759309937446852858562197449128236170264433346711673981647198294649587638318617209546521551647034779793514294203444340604570797513762817006497651085453358051967836529579122058034836273502520814068448980054745761558457956910656478888369e-01), SC_(8.40637217358530962617166869970573153775954370007516064477940281451417234267504782461385855075871355157179288974185941910150256426691364101853486231269256472771425076245123147503280465557373884684173386719681462663766345749724735744081185615292127240794974750109376937292899249194855048353532646675177599991950894912833572228079283360178968590319455475444665383695538491207634412121327239846638502720531644839511030834497680853242745850920233520996468882127230891627624467473374628176256541247234848953e-01)}}, + {{SC_(5.80943822860717773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.48813165155509844192454069897378255222059800318848971214181522712559752371392694439688950488008279295033778330851407407538523566795739799654146239460178355402348023334155625459433534500603056681526233824629667872588475660174360717409290346777163781004021237411856260793132118482661903922892916677044810015653072554145111411250594554349346047088432220346892733029194947849380035748205871877674526988365095539652382297318895709019317770178368606577779278083479508492404153089849803687769215965281310732e-01), SC_(8.35945039911112263677095616391004433124413495567336752167508906438259743069245990282913973214554571969177304385557106963604907643376708364394277256629360667941308687198759712832908130207745510426514303099747739695715739450579154667857648740171678725754478281782329679391568802376848420455165726573253805090116019404447208067037349934527135867262568590898932612843028746601037322593214456836565075844042126797907841397369397266754100931894716926234857663254549747660361282112980225408873527817007427990e-01)}}, + {{SC_(5.82854509353637695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.50409391298168491596150482570353186473225165074869249579230018842157715680613771764649128192314700378992368535474742002485011421875906957385285657324300726277958078036298364933603213485725269218826700648644800418611737606433714230535321683504247685363594238155126069310747013818822879985570627906886508978408394982831547956257956536544590409045853086713179410800861138484380067373798502293727454801649155059590149624917718627938217373033323795237305120621762948047394416264859542618264254192433551073e-01), SC_(8.34894904745968397122337143288036538697236885805361244093975311074767740052020907304944995451086032530150791095893934644176994383991691599271559032684425891447484026866957350929544470806453316870804998160772266105931932446680136021999620883072198820874483568703347245846148122134149561292328463469229261516928882818387894901878049370770830895114699946795594153739461667478785018799954247645045229378473876480527746725169467194980012963031723208736422455186147677872207396000474362366949139854735598959e-01)}}, + {{SC_(5.88340520858764648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.54981328748038594389409222118296493361406722204316601039080045097561746367256420457135064548526427768164560764497538972461049133429788803032011714631332435608878919210217380233636379382769112156998945046969620193348706178392702708810399735183425378496361615421991110404840318568945206401436743158511187018101434033771663853525624649878863128943966755740362299129646209442115612058642089207004232090022736843462658328519333427718454217482740286302870932210190437836952038240934544486327443980179039611e-01), SC_(8.31862804037457555573106159931804242284656404384485071335994653733473005054884858296577229285204654906976630312250918448628259671755231029989458048999183555644405516193443670517849772686240891945946039525999988429248534398424025093271276531490728880513255793488192330389893779683789326076963100529203447817457355637888154612527551686629330928079288557304750909983330349509528372839396456227835571961111453638045659531283279746393377633392525795321762710545335320001100575629727024680780347585595575401e-01)}}, + {{SC_(5.88480710983276367187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.55097942244132061495531571165679871262724499795417513173083413485055019772427361468552500656487265250806213156009035760042477803381019482502820928713219477595502474314187126251062789023921328177960662028807827415938348104614614375028942563055067804906294650682269671995277955728374031283398921302129002652523268955506602620674798387968196126816730022488639662515652349431661679239799288485652945302886443757790689209020541656411027584022229840977377299248051528161147723320595369228691342415811208773e-01), SC_(8.31784992961720983534359232391305188584063751853626211735857810341353297240324549055333935647771867957433112311280525051166735373970035761464744610858062803351708601490642216194702218471579830292132620536272778346971800827572537398578189594660242145927783320871528142664463408523731435595615813644112256518861511592562839704037855278536568685836654817502765844816585425626008475692953552493348690999667725721103065091643783290643380737951921116821247273152701349225223838419791660101143482872112798004e-01)}}, + {{SC_(5.92362165451049804687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.58322288253439051744557534267506286885060444861732597553964794301319966217038367928168951903535702321312327402000330303180259309249997384870049569392286402372655538202926605727312480426025714746316833966374166956030639926161547076571832803358539092894342194537261846646241645995470185118744157796984447771024032092880613250533078792521101538396462947988540549649727418090597597042369359700302976217046151525960360893745433255209441737159975029418199167071462611499945258530939279452145306487229413816e-01), SC_(8.29624145284745020516215455724407888077213673743160788252677680220684699002053633204757665277322687553558235918282689862240807444306321340921280927942735138774702365689856787083484164468516551522355741319231716986119476001913931681490030833762017164619862117967111307933862130716575515431340977126892141889221627007181268431489962360421173167336434798315226930647680073783873124528566080722281638117951478967706088693998991575443387902213162302286315711337900394259691186938803878903789406657834635069e-01)}}, + {{SC_(5.98107814788818359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.63079775669406341164390113803457426876218890714643705918420902570219293533895083351987901536166942345184372663706747350140651014744113421153546396462631796031006217208526759117477953688062277202759268233614725401418898666007993416469703642358102740447434080477006785791875740627440576182794001744019355766499403487919514669225812073408286318205970784355082471973998831868467854363704446997087804272211009212208588585247986200104642732141375695026387981342821975523123173641969953803066131974996648408e-01), SC_(8.26402544909011658241432585065175399903821756918495896750301886981808712362149771940549292790542650045147545087131705570423534902313068039653779493898450768666898915232115053623498506902881479053281044503339148499487375815668198415204385288141684801981955764702648853853788870503645633524763713779262558003952462666882738272366662792158419831973039867973436791725975558771042770624392035686827655124184929447826740277132618212118727354263466185605275377022580858818482725012031583671742511286356968707e-01)}}, + {{SC_(6.06312751770019531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.69841326954622286372776223794751375442564387527024987387600763171257473846563231383256042951126744237939173335621133174126564140203783722168940160693903369738874220238990420957962570709306595253925042184973848951481282707435821990405340612615847714760791702548764815132941836944307996329168183043964971707047310773157459458933734373488265390996753682505088988425040804909331792833393036337801209481443096681293307113983919326697774171463311972401915096644602844245006893698721334381447170355033646130e-01), SC_(8.21754745708593558893877997210453421259931832482362161541788802678473040052084610746608123448789164569464037819997816728512707321503932270814997135283224942751431111955279774528079707816282945989997447671912075562165513682745655357171785464101630243159881468499507267100858619865385365378153126523299388132186668506319523531631609433771914896664530437720612542897542396620962675976882751729608935582973299418407696895956465945687660264361883010261463103102557157947538917975921761520492381028453930485e-01)}}, + {{SC_(6.13096714019775390625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.75402924758358231334650295925458267187997174384331476102790740464035059881669019648945917495330357832199117443396061757906648148143864565486655997217444390326266423656372581729412495134230605632775775658476278080199106041530764431654018917606633061332458253725936672170985855414138958779244233609811429392906129724813200490019305469102882138282187987758848707647084287856167057475384628960636610699989646566839615230658291641180186325980960769949839830931757500819770067681359981531260310739391528533e-01), SC_(8.17870083925024815995359911687699926394910179663053145399361592982175638714351229731592822367031107979190069836208751007928500526343506812250399499321292994038539333622880839450312630804560038815300432575283087889439566134289676657146439855404820384685674238529876396699346001212546362146669165127918149018730694797820327381382869648762338833184522726914408835689355455865656334360248829227226282107950259754120637101606226726958719637090515583876970735442819938536217801085805639066391598625734381401e-01)}}, + {{SC_(6.18999719619750976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.80220763340469067252319354348809525508566786663639706547474531609835093810520638777589378050103692705699084463851477753313324811311532142563670009162918655521549754866820982915345992530355351938172236029963335866781105855187839277567473661203089423531017328580776713279646844758775417526897324987212907470655814963274474648397065129785999643316638914124658962640072449392408594369804885547288085537425585383679063570894092676237315239702551170852776102535717628402664327422929792503986746762679984372e-01), SC_(8.14459247469511753057400936713432968553335008699570079517618820900093799983757685955255000345600952230461680637343901677229590811516546365848604073614715769779803264305390559219038249596549722583488785915653953746125687426557192475272851289635121215421678870884842323812552055139391315679645514791432234634867654564749569105902510236521494312939601544245500760676880839934466297825827186225790770259383958886091365471907625416746368992933084207679548025720343035493993024080822460847793935966129878775e-01)}}, + {{SC_(6.32641792297363281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.91277340467781572501372257135126124830312635097266844526637989610697084071956468123140510670966119034398211587971327145083152065850053928352251643344115891560584207422020080491324364553802811726723984253955887539864120462372467968010685410707352060877347028135620212231883891826722468377361823617389583423755792541719634023245230960594991594343071526963547302594773264903765030123757196797987522666861964544622436149688806334825780946673830774577772569410218147060834770459214518300816091633699325159e-01), SC_(8.06468292401720597243607373643076850834340099346187496135107605436527121943597944556982323079565414212179242634055279668924865287777492580167307947076770033365812533884726110826320880591592785941005328200888816051713221955488838557889813329320366811437654737145172121579310229169878585583506116077567673630546054503550524440060601659762352169904975997908131574019740393377568381882944867982968248139190044503341642391989065718049393007583854820241850044293966116050194422903385301862216349966179580820e-01)}}, + {{SC_(6.33131504058837890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.91672206560683861698540323502801662910962736425356518288149873999685630240964750179568794247108357160690946288481169713940570547424947615546778155106801267043363321492217167599527333952918788752215773564356918443371916686724984099928777803084887684542012414845624911080183652414153605252840275567461856370803877535932898839635003969989430608143290403589515438067716518748385434785173915278527980007671148142994730359776314173753830353587565828451836432010916756952104014001139911897290974597936505947e-01), SC_(8.06178640242726505993242967926694062895717233265734674638169215030194480752243897660577492537544366232156759749837560312908253286224387082540538400275543585442286943985552382663607758918581064299617916349453746809306887843201069591375384341794492842128432850981297373891467581358275207844126709085873133207125511792634497429296621277890733121173684425000350842660734392317571807218231702881414377327633225177841877645449690103409480881383280862010633511049174847649468719070167967064564429876144436423e-01)}}, + {{SC_(6.34747505187988281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(5.92974219022706010108992855867183734966583628307882658321095701243900911417197558520889489349140573836663955174824380113169379533261839946161834656524007580200253067087554456971500650127473047120600495452949972788383451786221139777272831295410107709155445038220377172969485227970155197636388634511381949187072449999444268403796704613250710106085854068057822684526341487684193917169435620792297081433473836123012367408071501519994617388901764025552905992036717787425425258583171549106370962485524713660e-01), SC_(8.05221445053726746419815971651888518671645149916391855552948789936704566336934637270876559849890401158717510479582527189926061647034445841426220869339477187180352878239905783188709671871951560328539881083404045467288507567247387366383779542043359249431790499020266939594575410939230015987101843244838403909034273579593668568094414648076559519075205679025774159395184845727898759689983721106347949365458892435974166757049922971026861665764014954983365451676686431477740484946958024140265760598858990745e-01)}}, + {{SC_(6.58116579055786132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.11627877491971613071587044772912068167383316357396771437061427662844502897427620466609259658621123319126645682492753359863400100008935248827153601001426080169982697412239718329624276398900680993889862668591190467393604988686920649867296487377076766197467386553383366994250727747880545993652542366387060248701021839633518153831885758282009991740386520264990613788985281594829350408970333117550653195156920397388678526234922066237547328598780847807509003389905942436432182574100702994762454278779126657e-01), SC_(7.91145586775699434706682325152449132619505292885241407040398261444638165675241801795441015121394868129782183647525514379878310240059764779307080503506048518850465060777594888337287672252521112896981531471145120562580244467829046974149957705801022065945453350900334077892966242546656406133204748800658419775649709440059128375286344767464588124626908555642921898233852706827999777042876474714967504251148166304922393615026590743022270142067866633081636388432547812265438968963733102573956969507972985056e-01)}}, + {{SC_(6.68379306793212890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.19714837588306842543058718138740246054926714910382239485238502970856970097538661113589982165067187132619066720539640268281160439445562932670528298393556312197693972629332318849922700175319101493247268865659591171932951208250809708474317514861424683826798638953226526386055915255029526789214936438984393136364358891272530680010418976217414151997197701807740467294311501247213013330492290365626594001647614860954112844174704251515352162101891298939671842185917196856654362819933010462684597327427126850e-01), SC_(7.84827063799980379211779203074982361728059891779214152842305280398556004966511746571802372837688959219310907474890329036726089422113991718114500383303663007778344198446438007989934781619010896796633674747003624402106368817595803358545678907629281002244851037896204259330272863561367660123874616721196035359424902912316359766328561961112087692177004024520170858826342186686483560937099248883139544325049777616232022358653962294978208855164667855551374367419008803669675437191041878513041619215093977207e-01)}}, + {{SC_(6.84049129486083984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.31936353372929666377534172858021669016330116548927716436870689842767426969839532417161302597045406330054939921641169232029932391615578373403572026279946125317776120510795978090743324577846359989163695367113214738203419801342136118452677670008707025764333970967546198963531058683258802446493328460499592380459692702978891403432765465115433277962954729226399518070155783579346510048953263158414792673476160659020329400278821557190918419587562973276289817258986258653326467450495799750000672275655561574e-01), SC_(7.75020287015587588914578411771195074192222224624281637676262362599907293785961779059986129977211025177830784348442168786682183450667953136365155001785832551965132555642589664593887400121769662552071171946634504133253856348488980396076654712434606013146460571880041761226638371907081882080141542409394003245437988920143100898825137908543687996968163501342562315851663970885479616359018385950082689104218686603061204210645171977533827915317644911647373597167897649132335989478522271207287702127764972518e-01)}}, + {{SC_(6.86983585357666015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.34207892130906185138217995521070060980771134595814223028401424268550028414802642147887935516716437745780743991663524914640101336980226910760315195318804657377246841453310597941350572874724965315733117460066200156678788109903386746756862845060984064517563908979315608178603088957964531685560982456412273287353648076897631728915407427856053044019768395890995445141933769258230908993320288843265454369317690853165669480148178407097303779349415564481663937376368058473755523881122097622561160134717532533e-01), SC_(7.73162563474766841048483415887815113128270668467243021121425122543440004967601932517340170925412923140648469189427391493032322424298025129846960002538396012061927491269154650119691626990617439396114342524616971770389759352447109606952151184472001811010660213708603024649577978842970502993544673075017954455152924365371723225635025754836264482382777266251590714034776765873194178131181718759634161918136432931648140234489835301481526824895759034614583345030384106065853342198571446960029902288705166826e-01)}}, + {{SC_(6.94284915924072265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.39836052877330415849557324484442485246960415097675587817729130947796598088679398211918418430782716761499904608212690457611529828373751516280960985062072450410659960845465774665370459640245023079149008857282599337994588698772961300102932470670455964033692741822804798894372704901582184812003971294366565124048223850858405484483918946765658340154449257921292765659570238517273545585244602216656601192100295568929395484656008714082018969371732663016880302660592574145128291454881820236795996282547497677e-01), SC_(7.68511434813014370464071069339832221311083583138535155987163342906384134901657393354802549369389890372582861852791541558171094773595275468892230556500115368424467831259833594084903054252311484213541678484269411902594249145222403876708128400697928924522816288182254355192372916075954493920965124086228091558841373752049897442849725930050350651938100137683579995803849252482883931876266606935457585636549131596716992112380751040967416114021919373289953352841490346808526597399414353552864896082644783968e-01)}}, + {{SC_(7.04085826873779296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.47337314034375267311253727881438908324914118655596903539009237679025823609807063414519572776218793579216891876342705736585205189677473150287545285885407465163607235072015934997648155039523284701130740438070319174804288419720689962870453835500841745307067839463534671761104917869376632808602691603261461941161338330182919616033742212613058331738146514456978322077962906477328825044854350200058603333916688049190257182038575346210285536253744404448592449041637901255073270427164340439531631907267607749e-01), SC_(7.62203648547263658124556003919108631375059729455752347315416115221615289769809363766341996100406708571842804474615990281624544657474722340968058460824215775408209176056732637981834602157220055699450856816394920036523737063558780069515171775820548685613535497845720729171156701201157483359755580485996949045344633845078270826538922382725667656783623857614425595386019791584646719482830027977561461206521773127678313382573998766556014080907045322829632444997663307108065388896464215295338370168272490364e-01)}}, + {{SC_(7.09933280944824218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.51783172382929841429151101014983203627578328333573592510980632952108143767795039762068083754176504537476052511691864448014303053397482545651822053832287705058499414996079783090399120862253899390521463138924593245394562793681032248632866266766895509930032123199410475544972713589449479893108999097158598859942660268342636814309052963446861245270616519908709276995009050713056849385235425190399279180745720917292866069759567084841827333335964523406079209272268782749630319370918462231083124713647708027e-01), SC_(7.58405364035911841501543520471024032415280607540389078760632519463303840329020571045544960761585578507657880881719158444633178745177097217632381274410178922552576393958541137449644629859679438925409830143968442835575512375287556654397959631087638498982572638282648212386560157945725763904932732228614132924703510889158885743657357850286206983294111169997088528262884477065796101760395290581798087463364077999452179153508035671219845061724275612416469431248397257676448236556699979541960793793234354297e-01)}}, + {{SC_(7.12137937545776367187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.53453610421558887191770037954012677520047542608253781911414475633135762082648944605151127271372005391447599439490226146358614114988444338767607370529972443432762056723355412014818413359758533894010829816380996931409136716572396990538773275750459085751647799299686743029739389324120791907775424334541966372901562358441229790779983815872877577111708548355032397661700832814240256454741065353652618317355244351437327924856434997949990497272086397007826557763113495785992334434996013212106563351821012639e-01), SC_(7.56966564008628816064935109195378426911911472438595933112354357748505074207024354053911829385588364448207071677852917245130645012968655730226513657764473316710014319131523151887741595944009634322876870833038475238389767311902965604104789419520464629484339752652742222247350707958785496125375295437037990398818672449792045553554805101541785038921513194543317116169605636216403146997656048107702306109440921721516258305004378318430714899908536008728011634964756998246216104383496283612208246712707809890e-01)}}, + {{SC_(7.28063344955444335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.65425239549281551387975096958780375858851892612581018364517691550986625053067200927521434055711311934858303843505620795647699094991167962072952782940273782031412754829044154523685627551088516306144183410064210956927323855949328679639013060157012524469106990066776143600831038975143469374685791501211129515334810687858924199124184919832544720039523738772834549979678896244138923880641120598453180075472233453229563256798121518710091633983273444804638251096554147694798885058914196854535864381045701914e-01), SC_(7.46464500542913469550304482427483604981998295473097001834850867024888391361681154549551085476420379252215393733043723887519290343750467446615492574133174914266424284911131646002469252866740075071221424899571812395871594617919523849326962762794240599720695713605778048623064419305383185861913597186339664175665315128235844322682700305036708590451177189730578210863235483538381358838871934839801769986818109659779590737181465381969746699020808152545779451579969426999507214595377575535319512818498620621e-01)}}, + {{SC_(7.31353282928466796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.67877455849328415313685511252407361475290664944847974694748374470430525820546311711633036068027917655119375109669456363780879204022992271472046839476884364877059886387610485425570541910060468422158698050147164337450261912118083547208431050535457571356039548539993621937778735874494935537604478209586817246415426357876117341987602497257974902619453111772426625634362317200865655014604545340689911403283456936384775676107431194675840774229025714882598541659398348276336357516196404102890789080014278310e-01), SC_(7.44271256981101194346209628134504606702099618005331278155702255569736794611306017252420167649556829316737944208883220062940525982827062319833178706198085721874692819642620284994022263051778498810953118700480764998742939090561601606284588646002048877898161498445470978169991315741359253391616577330147012226863384211221768778133768652882840183361127105099183092604737447476797351760900482923533200976293883182732697626771002910636171758241902951875407238841238780899997688911332446119841029304425479636e-01)}}, + {{SC_(7.34646558761596679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.70324920178083436441069471678009876567531608055824879276071736344347039103770036213432254310241283901574175309710833116509980678094724076935940860412925232677469144438445914009770303026253831951547428328761003164748593055572657816784981748333393830149829036752582048673452037841744030077018127966629362072622320459806895246918774521500257936723572715328716560257228806009962495784185008529474473181791809299845667764302386566655812206124328554962989512463916225593807471830263098536186790040787445839e-01), SC_(7.42067720217128208561458295260588188538883703614529506403332866542499686401570844168065379119686678412121172275197281466837025752106843152727749804130330019398565607006458973651927655708121078756327411774608433581084836662172963084466807457891491110306028947765023619026441420363688723939400112648843886687616294780578466440795163986186190618677996846555348224767261142760875403983928512707788875476531712495126954048108942578212434188855740383855884084742323564540464861291379994368969288540451950217e-01)}}, + {{SC_(7.35883474349975585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.71242282289650784432824894888486151838207425243821064872578816539245485349169907081030400639140122480003746277774671981965140905966502055045096267484016861019863714535857263392580875083896637853022773890639463141139601546619280185776793076302947369731239294025987092087696578758868930952282914246773195675160183965633100755161279046846470580227563479309239991478236819173709358267985579481202693451305809572478116921859856167569426408004912947211637308584527298655605280783744732163905380489214924919e-01), SC_(7.41238017418548742413842257768684553615834706641899661393734845623817313321543239084972374770481917354445618824230060053347683515049801885699977994522189688560444826046327608254570779006944178830055126966799122232990289767677705366215827296184520130230453169104436487644749130788789590578134797523361818202371818815713878405573658388136437453814494911814556871777282812555049415325042882677170454923162907543967764711047796723580024692887761925274834178826463996678615559173056991061779677528918102368e-01)}}, + {{SC_(7.47545957565307617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.79841113768607340695944112185623754809736842484299646727916304809581417691228956969140207251779386697691577741546714860663854566118219588035062264502499883762054739905424569936729908546433662571248273931646831354089850605147738721655208493575116647047591590318581469421315162634504195730838974528986962257992624940001258430180986204021942332453689279121755873712801504797017002558955812865200707831055953451811123671205439221790845442267042379316447624253844858919397067431005597259087018747582178424e-01), SC_(7.33359434404344109336395962586828145328170625700473318543788063807067543247262286190805164830755305055267618419943813198649946951834556772016494519206476727461835185579311139486423232373044374013136769637717868251379282837922690752383578796965266903327115596677790452452974648347092046946474286910607295726282964624682284028852420742519914706578260046372907466723896662431770421690941601880002968886771614517398489952077636798547497165680848712519474408905758365283290126582236138958173021236321161885e-01)}}, + {{SC_(7.55493879318237304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.85648263319370343052834907809005875626191651889287119446755435146659758692147853953563788614131230147518332897413407029130680747659427336204146141672902830333767903465293143774579343702237822978154183397763786037274035612370601549591566046393421688340945541811271244446471992893685816844422290107339474582031600707672053506093570991627232277511247616242319229764885571613405065990151195420213966833530643133441081048453151568306471387731353145348084761549276605935431818127669747470731171948853979945e-01), SC_(7.27933004477150623008809972442600651954692477743538333356621001503195937504667719700541942845670031454624830343728389907907347912403665447373766506340758222717919268080026986771138260024517905388101442952981872598882504479570588596424852623521866672390156090453185231458894061499369931924249576747238446542346316663662331729519738390267757834504744290361928534954604379267936758410254241823802609817231482104502777287124391370444319867894433306323868979969521772048460043626033860564960537038095938656e-01)}}, + {{SC_(7.58935451507568359375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(6.88149431809074292039011479636345409272821159878239199063155901100467548853254258110502008140002376113188676528706129709315448525290898431272202561536901596271344648580137727722677193046008709171376549247548169720757097475212932378765873167576807240071876899865667566027161620638408264083007728986171521870542890063333655118712811809103286225117916161550631677504773924185458526354318750799710662777478042439728309044909159664046364148985809812258610769136628334650773734441115032126818377546249320163e-01), SC_(7.25568990173124895338125876594655020996196799336506719347548207108773241573013361988843912380042967173319980848965347758554096264013024360802944654983722000331612085095493975827321189492026812256223514482673900792147489176478762598983238564011300475061164502341735461598546965603251492600505243119182301013494029540587474258886399189520179110749622455444080841081454890362686228212962087454598613627230870475322625762519069603723940374929932243553431361246951367793348636809564558449766920116867744525e-01)}}, + {{SC_(7.91057109832763671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.11096917179776834302812515833728935272468647127939295351299971149188833687056624942448454512139136992529960373902017326874914774749603887673330321423898880605971457130146157359406951110300162856514767402201313562337065970349644312236506562094236677034639384877728912352270003473603967918428645637947206690444105732593825279836711281992638418344858231107764502007142454975430695021477350271536707626622731305396784131486382334375539297869210070416933438023276579520520390765443097807298713622715115891e-01), SC_(7.03094001096167514247452987566287284250780249387962704875473628545617541774686956469062454651828607591249279271245274397135059565688145447752251614500578532608639894834789582982265370817785925338408376851087909205953300730678570975044663837957505742441580929432734796231676920571015992517126640510826168319087313544058187812809896079863947088018101287123002496421080180476087162715986713471824224540590420685566491565864250397615116860667256579933004489120091376491629218063464801507664268777067724241e-01)}}, + {{SC_(7.96196222305297851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.14700790241734210718720054373475547331770418031912502525123458538003032746062328257741114689875158887248192521669534885392619195512740041442251588903822310441251190280244808295176115039576094740370089122366345937461478223639891454003139173543796840935464808976223093898587054390970330087960689894004259716945839339645236791663447552549659390532864608528110443354882079183588236749335885717305759587003809538258581826336560351673467159629498055049188564719726195933822175304136939283243967908242494550e-01), SC_(6.99430325642119007199077599804338282359678696992845283199385067785523316357497003279755601846574384248393159269985358143471633926612287125404225155548044445499184262453697237728665071432512161845503412031823157453310693426644414151689312780774754757744034146765706240859362206302826721474463009388112171549014346332567224941063583183938496276118915668883695302262651276382992275711085438741067375802053372839441984732848254301369814425503989712195275586467060144295441465488922768796892003329447608649e-01)}}, + {{SC_(8.20322275161743164062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.31365654704142739846905019584696358036047306428180059429371468748059482991110982535801827867051266821311376439714397817455993576620879096008137068230869436717130513368495882562650856370559340685959779025910012852712707473599834793447097591460733637138441028399795427998853135945798003850175043219913393539806928792759611776050133706181971114194824150248235517135756254418435225438771834830422404958975726823719539265915396582983003903333187901189190376044100155608302909472752013179273050165726134671e-01), SC_(6.81985541722975717095534445767819481908864976076961739056180221697736132141265585566999326647245602003551277294117508416627907538030876733016883885497005656713622185232867964646776021117768267034928283519921750560161271484197621123938042103057877171133153181306536200901947837955079582005567762647046471690332827928980954613232524604877387625737395340351244820721198289997787185454105134445968462217536369610202581676650929417732788588715743220458135214003687206783391270487189498386364945123860360356e-01)}}, + {{SC_(8.20823192596435546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.31707181381410700775852413944623256358279362863429082318176094644074345198934818511604497924306255057761372148290611474872724768056233841633053057759269625564484451756172360890862732976965251435126007770329830159323039601468508914547084883261046412490538012690073602709905862777673769760539824714203891758844099506177024515786538294725856183082907027976942601097128886158840072184464238575694374237570771730277620705978363177030311651969394642265696664888395046181793221822925825553797830022216861812e-01), SC_(6.81619102369403480554305225830589669749496286393568170235405441280278381355502071404131720011170133029142899451867504224912313601433029599167624590909710073729960213379239331488260793038841494500357027141640185106376120026704091104273895547141376917874461252188333037699289790582218493452933614232800683564196166644334061074582102278060215612103232488660156166325779181387963741004387571863137929241835769518810981154518776634995901657416266901576969346164884723744461577404233270130572283559282001269e-01)}}, + {{SC_(8.20830821990966796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.31712381701167181235940405073972015213017639680082667356112029205671139034521852374354906548574117997188054771119114790417352101300580820315150401962599864229711663045499725615624769701732815805881838686006938070145575222297658526345767913189362679305898973467899416346980968752255458435026841646196804679932576337820885098573186877489399993520726005939470747793237899520526853009339508138223853067623106893392596935713790281374384104322060460403415407546619022310768214665068143293181570925173506030e-01), SC_(6.81613519866797700233561078830285348868909728015824467996873436863083948946792713662365645207291667275891590707518243675662095426503292274413226380893079787669115620493220926707096054723242308983595288942728615386528125187163599085233693989737313878754308845546547871603235046915011224509231019712012001921675566002620394997684099906522793791517970792998530561520243658709327233522695971109704887254996024093751518624146215852953903992457981183041783974253387011361571840065767392160436127405910006494e-01)}}, + {{SC_(8.24585437774658203125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.34266415048580601601171614328189945485523348339167684552882817358872463794947236136970813327323639342718055615553899792751868468349220589184493975245756465487196821811241807511777442736289719722639891858859935335651084759033715948897509352669673287794523647621937969176476233408092160097961004199695909264152719287052279829589065558997590492898837638209347034503953069034794972138475844603380815379547139569854568998577295466205187088165937309792617517840630419328308859176681506271893863528789248027e-01), SC_(6.78861423069322423142287792579947877264054945218311760117309756513802596452752265941644672458371639416650177013219274176072434763072510338862834134080437379766218972620884833863128184168443684900967637836984797742269511801017789421153124594757787251028286436667001509092732247658107436228355788096082272539774666132684178084465292359871687041227303291674144130444761955366487836773097705032915931079300488532047764679474318554807323227573756378123678236220609152577882604414124351048800037673338910072e-01)}}, + {{SC_(8.42336177825927734375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.46200398377393459649680826081175427868749016777479391656946615357401168769244488163885501440054564764625884632208092536154327477843944291217071640186792695307439200754180218113370133302122271947648219228033925537331803886856486078614193043394452297264214446820642087443784861194790324615980733184632898468451644948907519394191384802169154937632223335637190099490677170800235666162943855162453645700761176168292376053760435303585758309036258034104340588553649940846104238991034056185825466741067882072e-01), SC_(6.65721387264536737199053622485047036959155178470601890364581116448749188037417941827507890537685995449185191055999932249913339748939836149314270084339122677529396816057499007557737481859203418779490782222223935147785268990135438875913775527887167257753754804880001533585490387945085868364708189831954961379748257097179336872008456812624559823103794451262576155877557164818892518890148246723174790434123610728214709486034014405859537649796728092585200795147670242992510582392423063209695060045435639049e-01)}}, + {{SC_(8.51732254028320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.52422535846828634329763573162467783775835226181279002075499246862952798511615086223852170067031422097672291727362551514602515232858650334266117329374278299553738913137263989569552544670658051509333142548737955765721640897185016235302271826229961834507496959699946522065996334471687240277709484606165787709519654824887215013969427685512023892851687430587576049452204426229183023498749375591705872255297982552737172334378319347460973591687233240652609574815157682893428262843430032255662299652114089879e-01), SC_(6.58680747820845207658025673099654398208410800146063243277102180468596975359125822183693199476973064425685212001483520724112988866317082004563755687487431948863912142895176713746527538414153195153195902886992468372105263034943619928953111637060748803014031715925157205650185348194095196433146735511127968345957898334184182275252020868195423853786179773905957452209444524740405316126300170571443431668967442839329584782366429851699443487772336859741150158436052721645009323345331192414931319025563193732e-01)}}, + {{SC_(8.53235483169555664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.53411833445184158836140163572064590294752166376711614137854911687483379705773538984310687352928737777394594541765815710911439334046554940997735934546678121569321606032983208295786707007964249587180529897328468589036869105558173786011112106628817264554495698575451649354701607098355116981968314044614012968784188544167980927924327829203173902544581781617093304811705073341251715042320605762563751570423820183200736572716105436344306462925279390306546438823958050135189736037104122213194340265159200889e-01), SC_(6.57548940554819907573257528419300834282085959566971485261554488964967201945618235849231884529358874985523899727532768461452843522892545956567443976145556104320240537755297697336571583884606812992554738345823881726286988930443989691129940518355496639636521178039189177831792417756204567633195849709348605779519669211602867459041809898937701383112387501471360860974137298579481666185065773825441102462503880766351019703882097283156754140486193325603364399157977161246057275078823715656758124740769286135e-01)}}, + {{SC_(8.60631942749023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.58254714672202734054245631300777236683159096097036356652865208302350109743073684152410962467600654933745740571894780398991815718735737674465828290725494858194989836534553160399551271476918168363229478652799066322950631488733954033725999111904414202705936578537002784526606704859598219316245631357166193113310254529311587598217265788825906764456617882297267525625811076294767454761426589134159107671204802876644719093564206549129870218372256457669807937656025972129347553750818546756113960841751027002e-01), SC_(6.51958424807423145724681352366893044913213138350124776252984208258289594390333618059154128345089870962156493775277533940863780236374174323722886635230257339343144735789204877774178934520266472338942566719658189212879424410842064912899039411532389426668819500380572357870722896319650296336689216304697183340394099481481510010815179251484525103064808750250346301956674840478464617935466799014788108180458727627901714888446114618457583761783239371051182986228026484951181476347027474567524391889783918188e-01)}}, + {{SC_(8.71434926986694335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.65253428839936597894596123688310569090389685861623807747906998309584979498111611756491021760688758158177280261057414612992774369589196951533402853137262845408946611167107061628964817744786033131644642061511740789926408393663344035662239704331526547276660565514311115240209165188348550085117827815853949524900086802577414033834083707418722164713516489527969642212160278115195142344168107122012981297994117386544179420772588506796664759651956790125837907264670178332084628624287193563546028447376088112e-01), SC_(6.43729127544124799494617385424141789231958756626700658813041071428586618072421618554123624352683471102337219690582915815457570760436788158308993420812005608224926825196281977060682929608339080881610829922835036163838266204844465833776530324738412004194818792577411893967126443956831812385983415880848530409188330707192180880606478355189200581927593129330039998521115777958744436380095343335367391348225109459340647897714560715485246371205710624833126032500096010272581171199733945341054993950174852275e-01)}}, + {{SC_(8.77896070480346679687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.69396652942502806680163137716408274193626505179261027990589455104514099654445891686820536957953425257143644049015207376709302919117653628962899300992652165756263697434031175190503438476983170969534318764637916846678576909260931266642525950222240920446950471376533409258600518379609175823729377664566681171424703748226617477150106440828466552604008804711774039970531971579418161768254301575392735582891812001284274165621905938490443628338710303566279299515235154679302470794188934092169362981251949139e-01), SC_(6.38771313101076798184916637234037591631630476518693506025388154191480127015986530208615984654102066160223638744973935483082365448593055470002327507056651767849014396832146717236805375433305757070883314307096701064579347870155982807280470443786167533770758312379604707343782359552342226011090633160077523578145167810262263830014035520208938934257324947353709830917635397437518132188605070760628344358879794443634580776390332446040995026564847535658561531518738815456137767206748819904544534640439838368e-01)}}, + {{SC_(8.77901554107666015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.69400155714758174751463956320581356413411030184997329885336980347356484417649575163611155974682960990074706177152082869084220135289675660713031854544651588961152487309343341711683624026191125452489208799790205351785787809081119847466237333627648354936014479460242198409063587836547650641254553229247595634761404167667528762434341974636313629726961805413262922094769725972157142384658932879933860014161454297080776720852052747460337256898405341811175351699528039330897784979131765307939727592470639742e-01), SC_(6.38767094006967357656721511247182362249968335273513367163289737234015746407858671691537030222365046724074960371995585209481034408116108478891455599216861380391587550923462076145935873889833750036290480159091501120762411644650573651648384896795839250531931008594162378543229267022201252857767447467217098240469413303271704255149771366309687473842534080354893076656855938206360596197074473714118186747774946181365116197433273399245150535866789495922270957506694650891577421983522076341204063582668149071e-01)}}, + {{SC_(8.89235734939575195312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.76590483008918075828123704043379132878468331801967725591605673654298358001840206326684419987926629893734512865726422938146342620014396972255648966508116762790571194859893171810810344158133433256238149661062529161655687364822434788153154601343256287361124721577752182527927513604966699736996393440773466561767934321328287581238024121937064696839131096415250977881879528957788874895432846673943989658776895612535263832944224934599638742571023523788882394130859758332145929080625534666910077534518151665e-01), SC_(6.30005731481845588273036576846426690914673384479600856701742059324050612829369196434797628379175419804925394509968380629103231661724961641777260194329213816053275791498400614982137324243094565751574074781317228207243051532251035366786012453342678640581014349843567477661892513532630021150492274687780375569033734871201459611566752431721742424256015626449576318661533280124185966359039977200045726794752617623916091606371771736962437251873603911510569433817985133372013360763397076481029831695401715002e-01)}}, + {{SC_(8.91755342483520507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.78175383462325163583674655043042202728281242225366935117157325225181476656067514837038925992809175658530368266776381307490548251307103630774046387484632672266242289311664765547821562848972071577684296851290420415760629271943958285077554346928275950835563328463912933949018430611596894649981846914368661843356689295600898585202254923488212519552327802028131150621466419842782435111397756440608545404660325234025515092577789467351085455750696722955121922226534931082782879468607373923807792631205949763e-01), SC_(6.28047030542508964660984155843210515427976913195341299397416880066259097497362083346900049795444015853644951521277472704361379055931891605371832291636618616517177726378221958317024446964676152999346744441923607521882244531629771088311460630752446686692856778162970446447509534204791120267039919827654922453565156209163873599425863243716981444860656074593325137604592825588655286932687854692292092466450735118048208393976096856497466171234771756357427282306123858046816566008416672777532403900088297464e-01)}}, + {{SC_(9.24067020416259765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(7.98058916312735347801439586114492791247504356700035350372617300035491325642498738425410757498463680839749405041855752082386106968476536443619420502774520054342166910929880836624789313581722880090984918986108537736057001903701343412875769073471137982084510071548308674144125832580017798601321260141766392193897611981849608390621570191349383770802898779074210023525381294056774082554327936599442711681328763257690606803631608191012883656486022173621194670860849528550383855769646670248938050891350939424e-01), SC_(6.02579427207519654945448773493218643267792147248371754581363473609795758074173708675888611453910760118715338469247983915920902988424878326449772922846334087438143568846425397712506600724800259903626436144750040497543988786284363660844256167811788822919038705711937971087151329191225800553441192050916599960240802588789035166708012627077407281815309268388481235738834736964636229043914244433488779816191329214444784311750898666557245872423964610573173614007380193002623880636557775872455442732077202276e-01)}}, + {{SC_(9.48538780212402343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.12564669864108740704526484207757833147196145725851301659425236068573275909234403133443871501638477787527174514236271369871077558250470471388812341752831884260599506119037378762442877644976065538329194428099200524865474042001514134742196903704060954707513545904884464229614830486230226988888294221877802021182915074325369718722295726897572934557026431305430687003882383920835240558050143374898263910116302593489183653819757258655043164740050711216449209244822863602113590113477874407887852238592732150e-01), SC_(5.82871046877979668715013686472506038570335511014029685667146599013044671091360805600736750567377723257295386279133021341229729624564952052341881681745532136732380301253980032056794607614053910168194823631388805229025653111289051579838992739177878645806958792467024000124031374521011702353300856519556067014730143575223461653982478513321149281707480959361188721812110134045643590586089099302264567372058785685184102186595081293450343022216284635973331409511742034734523393411078859037050754025652927233e-01)}}, + {{SC_(9.59645032882690429687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.18987935959352073875614350221457438487323685041914389690448592513530220519239651037978269508161267490945154670166534406063138841144746365313742048742546862828773094010795667607517794334441680608184241612401077775499508697509903758691830768580413170834939208002045427587221365787355404791692261389870945221206227169987866104028291835384398330045112454088191868853133231019091108422846986286460028278842813913496964587302041301009065202916611122849688878484886520224028920980574386384102219209722855994e-01), SC_(5.73810736003641035253230826727130176962684890290455248696750116766827303422983360120185965011205954543173332229412154060647120027510300901757548306117034351503130130202085092968416847247811715273727937511806279023862537563748813367037827626060355844175390548989122146048668943889392616278176867772582425831898960286338108240256596607770829334879298832455356563498708453483619048063771908372595407532180041349800539325399287092471638125266915313546537055155682234714560615363056319665309958777686371598e-01)}}, + {{SC_(9.65941429138183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.22584617683364992207229334003659891480399795460992886887186049774917024807741696479772302621685034469544288146545476789343680790813545029298766875601266418608150059915090250070496220181822089491578848816421876519641947266567872130828556654782426700108153109976120084697153230120698732412766844108655477561974029439822155046861812169807144463116359326576613037164120983818549053652688252257188181444212785010666711648974487686167965608784209332436955384462327442388935187075011633997680936530506621554e-01), SC_(5.68642723290039340463788908562022024375903444433579040809686968815987000773842985996083775322299516895433513241758088005769979020979884462820837775199929822542884367476097461845417648807912438092370123891315698660843301159976154405357298789332468698532196213669597486274889313498220406935743400370789951032049095520369775978550650161707155538699612971113574623040689344171208145873292268193066088579319566948787164894940602613163719118941837781698170157843766742315044243719982001719645953102362474957e-01)}}, + {{SC_(9.69469547271728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.24585732620709848369504663267842802945713140931526055303694584350216444781433131159335710298075509928061921295637330893161700738598008958933088727135651320082618894171378062680988313516773413479819875937871239017735048917366136188501496487009707095259269151030532083054070871581776644960270094028919341405032530725113303670443168536633275168354421263536701825456258624838606154540730225508037857427911887076941147694286382203323300676505455315912478482796722391610090650659648499187906577186157737056e-01), SC_(5.65737014484970044778411229540371735847367473436622430603910050048311316724172043446931327368976907852993925629246318655379949415439703717508354184841540236193001008856676979113360314219485181368297328528332958098894637359296941591426628297169297310200339047343894978498011481344298400110679380143795548248514001432340911565558270373397329312435370958143775911560520015023284874302778208115584385775213841761140000781186422079463643822755044052498499982835998207187441782548557791825513942412399991580e-01)}}, + {{SC_(9.82646942138671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.31968865865227323980817588534012145072956918174739347526060110784347496214243249811021514168456208338095803368211236101872863267851708520299886585558448598513907571648992356284386513455055507433219573905646545209558087301617308485028877164795043620893577991875789384432613469220875874237363555058119846748704662987579870821230396167878044611649792961253689446672029168473841797727920174931715223197252628290994681792926108830975273333625101578331152586580555117601990196126397627574074208787189349152e-01), SC_(5.54822319514029090084729982333587114741858196394685335721946904277279159971925853766398940004554450358130664133950870452817706012609815744578631545675150846874896545586299851385016742044321351006651189895571335493578725988267159464590787613441298510791278188261138742850430318264030952823330623956793112834295928275420379877586093404930828104809080519247793234083735911543819805565871096192190064772523384701149841800290179816133071704715005293923596635924030624539013903890347671661902299554760202174e-01)}}, + {{SC_(9.83216762542724609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.32284879858217969591237255043980110006686133815776202922271852776856771350332101339010324703843517116138866856908257614411748552627016061940281028219127825108284681787939022381958904898149444831010716290354011402876628197127433048291019572067903577899308097770420413212420988463826311822629338611686362193199071281878095764288618770356886283660840885566136277968760899908196602739182766462957125144855460241264414889900241225376090029495445808532222733058272682759974286930523604972591541938462082738e-01), SC_(5.54348156630282013522625791463277163031019039811554196308380824695427495715350261849345006396636896908970353963418749516078472471112962527026429006539719950884742421763042926231859443073464873027715096369578135064095865745463520613858465435926855006544338822632391199100108760066906871869656435735978048783045865402206282833748844644409629233161318525829336270222617930815810267936525385743714996362448897523286654136619104074977496801222450463284538962297449469961368377755944588348099574260345963541e-01)}}, + {{SC_(9.83610868453979492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.32503287102961641288101560354377842367104556567230972911622477903374953912355915245242240712849108712975196498653679010031326983813457851132151662065430308536699354126045252973333911068809938765074862248868066248950183496391766060621564702255421080483036262188122479946139341381880799016446714332666959121998488663346116132867751565190150997298130863357142937821950846814913958715497586314656834866185822964252264867773407658286314197967136187153405146257556907174702384339683351878110201477329379447e-01), SC_(5.54020105197242658130588336922487025506504893915583522168469404039255366646111382241684933345969643188484322454205747301489360618730048950013527222210645916151377608244930275389952630297948885962678803933526584267017432976830694495613544874392202201421177634556433257628036811829533377199654511854934046963490441917900799491948518218492351408077283977664676923257870328730978442918374816705738155924294226672938193936714425640217827125527711078010078149888140743747761531647128525612808314747478972570e-01)}}, + {{SC_(9.95408296585083007812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01), SC_(8.38981214920497704717899373418671446928483890855060284799740971304882745920908935736943939704589267941989830244373551895255783588073679113590173973114584988190155699825108410121360686195883747719007007893468921218727274807297991363217466038664657137367654723084973463290946256650626836794264683004278211513899268551920312342756266515826259259726512189757872712853305609667619002475912833361518495511938047440818339505567676937465864214207573785916885844608123312547589207580716363920365861285143764375e-01), SC_(5.44160381698746642203232743195166366078139632851608169818655383956057684555190540842709659974600662215781778550742641804821634170960591630073806891722462368887780189280469596950221091518334725610368627400853243854101015413430763147562200343691917920252378433090596199174851325731237602783897610447664865875066758800548339826233645876541728305686639074840192077219628286646161024241998090709536557554219707070398247151276149197837163311776708081751732490183361938952600699049554602049842531852153831782e-01)}}, + {{SC_(1.01810264587402343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.51113478224340112819769419406668343296997137852125085026627601033695221027221680739759228450519239906763483813641409205221569907017649544939651124070200567253311923725255685394557115288147651330781854842724082858086345305489388659275201553064204666324384134840442724180538877542570522337742275387903182943487865040150306562753008760418606812138537167402919354824803373463154562471658910999723607611347855634475155110992237162274694333736177499745794536149613151318943582648699966229652005358496444489e-01), SC_(5.24981758906788806720321221493041546046536853101112224546068011604066251428211928527397002568495685344162019857040043384725024419519787535508177503109959734124106406089378362511958029320766868127672972643210490560131971265057069410667058521515850110288642291074881668261518014868103948599442592327439087184092477973618634763995106587135252254198900232994974891591691575540357713853493587106149036294617662585229941327315258402172912132653620060621681600736287201723171700062195198507667762376876900942e-01)}}, + {{SC_(1.01955366134643554687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.51874338625406898751796376082414397227826831688945988367360783686017719569653498679495095886999187714603428524281489702697040739076723012974936631879646188087684388206213784841749240905322462492964708867774769042085311978421900563215780430747642719614466282351813971497903235599082563973431089320745714074712238730503082382330756857672861429927076360205779930674044202676173396435454508624742394250617203698465375200572249600589644541811730973102448523982739402019880822845906443454298948632220496623e-01), SC_(5.23746227854220998683713255684654580420349623900629957727586767135312869229549505909978296996917115078905829360331882501779993750493598375098975060336863081613594923694881885705251788938200175364653283701562862904858617940803729599936402634714305971022089877816493348526312968794620717565655039815357858048838314590763290686976255039108541835565430327578529839018553312044777610181376111606345346520328973885384006538597494774490276543810336811350585911692458465560280443001411399885568556041662167070e-01)}}, + {{SC_(1.01972961425781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.51966480111774361399069328701995935071372020219143309997787113638393919403968136915121861175835538754600834423963514889305138630433731608710603652954069400606286560468407767107107087190487293833952663977007675506578323630239713581324373245904026958212213991969335770230236066364556367455390182358766586599976713221737360674982019306470673766163584861978662023566581366437871005356906184711866434214164772764320131703274870131106914060711534591606757951979026327161823156723675231577861333842318394569e-01), SC_(5.23596329977544420065144742862516506591535240888055421546339421107981141699964339304232991065563646931999786376875813624393033637311422887716774299128151274880500637675282113944004049643846577609752770470220724898109324739773136018960486589825495016797038063092491896424124930201343699338944844182394014862004848223072687172743460980013255184854002963549706263053554276115375457613032065224733557244235021560239945266210789382637676232772997067729369831317445346394982926087240786066756007065976865199e-01)}}, + {{SC_(1.02203893661499023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.53173359993275510769201141067594417476315071144690812595653997191597262071373310668427274018706715816875602616981734686623449274232164965016889022072766227485090158582077532768757553401295445893372500614520712981163822507310326564305951524928590439452755277457928064464061417996375315127154980021397765697409923057256186808780046527978929918652502064643686968787899776711539456339228100446563066687648856212511031491366882500584309071946065416129844562857212623798449390581588562607486228411763200912e-01), SC_(5.21627470325120732269813404010316165592480428238754867261218888469888255657619814460908558032950507230122405786726087773136456927684474035194236890972080578053974577567271612823522403564086609541956175796055431451651302515819459184551928562294838939499804848508446524019874020648005304158480870967982703639307838393841009588105053700130042111134661167777802421383209221609204503819802214845033946879099849476229349151407266021771468544538449977330323950620579696088984722405789899241692475022421773349e-01)}}, + {{SC_(1.04224300384521484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.63537510869255626006639649621175598735538216049096047128314622918130121205771750109554598476295766551959430732465946275217523612600471370041572597995781971371139574821411627966947779135063872049262142250252738667498080540864312933810890040892588107753549143469963815055751855843122150785220518063256317064976725772586961349152769650156149724984037410207678280018005860017259990329083346957046556900359716959229695808387355551627553590335378265769145941947762744207681462479232274858383582258321146682e-01), SC_(5.04284609443645644137677327061934533419774433045359305110392458573885056024777806215829688978846281239767920668722056849722240308192065029841912755982623384774057517123723890362492952826228273224806621806848022766917062904511082784603260842696460679290869901569222629711739587027262051175653556877760863288406690317492056664849858221206006338415521392424645862165044887535133202678928311297187596359205254783280406914115226610484936105009423715924949584882457354022994692793854393523665552395861099271e-01)}}, + {{SC_(1.04284906387329101562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.63842979002663238449435204701296774479655826106967229981922424457731096065820930075780015601998055141776673434896407704894969355059239868184948033405937550873032643388663428811900936276062506481301207786612350255430669990490729215226235121222349700973545475451464817766888760629083810292716211070263259927244982625803510694487567162546304875630668045246698992365147563968339464619497746621408196495203376801750617431925118103653718805521676962134971750239373249604163366941443887767002203983420837004e-01), SC_(5.03761161293528383227164965192425790682824545017807701791943125349294184971304713651260221666354091350373720273671239823498548250306546674281103764298601227442025581335391701007457061014636915234497930895368532401260152887354212476227233684348573925252957161208187722137191234610043021535983693195925363819124150968863527869550047518806715597667180909668244768170869617482829743029747976901530078386044099961964993287601498583919304961877326655570710119819762322404343568305105919239287745118584466384e-01)}}, + {{SC_(1.04861497879028320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.66733247377868951447252165296997103275902323306825603286025420811951433197464955740899002646743162306607094455479834727516163691620584323734800820553232230642057166947959008797122645834292278918957085530137883249125718201191981410765862667238291809157525861398511128998302707821659666786785287395993637713049198043239268120875487982735366514430906588661471270367651330814997354583032200750284247290948390741087239847195715009409917156323220163532420782083677592580985013545912022698903528995514045046e-01), SC_(4.98771969831719617656313296373814635897071682918217378300535179362133842502217650129347096266351936125121723618551438325664026121428000063243627791654072553877437816025406826832329511867150127042335149389897303965017841207076047913283061462035024660008951807614818673627574045268003412329001964254784115734537224971653343491403923664649208156711189624863323988440483604190657287900352131068098389460854483492037204020251328926921040829359333356258262691810836937317931035145533664735541511268437477996e-01)}}, + {{SC_(1.05866098403930664062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.71700092969493626279546693696551397493991446149794302485855185071559252304129808957656534322985619215530703595370148231144605038244762601499558086066253298201721452458139800924319525215992700207631408178644067538811094757639672162883610186864783317216938583320140927245396624100839223782524205485345890430722933364461184266302104566922918644561789891784216336399824110016096325069780392799828712360498692723629518772477904562878551087979153180016119660661629714428171152595134549244921669357637378530e-01), SC_(4.90039741160832963536753160205593132037374376582430495044622014080102593330940543147968970516476557812862892251484558355747279918010270824195900052852345758671435269294213984729937106474238759954744443173560342611126375754001378758626835355417533327367416358134292679789559890041569110407731964541608547658013533427986766123173276022255728761713441308385331757886687513503928228738633573577685286548823375042623755093322781458210089213265443292059658113438004651530124637994621070590528663737218059825e-01)}}, + {{SC_(1.05906915664672851562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.71900041148086937973555321604330213985140886896008582336879680485951801838536757137680147227689999055281146908629782633626208197037156626351590838519938227644843232798799151269867730701592257371390578792620045627497869615806106292625144081738038149002249083747141778533295159439332365548240034531265935825458152081675135035228276014616438214653329840956584196924947186240548057375341023247779001645921678513017568431415395475877280675923689817306500303008012021121811240038724856466165513133102993682e-01), SC_(4.89683896249370553462585077764343079070425471970774934269762429179697954755140596970515332881771953730866664093747597682883770922465296585756705379891189164474550828309710536478687378551749125798283750925804320256316131484501216766671168200003672179899082617391804064193590636351604598132301058797388847653654852045763239641614760898092478871627214104974166613633239197560113865348299157056473943881709690798686908910527770066800305622871129681295792885174909899848762633358144516547914334749398063424e-01)}}, + {{SC_(1.06404685974121093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.74326730386322818165403183829980231220704758664528761387420793318199623988188287228562182015131457264237017227064746614998591399611548349871711291795824419164529165313313021083410212942383334148070717204428133348646343376310245442559551132343333788773189360881220499349668657349467625660011112074882591775033745941184779921679182973842931373979727864745558701879046424084626658938114080386064766769338228176043903994613285122403749373739641206790074751532744011064257881235735911936010463427099612510e-01), SC_(4.85337788073381287161887688374158104787121431696676269420939153194208236780343659176489818915243470660478303445022418521038772374464737790940191013779627823755948639551012033500994958158596241638089706174311771559123609136179569130774973500169818848750983070485708416951959646979887204315285378894267769462886898693434976876822042800157209311826110363162979732940360749999711522340809800368388340892598573711896105070909259272401472483472934643092264455000104919075952371469577743222764107855405023035e-01)}}, + {{SC_(1.06605577468872070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.75299967790800326957579466517206035726317102716369270128391908288135911852195765828650872928533486235396733613840588300344811474626458612175989430336995298154686296235044268747799901895709710805420255341939263059476701352744184930828290106559184325681355173874783483292064401232914578814995682806788689043618503855229338630525795134718154627642954761554611143112771548418565760470236546269560167412033082374631027328722837121253712518795218699823558584473298010514761381916663250079831145927637145512e-01), SC_(4.83580361869073329096825498101204074277486615445135909310168681314825584186657157743805083975295683484952524011405934900340956505003827546459728857790961378812777211919246155282298673275109441911741584594258370232586494882599141950379291167180634978982484743769885908842514792665575851154827558487433305869590301423981877540440377311878647101784216763854546447711696835968416389178865142487352325329510548680565244359142338882708937974756485549426742727485384836573096307146944816997897987974865088132e-01)}}, + {{SC_(1.08875846862792968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.86052041181556804420157853003809295509020381003159632678330031926155613313697651928224454553461236532769947500220261165833194050244017463159967219713343190888940872924004769898668054614960612067768163625708922335854525564217293571956099993449125025760275399724646641465279235965514468163044857266824825421011134068746859211431142030482654092389788984448661655175218265916522966248599635107890290516032595136634978232855673202716459245381925484723476080448943336886986452613547709008515545495817569844e-01), SC_(4.63585785284662028256719823759376681906286982074268964315510196265728231707894853818039426659059071662329061671114028654510223558493226539111242214193138182512619106471156301700943201023981145277827931214941828831485183952462840898818541019222917041622101466393157750959830184099117253138133262959308462031622066276723882938564922305305898089637006609621812072121630293042477785161605023273181599435075615845484386493659177045916992081830224540648958182405308981792762102370113493840942771604418998517e-01)}}, + {{SC_(1.09043169021606445312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.86826482236921672447449179706708485375043355553691440273593327420168239477132277214344720793711699844640227035419019043695996177843752980965659507636733114075792621556684339379870175681850993461559212924371482017360541975449665834411762915368590952833725617100522956368600899475337046764478577981743840414752227942784520893184527669100141833554190941821310082665045546591131096732242366404075879568232822588962816549825770535262047406532220397884349718398351351345631146467329904338988277781412388604e-01), SC_(4.62102575629358345358193278220239912943762914155557091630440688880915027260681567495686384307691236098241669002192609522100608971538797481822468296643338310413267745080338888521763724449703721181525711685961754882823506150496638839603163061168716786433832063182624298206059756860545859311345810189175501383844100673642551575982167724888306813123033872261489745668071968509975782852008866634876883678069222670357529286372112832471386556313264785227932452858751012982478420628900495737432680259485050530e-01)}}, + {{SC_(1.09919786453247070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.90843227852636417754078023670181836726969888550715979569761582421788842009811166075357104409373200529353797356296194747329117633898284595748884928377534387104217962809520596709461075749050442194320744109543038360303571206655530254972549509191577835061385645662404364751070825063866314122891742192255538291420008446512683265515675475498267033791336724727715086534695038766636105394307515824333179209863613528055367464822768969790970366968860100398720098161704801349229024135958102907283928389323224690e-01), SC_(4.54310844454648379873120607006670548106504273936308344713803781953816202878153053648467912295067031642609621240314406106159323935686078031887375872538432773046877998973015349829044676649690256098999812181013898252995101567265319895403366026693535145332532873655206578590173815426496998031760122181314810388522458497891773842101978471976657558938033312291904330254393742169054653345552739972745892889286687291515486452550371590537891653627022141132791592981991782894148906882988273880648621145756781087e-01)}}, + {{SC_(1.11097049713134765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.96129806525277931549746940258054038497901485655442462001193167615553899642423376679625380957006925609116439219224858033789799075021311265199475814709599907351541682459655081479100637148446800988291544390650139527246523980147599760194178750523378433869006158214829518372397604307862131909717684083204284241198398231089136180930422436840921141120636985652941816392179823567868504597525864700725317377642228825193551884085524027677622962577073184463809485907517350000538374062310077315366255920874398518e-01), SC_(4.43792034467686161435066158920582937499712557756861035727252976848950110688968604315912228708353790253735179591661368667429164980481829903835715257840075598064072824002764782072845168539256496422996300665292347918368805696122560306744840297116277600434841582751477611680800989873578927424627380500046081155735784608784217047984558403352197070648965620223868221536453713383650286042124390749422283505134734861735393518918432668799277981357022864234465981498457298557827308215729393447123815324719923535e-01)}}, + {{SC_(1.11469841003417968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(8.97777993844069867883061833880911622006887326593247884434663254193661888734281508879280574938201245602083449732573669531783925291848639988968125196704553953589366990918944695638753782313321323890118010922221573802474698070006163298230204972483445936716816168920988970067182809681992444702281259138298123085231327090324810628911830766277370721641182158714867679521918526123129893316247010190359472609851512168378609591714336295574522133017233668001470928320744807364031893909492535780311537114396397383e-01), SC_(4.40448264577483885910375157946717295915588861882827699636627088893229732284307726315707187475199224348391643359726102261524390968202594593840733279233687652418354013586574979551135946054471473954056758870692267774395976316275443998231016071492822598582945261015440379122802477725712247192982519270953451354709602577554144286980143085436853223623449058582287231933171646155624518683292834351505770838921143886420194465409487151334011900040856783736776989060019468666458059591569074292685623764135347602e-01)}}, + {{SC_(1.12690067291259765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.03085489385391432138253648320136584881972783327890236915413986443801167844516547603415075150516829537723847711483356329411026561303437978341538137836146631530839907060578165484607455219737967202426787288065430192025756314405129316124792600634387383385213813622327788968426536841277494211116731173272141847162651617309944529541815581022123818705107038152033099618846122887043326857140151945222693743782852899700635161577334205006395214456985256802054905416422768196408511772953988605995576812240623264e-01), SC_(4.29460823430435921006266197584528037733748764494732686246717505687114122156436032393588509554223958375815536774890597205754201803789763800242662124185976046398574571942282147255557615032964621564822171042288133276038438233227333630273947706974237786924602656504453943651543681466245760446369633159753930120725421033471338114511183990802815831071292367895473665758738680222262438292573638438829073833666408315924246288193759142668342008705805569331144834511547498169751495542450410208917334083742163910e-01)}}, + {{SC_(1.13059329986572265625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.04665167392049319620345534586690601564567126821677157288179146201232502224038422158590894129258427636693774374991718538331797402862317721599358645680187066039483561196211510383540514756783626943025645617696737318571080217935639578670283051167364957232392205621360119928029038386868026301033816567702186916413945026858945898884444539133885745012029762371205009252452353561358454635292174982169882365306944417833571913181192416199936541473351685186213596148125902968967370404530630558777459028074348239e-01), SC_(4.26123145237987963991613880409153775051796291409747115768848883186503992232882078065961622999098345555682662519292123005912710960263209200406429824415675430100909189286037738185934817050387012187711110624651352320496017247435142334638833769478198107500195021860665003684853075795687835166282633358049322641609672922147273478139866808881821932563138904972039419343160457702042396592530159562619762244687437043963692192588118989577505084607997788618215259359936094268526404135820006637208410406899687037e-01)}}, + {{SC_(1.13203001022338867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.05276449041733672010394121707986473647650308154796820988450667995371427742162893489759701441144972742607911598724960388654184134870687320510532723658273849388688349217111452962357294546426666306484813458191847624209008230503933128657901248687587385339974502942770548704446490212953058721298608200351499874587139421433041834508501966339870189580806151431280630166068971566970973089984628295633880739897314610369766087638070821803684483176989819772942985455660825311309235876553237536013668065305000950e-01), SC_(4.24822964080791397836406140553655164285290555828753133654215241349128224504862552665142530358947448313244621905569067742835864871849030965039778594300582077897713292134045831590878909923650003553010034665210041549470686252200567670421755471525246662755775220033654481207248039696872143349607384217082384877921659747747396282196454772408193679787802467785949018949574031801864194180099340272507112889456095629725679569306278784200415308809374685045388176886359807464124186606204017335800042421388130291e-01)}}, + {{SC_(1.13580036163330078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.06871742614826080426544902188552969097848459806253841312178726501739938755516444211826915772979090536127855767525899082662224114622182815815612343465831726391255607929734082143238153402639236649734531393050939975703605497311019419494134459261321131507417008707207443899646798810350452119841213643499629620414211030084093961027440802732600831753935826276420335421569830325731475827414663734255422792908765523351937064535216247075985814083775165914030572741504380395913744298728644899410010274648288436e-01), SC_(4.21406742289143540056935238939259708541056211496750699572410089673639210208041539522174047279155199117564705822879329351588563719453367242375358674638504791410169798932363623003826047711618787025951475619627355652425326365677533816876071542203043388625599667790949286920973946005101230035741719273016087443767907768947724151049369977302480232422549185276584371407614838897669352323162936830603087635485697835568603231651771815134621466815124052893383759994838547910992828230478070297904246533640163446e-01)}}, + {{SC_(1.13661003112792968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.07212645505078336592546993342034347346036166526424106862079138801101414155005079700969208442578490897700209424599475522246377249297244777909388623975719805155716971165782231768203899326560121668452919809859133801211211307056050647136579966629695848877926282267609793465571254118252280752501521262130777941983150143901874832113135335072344383270934369371992512277950310350747740418237558480525688444233353187647739164143786205662610152386867031750885707697735306042808487292463725715483452131810554418e-01), SC_(4.20672337854151122457419922618285571400958915669271978123671381721041860797076368560676678098491061900075566981882144330319995537031854242613255071424533255100142882239789654494110694602824957866149242812165087773509386357927168585463500271966119408996321033682473168219447765947440866337522704235078470443456337386648514305992195750299860401351353849013577922401633224537989546041958482707453618435788414778552015740127056056170683492826198507074529366220355468791722411059343918696159230187827135461e-01)}}, + {{SC_(1.14259672164916992187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.09714808146786766049489801864942071290026582230688936968489304005176787639966209570341529348132301981885321475662528144306433593266804841044918666299859575282004116334525253416639794749732738787181737628768536940208576836168894664020460269602393048737409067475417277994778388667822250928151297675111015356641185595052735384019315307485456414477227270612916643720272064123936491452009884098169679777105872945543297292672597846182275840226359997441848714050871056195110241872729791036625621656486350379e-01), SC_(4.15233630428045828571165282003422139712498001317957511686008534131679635859864183538546177185653594374218335784773172740834926166657981604452038659779134984969519272193556311849431489541170367150843629073886554832945321793115321801590597547238379687982261245564993552355427076728293723743931166369926846082988125088930254643258317503216425767257590624560371522928955957185570513735646894542449058513305304736526991548661282952311223031495252853637632912517195447976026206965381611747994754319121271858e-01)}}, + {{SC_(1.14562463760375976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.10967928505449442477081422038075435262620844535733183630539949040639580246047111782396326632112072770317601862316282853591194195128025559773450972473683112248038698411251861789551926493885241718374958549513870960222836015685629450659124563614658835942746664146199112693866059530862118589459649124320556609092325828809814480862988576538019654266897227975463670711733609274726111254449385800639664475604251535601588720621597744311853100014972643463460221171955634192568653477510794182842549976291195423e-01), SC_(4.12477191168784935397589542884325027388357689085498131947537129681766142724657274514830840400491483690289714355599661512898778855332753696947337182311118846864698871919209941904729470689913124105484612422836802503073421988240018713959679754944896616022088589357690960812847247905388912400965711338977743333908776275515778687477194087747920739357278304117980029841210676526164619193233342273088978741163549949119443274091275889686142390637733620167209522300374444339487273724884402412259930353569845255e-01)}}, + {{SC_(1.14827489852905273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.12057900143872218067970982922192214668187795116948511672998654720440343998088259815687165872732371544982085414715899103659438900521194591600181946583254530683253869914773758817729876505766650911981273294394246385317544914009845972530946264882254929676362709065143411714714374056356926303562018956394533704359647326639327814904124978641240051251497949310161132673465026917592081480819229359101746014566898516905814766805157596467983977225181854087666156217397312415244373301335833103871561007079773134e-01), SC_(4.10061442695055656241592053545077071469873703766913194109513704590498736621005492180749270920350467016099189629802475477376987392515014862532685086320893762312509118905916882348513232369480296518941886810485931101681991846575827285414850722852677268262077026358236462435033082529712139434835674072710092042900091838274521865048762682145068651151230083599431929738579885687009093402528423886269652027467895932317073488434254279724863916498024223536756341449912881006114760096653887317577800794879031173e-01)}}, + {{SC_(1.16087532043457031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.17152307556783010082604234062507416168862222322805868126512908874350444391624031476519790127724286350630918661654825182157230692102809969014735976181937839485822838860652846031092583424633641391644860770801491068731915330548036706668019531194768932514193867386550118051090351625465136521387253167298769484099254783855080887282648257670532689477740287568441339407697982292779708547695743644950283477211098450598616887397228591108140780640496617665200172077741439182065274301575092569036291761425872831e-01), SC_(3.98536880029023294278086460148693023952159542068516426102352744170696664558788735125994072124366919705847446617560472546619823569017866513210849521064383900291761216761561162785231326739724126611432626880545467591218595745274715036559709822417247333109223675317648292898183991722665201709066965713530805920987744018060213090984936415190464295866173245814907161799185414469513053299582009503693771539080362564920256173007163387568260952162357027452986740446686993641840055667439013164437546688199957800e-01)}}, + {{SC_(1.16834640502929687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.20104186328135298496957248515380925598682445083418972994271507128899677334354024738351143080520758708488667415355312255775785270232662089553577967970873736421981804100263026490020568371888346518033676923936168299859080948491538582930383269106320961933704101394993022866629525312057629214437325611043108130115817888749357539683062625350003630331806028055668105891089090457634237162817066604589680759760697303496357583924370788467666847648455530619909598563666998753300878386929067426913186736757889555e-01), SC_(3.91673698761405321464513321854133469209236441434776579154828431768579035949142740619365697318411018051757099441576277596809431746185297594423424182048115058393371137639111683011078346738805323243265590930585823423972969974096869859395067920268358674806993929141535131498160046100298751958510732699978972390385447219959583475405359231842797831501966566056834990709022102530031667881663532298096407254848006625574985191288563471602091514320519928910561533915950755452343557100085313807737796666507723692e-01)}}, + {{SC_(1.16875076293945312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.20262487461150275570854849780709403747997606590129256273406002091397926362725679700314769011519619363170611596478988430829966031422891691220439160070374308583783549778149771561058934629067954429785992714463951215361015537223308002891453548856025459451393659632361923622571301382221566318474633889106056646792104013701242038510237198194757991668351095063614184302113070108687939723485895001025253995763922338162059728474300489054051672986171154008325483425037217675490894835207039218324736935888548623e-01), SC_(3.91301615345268197670216410259475825479249814948784542097263382780490667222684759025749178892955351123015057685619256664176699053210800289407983698386813767660647021867504064472580409883400638687828026689981725185305365366518569508764730815075227525401705234916938878520111673256164342830245867994075805093498516476012702512020012631774741281921364755873559668935956266229855973637764179253709544696893649654956630131135234060288014322494402701900781641804665327126095941387136867878734833794824793014e-01)}}, + {{SC_(1.18831062316894531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.27739769191142907630112261054672408433827074235085526421482402528633827895944923714163948862685153260396240262340145527560063155405527940607146981993573266564290150967731878595488727269617050804601144969687367169963627158725306967711203122929341189833054178990422555120382808115008410479562507472567225958915506070205471388127086879938312382037849559206758820928332307712139310928957998804194412914452576847112033346093713837229781543082521999039397303555891581773141822238740680677363969056621960270e-01), SC_(3.73227706181045574613892029421809688445117154458049890104744406554689644882750279997054135059574163615307509496387105911854259028657360416931236569295709228060537679801566224951288390179021321788619702625697075265845040508785342707672119147499611162773659507482557860755116539100333611957562095234456233834164399613991535254524932170807619064048654686289232544975838193264702607218242419552506465332505750536654755302782459301575073829888035473070859898459854288592606628531015905515215328965859623271e-01)}}, + {{SC_(1.19039630889892578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.28516186454902422464142063253245617835831993322076364693117226547496030344560233063981553692632197906206457496888066502992250708601341632026473576675604009580382753778104608967714567825230081216174626717466594925097943661283821261104432382946816906642439643088433343511790123173750311956101253560175744184353523795540070855594196730896187778475843109146032220509648721592227300000668194085625224264770046743164904530985803854668382032903091457367068937360346739058382131029700969766599027553880587035e-01), SC_(3.71291922200369017368204717159193337291160314265581751304430097275815657042961764795772603591106890014199979261611780010990427181966397890965023529008555433311859263133002971046765531291467046041422198778207159128153061796218688191455896913293767037947336850496541997112417482121395773838067935117340279113670753379915713771543247146237271051406985023946047916102811069959567507384501135518817887548474039934107670070502429665488964979540037453791016826388783962172031111105650673657315136169550774260e-01)}}, + {{SC_(1.19096231460571289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.28726191059670008805902334584454239548550218003865918387783274515713982271365456721907937011819322308247639769464524642436387203203810279099134490238994363363782132621188175076050990311114605791787695124584795868845460986309932894230042170346685242336929156221469507049469718315497437836489677855006366723074385513946845372946221747502328157358391353990910345204305499847252456480752480911497808889323910234417398714462949933866979576468447248893856074487655468996673069831674808380773383597169728443e-01), SC_(3.70766317294056957066417833495763491113348627015635672702274459845001395617942727417604473158835895034446078418116146503438699088887013640040997993396866348083748879658746047274170403869051444308176371618684989522258324871577825963013946350547476759792863601524048307707490592682701522755101838488421372094179515294608847143712947490367777105233444576897531662349328883091349236022669451957605736146691710067849435432231268480058722914653984610289840504861644546434752499763108252506066044223619930146e-01)}}, + {{SC_(1.19279956817626953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.29405814959228531972281872115577848744241330476539424322207732928371094987223836641781173065764693421962834615341501910662796428871653547176129657230584464001961420818793097252905233960596169032065469878813696966372914938789591824236632930918109243800393676264317247373859532812738037382380071974856343972472688501422232135472880038578042720155517847610051178510453262581202097816409643920956443406712243536414770069769104615562719796933834376565411943382368723980627719029012450807053347412219704017e-01), SC_(3.69059386982599663479268899014918242058146304796244059493852041445394639969033313487963675689101031682048803705239313832756670076420320497105412508794711632075221423978497396573301682338629221725782129504408874038643623931958659624156623372278817482189559731742170140152759634226143222489507613263475147517846822391485630459802157747193534639725043070387657299498871201980115247626547063665279931867790323452576604332369833960637356251333916740127183701321319256002780080402637694714766766303212334787e-01)}}, + {{SC_(1.19591951370239257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.30552734832125840052974015459491503538231284518030644709405832601114655819786012336846100936680207777126596479633402462155688943661893846904345931371744036668113498108437433881236484618382378315472957245446601780294109805337925926459035813330580701717675021695222169203288405159988537677776806482266518848385138258917056294589703550831979726470477115328896554634634025613709309896598964607474308036025472101068437690489908562630928075259302077592097964344717678590374147915076540975888821010858519035e-01), SC_(3.66157899950897266341204379353537798419054654796604975177391472417424105792604912894740645390003868771294538477949014951205228558913570580253857432999788735617990786196602185473100952466926540228987836275968822023067591944084939010810167083511169035277797744091307218205228104199829296100195491260033447590647463764333346476157327673006815488595244083055259415907488611696454882856572283242204473890087698344001008271889415271602016935370350130295114514382937056980246894560606589697741512051296983056e-01)}}, + {{SC_(1.19689273834228515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.30908647972181035306415717863675078910016730211025242842074951415346666558517182530606465652617602590503103135667675401127384688452760685047951125160893347618897936414760230294770147124404072822817308689665138567492587093786105929151601743217783170480962687630249977962066929583403767936082548393140331559208424623662293131882909285270562319002202662931897538475959477582192591513214623911397240402575108754598773509233723284574310101952889917315026274370157180256653172508219677050914615205659980002e-01), SC_(3.65252089837424373938727945032862259240929210684074233581248975290379302867642149838224468303772701597352111309102217895680362856214434627802079638333831135765550971400956355746825337558988814224935287422777362046821445133407585196406260734897665635734430246512236439325599322156781662484035732365087377434537435860795506489448259273991060211231949210335294264543504144693688588523172409424441977492672322754209085937265193527550849457330550424215617614405156231791817612582999509373290207256377986403e-01)}}, + {{SC_(1.19715881347656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.31005799517589437870242196814333217476995807649499693529011070735117435783018891960654522070935542030690361671439020630259187276793080845112359698698329519869008736053654931150687543898355294413242013599585226095076607506277217378010263042670261524175168832644995554677688260009151311954304087058469724641996779642466187883365404506690773461791353735112562733576254065327574996637781135584728439660654962080740806431927665418870924715565205976970614881780948820952724574977216025534368393095717906537e-01), SC_(3.65004385267648616527954865992296715275029468728197283298369369930031821727862070318709641875550598883423006447077958239050946694834283128158044911447498221867204751900599261516784488761688784555629755762916704867361218920515635517453763245342455078305608967286538908919851124430404639267094726214081305999445008172503091250993696611411571069568706856976299567635700760301194898486438742662857713008686781080202029537398830440958546777053699027918966553421725537665837567022045705930444634954470244354e-01)}}, + {{SC_(1.20042037963867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.32191331430111339261449895086549029541470003741228205646821040804686851621146871816651400894443737177018463008240204638830453840674110125623289812708169644095629325065149010200905012268466419912209994111447231809810189231643566978559554114551916902520362624563910880568441884854356628502594736765571672265089892468311580935293611112366583177210281808378715470173722388206625207952034210304617334678964865106150827253512547516634051558951374863846101108535417490465431614432426061074316072852256048091e-01), SC_(3.61965912216269772828200120428024811920456259669546381965248128788391743437600116259321455141954281630073977684422263911816649717453219170684896869008765512815585782466216706979121600952302690882562786945071216712298460527846953632063971663355824055031885453974118933514177156551266644969344183771388988187700954591832948468792829626512593460301367220285789086705214738415671060717347435359215246280542287945602204254892492098886152245370062298214430839126574533251827355360921125829063528873727247319e-01)}}, + {{SC_(1.21129655838012695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.36072925273237052589741354103374154582179542921990534420565853190994871061359180376574053467333730868088721976674265695000194820004662799610349094846048824061780209573454597704080611299528119256577646763302585376602803450230153550952519196349901875966598992633061265243075394277854693043396843989237317378406228134060736859005383861136196908476811762891497452579890884383358628813653439329111984377402837232792697651409263740599186857664307725963774301386350428715153756030172114179091681771359927544e-01), SC_(3.51806024067816042923452710343957815012239304381787658203322727361903081924558982395548437902680194552661545970996952914544963432766599983263188021061667602696823019854633628005351974297646059178922893378662728758461925073548375986644842575266392632793345025076736067246775258211147285299896097131511715201194597912854700786474397178696076586495453199254850554056748961865026453531107999621927404659841430395128647175395965884488845322038120983810672480041843000599942586757533592915075486458021630309e-01)}}, + {{SC_(1.21226310729980468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.36412525705292113005181122991624028179942861503165469987226035896376047466885319902303883839379741451140394259347926363975217804886369110016553611927193486731484198489088957178930815051931109152472621108575791931072217293637835723737313994641590019638899944999808902113847285921266332195762292416864655779343136099559172332963707123208361372838218978908059128893432339110061768503598206594598946807980130546308223430908284488119931468633860015472526279070073415117353762389835727974307845340200613643e-01), SC_(3.50901099602488617933961662609194577832551303168379986695120681175473236287005062080455575167049970587669429800258767273667243277503972476292879911386422017336420102780155154909666335311881195241771041240308554984076113094352112043029341814955976936909466185721106124354719414139265857104084452167918558350056175176101945356049631972945089068579910004816914095211003946675102731776786465580977726763772219149762094975256571732700846263127621206586182138024859732939097232892050622642147713701363141822e-01)}}, + {{SC_(1.21460151672363281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.37230515170665959085324305435816580824334060759925311235095988583363681210882971361015639915500438790623872866050950396566896332921324713253658675617981474109530663758689150181212482116443395967805522361320173948366777777549194083587765101013923132282405066334922427013881735709518698558177470965263274689926317431180375953081525097608464790961485003864050369654033804129195503199592098281100081388796893319774893910509480688105560424395937634005187859987536277387268150181832415882844731264499687596e-01), SC_(3.48710426332405618132227540555903517056786716385788196839483490850475902035868776849242484073475814113679351593802158471206518252887259870568005759089726021896451567470580888732652672079444087984700684961404157116233065933905865181127124685548895000573634425733126645685362196697441178043026624272299059779697880380488364435795548619600267324209181423660077472428253880775703087620032376724562736076779072125401913269088489020843657385728969803849312555076792481699941332776210312751607467030287676880e-01)}}, + {{SC_(1.22142696380615234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.39588770085819691865847010275003682328490704428234580843509362105491428163438448710042684284109797054096472724012751496536528244522738064907879573912386102664587700021103931492196502634778712822226419769182878104076466423635618060502830320299773502938148601794567184867686070187290681996430307341965745352810807762976757865055833978860122338848801972274049557920720539604317776324957070543307660085092806429545140437522026377782954574391713807786920755303595104855319858899110269382668643762661454669e-01), SC_(3.42305336108884902887927320575279559613447444606461224929617092896182369164661070824620337813821007909772304866662213350426972631574890823317729042350306113005691776633881243301450523125297179600210819849955453532967854941727134365115369864028598198604524465184765997818343891127520544365161238551649752264818554220850963710321530446994420439978205574105707505176591332458227716523834711613291351686308332571358688396721775880721873257679162552336092352441386034121556519027449256660873800382080061980e-01)}}, + {{SC_(1.22208547592163085937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.39813978559762047755322455989924734422740736531083873105168806262703082104006400399243451104269319997589950335686316330935313067840719316152982821117636452214516953937745633986997164220794471996103513775628249098109014694914685001253018949349415846758651766091317887446106708184940528230682632778052559685259330436735642221324661352012902839478691454369461241349713438471782232386917837439816471075185081605028486721931552758494782311573639335087551525116851545075348233789520484671443269682756137400e-01), SC_(3.41686531346600084300401784614799893004757161767735513566812293919164675411857921077427802420771871729690257003944133859117661387568350609422772611494688750011640503072888589321701691855742721189777588064092740430186592868077940180336134880261857041689621936378609096903010378220341856304235083749800120130002770246847233159418787899794883146762692009200694121724147112767760692147537325878164475152361287321256285655447786743373896368939341494404532390842764544084149054784203820907870728211517025269e-01)}}, + {{SC_(1.23126077651977539062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.42909451828498508606474709375264723308842078821339777686217320508975455062300122709369552657428197799104481963400540519817121209533671060192044819654074230269737951307056021548224854806022284259103862348124304810034465177910057295938738114519751420463405272341889617811534402988525056538384348037656428758340675621634449278436308125862620745919116602430281338222697346377191632713614962700759746388254996582791040894490980209916664531339155045033869279801435861516973847175864623025517486143969820319e-01), SC_(3.33049194042682605175241363784040240910285245708277205252748368685755534290141711394993998500991014686784430027546221468679903420140548619407963172914406334035263949612686570761312298281247646711316376182219248163711930542803235076769721715931348363633226871451602492708928131518862713071147775206684552059843068760118425994684230685879647854670292765541806378318880699327264466824963254196260044211725225547447464973750115240147306146083186263336647077159866504141860017716353241263363657015139726553e-01)}}, + {{SC_(1.23186874389648437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.43111760599709541035588926901094997566502718811144427478325174481620111845861591297173944398313017102652417632855534696066465013105557184226146279067590494633440907772328572170475398014172118282965409195033028893604787232003194956847056575653399955047984495654919094634481779204010157424719276038743419254660219469258610283432010853914432281178805639955141819568197338491600326973895231948028123781044473735801311915011507832384237593541506995096256938240840412181938542889141117184710113419161088416e-01), SC_(3.32475874340554457877202447234475014625989155433126288392599830437752954563599902656557040540286535124631296551395636307213098940140603482531580069603155304081711132781783110299772832553357145878218145112077910478105454877237161308232045592413393717909447388261991731950085718673812733427205738145139181209503016951452142299343473400624768159762695213151270652676435125559371142019981631428959629983259386047734915266850184479686836227393801237648335275044395133503637188941980982471598895745239031016e-01)}}, + {{SC_(1.23285484313964843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.43439156217638164611436012930228382689755438982293909056748709765218557125176035116803710034077451195147383026645041830589413044047646236397156773656436176560487896613910491818283697348760063758826608457400150535252854890989562986838851695706325895734051254961720112330923499814106800806774483808233423741414105583491907454466356027291514010057864404870966322389372113571153221924917442689876389650652168380703427394113468793521455108081660048558837404953698699159745637539714086892947033196599689263e-01), SC_(3.31545711049548839257000706395881987887544852335637955820041950634792349777877146091793726646581794280066231025664093730708988019858153187826134750956235714639167905729537868470957660612761971312259990996222427866783399658798385953978906208383850722176584774703718987266959132557807629489026453894218196169262461930928017614227977721723176068755996006303058069652596783549031021267218301715854961427011462057088981815919420755933964243770657110629374546019598030758679903822363458102609871773705474429e-01)}}, + {{SC_(1.23518657684326171875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.44209667096123697921582138669326176918529476690320250447678223598946323362005245879411974799045920762058832832985133487447485408509583010708288946546618259451679406538212487653483826636128540529638916310113140319036693842701353614311952050475953080822080569346027859301545516626493224857004408304854843429296425792156637522761688106782567403043835154816696955555753046698752637657160792857902429886164915472067084443361250512545205817736097253824127751766134380610996601846700392801742914543911037926e-01), SC_(3.29344962861476388149406913998441912009230904653412583399999352256824561235741071049429170589583463558327490064123206934737081606018173969087932126027338556221875098517159871251691922634325098784219711062126107609916963680928323227478737529546256658245101678834691028532302311092045323468689356548157944765823909411811533495497374371282141490365239488023630772933241701929407601305723704383237378697819408791569514437882779120717260032221738642842405948248710800015826687135545568410720727074739930280e-01)}}, + {{SC_(1.24624252319335937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.47793106505864155710372335631845478492346645144628703595395965467239858524618751432955399079998713862118814340871316979430436352804054698096345310731993977194557526214858749942483204958723187668936619789545938232937082744239886585206968488048066729179235203027526167144649855034638305660874263285668201906999849721073117980803930530336641270842753565877517211243948658335212510450677017982023517654094004127185898571544639567951870938504467089485132320187321443995300412459166829074977205069854128167e-01), SC_(3.18885915744116307991824460697936149035981956507037394874207203343766845897008716157201515632181715607046169386224158869719338499493357779326841073732915200544938143073386213701049092950004898330773411106540232117579844388237617549128045386552657145803158607454717496911937874697588703219813472297898156220846861451173907218251333262291730714466252844502243144054267530253758685787092879456557743676371047799961459103016257328082697210759446844885660824574319820570419954670583966584126272686255168088e-01)}}, + {{SC_(1.25251245498657226562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.49773856565935007970549344512699526547923968348365818675525781601959843817621732366867203995655385937951745643136104129868291132508462687598553162794100451077120644951475808579961073311184381003686892179651005302578996007940600397705098474530493933204289689666095106701306420249614061152905549589374731140175838517402015869865999694639591169784678467636104934359422200801913233216502687786281067467908895843320108471480144038611249749161387634157417449327368632565706141541919713135041484839611347573e-01), SC_(3.12937088539966310827617816863542443537540805689998483350331382819275180168620190928606558064685917571580731924251185390060638335515562473056747532029126629589310820045526353157641807788806385485857586135006880770118838965302001129873513923219007500039161812961582202391858173636142000187506046696434678802335539416687869723789979833360079132724807635630965800159606622528573160421322491440022849488963828968641231754471167254476401435600251010890399418114639079564829480566160639228869800176144301207e-01)}}, + {{SC_(1.26107549667358398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.52418695956686480941850006541690930239761325232741626838515846936884406383023802081370469754681074804545915353145563398074640428884079797524360775772596192826878326965373666553059294324922147137549306798969863433593411183534403373204507899175938685742339242571442474706314723892564187399965843300144380287591834727003669115250840682958587379968031653433460770442328081770634773759114952115757110000204146434560295139713438946949932003331265057495416454532719341146715168794305719687927911827605620710e-01), SC_(3.04792761712224384443187440326485521277019541458374687178938884329401562377594129973298941372783852531469542452088127625467352152764900393544352757876910877738043333639268176601041834046867143684929017539126542262643786563076751353073667362561187662421509245109958895360976584080168450328548225498844675255271705276714092191942776847386252873452858675899976559091285901770662612613531069332059711175867315451004429558937196248454798368082613262854234614462702461791856600415426502994212521285961939653e-01)}}, + {{SC_(1.27270126342773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.55897702698394019729304962915783339726149744494967774619631929617070997603359304132004967665208808726981185438434988592804380773810408457710481407880665329100751305932132573383322495994314169335167702811247724242084676106663770075572223167737313811281221336916721200692951939588598623738309294942523017778375982939758937559540634496752120663904522086416198205632120656934830706622226108996378750114163976746954239093448542669711432898214610113927075962020141106214972505729115311860914979288804790829e-01), SC_(2.93699816097887127043847639571997202640909304251711570871621466393972194728942985403745669049952639981112592351372429654141213093184117782687405526804809341776471067929090431550971880375019669575265668215408329474561215692609890091928351019813993747087345436206926066191226700264499898302760789705916368784748646787652939680945907860790073813947944118519002614505565558758391723561571904176502747834651484436309420341412474883573808977804315917279383947293912390846411905449890347664818172102427869171e-01)}}, + {{SC_(1.27369403839111328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.56188809407302140382519114161585931061089096133538031388986746812799011766912214432553468991963837135206882860816542245983053233993094277539431446743357262977008827009374763284827895016421564230457917470211305717579021833893032138958039974074703001877337239390215038737106172458129186974741460670394259661415574457285603388199508619494741444619649181349790189072222296731305345037121134600074660767206690937687887307524014164116679464591387661354610259197146582254580550754314222778854512940941975451e-01), SC_(2.92750680211414746770844834430161658350022817838677528204616418770016411973049638712003593524209894044712330474774636787107110946674545326257267713468777492693895483352299710997078212274344324361670663764821113729265765705273387211601224326658092724978157805173109712835197097971977685009294324466709071461279772808181639695341825295953726444706286165065694230687880410120205268008012484510459176080990941425970128533715782135699234119402304189387675442401836055216754433030476408800736483624398815316e-01)}}, + {{SC_(1.30864286422729492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.65834124448968758372373106440044548226231466537435973276539535442152788754757669023365222845168257027951609639462431742264781036338666497665199597024074054375228032559150094452571866604853409863786616373043000523609661967136561191379693746836366992799858653529442457581064828032990400456134462903027511889608735806202396605802508740621722399330444196254992207913243456966683022884751737196688975606995192636674990845283225951184164377590119512424796579386202619458608939451290244931218394255282524872e-01), SC_(2.59161038834725172326566408046635655484407996683812930425596593331321052560858900104499556422763595724745722744888885012081379301273496392545730800427206859277815623633316107868525096561220315385068440356778513672994616088760741224012707881466960081026623434606955678671397521489157762162852500111882453963438629697190599563321621932651961872959107980463673537799267563006925080070818207097906067384521865616370172042193402833078119193467872189984306913742687629125585377205706386812697845482831875212e-01)}}, + {{SC_(1.31513595581054687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.67496509157828201912503630642992815986208380087219453489786887511179651968481635751257483296845739295085326766167034119259758101256282104848357585266183737568700627901779263861176788050184045731923724812808611848830295658768104434977347403943462075868578161953644447327877542025293961158175558534004721039058111728107455651102584979006718701806015009635716357761745543071562343687493685180873927341511807385763241403614761872459414672368709060179385863095127929719194061127988356635866834884782068660e-01), SC_(2.52884370350198689836509793238736044053809213320990655336570043176388019869051847476197344301598145790010542007186953761020434865510582748749159053480789974879901690784775151251388330020872601298672488507661166060231571603598086759786500882133991853156299415642748708141774922447253154306852506112676846419230056649032959277813296664662686618019664034010059955597878723714332427869130132431251976307122761466400368086425708093504776300178852667386689097710596288656596635943810817886346084363546615387e-01)}}, + {{SC_(1.31764602661132812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.68128218332560022849151062862300290002816382002147406561122634954071252385092499593221939459869865873066337189640214979139161323980903390581209894104049320132006144228121983278855133934081123751398423334417586315867558772265879539165555345783090329019848075276239846426043655137159253374607313204375273679398119955419857249062342836994545408747733385348346736928923198076278906695111754630162410275969412267739639630188845066288458590745754843970182123421421688608657347772943092724923457373537413777e-01), SC_(2.50455091519863080006567737617454851596080837568745079926261175080989570659578673726466242881105045890267567542084835065570433112497594501436101662253622732503676986129627532303613101872288751267994782026817808674381109734346995384829715512131218462764261510046662595323365526025933703952987521614147369983649867368067869287418530494000899105489059330421493859551233237215950932397638169156132750140846519250994070230478406360849077447064427738507497094901597123294713837766393265188840396610325242108e-01)}}, + {{SC_(1.33635473251342773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.72644210557293654073542060086406625986306398124088406711769491620100790420760540376060363403161717387226272332636849641619930464925339803944531929266603507465706542065108113136867046044362596304173454484263029807116355953708147595143804202867331365545502212705865645907773286493184357361549950316863558913715091890954079746952857204650313515355050936769164887155762123877636283908302073199934412972530605773747022445848422608312918511410963171951321236003915112872694863002674706748808090242394674013e-01), SC_(2.32299891668892105578430805968784557325686629203513649173751412362396164213323697012298385908705298284670606095798077758105179389153786963623253782758621229155164273749408854178705238465846547675503227965043919867632856632606716985862406879880250070563911690782986211180882566400301852287461686831670836491595633263904306560640539575748724784015673555715408431433094224299347067526371844509941381534872980427669628158743417929463652365941992113826691670812353814751524843826719411056502918081890211682e-01)}}, + {{SC_(1.35868787765502929687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.77589214007614615935359180562771861203166061718965339152265847612694400557778882424825354726559526679131378190463366614157230082908624532353686825552961134847897731092392578220212878039351536459454543880630234224638675041433017159708614328391485993736084563916512754386563384570120566452752959876512351316136595224175505892099231154074614562104731051732156166147422341586213471542961144619498740979806752418525675494902597419595759347605843233173004190642974259705891490524545835711058060322698924180e-01), SC_(2.10521563399035850846293344058639880547734577421953544992592199451531878600608929560334781406775399358068856520818402473362854370439100435712010515124940674627273883774342975022165663149085933054914512215716969149912131601383737072603210633382998215613080762106302730395977878722923513835555432768182548632737981806045024087070109825978918059855411453037534752326280434726068704208466819871376329820900372129902093122395293491407971401671172806094740549791747150107306999208279058576893941933708045083e-01)}}, + {{SC_(1.36104679107666015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.78083095805601987454573074803943470621757804524696784103098140449005639638284361358083062934010737831830783063312546836042296335609289925732230060233333451407917686529015877187030416793493427654808030710998148092926731919176988787289326234540198018431288569972368827591092955147419949536865952244750483357798197466999667993829746941833181764203465732330156288972592614004040835500793593364074829607037302415716045363105826526873673616003512747621072743109454493646420480930668081089526755822913748283e-01), SC_(2.08214931499471487580527212737500656418746457639132995511351210615068938343848506033358245359661394041703442281266292810884445455040891225931387155913258751438141035226449517065251786763225847298217846143225641509156212605618483988613037250889126356687450506812452058374859588919863830693505452777076935690791833854447391737572849335367943607136147722227750905412690739098366592762468180904934634565064553997996536850602898143403118093286692072145247502224184666689326027284268178665916305253016113414e-01)}}, + {{SC_(1.37006378173828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.79920780655323574325048032290553442923802914302042449959517032217948051940150581020868536605314435386459203898708604722427631202543713090326644807022874911720884509405045011880194820377740065707611794602426514158781758693026900421398037712389268280235218067448311153013979648678838706874169795220643677990190870933642180225407599463343126098376439581164242726050065349453834012003763877617586777474403726187072521595310016909539569424640310905288009934114205082383526315485778184708537009526195176275e-01), SC_(1.99387220352411812643706162721391972243201742242193475787958496815486029474907430687983391246649586894127152003306028679128609931296024818616213480432671358196302228903498401651517092937484268824835198862075776807808683194099912324765269446453036769957409467627861694009583964690786001732389779565429776808515515017736450229078368649763370096373452237377053728657912280976882682351106748213592796547048629363878065867407923229520949463360810455413121016679444030724292708102255182692318351645333863659e-01)}}, + {{SC_(1.37360334396362304687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.80620384192341085280818940390688592996930713605209325865795280353167597318617674789286503206624638647024427810492949762186006468639432931548924921990375287718613180115266058663420054121130510011093500432590233907644752304593295495326263164317713133789687740999996186308542015177315380533224932052581739319510053805587922178754568124801554813628698943853009281775953423476421434190241967808449688959898443562854457700532916910942532208670140823364856647585716850899032174120857753436343560437861952422e-01), SC_(1.95917488005704498796109337839462311020563464533356224712944059814078278920561867832819886450214797187489939587085888526835962063802556392807082653670784036934320396748454552006182311130900790213674388500137041259099662844726092679222947491447396027724230508542332716957208884897294938245847990852513593101461664259719909071166581138742150607442617905593170491086391650790888740658301124572273285141285519435831995534059396058973595699379902139733254076628925801545908839520914611947748889644366689804e-01)}}, + {{SC_(1.37579011917114257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.81046466700929950246668718727336319603422607523486257737752177468390505792022504803078733499622336237569514186945730764657819229620157949505190809705402556212976287179933461585472651303039684488150298524723737283620337889897920345569054449457671306492176333362444469978214852108745968215759045161643806570983234462686298094463645317631449549682235915973343298000368089574358566062623971987254220397400720855377779653358609132128526401680980996939106354687468832044201823937757703711290958140670326488e-01), SC_(1.93772624933505873954526307542792857908119793419071306140786180506660673347469214081509951677829702334822528190190251019855050074377834646317392219744580866160361489259089532138847887047287371437920827424743971700527942058451956937430528654494731672514873731486172998987543330286127627257355443896756851760672491599793182135160951137115300143519605652789579329580837860650478529356618782397844974277048622432233205547812026760264071970210071830565819625688558008931106124303619620049393235119593562032e-01)}}, + {{SC_(1.38131189346313476562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.82101473951433113616030058028945882827700529777659399626299791888315472122893848203122995186993249918138656191198348734122598050722371471038505795184682249083561762735866757721714072734782810762657563932528073571155752961737106346405934750501112839406941959325824904467073234302652189813381035175894782823019339402643440169650165761026339375821668333766483902789516971596613319142475601840957903445030084283730515297138803998334696043029278369165801886898644339520146169940327705952108934099184965051e-01), SC_(1.88352581247039312796004784885792696475588661060726147078352536060782866764818512994083123827030945328076367388613370055013885867405072819276681817228272086206013317353664827033343035360983767879057064569076498155542057096622655089221516370992457224624603085336876933342215313240050182855613227752921675497848476243136725589964476896553566468837178670329761618580278911807843375144698871715377420530960628384366594660855642419370115116659211832265632273031077713314597591180856207916233946464612619948e-01)}}, + {{SC_(1.39389514923095703125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.84393748984697599494255913228519356500443797238149851639494732303698059390316473854670305205991023687197405840363981298453269251894181637148434103534542073081782734924644439718021321689020417889028131238320809491247476894902458941394325539956411459525912507857369660076279292066105700446665056353874479050722766877388177176029874265985210046842349030812087425559726948928409641894759402387263491889699421786524411665629018248250590827981422167551410817277634443200384399289098727342057754944559471253e-01), SC_(1.75979961813418330463246015346785922996793666199283524740663794915720273003795539409709892289424553224094002289191965889297876634196707865043091465457965056322032412992884309526153698834410862154379415726686609410706343428724975862198717229665810504104156779671263630038970686942846971450207400214891909970201246410306632949413399102387736446279872852586166870223903033833049605211179096732670493723266210161088674326547975842093333122402384746965183213793318184772815360336300118983377180563926983678e-01)}}, + {{SC_(1.40098953247070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.85617435504275879052838351473422384140194868085037483863671989201067225619425571115767482271215770496859292537044150740107974152029149839011472238269874887036032939699625000971850206897702187973275492769390535345807412515353236530010768540682551390483886603019487960710475971398347149061935832649656222349711037952773450481944849281665638872163332303576583218021159726525048956435930017186229181305861378734868720812113308950238852844213779810697871054524548057515433074620560538926975013561664615709e-01), SC_(1.68991925339569339604661496424208240093498383477146418615565299727998626345325844611994811159257205982575484035326636993024412027870667349093871119983265587745698136494573535119564056284191038785903655082458002571428229328620639699045804331852797555083547720368648689121007274958950735582630052300967992220928569101056869705451681433318191980600098912075548588729718304540582582836247993674752298538944618403645465934491911133294241205561058621342699438071895927728838513098621388908181305166539103073e-01)}}, + {{SC_(1.40101575851440429687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.85621867154937990161355741456501379427686529270485157224862649254966022362110443495973438200525536463242664277447890348935691893273536099906456638207162825126576843366652617955303374416503841499587078828970436237045163374727430933757606723294288110511877325710820014268639975529400467350328864739151245994094157058478899664410923370270816718688905971514087797141858843595803287066985538914148795677452085190268952123648657706491750188162484814691673998674800424899515850946008080603852145559474897554e-01), SC_(1.68966076435519353962481075898958477545026123896902065690890676310569504798562202400982815531169410784648901144018478477101528696727403731035179515876213449880962005156426103688847976760828487626389281701587312839145657572681155558686983505422848380769701057226774703457564482651992554580738823901756265324815389555165826073908210955723185833731466146611384227971387719800158982983339977621693099935688345979958646148525722384424484338569211001385904777013357253104499183168338276670653879474853213746e-01)}}, + {{SC_(1.41011095046997070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.87117858586820775624965696236564943727361512341866183156650482788896380417914897793279124473515322346483600167082027894761850185430736258876861651247601475778439302962028949350765397163734219392424137650555626708780329712724024737895212969230465645942701271933175672679085979373625902742228817342906406414815750958280697847446219322689649467627772417102771255292832906277996968684852203671520607993434988730178276813572827981795425969341197977862776742515868746300221678580739692370360137716379880437e-01), SC_(1.59994791349497692096310940926922433291994198883744468744005470409078245893996153539802601598737060687483733389757045235896095957400266180075500992364021539221917108997307230046574125251952304461637030186471062562619523234193692618585774925525419040975961516212188872188853608468781398148788251249659314242448691451141375364682157224189761502490697285106725955016342688708103583146450318454637473677756848148946111691551396903396081866701675441083001752543398185132497315372365608059051895513314949579e-01)}}, + {{SC_(1.42533302307128906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.89438855795183886998786581200513329076368840639634376361595786937211016205369393880525718435864806301335301282401183701106479251675469255403508578069217193848364943684508111845954935570776509998533134936283124529539828304501881046070786528700113675273503484680453633403668330643191207048485739965410736246347483019206275407836155671132435908585093633309518491565179092602495042637961696521026914991832196243209106071985665397845319941148355665755209958322775690891457420342651185239844150245596327947e-01), SC_(1.44950855957173654196257134824365513134133201450079523719697853158105525996193537681649106974620513605006455769791009116959886538550266029282692875824056064287247623191024923923550064333536271085049062725464192365631526069063550184078248236006479591026443959058514786355465785459602357875413912538891346259989738066918341767850367928358981037418135328507988540823626368932440669322691107028465730644797892733370773348508342557416764628129238249741504704236947393363136868043895800163017362575013961290e-01)}}, + {{SC_(1.43252611160278320312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.90455894212278646682286952361698360750484925762077663955915415425200092204173679261660060857165366316201501332320971411870372367383031067911179925113944816094496441312871796921361407697738122633941915991825088653087265030078891572812182705223138859284267087996754061967690677246219005138926423479120522417515704205304515586665318577648865337189846259000229102696099755825093328193052696327092303622758297319344389570129955773532709225183232222424041153368966111478547808896921857325177982548718771158e-01), SC_(1.37830046144356675250872410437156137418445970379445568874986063770412578264945685021936472202077012022182697513678356960442192390943674941380077529122281760664567764993131196070130465793335691254056246930897428264833632852315773233778709341455031931560142964240737564638602823711734409767185825071947764997918950296406844128918029320519728667997040516955426962206122258344354400413540432792749979019261016751931226200374985412506207323213643522455191228802651442335019461635933485240885233775534028203e-01)}}, + {{SC_(1.43575048446655273437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.90895160230121997702288446855581405901760081230384889585645562104421752177021923047531084568450326893227703184655477128300485696702546084083636117118819135371141893757016403129691943032247687888381242423926955796509656359721022387715707166150977984559307365089946156361069068208284576434164645941608103890018860366873703274312413864716472668931881280938821103122161489441182439131879713935704611483556687225869596341238675045956872266915280113063921753191332747400724156543076912116754374874750054973e-01), SC_(1.34635736090091818094528204085818356101807997017845390670155478403606606771620855953189545331098032529074637876125914631803457218671363025531396769111554517612885738927295369006431968049166339715409645435369564404672125253442906034702151099344922917418994177825002810347017671706373141382337224796583178154615455960082217078332717493653904158690181583515356788176235405991881547549149452753027065371587653125663516719462714534171084475796198006533859917606833628107186105787809101967470779035305450920e-01)}}, + {{SC_(1.43626022338867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.90963660568134094400971901498988905319554266361075315281949278115893947953256979043383147606632955045753627672782128846852191033978891970221149746867578886482678747387800642996493640522219736150214876489388752111581525484145661461989583738801301682758872224572425127995699599203450570258361503179471293916821074295053494693378034402025673654196231274987906991244583192913828304407994756526024395389425156962038699675288302931357316631745952940420722432935854198084810119889611812838202854327047087633e-01), SC_(1.34130620789601643297435177545524001954141391748474759563452684046937170171124919131936400073282912787645653259241880684313416126416211409025645824655684246053734081280628162746192535860988794701161895027084056830536993050641113632462258021194830151178607327486814897660784369677235245490434876385754524750500204601522349690543772219788636263128283700192373357633279535557585911804179534914355347076739942876595712160644569672695775037899587969833017668537631078189945084691339552998027255384326844140e-01)}}, + {{SC_(1.43893671035766601562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.91319109575353827009524291495439092992609811853229821159166159151103901148532756099292375393658980856687146260362406220995470141661061317103167670220098478568248794744003136334741272352694999145446914008031920389605991216195136102162640563302102813627231858860137114375389133133397415527784515231042189322930600081954067068979704162550063898754530920501246869992971165629667699438110645545498170415962658239563515234890345521891246987256466209364284808469885035281015898704958784193974691004150021440e-01), SC_(1.31477842204409608143481604778289471096989432741883764052857915784986484318032634024067139351793577350976858922540277282623045875976061356613691647950469635616570216317069615463470059393814873032370292336786402935014974684094100738552918070641543653862350399204902298268031885011842932620245754790505398283832018177439959836755940979102516771954166434909998171784510426184975048758424286402781599100148540714546447711769856438806916702480649813828940835784901933444901276957152379932153447509228696137e-01)}}, + {{SC_(1.43923854827880859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.91358749415694718375338446318520938245933399170216515550162277117477391720337296530042486538615494659392608853197762294151718033779623260069710976312896628717586901774481690096841376459649622902116531379807543817349138434425583628639937086422980602415256616704269488506418530308517347564085682123911519216119823363516075742620608973853091856105663492745369073548016404817781648983470056148620342542897508768583078218568602415975758720531150787539258203631976055122050762021258847803225815586413983594e-01), SC_(1.31178618520511210932639613646562667970910211143447525041763259377225077944033963198139901656474403253313311900854623885170093549689579895346253603161951404971637347127491269985682548787839965097189544180076866803717837988248791973444620625374673968739089275753356956276391050058192244847228373681483681343061322393838820468731882412707831450554284369063204798723878265096994905601911657910504170961317716023507473626505888920988030515505601969581368230219763312001217408116589019985350643427759453027e-01)}}, + {{SC_(1.43961572647094726562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.91408156611675707296664656058223080152485128775574649173021236987320160261145962178762573763867204348773339812210608561100661146497081024184848594028960145235706699880715910562953861200253810695797510258001811213168246891397479444794767683027181509397456942656840768865307567123173491515632186886152415447993081560133963732169955082791633660308902637129969728163244325298495434764536351360777449422859214749223257906073184866030661311732376603554906787343524537507972606605117568102379976898997387556e-01), SC_(1.30804690297554290504989423846664214343871971288892730248455107330480322598111478527291294656586536354347060079501463191824637278899579789830724823242348033342333742371700916702509134210059650531852817443296827350488198919145626370767974551816464494406170646945206485942489762762056106891367852891043967425985347102892606683294114815073381752131566806564187749932742216915803605939012920924230774615714791230728265624437944193225253025470901610417643068522722728430878240416873384568643829313305535027e-01)}}, + {{SC_(1.44733238220214843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.92388003924177313140090027971915918584257628279020219474834338435924744461556664826937218895846315344351959435620232974461413412660625327718605557450020435740353207685195892183491583378240589992265493490175020140561282535656023176931718779705642570303800362770035646009247080796429678251537352734587121374533778369237837973021704239350832647444669642055605296497584322482667084736622674001731471182384738548849145026540595340207684378319043448448375976983562094694763759141523233441297963867807173230e-01), SC_(1.23150516309867875989569500091859949538209314932271743672937839136536501764869171434751888595099441665884508703820137465595390996452770295560950163144838266096299820229745872851223264952301951583171652940286501789832523596307854150203819900567360148429999324024127583351335571985879527474760460123624195719269010080647337703374150788251690634185963743503086320018503677388753932389411896123706087229183305362380691808334014583261378865654194061555906317934047697173152604178316357472971054644931431007e-01)}}, + {{SC_(1.44744920730590820312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.92402384223882789932261167425343450246956345459586286370336167352566852171621116458593647705802173528121507646228587446217386261770854494486472079130461840033751569077191235116879649490897128782846926355137884452312288880211033422612152460072911482530288128569393084939527997746297498300862428618077679314338568003724382747131398401869970818675030832582905678960788419233415037831678397997028491476723422057386731673921794812002654045501668179874746043063590611649424932881749747850199999649458980332e-01), SC_(1.23034579638217625029872282272402437662093252013182327996821295956822978452419259217048913138605637521619464291253863182650817791682056273134695984571528196607840573470807701589977902167891230627949542905867599039057826790021360258199521140849548290900785404111420099350972186162756949436658730757354190824081339428667944721803530652607059601295242664233649552435918280060710052841718723858516493198074231988111624685499136821860174842545366428551676343529394855788994773464430657466696951765655081137e-01)}}, + {{SC_(1.45154237747192382812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.92897670924410531455308403067195670028166438299545559217547024316039582474703048515572995385737263658775525140179896272492682727904755237837950242303032893320399392340524679763156054755798499200503708258833780300903783645433313620255464751916379090634079587697883676031786033937972412617753201880865592252516901165029948342610525988212251655766536877387133775131843264659894018569911003548054019687818715867363301061741589797231839706403520055095055989644698443913520699876764791371583654897816260752e-01), SC_(1.18971488487288304308425699210614719866878259676804804262846896571022601257545817282175995659728561527339387857587830788109332577117011986425932901344366978967352649545020809657624889841948708848929261420409010627364470837074847218316673600693253526576654165766705835056357817622597952581949808041989979706804283927703846598812892491431255024889245682296352331155850394323676087358406346137369111543419082047067595620398532071247556766820276593583587556123889897153525352863626314107635487884572998426e-01)}}, + {{SC_(1.45330142974853515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.93105411740343505979941692065212954734817555914074650281588114038233678075276394011281531825927323565721676809068049180242769051762192574807268658746464170597014860395374014702172519273733548176632886082595693891351425720343131787988496468579795432317171238483180139422234210372749213206588283534233831908394582654231750575686783875745511809042593129988278841999995524050769441525637738892576778838033277871692659550467516595634343802643379683228631743812937611330519329616827468576341825528132052336e-01), SC_(1.17224746414922113394680459621138654141515011468565470547501509905431672693738276955358228769564509462137569555299014927161641678112156176912374444048091919642849459540872135016797222796525448414106745029017241368167842038210883973473987358596838846975718240227122399101468532167473154373896203436806908913091121947162452896071564092737961908660984482393247148789843287711178022307994232547371668339453767902590820307947458700379454535785143261333718503831510741892113212862974188905351819040231571308e-01)}}, + {{SC_(1.45588922500610351562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.93405439789757141275202601364355779502679848734651978182155130072168276482638826307412791668860025733070999061755033321901886773799227371917222595289420747085427784871438532344797731199223428339013161791677570085265437560296083277340845904465956638418345392999864987861028929290148714050330685270670948455026609008733297837390643273232248915759554146794901132364794027334453505635161634851655441841286677285556554929761224110017992819251284010541747937525942378738773667656679523684139733660561250454e-01), SC_(1.14654403300175083648655241424713554876591410670899082802706257994408600890374804156744972009245333224858858840058865138728143319116190374735741716940083629338564479621306357085959924901450353848857626798452776676039763227965830495379918013430493486371677347432381790712020223595336542260879737099747022574632060518401383064409905884124848180841992448644395615313940886011062062975865185967646280984788987330078321682531189251440331206378939892631509660362968636990584420084242504975617656278628117103e-01)}}, + {{SC_(1.47166442871093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.95090455929404666006154823168144087189140053255522339316806520598490841109867383633977530535018659423876097071858161130203706649002027525940404478895698367390354260462433431675488818940998152329248038804193093807009906773861589081969360477762624353775906996639062265252175967961550873009581733911335420867297760020697540822045266366770530036973389680212375467050585559942092343814379574239413774425890235854531425676118483749702011351971360190721833433641572164265515387155347107711295271352712743920e-01), SC_(9.89696141156948746533779105739509719701859485070413706167484933115112066336174440361597142496460529005477561627345324008350535949128391226579786599207708363053074301827988346459788334279429737675780235245888898300686596905930790877873637403683928778470682731019204053504784430768910655143803501705308467894729067255148499639765331390047487792750517217890381326189053380138858456505067986074977471820348175139209916889960977991394445595370464003745273811411030937898173471905892363724061478289793119348e-02)}}, + {{SC_(1.48118925094604492187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.95987971581469849835212192761387433880948032799743403113405841762301737272660663272771126085311509092947080459948251558013435279217583393463811660766402644800234944489251699740786371879736855583038422681603128446143622034878159613520219538075200024898473039195144740678733899601210689307500632218154184430050627947647985952105033868309795151096435214211084770689499068527480958647335117598393401054903120640089430217860460804499994297927249386845726766898814799195449319720578659538420256997308211025e-01), SC_(8.94872083877310745992995729453189430370374216494843644464203198739023378590658969785214597002302119076433271051158949450602535037208901054605904460051131565768944344714994340047575313236362345896146244898245040780545731961335279415963661509788420847604974741441811091560365159585870007428861114817117469981394171402847618853548699252957873293345224676542413493010857730777156556972874471318434497632251719969283577188808589709859828953081848004422162716626512357272747440738023351312980295536798316922e-02)}}, + {{SC_(1.48278236389160156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.96129270838430119300051168101128018381711663975084689464093791562764752253731121972874715487882382751179770152493027118683467727036964708520634542103501485669757146226438488081878080926649554606187846378195600014774584360969390987124603322695895627803222154125777080064227842041901715773894330691637378759131986041012989252185848914840073182305921568081447589877312031877944980532384362610432698158884417534261275444275397015596380868316425733585342742440883714085896222445321624407650811982586296636e-01), SC_(8.79003741681315821251280686027308782114586877469765715995387548225892541129646634622181193716483073221684877664769071763743258458728042536681305436365814040903460426066931360249824421763839424383563759428429066149167258244393099606620797760427563923085307430292326673397490669016001630596625436022406452453276617767081117940821836317631747493227941287539612890181193545073004560915169680617098938412078376539261936819313380292445951887013297284686257609312633392205252300434267806647195017089621710655e-02)}}, + {{SC_(1.48932170867919921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.96682778918135881536275990842605733339523038813167252150321614421595525838928211021490885982758765990951313520268744178158346030034831122597669741414660123131649499595170494000918804089933602318505074023337014767210419674606196522230870351450346722685462669386186899171200820043924773724372012377225749522475547961748742969344987224598725348359245989549214445144233239343849591742100654576204916431612729728023490540829084798820588062343315674262313864097725179428828982666540343368732780105039454552e-01), SC_(8.13845084031492640613386104575625537797314524719600723400961398682265346258342553800702435865044529994514493269349360241716452021150170976184564475930349320327294213744778471680231255567737036617811154621323506663548592662785646800499829866106486293702489790533055529549635178889628268927391706714202367178496631902276183977618547547514283224465880040875138298723442763757980830113435205370560834162520016704500157651115626101042762031082967251945734212875798186029500136459910061696644610683824984172e-02)}}, + {{SC_(1.49110269546508789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.96826142879974523863831045963884109600409432642463162064145662688965036053042311506387703651817442121009205293172616437818555258112251730073632334612968938357736365937318953971797778938245108123188897428261195201653763029717278994009284610609918683798387178776970008741366601835926335083641809206050796411321487406184056687220549994528554465293966740994858430339601520279341278775826310640952951225475713531037110335618328239225533137083081585843611982466861028545104133721132301207113669094208158152e-01), SC_(7.96093014102787857311853897169714896003178997833084509746261920212282904923245728708338229611953838785802609515963050682205601178649541846223606669995712553087046533525243208438038611435636700879519384389078441175165514979582616566905525683674375742838422423588917802839236707296641241280017877960271241566981191179744385341858916524101345194801390243168621344421220012275921118083354308199733352187061121123492182523906644632947523518443805234926530481306985017526225224799204564632165926385889633624e-02)}}, + {{SC_(1.49469184875488281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00), SC_(9.97105451691637836980566977886191495470310625478984302514468734081978317004712365179572388160094873766545892259684126612171730371334431713402903857531243843855031719141960805464286066705907297221591074259625271788178601626673326754719816154765918422856170761025895221537060495081964634143881365727528637573199554544101393148199185537988251924073321046398397270592899501388280072694753480150196648362062195285790390273399747995245778399713979670854796624214784952767383795902013605892666997263955330095e-01), SC_(7.60310344978606994311454252807960986535803469428379193529425796476644344334413001865738243975566508261589698713562091901145249736705485695273728137391377751615494502695150924195446763383201607951069471691560757133118887684442353070862022248337360915742210326532477359739395822627983312298986859616214217003217070111399151039551118513567199164797534425187953687276545896053419230138261452230491054544837629498576689887971671483487696900902095055042924520918068327882892863731988941436799798706418513466e-02)}}}}; +//#undef SC_ diff --git a/src/boost/libs/multiprecision/test/string_data.ipp b/src/boost/libs/multiprecision/test/string_data.ipp new file mode 100644 index 00000000..10cae895 --- /dev/null +++ b/src/boost/libs/multiprecision/test/string_data.ipp @@ -0,0 +1,4765 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +{{ + "1e+08", + "1.e+08", + "+1e+08", + "1.2e+08", + "+1.2e+08", + "1.2e+08", + "123456789.0", + "123456789.0", + "+123456789.0", + "1.2e+08", + "1.2e+08", + "+1.2e+08", + "1.23e+08", + "+1.23e+08", + "1.23e+08", + "123456789.00", + "123456789.00", + "+123456789.00", + "1.23e+08", + "1.23e+08", + "+1.23e+08", + "1.235e+08", + "+1.235e+08", + "1.235e+08", + "123456789.000", + "123456789.000", + "+123456789.000", + "1.235e+08", + "1.235e+08", + "+1.235e+08", + "1.2346e+08", + "+1.2346e+08", + "1.2346e+08", + "123456789.0000", + "123456789.0000", + "+123456789.0000", + "1.2346e+08", + "1.2346e+08", + "+1.2346e+08", + "1.23457e+08", + "+1.23457e+08", + "1.23457e+08", + "123456789.00000", + "123456789.00000", + "+123456789.00000", + "1.23457e+08", + "1.23457e+08", + "+1.23457e+08", + "1.234568e+08", + "+1.234568e+08", + "1.234568e+08", + "123456789.000000", + "123456789.000000", + "+123456789.000000", + "1.234568e+08", + "1.234568e+08", + "+1.234568e+08", + "1.2345679e+08", + "+1.2345679e+08", + "1.2345679e+08", + "123456789.0000000", + "123456789.0000000", + "+123456789.0000000", + "1.2345679e+08", + "1.2345679e+08", + "+1.2345679e+08", + "1.23456789e+08", + "+1.23456789e+08", + "1.23456789e+08", + "123456789.00000000", + "123456789.00000000", + "+123456789.00000000", + "123456789", + "123456789.", + "+123456789", + "1.234567890e+08", + "+1.234567890e+08", + "1.234567890e+08", + "123456789.000000000", + "123456789.000000000", + "+123456789.000000000", + "123456789", + "123456789.0", + "+123456789", + "1.2345678900e+08", + "+1.2345678900e+08", + "1.2345678900e+08", + "123456789.0000000000", + "123456789.0000000000", + "+123456789.0000000000", + "123456789", + "123456789.00", + "+123456789", + "1.23456789000e+08", + "+1.23456789000e+08", + "1.23456789000e+08", + "123456789.00000000000", + "123456789.00000000000", + "+123456789.00000000000", + "123456789", + "123456789.000", + "+123456789", + "1.234567890000e+08", + "+1.234567890000e+08", + "1.234567890000e+08", + "123456789.000000000000", + "123456789.000000000000", + "+123456789.000000000000", + "123456789", + "123456789.0000", + "+123456789", + "1.2345678900000e+08", + "+1.2345678900000e+08", + "1.2345678900000e+08", + "123456789.0000000000000", + "123456789.0000000000000", + "+123456789.0000000000000", +}}, + {{ + "-1e+08", + "-1.e+08", + "-1e+08", + "-1.2e+08", + "-1.2e+08", + "-1.2e+08", + "-123456789.0", + "-123456789.0", + "-123456789.0", + "-1.2e+08", + "-1.2e+08", + "-1.2e+08", + "-1.23e+08", + "-1.23e+08", + "-1.23e+08", + "-123456789.00", + "-123456789.00", + "-123456789.00", + "-1.23e+08", + "-1.23e+08", + "-1.23e+08", + "-1.235e+08", + "-1.235e+08", + "-1.235e+08", + "-123456789.000", + "-123456789.000", + "-123456789.000", + "-1.235e+08", + "-1.235e+08", + "-1.235e+08", + "-1.2346e+08", + "-1.2346e+08", + "-1.2346e+08", + "-123456789.0000", + "-123456789.0000", + "-123456789.0000", + "-1.2346e+08", + "-1.2346e+08", + "-1.2346e+08", + "-1.23457e+08", + "-1.23457e+08", + "-1.23457e+08", + "-123456789.00000", + "-123456789.00000", + "-123456789.00000", + "-1.23457e+08", + "-1.23457e+08", + "-1.23457e+08", + "-1.234568e+08", + "-1.234568e+08", + "-1.234568e+08", + "-123456789.000000", + "-123456789.000000", + "-123456789.000000", + "-1.234568e+08", + "-1.234568e+08", + "-1.234568e+08", + "-1.2345679e+08", + "-1.2345679e+08", + "-1.2345679e+08", + "-123456789.0000000", + "-123456789.0000000", + "-123456789.0000000", + "-1.2345679e+08", + "-1.2345679e+08", + "-1.2345679e+08", + "-1.23456789e+08", + "-1.23456789e+08", + "-1.23456789e+08", + "-123456789.00000000", + "-123456789.00000000", + "-123456789.00000000", + "-123456789", + "-123456789.", + "-123456789", + "-1.234567890e+08", + "-1.234567890e+08", + "-1.234567890e+08", + "-123456789.000000000", + "-123456789.000000000", + "-123456789.000000000", + "-123456789", + "-123456789.0", + "-123456789", + "-1.2345678900e+08", + "-1.2345678900e+08", + "-1.2345678900e+08", + "-123456789.0000000000", + "-123456789.0000000000", + "-123456789.0000000000", + "-123456789", + "-123456789.00", + "-123456789", + "-1.23456789000e+08", + "-1.23456789000e+08", + "-1.23456789000e+08", + "-123456789.00000000000", + "-123456789.00000000000", + "-123456789.00000000000", + "-123456789", + "-123456789.000", + "-123456789", + "-1.234567890000e+08", + "-1.234567890000e+08", + "-1.234567890000e+08", + "-123456789.000000000000", + "-123456789.000000000000", + "-123456789.000000000000", + "-123456789", + "-123456789.0000", + "-123456789", + "-1.2345678900000e+08", + "-1.2345678900000e+08", + "-1.2345678900000e+08", + "-123456789.0000000000000", + "-123456789.0000000000000", + "-123456789.0000000000000", + }}, + {{ + "2e+07", + "2.e+07", + "+2e+07", + "1.5e+07", + "+1.5e+07", + "1.5e+07", + "15432098.6", + "15432098.6", + "+15432098.6", + "1.5e+07", + "1.5e+07", + "+1.5e+07", + "1.54e+07", + "+1.54e+07", + "1.54e+07", + "15432098.62", + "15432098.62", + "+15432098.62", + "1.54e+07", + "1.54e+07", + "+1.54e+07", + "1.543e+07", + "+1.543e+07", + "1.543e+07", + "15432098.625", + "15432098.625", + "+15432098.625", + "1.543e+07", + "1.543e+07", + "+1.543e+07", + "1.5432e+07", + "+1.5432e+07", + "1.5432e+07", + "15432098.6250", + "15432098.6250", + "+15432098.6250", + "1.5432e+07", + "1.5432e+07", + "+1.5432e+07", + "1.54321e+07", + "+1.54321e+07", + "1.54321e+07", + "15432098.62500", + "15432098.62500", + "+15432098.62500", + "1.54321e+07", + "1.54321e+07", + "+1.54321e+07", + "1.543210e+07", + "+1.543210e+07", + "1.543210e+07", + "15432098.625000", + "15432098.625000", + "+15432098.625000", + "1.54321e+07", + "1.543210e+07", + "+1.54321e+07", + "1.5432099e+07", + "+1.5432099e+07", + "1.5432099e+07", + "15432098.6250000", + "15432098.6250000", + "+15432098.6250000", + "15432099", + "15432099.", + "+15432099", + "1.54320986e+07", + "+1.54320986e+07", + "1.54320986e+07", + "15432098.62500000", + "15432098.62500000", + "+15432098.62500000", + "15432098.6", + "15432098.6", + "+15432098.6", + "1.543209862e+07", + "+1.543209862e+07", + "1.543209862e+07", + "15432098.625000000", + "15432098.625000000", + "+15432098.625000000", + "15432098.62", + "15432098.62", + "+15432098.62", + "1.5432098625e+07", + "+1.5432098625e+07", + "1.5432098625e+07", + "15432098.6250000000", + "15432098.6250000000", + "+15432098.6250000000", + "15432098.625", + "15432098.625", + "+15432098.625", + "1.54320986250e+07", + "+1.54320986250e+07", + "1.54320986250e+07", + "15432098.62500000000", + "15432098.62500000000", + "+15432098.62500000000", + "15432098.625", + "15432098.6250", + "+15432098.625", + "1.543209862500e+07", + "+1.543209862500e+07", + "1.543209862500e+07", + "15432098.625000000000", + "15432098.625000000000", + "+15432098.625000000000", + "15432098.625", + "15432098.62500", + "+15432098.625", + "1.5432098625000e+07", + "+1.5432098625000e+07", + "1.5432098625000e+07", + "15432098.6250000000000", + "15432098.6250000000000", + "+15432098.6250000000000", + }}, + {{ + "-2e+07", + "-2.e+07", + "-2e+07", + "-1.5e+07", + "-1.5e+07", + "-1.5e+07", + "-15432098.6", + "-15432098.6", + "-15432098.6", + "-1.5e+07", + "-1.5e+07", + "-1.5e+07", + "-1.54e+07", + "-1.54e+07", + "-1.54e+07", + "-15432098.62", + "-15432098.62", + "-15432098.62", + "-1.54e+07", + "-1.54e+07", + "-1.54e+07", + "-1.543e+07", + "-1.543e+07", + "-1.543e+07", + "-15432098.625", + "-15432098.625", + "-15432098.625", + "-1.543e+07", + "-1.543e+07", + "-1.543e+07", + "-1.5432e+07", + "-1.5432e+07", + "-1.5432e+07", + "-15432098.6250", + "-15432098.6250", + "-15432098.6250", + "-1.5432e+07", + "-1.5432e+07", + "-1.5432e+07", + "-1.54321e+07", + "-1.54321e+07", + "-1.54321e+07", + "-15432098.62500", + "-15432098.62500", + "-15432098.62500", + "-1.54321e+07", + "-1.54321e+07", + "-1.54321e+07", + "-1.543210e+07", + "-1.543210e+07", + "-1.543210e+07", + "-15432098.625000", + "-15432098.625000", + "-15432098.625000", + "-1.54321e+07", + "-1.543210e+07", + "-1.54321e+07", + "-1.5432099e+07", + "-1.5432099e+07", + "-1.5432099e+07", + "-15432098.6250000", + "-15432098.6250000", + "-15432098.6250000", + "-15432099", + "-15432099.", + "-15432099", + "-1.54320986e+07", + "-1.54320986e+07", + "-1.54320986e+07", + "-15432098.62500000", + "-15432098.62500000", + "-15432098.62500000", + "-15432098.6", + "-15432098.6", + "-15432098.6", + "-1.543209862e+07", + "-1.543209862e+07", + "-1.543209862e+07", + "-15432098.625000000", + "-15432098.625000000", + "-15432098.625000000", + "-15432098.62", + "-15432098.62", + "-15432098.62", + "-1.5432098625e+07", + "-1.5432098625e+07", + "-1.5432098625e+07", + "-15432098.6250000000", + "-15432098.6250000000", + "-15432098.6250000000", + "-15432098.625", + "-15432098.625", + "-15432098.625", + "-1.54320986250e+07", + "-1.54320986250e+07", + "-1.54320986250e+07", + "-15432098.62500000000", + "-15432098.62500000000", + "-15432098.62500000000", + "-15432098.625", + "-15432098.6250", + "-15432098.625", + "-1.543209862500e+07", + "-1.543209862500e+07", + "-1.543209862500e+07", + "-15432098.625000000000", + "-15432098.625000000000", + "-15432098.625000000000", + "-15432098.625", + "-15432098.62500", + "-15432098.625", + "-1.5432098625000e+07", + "-1.5432098625000e+07", + "-1.5432098625000e+07", + "-15432098.6250000000000", + "-15432098.6250000000000", + "-15432098.6250000000000", + }}, + {{ + "2e+06", + "2.e+06", + "+2e+06", + "1.9e+06", + "+1.9e+06", + "1.9e+06", + "1929012.3", + "1929012.3", + "+1929012.3", + "1.9e+06", + "1.9e+06", + "+1.9e+06", + "1.93e+06", + "+1.93e+06", + "1.93e+06", + "1929012.33", + "1929012.33", + "+1929012.33", + "1.93e+06", + "1.93e+06", + "+1.93e+06", + "1.929e+06", + "+1.929e+06", + "1.929e+06", + "1929012.328", + "1929012.328", + "+1929012.328", + "1.929e+06", + "1.929e+06", + "+1.929e+06", + "1.9290e+06", + "+1.9290e+06", + "1.9290e+06", + "1929012.3281", + "1929012.3281", + "+1929012.3281", + "1.929e+06", + "1.9290e+06", + "+1.929e+06", + "1.92901e+06", + "+1.92901e+06", + "1.92901e+06", + "1929012.32812", + "1929012.32812", + "+1929012.32812", + "1.92901e+06", + "1.92901e+06", + "+1.92901e+06", + "1.929012e+06", + "+1.929012e+06", + "1.929012e+06", + "1929012.328125", + "1929012.328125", + "+1929012.328125", + "1929012", + "1929012.", + "+1929012", + "1.9290123e+06", + "+1.9290123e+06", + "1.9290123e+06", + "1929012.3281250", + "1929012.3281250", + "+1929012.3281250", + "1929012.3", + "1929012.3", + "+1929012.3", + "1.92901233e+06", + "+1.92901233e+06", + "1.92901233e+06", + "1929012.32812500", + "1929012.32812500", + "+1929012.32812500", + "1929012.33", + "1929012.33", + "+1929012.33", + "1.929012328e+06", + "+1.929012328e+06", + "1.929012328e+06", + "1929012.328125000", + "1929012.328125000", + "+1929012.328125000", + "1929012.328", + "1929012.328", + "+1929012.328", + "1.9290123281e+06", + "+1.9290123281e+06", + "1.9290123281e+06", + "1929012.3281250000", + "1929012.3281250000", + "+1929012.3281250000", + "1929012.3281", + "1929012.3281", + "+1929012.3281", + "1.92901232812e+06", + "+1.92901232812e+06", + "1.92901232812e+06", + "1929012.32812500000", + "1929012.32812500000", + "+1929012.32812500000", + "1929012.32812", + "1929012.32812", + "+1929012.32812", + "1.929012328125e+06", + "+1.929012328125e+06", + "1.929012328125e+06", + "1929012.328125000000", + "1929012.328125000000", + "+1929012.328125000000", + "1929012.328125", + "1929012.328125", + "+1929012.328125", + "1.9290123281250e+06", + "+1.9290123281250e+06", + "1.9290123281250e+06", + "1929012.3281250000000", + "1929012.3281250000000", + "+1929012.3281250000000", + }}, + {{ + "-2e+06", + "-2.e+06", + "-2e+06", + "-1.9e+06", + "-1.9e+06", + "-1.9e+06", + "-1929012.3", + "-1929012.3", + "-1929012.3", + "-1.9e+06", + "-1.9e+06", + "-1.9e+06", + "-1.93e+06", + "-1.93e+06", + "-1.93e+06", + "-1929012.33", + "-1929012.33", + "-1929012.33", + "-1.93e+06", + "-1.93e+06", + "-1.93e+06", + "-1.929e+06", + "-1.929e+06", + "-1.929e+06", + "-1929012.328", + "-1929012.328", + "-1929012.328", + "-1.929e+06", + "-1.929e+06", + "-1.929e+06", + "-1.9290e+06", + "-1.9290e+06", + "-1.9290e+06", + "-1929012.3281", + "-1929012.3281", + "-1929012.3281", + "-1.929e+06", + "-1.9290e+06", + "-1.929e+06", + "-1.92901e+06", + "-1.92901e+06", + "-1.92901e+06", + "-1929012.32812", + "-1929012.32812", + "-1929012.32812", + "-1.92901e+06", + "-1.92901e+06", + "-1.92901e+06", + "-1.929012e+06", + "-1.929012e+06", + "-1.929012e+06", + "-1929012.328125", + "-1929012.328125", + "-1929012.328125", + "-1929012", + "-1929012.", + "-1929012", + "-1.9290123e+06", + "-1.9290123e+06", + "-1.9290123e+06", + "-1929012.3281250", + "-1929012.3281250", + "-1929012.3281250", + "-1929012.3", + "-1929012.3", + "-1929012.3", + "-1.92901233e+06", + "-1.92901233e+06", + "-1.92901233e+06", + "-1929012.32812500", + "-1929012.32812500", + "-1929012.32812500", + "-1929012.33", + "-1929012.33", + "-1929012.33", + "-1.929012328e+06", + "-1.929012328e+06", + "-1.929012328e+06", + "-1929012.328125000", + "-1929012.328125000", + "-1929012.328125000", + "-1929012.328", + "-1929012.328", + "-1929012.328", + "-1.9290123281e+06", + "-1.9290123281e+06", + "-1.9290123281e+06", + "-1929012.3281250000", + "-1929012.3281250000", + "-1929012.3281250000", + "-1929012.3281", + "-1929012.3281", + "-1929012.3281", + "-1.92901232812e+06", + "-1.92901232812e+06", + "-1.92901232812e+06", + "-1929012.32812500000", + "-1929012.32812500000", + "-1929012.32812500000", + "-1929012.32812", + "-1929012.32812", + "-1929012.32812", + "-1.929012328125e+06", + "-1.929012328125e+06", + "-1.929012328125e+06", + "-1929012.328125000000", + "-1929012.328125000000", + "-1929012.328125000000", + "-1929012.328125", + "-1929012.328125", + "-1929012.328125", + "-1.9290123281250e+06", + "-1.9290123281250e+06", + "-1.9290123281250e+06", + "-1929012.3281250000000", + "-1929012.3281250000000", + "-1929012.3281250000000", + }}, + {{ + "2e+05", + "2.e+05", + "+2e+05", + "2.4e+05", + "+2.4e+05", + "2.4e+05", + "241126.5", + "241126.5", + "+241126.5", + "2.4e+05", + "2.4e+05", + "+2.4e+05", + "2.41e+05", + "+2.41e+05", + "2.41e+05", + "241126.54", + "241126.54", + "+241126.54", + "2.41e+05", + "2.41e+05", + "+2.41e+05", + "2.411e+05", + "+2.411e+05", + "2.411e+05", + "241126.541", + "241126.541", + "+241126.541", + "2.411e+05", + "2.411e+05", + "+2.411e+05", + "2.4113e+05", + "+2.4113e+05", + "2.4113e+05", + "241126.5410", + "241126.5410", + "+241126.5410", + "2.4113e+05", + "2.4113e+05", + "+2.4113e+05", + "2.41127e+05", + "+2.41127e+05", + "2.41127e+05", + "241126.54102", + "241126.54102", + "+241126.54102", + "241127", + "241127.", + "+241127", + "2.411265e+05", + "+2.411265e+05", + "2.411265e+05", + "241126.541016", + "241126.541016", + "+241126.541016", + "241126.5", + "241126.5", + "+241126.5", + "2.4112654e+05", + "+2.4112654e+05", + "2.4112654e+05", + "241126.5410156", + "241126.5410156", + "+241126.5410156", + "241126.54", + "241126.54", + "+241126.54", + "2.41126541e+05", + "+2.41126541e+05", + "2.41126541e+05", + "241126.54101562", + "241126.54101562", + "+241126.54101562", + "241126.541", + "241126.541", + "+241126.541", + "2.411265410e+05", + "+2.411265410e+05", + "2.411265410e+05", + "241126.541015625", + "241126.541015625", + "+241126.541015625", + "241126.541", + "241126.5410", + "+241126.541", + "2.4112654102e+05", + "+2.4112654102e+05", + "2.4112654102e+05", + "241126.5410156250", + "241126.5410156250", + "+241126.5410156250", + "241126.54102", + "241126.54102", + "+241126.54102", + "2.41126541016e+05", + "+2.41126541016e+05", + "2.41126541016e+05", + "241126.54101562500", + "241126.54101562500", + "+241126.54101562500", + "241126.541016", + "241126.541016", + "+241126.541016", + "2.411265410156e+05", + "+2.411265410156e+05", + "2.411265410156e+05", + "241126.541015625000", + "241126.541015625000", + "+241126.541015625000", + "241126.5410156", + "241126.5410156", + "+241126.5410156", + "2.4112654101562e+05", + "+2.4112654101562e+05", + "2.4112654101562e+05", + "241126.5410156250000", + "241126.5410156250000", + "+241126.5410156250000", + }}, + {{ + "-2e+05", + "-2.e+05", + "-2e+05", + "-2.4e+05", + "-2.4e+05", + "-2.4e+05", + "-241126.5", + "-241126.5", + "-241126.5", + "-2.4e+05", + "-2.4e+05", + "-2.4e+05", + "-2.41e+05", + "-2.41e+05", + "-2.41e+05", + "-241126.54", + "-241126.54", + "-241126.54", + "-2.41e+05", + "-2.41e+05", + "-2.41e+05", + "-2.411e+05", + "-2.411e+05", + "-2.411e+05", + "-241126.541", + "-241126.541", + "-241126.541", + "-2.411e+05", + "-2.411e+05", + "-2.411e+05", + "-2.4113e+05", + "-2.4113e+05", + "-2.4113e+05", + "-241126.5410", + "-241126.5410", + "-241126.5410", + "-2.4113e+05", + "-2.4113e+05", + "-2.4113e+05", + "-2.41127e+05", + "-2.41127e+05", + "-2.41127e+05", + "-241126.54102", + "-241126.54102", + "-241126.54102", + "-241127", + "-241127.", + "-241127", + "-2.411265e+05", + "-2.411265e+05", + "-2.411265e+05", + "-241126.541016", + "-241126.541016", + "-241126.541016", + "-241126.5", + "-241126.5", + "-241126.5", + "-2.4112654e+05", + "-2.4112654e+05", + "-2.4112654e+05", + "-241126.5410156", + "-241126.5410156", + "-241126.5410156", + "-241126.54", + "-241126.54", + "-241126.54", + "-2.41126541e+05", + "-2.41126541e+05", + "-2.41126541e+05", + "-241126.54101562", + "-241126.54101562", + "-241126.54101562", + "-241126.541", + "-241126.541", + "-241126.541", + "-2.411265410e+05", + "-2.411265410e+05", + "-2.411265410e+05", + "-241126.541015625", + "-241126.541015625", + "-241126.541015625", + "-241126.541", + "-241126.5410", + "-241126.541", + "-2.4112654102e+05", + "-2.4112654102e+05", + "-2.4112654102e+05", + "-241126.5410156250", + "-241126.5410156250", + "-241126.5410156250", + "-241126.54102", + "-241126.54102", + "-241126.54102", + "-2.41126541016e+05", + "-2.41126541016e+05", + "-2.41126541016e+05", + "-241126.54101562500", + "-241126.54101562500", + "-241126.54101562500", + "-241126.541016", + "-241126.541016", + "-241126.541016", + "-2.411265410156e+05", + "-2.411265410156e+05", + "-2.411265410156e+05", + "-241126.541015625000", + "-241126.541015625000", + "-241126.541015625000", + "-241126.5410156", + "-241126.5410156", + "-241126.5410156", + "-2.4112654101562e+05", + "-2.4112654101562e+05", + "-2.4112654101562e+05", + "-241126.5410156250000", + "-241126.5410156250000", + "-241126.5410156250000", + }}, + {{ + "3e+04", + "3.e+04", + "+3e+04", + "3.0e+04", + "+3.0e+04", + "3.0e+04", + "30140.8", + "30140.8", + "+30140.8", + "3e+04", + "3.0e+04", + "+3e+04", + "3.01e+04", + "+3.01e+04", + "3.01e+04", + "30140.82", + "30140.82", + "+30140.82", + "3.01e+04", + "3.01e+04", + "+3.01e+04", + "3.014e+04", + "+3.014e+04", + "3.014e+04", + "30140.818", + "30140.818", + "+30140.818", + "3.014e+04", + "3.014e+04", + "+3.014e+04", + "3.0141e+04", + "+3.0141e+04", + "3.0141e+04", + "30140.8176", + "30140.8176", + "+30140.8176", + "30141", + "30141.", + "+30141", + "3.01408e+04", + "+3.01408e+04", + "3.01408e+04", + "30140.81763", + "30140.81763", + "+30140.81763", + "30140.8", + "30140.8", + "+30140.8", + "3.014082e+04", + "+3.014082e+04", + "3.014082e+04", + "30140.817627", + "30140.817627", + "+30140.817627", + "30140.82", + "30140.82", + "+30140.82", + "3.0140818e+04", + "+3.0140818e+04", + "3.0140818e+04", + "30140.8176270", + "30140.8176270", + "+30140.8176270", + "30140.818", + "30140.818", + "+30140.818", + "3.01408176e+04", + "+3.01408176e+04", + "3.01408176e+04", + "30140.81762695", + "30140.81762695", + "+30140.81762695", + "30140.8176", + "30140.8176", + "+30140.8176", + "3.014081763e+04", + "+3.014081763e+04", + "3.014081763e+04", + "30140.817626953", + "30140.817626953", + "+30140.817626953", + "30140.81763", + "30140.81763", + "+30140.81763", + "3.0140817627e+04", + "+3.0140817627e+04", + "3.0140817627e+04", + "30140.8176269531", + "30140.8176269531", + "+30140.8176269531", + "30140.817627", + "30140.817627", + "+30140.817627", + "3.01408176270e+04", + "+3.01408176270e+04", + "3.01408176270e+04", + "30140.81762695312", + "30140.81762695312", + "+30140.81762695312", + "30140.817627", + "30140.8176270", + "+30140.817627", + "3.014081762695e+04", + "+3.014081762695e+04", + "3.014081762695e+04", + "30140.817626953125", + "30140.817626953125", + "+30140.817626953125", + "30140.81762695", + "30140.81762695", + "+30140.81762695", + "3.0140817626953e+04", + "+3.0140817626953e+04", + "3.0140817626953e+04", + "30140.8176269531250", + "30140.8176269531250", + "+30140.8176269531250", + }}, + {{ + "-3e+04", + "-3.e+04", + "-3e+04", + "-3.0e+04", + "-3.0e+04", + "-3.0e+04", + "-30140.8", + "-30140.8", + "-30140.8", + "-3e+04", + "-3.0e+04", + "-3e+04", + "-3.01e+04", + "-3.01e+04", + "-3.01e+04", + "-30140.82", + "-30140.82", + "-30140.82", + "-3.01e+04", + "-3.01e+04", + "-3.01e+04", + "-3.014e+04", + "-3.014e+04", + "-3.014e+04", + "-30140.818", + "-30140.818", + "-30140.818", + "-3.014e+04", + "-3.014e+04", + "-3.014e+04", + "-3.0141e+04", + "-3.0141e+04", + "-3.0141e+04", + "-30140.8176", + "-30140.8176", + "-30140.8176", + "-30141", + "-30141.", + "-30141", + "-3.01408e+04", + "-3.01408e+04", + "-3.01408e+04", + "-30140.81763", + "-30140.81763", + "-30140.81763", + "-30140.8", + "-30140.8", + "-30140.8", + "-3.014082e+04", + "-3.014082e+04", + "-3.014082e+04", + "-30140.817627", + "-30140.817627", + "-30140.817627", + "-30140.82", + "-30140.82", + "-30140.82", + "-3.0140818e+04", + "-3.0140818e+04", + "-3.0140818e+04", + "-30140.8176270", + "-30140.8176270", + "-30140.8176270", + "-30140.818", + "-30140.818", + "-30140.818", + "-3.01408176e+04", + "-3.01408176e+04", + "-3.01408176e+04", + "-30140.81762695", + "-30140.81762695", + "-30140.81762695", + "-30140.8176", + "-30140.8176", + "-30140.8176", + "-3.014081763e+04", + "-3.014081763e+04", + "-3.014081763e+04", + "-30140.817626953", + "-30140.817626953", + "-30140.817626953", + "-30140.81763", + "-30140.81763", + "-30140.81763", + "-3.0140817627e+04", + "-3.0140817627e+04", + "-3.0140817627e+04", + "-30140.8176269531", + "-30140.8176269531", + "-30140.8176269531", + "-30140.817627", + "-30140.817627", + "-30140.817627", + "-3.01408176270e+04", + "-3.01408176270e+04", + "-3.01408176270e+04", + "-30140.81762695312", + "-30140.81762695312", + "-30140.81762695312", + "-30140.817627", + "-30140.8176270", + "-30140.817627", + "-3.014081762695e+04", + "-3.014081762695e+04", + "-3.014081762695e+04", + "-30140.817626953125", + "-30140.817626953125", + "-30140.817626953125", + "-30140.81762695", + "-30140.81762695", + "-30140.81762695", + "-3.0140817626953e+04", + "-3.0140817626953e+04", + "-3.0140817626953e+04", + "-30140.8176269531250", + "-30140.8176269531250", + "-30140.8176269531250", + }}, + {{ + "4e+03", + "4.e+03", + "+4e+03", + "3.8e+03", + "+3.8e+03", + "3.8e+03", + "3767.6", + "3767.6", + "+3767.6", + "3.8e+03", + "3.8e+03", + "+3.8e+03", + "3.77e+03", + "+3.77e+03", + "3.77e+03", + "3767.60", + "3767.60", + "+3767.60", + "3.77e+03", + "3.77e+03", + "+3.77e+03", + "3.768e+03", + "+3.768e+03", + "3.768e+03", + "3767.602", + "3767.602", + "+3767.602", + "3768", + "3768.", + "+3768", + "3.7676e+03", + "+3.7676e+03", + "3.7676e+03", + "3767.6022", + "3767.6022", + "+3767.6022", + "3767.6", + "3767.6", + "+3767.6", + "3.76760e+03", + "+3.76760e+03", + "3.76760e+03", + "3767.60220", + "3767.60220", + "+3767.60220", + "3767.6", + "3767.60", + "+3767.6", + "3.767602e+03", + "+3.767602e+03", + "3.767602e+03", + "3767.602203", + "3767.602203", + "+3767.602203", + "3767.602", + "3767.602", + "+3767.602", + "3.7676022e+03", + "+3.7676022e+03", + "3.7676022e+03", + "3767.6022034", + "3767.6022034", + "+3767.6022034", + "3767.6022", + "3767.6022", + "+3767.6022", + "3.76760220e+03", + "+3.76760220e+03", + "3.76760220e+03", + "3767.60220337", + "3767.60220337", + "+3767.60220337", + "3767.6022", + "3767.60220", + "+3767.6022", + "3.767602203e+03", + "+3.767602203e+03", + "3.767602203e+03", + "3767.602203369", + "3767.602203369", + "+3767.602203369", + "3767.602203", + "3767.602203", + "+3767.602203", + "3.7676022034e+03", + "+3.7676022034e+03", + "3.7676022034e+03", + "3767.6022033691", + "3767.6022033691", + "+3767.6022033691", + "3767.6022034", + "3767.6022034", + "+3767.6022034", + "3.76760220337e+03", + "+3.76760220337e+03", + "3.76760220337e+03", + "3767.60220336914", + "3767.60220336914", + "+3767.60220336914", + "3767.60220337", + "3767.60220337", + "+3767.60220337", + "3.767602203369e+03", + "+3.767602203369e+03", + "3.767602203369e+03", + "3767.602203369141", + "3767.602203369141", + "+3767.602203369141", + "3767.602203369", + "3767.602203369", + "+3767.602203369", + "3.7676022033691e+03", + "+3.7676022033691e+03", + "3.7676022033691e+03", + "3767.6022033691406", + "3767.6022033691406", + "+3767.6022033691406", + }}, + {{ + "-4e+03", + "-4.e+03", + "-4e+03", + "-3.8e+03", + "-3.8e+03", + "-3.8e+03", + "-3767.6", + "-3767.6", + "-3767.6", + "-3.8e+03", + "-3.8e+03", + "-3.8e+03", + "-3.77e+03", + "-3.77e+03", + "-3.77e+03", + "-3767.60", + "-3767.60", + "-3767.60", + "-3.77e+03", + "-3.77e+03", + "-3.77e+03", + "-3.768e+03", + "-3.768e+03", + "-3.768e+03", + "-3767.602", + "-3767.602", + "-3767.602", + "-3768", + "-3768.", + "-3768", + "-3.7676e+03", + "-3.7676e+03", + "-3.7676e+03", + "-3767.6022", + "-3767.6022", + "-3767.6022", + "-3767.6", + "-3767.6", + "-3767.6", + "-3.76760e+03", + "-3.76760e+03", + "-3.76760e+03", + "-3767.60220", + "-3767.60220", + "-3767.60220", + "-3767.6", + "-3767.60", + "-3767.6", + "-3.767602e+03", + "-3.767602e+03", + "-3.767602e+03", + "-3767.602203", + "-3767.602203", + "-3767.602203", + "-3767.602", + "-3767.602", + "-3767.602", + "-3.7676022e+03", + "-3.7676022e+03", + "-3.7676022e+03", + "-3767.6022034", + "-3767.6022034", + "-3767.6022034", + "-3767.6022", + "-3767.6022", + "-3767.6022", + "-3.76760220e+03", + "-3.76760220e+03", + "-3.76760220e+03", + "-3767.60220337", + "-3767.60220337", + "-3767.60220337", + "-3767.6022", + "-3767.60220", + "-3767.6022", + "-3.767602203e+03", + "-3.767602203e+03", + "-3.767602203e+03", + "-3767.602203369", + "-3767.602203369", + "-3767.602203369", + "-3767.602203", + "-3767.602203", + "-3767.602203", + "-3.7676022034e+03", + "-3.7676022034e+03", + "-3.7676022034e+03", + "-3767.6022033691", + "-3767.6022033691", + "-3767.6022033691", + "-3767.6022034", + "-3767.6022034", + "-3767.6022034", + "-3.76760220337e+03", + "-3.76760220337e+03", + "-3.76760220337e+03", + "-3767.60220336914", + "-3767.60220336914", + "-3767.60220336914", + "-3767.60220337", + "-3767.60220337", + "-3767.60220337", + "-3.767602203369e+03", + "-3.767602203369e+03", + "-3.767602203369e+03", + "-3767.602203369141", + "-3767.602203369141", + "-3767.602203369141", + "-3767.602203369", + "-3767.602203369", + "-3767.602203369", + "-3.7676022033691e+03", + "-3.7676022033691e+03", + "-3.7676022033691e+03", + "-3767.6022033691406", + "-3767.6022033691406", + "-3767.6022033691406", + }}, + {{ + "5e+02", + "5.e+02", + "+5e+02", + "4.7e+02", + "+4.7e+02", + "4.7e+02", + "471.0", + "471.0", + "+471.0", + "4.7e+02", + "4.7e+02", + "+4.7e+02", + "4.71e+02", + "+4.71e+02", + "4.71e+02", + "470.95", + "470.95", + "+470.95", + "471", + "471.", + "+471", + "4.710e+02", + "+4.710e+02", + "4.710e+02", + "470.950", + "470.950", + "+470.950", + "471", + "471.0", + "+471", + "4.7095e+02", + "+4.7095e+02", + "4.7095e+02", + "470.9503", + "470.9503", + "+470.9503", + "470.95", + "470.95", + "+470.95", + "4.70950e+02", + "+4.70950e+02", + "4.70950e+02", + "470.95028", + "470.95028", + "+470.95028", + "470.95", + "470.950", + "+470.95", + "4.709503e+02", + "+4.709503e+02", + "4.709503e+02", + "470.950275", + "470.950275", + "+470.950275", + "470.9503", + "470.9503", + "+470.9503", + "4.7095028e+02", + "+4.7095028e+02", + "4.7095028e+02", + "470.9502754", + "470.9502754", + "+470.9502754", + "470.95028", + "470.95028", + "+470.95028", + "4.70950275e+02", + "+4.70950275e+02", + "4.70950275e+02", + "470.95027542", + "470.95027542", + "+470.95027542", + "470.950275", + "470.950275", + "+470.950275", + "4.709502754e+02", + "+4.709502754e+02", + "4.709502754e+02", + "470.950275421", + "470.950275421", + "+470.950275421", + "470.9502754", + "470.9502754", + "+470.9502754", + "4.7095027542e+02", + "+4.7095027542e+02", + "4.7095027542e+02", + "470.9502754211", + "470.9502754211", + "+470.9502754211", + "470.95027542", + "470.95027542", + "+470.95027542", + "4.70950275421e+02", + "+4.70950275421e+02", + "4.70950275421e+02", + "470.95027542114", + "470.95027542114", + "+470.95027542114", + "470.950275421", + "470.950275421", + "+470.950275421", + "4.709502754211e+02", + "+4.709502754211e+02", + "4.709502754211e+02", + "470.950275421143", + "470.950275421143", + "+470.950275421143", + "470.9502754211", + "470.9502754211", + "+470.9502754211", + "4.7095027542114e+02", + "+4.7095027542114e+02", + "4.7095027542114e+02", + "470.9502754211426", + "470.9502754211426", + "+470.9502754211426", + }}, + {{ + "-5e+02", + "-5.e+02", + "-5e+02", + "-4.7e+02", + "-4.7e+02", + "-4.7e+02", + "-471.0", + "-471.0", + "-471.0", + "-4.7e+02", + "-4.7e+02", + "-4.7e+02", + "-4.71e+02", + "-4.71e+02", + "-4.71e+02", + "-470.95", + "-470.95", + "-470.95", + "-471", + "-471.", + "-471", + "-4.710e+02", + "-4.710e+02", + "-4.710e+02", + "-470.950", + "-470.950", + "-470.950", + "-471", + "-471.0", + "-471", + "-4.7095e+02", + "-4.7095e+02", + "-4.7095e+02", + "-470.9503", + "-470.9503", + "-470.9503", + "-470.95", + "-470.95", + "-470.95", + "-4.70950e+02", + "-4.70950e+02", + "-4.70950e+02", + "-470.95028", + "-470.95028", + "-470.95028", + "-470.95", + "-470.950", + "-470.95", + "-4.709503e+02", + "-4.709503e+02", + "-4.709503e+02", + "-470.950275", + "-470.950275", + "-470.950275", + "-470.9503", + "-470.9503", + "-470.9503", + "-4.7095028e+02", + "-4.7095028e+02", + "-4.7095028e+02", + "-470.9502754", + "-470.9502754", + "-470.9502754", + "-470.95028", + "-470.95028", + "-470.95028", + "-4.70950275e+02", + "-4.70950275e+02", + "-4.70950275e+02", + "-470.95027542", + "-470.95027542", + "-470.95027542", + "-470.950275", + "-470.950275", + "-470.950275", + "-4.709502754e+02", + "-4.709502754e+02", + "-4.709502754e+02", + "-470.950275421", + "-470.950275421", + "-470.950275421", + "-470.9502754", + "-470.9502754", + "-470.9502754", + "-4.7095027542e+02", + "-4.7095027542e+02", + "-4.7095027542e+02", + "-470.9502754211", + "-470.9502754211", + "-470.9502754211", + "-470.95027542", + "-470.95027542", + "-470.95027542", + "-4.70950275421e+02", + "-4.70950275421e+02", + "-4.70950275421e+02", + "-470.95027542114", + "-470.95027542114", + "-470.95027542114", + "-470.950275421", + "-470.950275421", + "-470.950275421", + "-4.709502754211e+02", + "-4.709502754211e+02", + "-4.709502754211e+02", + "-470.950275421143", + "-470.950275421143", + "-470.950275421143", + "-470.9502754211", + "-470.9502754211", + "-470.9502754211", + "-4.7095027542114e+02", + "-4.7095027542114e+02", + "-4.7095027542114e+02", + "-470.9502754211426", + "-470.9502754211426", + "-470.9502754211426", + }}, + {{ + "6e+01", + "6.e+01", + "+6e+01", + "5.9e+01", + "+5.9e+01", + "5.9e+01", + "58.9", + "58.9", + "+58.9", + "59", + "59.", + "+59", + "5.89e+01", + "+5.89e+01", + "5.89e+01", + "58.87", + "58.87", + "+58.87", + "58.9", + "58.9", + "+58.9", + "5.887e+01", + "+5.887e+01", + "5.887e+01", + "58.869", + "58.869", + "+58.869", + "58.87", + "58.87", + "+58.87", + "5.8869e+01", + "+5.8869e+01", + "5.8869e+01", + "58.8688", + "58.8688", + "+58.8688", + "58.869", + "58.869", + "+58.869", + "5.88688e+01", + "+5.88688e+01", + "5.88688e+01", + "58.86878", + "58.86878", + "+58.86878", + "58.8688", + "58.8688", + "+58.8688", + "5.886878e+01", + "+5.886878e+01", + "5.886878e+01", + "58.868784", + "58.868784", + "+58.868784", + "58.86878", + "58.86878", + "+58.86878", + "5.8868784e+01", + "+5.8868784e+01", + "5.8868784e+01", + "58.8687844", + "58.8687844", + "+58.8687844", + "58.868784", + "58.868784", + "+58.868784", + "5.88687844e+01", + "+5.88687844e+01", + "5.88687844e+01", + "58.86878443", + "58.86878443", + "+58.86878443", + "58.8687844", + "58.8687844", + "+58.8687844", + "5.886878443e+01", + "+5.886878443e+01", + "5.886878443e+01", + "58.868784428", + "58.868784428", + "+58.868784428", + "58.86878443", + "58.86878443", + "+58.86878443", + "5.8868784428e+01", + "+5.8868784428e+01", + "5.8868784428e+01", + "58.8687844276", + "58.8687844276", + "+58.8687844276", + "58.868784428", + "58.868784428", + "+58.868784428", + "5.88687844276e+01", + "+5.88687844276e+01", + "5.88687844276e+01", + "58.86878442764", + "58.86878442764", + "+58.86878442764", + "58.8687844276", + "58.8687844276", + "+58.8687844276", + "5.886878442764e+01", + "+5.886878442764e+01", + "5.886878442764e+01", + "58.868784427643", + "58.868784427643", + "+58.868784427643", + "58.86878442764", + "58.86878442764", + "+58.86878442764", + "5.8868784427643e+01", + "+5.8868784427643e+01", + "5.8868784427643e+01", + "58.8687844276428", + "58.8687844276428", + "+58.8687844276428", + }}, + {{ + "-6e+01", + "-6.e+01", + "-6e+01", + "-5.9e+01", + "-5.9e+01", + "-5.9e+01", + "-58.9", + "-58.9", + "-58.9", + "-59", + "-59.", + "-59", + "-5.89e+01", + "-5.89e+01", + "-5.89e+01", + "-58.87", + "-58.87", + "-58.87", + "-58.9", + "-58.9", + "-58.9", + "-5.887e+01", + "-5.887e+01", + "-5.887e+01", + "-58.869", + "-58.869", + "-58.869", + "-58.87", + "-58.87", + "-58.87", + "-5.8869e+01", + "-5.8869e+01", + "-5.8869e+01", + "-58.8688", + "-58.8688", + "-58.8688", + "-58.869", + "-58.869", + "-58.869", + "-5.88688e+01", + "-5.88688e+01", + "-5.88688e+01", + "-58.86878", + "-58.86878", + "-58.86878", + "-58.8688", + "-58.8688", + "-58.8688", + "-5.886878e+01", + "-5.886878e+01", + "-5.886878e+01", + "-58.868784", + "-58.868784", + "-58.868784", + "-58.86878", + "-58.86878", + "-58.86878", + "-5.8868784e+01", + "-5.8868784e+01", + "-5.8868784e+01", + "-58.8687844", + "-58.8687844", + "-58.8687844", + "-58.868784", + "-58.868784", + "-58.868784", + "-5.88687844e+01", + "-5.88687844e+01", + "-5.88687844e+01", + "-58.86878443", + "-58.86878443", + "-58.86878443", + "-58.8687844", + "-58.8687844", + "-58.8687844", + "-5.886878443e+01", + "-5.886878443e+01", + "-5.886878443e+01", + "-58.868784428", + "-58.868784428", + "-58.868784428", + "-58.86878443", + "-58.86878443", + "-58.86878443", + "-5.8868784428e+01", + "-5.8868784428e+01", + "-5.8868784428e+01", + "-58.8687844276", + "-58.8687844276", + "-58.8687844276", + "-58.868784428", + "-58.868784428", + "-58.868784428", + "-5.88687844276e+01", + "-5.88687844276e+01", + "-5.88687844276e+01", + "-58.86878442764", + "-58.86878442764", + "-58.86878442764", + "-58.8687844276", + "-58.8687844276", + "-58.8687844276", + "-5.886878442764e+01", + "-5.886878442764e+01", + "-5.886878442764e+01", + "-58.868784427643", + "-58.868784427643", + "-58.868784427643", + "-58.86878442764", + "-58.86878442764", + "-58.86878442764", + "-5.8868784427643e+01", + "-5.8868784427643e+01", + "-5.8868784427643e+01", + "-58.8687844276428", + "-58.8687844276428", + "-58.8687844276428", + }}, + {{ + "7", + "7.", + "+7", + "7.4e+00", + "+7.4e+00", + "7.4e+00", + "7.4", + "7.4", + "+7.4", + "7.4", + "7.4", + "+7.4", + "7.36e+00", + "+7.36e+00", + "7.36e+00", + "7.36", + "7.36", + "+7.36", + "7.36", + "7.36", + "+7.36", + "7.359e+00", + "+7.359e+00", + "7.359e+00", + "7.359", + "7.359", + "+7.359", + "7.359", + "7.359", + "+7.359", + "7.3586e+00", + "+7.3586e+00", + "7.3586e+00", + "7.3586", + "7.3586", + "+7.3586", + "7.3586", + "7.3586", + "+7.3586", + "7.35860e+00", + "+7.35860e+00", + "7.35860e+00", + "7.35860", + "7.35860", + "+7.35860", + "7.3586", + "7.35860", + "+7.3586", + "7.358598e+00", + "+7.358598e+00", + "7.358598e+00", + "7.358598", + "7.358598", + "+7.358598", + "7.358598", + "7.358598", + "+7.358598", + "7.3585981e+00", + "+7.3585981e+00", + "7.3585981e+00", + "7.3585981", + "7.3585981", + "+7.3585981", + "7.3585981", + "7.3585981", + "+7.3585981", + "7.35859805e+00", + "+7.35859805e+00", + "7.35859805e+00", + "7.35859805", + "7.35859805", + "+7.35859805", + "7.35859805", + "7.35859805", + "+7.35859805", + "7.358598053e+00", + "+7.358598053e+00", + "7.358598053e+00", + "7.358598053", + "7.358598053", + "+7.358598053", + "7.358598053", + "7.358598053", + "+7.358598053", + "7.3585980535e+00", + "+7.3585980535e+00", + "7.3585980535e+00", + "7.3585980535", + "7.3585980535", + "+7.3585980535", + "7.3585980535", + "7.3585980535", + "+7.3585980535", + "7.35859805346e+00", + "+7.35859805346e+00", + "7.35859805346e+00", + "7.35859805346", + "7.35859805346", + "+7.35859805346", + "7.35859805346", + "7.35859805346", + "+7.35859805346", + "7.358598053455e+00", + "+7.358598053455e+00", + "7.358598053455e+00", + "7.358598053455", + "7.358598053455", + "+7.358598053455", + "7.358598053455", + "7.358598053455", + "+7.358598053455", + "7.3585980534554e+00", + "+7.3585980534554e+00", + "7.3585980534554e+00", + "7.3585980534554", + "7.3585980534554", + "+7.3585980534554", + }}, + {{ + "-7", + "-7.", + "-7", + "-7.4e+00", + "-7.4e+00", + "-7.4e+00", + "-7.4", + "-7.4", + "-7.4", + "-7.4", + "-7.4", + "-7.4", + "-7.36e+00", + "-7.36e+00", + "-7.36e+00", + "-7.36", + "-7.36", + "-7.36", + "-7.36", + "-7.36", + "-7.36", + "-7.359e+00", + "-7.359e+00", + "-7.359e+00", + "-7.359", + "-7.359", + "-7.359", + "-7.359", + "-7.359", + "-7.359", + "-7.3586e+00", + "-7.3586e+00", + "-7.3586e+00", + "-7.3586", + "-7.3586", + "-7.3586", + "-7.3586", + "-7.3586", + "-7.3586", + "-7.35860e+00", + "-7.35860e+00", + "-7.35860e+00", + "-7.35860", + "-7.35860", + "-7.35860", + "-7.3586", + "-7.35860", + "-7.3586", + "-7.358598e+00", + "-7.358598e+00", + "-7.358598e+00", + "-7.358598", + "-7.358598", + "-7.358598", + "-7.358598", + "-7.358598", + "-7.358598", + "-7.3585981e+00", + "-7.3585981e+00", + "-7.3585981e+00", + "-7.3585981", + "-7.3585981", + "-7.3585981", + "-7.3585981", + "-7.3585981", + "-7.3585981", + "-7.35859805e+00", + "-7.35859805e+00", + "-7.35859805e+00", + "-7.35859805", + "-7.35859805", + "-7.35859805", + "-7.35859805", + "-7.35859805", + "-7.35859805", + "-7.358598053e+00", + "-7.358598053e+00", + "-7.358598053e+00", + "-7.358598053", + "-7.358598053", + "-7.358598053", + "-7.358598053", + "-7.358598053", + "-7.358598053", + "-7.3585980535e+00", + "-7.3585980535e+00", + "-7.3585980535e+00", + "-7.3585980535", + "-7.3585980535", + "-7.3585980535", + "-7.3585980535", + "-7.3585980535", + "-7.3585980535", + "-7.35859805346e+00", + "-7.35859805346e+00", + "-7.35859805346e+00", + "-7.35859805346", + "-7.35859805346", + "-7.35859805346", + "-7.35859805346", + "-7.35859805346", + "-7.35859805346", + "-7.358598053455e+00", + "-7.358598053455e+00", + "-7.358598053455e+00", + "-7.358598053455", + "-7.358598053455", + "-7.358598053455", + "-7.358598053455", + "-7.358598053455", + "-7.358598053455", + "-7.3585980534554e+00", + "-7.3585980534554e+00", + "-7.3585980534554e+00", + "-7.3585980534554", + "-7.3585980534554", + "-7.3585980534554", + }}, + {{ + "0.9", + "0.9", + "+0.9", + "9.2e-01", + "+9.2e-01", + "9.2e-01", + "0.9", + "0.9", + "+0.9", + "0.92", + "0.92", + "+0.92", + "9.20e-01", + "+9.20e-01", + "9.20e-01", + "0.92", + "0.92", + "+0.92", + "0.92", + "0.920", + "+0.92", + "9.198e-01", + "+9.198e-01", + "9.198e-01", + "0.920", + "0.920", + "+0.920", + "0.9198", + "0.9198", + "+0.9198", + "9.1982e-01", + "+9.1982e-01", + "9.1982e-01", + "0.9198", + "0.9198", + "+0.9198", + "0.91982", + "0.91982", + "+0.91982", + "9.19825e-01", + "+9.19825e-01", + "9.19825e-01", + "0.91982", + "0.91982", + "+0.91982", + "0.919825", + "0.919825", + "+0.919825", + "9.198248e-01", + "+9.198248e-01", + "9.198248e-01", + "0.919825", + "0.919825", + "+0.919825", + "0.9198248", + "0.9198248", + "+0.9198248", + "9.1982476e-01", + "+9.1982476e-01", + "9.1982476e-01", + "0.9198248", + "0.9198248", + "+0.9198248", + "0.91982476", + "0.91982476", + "+0.91982476", + "9.19824757e-01", + "+9.19824757e-01", + "9.19824757e-01", + "0.91982476", + "0.91982476", + "+0.91982476", + "0.919824757", + "0.919824757", + "+0.919824757", + "9.198247567e-01", + "+9.198247567e-01", + "9.198247567e-01", + "0.919824757", + "0.919824757", + "+0.919824757", + "0.9198247567", + "0.9198247567", + "+0.9198247567", + "9.1982475668e-01", + "+9.1982475668e-01", + "9.1982475668e-01", + "0.9198247567", + "0.9198247567", + "+0.9198247567", + "0.91982475668", + "0.91982475668", + "+0.91982475668", + "9.19824756682e-01", + "+9.19824756682e-01", + "9.19824756682e-01", + "0.91982475668", + "0.91982475668", + "+0.91982475668", + "0.919824756682", + "0.919824756682", + "+0.919824756682", + "9.198247566819e-01", + "+9.198247566819e-01", + "9.198247566819e-01", + "0.919824756682", + "0.919824756682", + "+0.919824756682", + "0.9198247566819", + "0.9198247566819", + "+0.9198247566819", + "9.1982475668192e-01", + "+9.1982475668192e-01", + "9.1982475668192e-01", + "0.9198247566819", + "0.9198247566819", + "+0.9198247566819", + }}, + {{ + "-0.9", + "-0.9", + "-0.9", + "-9.2e-01", + "-9.2e-01", + "-9.2e-01", + "-0.9", + "-0.9", + "-0.9", + "-0.92", + "-0.92", + "-0.92", + "-9.20e-01", + "-9.20e-01", + "-9.20e-01", + "-0.92", + "-0.92", + "-0.92", + "-0.92", + "-0.920", + "-0.92", + "-9.198e-01", + "-9.198e-01", + "-9.198e-01", + "-0.920", + "-0.920", + "-0.920", + "-0.9198", + "-0.9198", + "-0.9198", + "-9.1982e-01", + "-9.1982e-01", + "-9.1982e-01", + "-0.9198", + "-0.9198", + "-0.9198", + "-0.91982", + "-0.91982", + "-0.91982", + "-9.19825e-01", + "-9.19825e-01", + "-9.19825e-01", + "-0.91982", + "-0.91982", + "-0.91982", + "-0.919825", + "-0.919825", + "-0.919825", + "-9.198248e-01", + "-9.198248e-01", + "-9.198248e-01", + "-0.919825", + "-0.919825", + "-0.919825", + "-0.9198248", + "-0.9198248", + "-0.9198248", + "-9.1982476e-01", + "-9.1982476e-01", + "-9.1982476e-01", + "-0.9198248", + "-0.9198248", + "-0.9198248", + "-0.91982476", + "-0.91982476", + "-0.91982476", + "-9.19824757e-01", + "-9.19824757e-01", + "-9.19824757e-01", + "-0.91982476", + "-0.91982476", + "-0.91982476", + "-0.919824757", + "-0.919824757", + "-0.919824757", + "-9.198247567e-01", + "-9.198247567e-01", + "-9.198247567e-01", + "-0.919824757", + "-0.919824757", + "-0.919824757", + "-0.9198247567", + "-0.9198247567", + "-0.9198247567", + "-9.1982475668e-01", + "-9.1982475668e-01", + "-9.1982475668e-01", + "-0.9198247567", + "-0.9198247567", + "-0.9198247567", + "-0.91982475668", + "-0.91982475668", + "-0.91982475668", + "-9.19824756682e-01", + "-9.19824756682e-01", + "-9.19824756682e-01", + "-0.91982475668", + "-0.91982475668", + "-0.91982475668", + "-0.919824756682", + "-0.919824756682", + "-0.919824756682", + "-9.198247566819e-01", + "-9.198247566819e-01", + "-9.198247566819e-01", + "-0.919824756682", + "-0.919824756682", + "-0.919824756682", + "-0.9198247566819", + "-0.9198247566819", + "-0.9198247566819", + "-9.1982475668192e-01", + "-9.1982475668192e-01", + "-9.1982475668192e-01", + "-0.9198247566819", + "-0.9198247566819", + "-0.9198247566819", + }}, + {{ + "0.1", + "0.1", + "+0.1", + "1.1e-01", + "+1.1e-01", + "1.1e-01", + "0.1", + "0.1", + "+0.1", + "0.11", + "0.11", + "+0.11", + "1.15e-01", + "+1.15e-01", + "1.15e-01", + "0.11", + "0.11", + "+0.11", + "0.115", + "0.115", + "+0.115", + "1.150e-01", + "+1.150e-01", + "1.150e-01", + "0.115", + "0.115", + "+0.115", + "0.115", + "0.1150", + "+0.115", + "1.1498e-01", + "+1.1498e-01", + "1.1498e-01", + "0.1150", + "0.1150", + "+0.1150", + "0.11498", + "0.11498", + "+0.11498", + "1.14978e-01", + "+1.14978e-01", + "1.14978e-01", + "0.11498", + "0.11498", + "+0.11498", + "0.114978", + "0.114978", + "+0.114978", + "1.149781e-01", + "+1.149781e-01", + "1.149781e-01", + "0.114978", + "0.114978", + "+0.114978", + "0.1149781", + "0.1149781", + "+0.1149781", + "1.1497809e-01", + "+1.1497809e-01", + "1.1497809e-01", + "0.1149781", + "0.1149781", + "+0.1149781", + "0.11497809", + "0.11497809", + "+0.11497809", + "1.14978095e-01", + "+1.14978095e-01", + "1.14978095e-01", + "0.11497809", + "0.11497809", + "+0.11497809", + "0.114978095", + "0.114978095", + "+0.114978095", + "1.149780946e-01", + "+1.149780946e-01", + "1.149780946e-01", + "0.114978095", + "0.114978095", + "+0.114978095", + "0.1149780946", + "0.1149780946", + "+0.1149780946", + "1.1497809459e-01", + "+1.1497809459e-01", + "1.1497809459e-01", + "0.1149780946", + "0.1149780946", + "+0.1149780946", + "0.11497809459", + "0.11497809459", + "+0.11497809459", + "1.14978094585e-01", + "+1.14978094585e-01", + "1.14978094585e-01", + "0.11497809459", + "0.11497809459", + "+0.11497809459", + "0.114978094585", + "0.114978094585", + "+0.114978094585", + "1.149780945852e-01", + "+1.149780945852e-01", + "1.149780945852e-01", + "0.114978094585", + "0.114978094585", + "+0.114978094585", + "0.1149780945852", + "0.1149780945852", + "+0.1149780945852", + "1.1497809458524e-01", + "+1.1497809458524e-01", + "1.1497809458524e-01", + "0.1149780945852", + "0.1149780945852", + "+0.1149780945852", + }}, + {{ + "-0.1", + "-0.1", + "-0.1", + "-1.1e-01", + "-1.1e-01", + "-1.1e-01", + "-0.1", + "-0.1", + "-0.1", + "-0.11", + "-0.11", + "-0.11", + "-1.15e-01", + "-1.15e-01", + "-1.15e-01", + "-0.11", + "-0.11", + "-0.11", + "-0.115", + "-0.115", + "-0.115", + "-1.150e-01", + "-1.150e-01", + "-1.150e-01", + "-0.115", + "-0.115", + "-0.115", + "-0.115", + "-0.1150", + "-0.115", + "-1.1498e-01", + "-1.1498e-01", + "-1.1498e-01", + "-0.1150", + "-0.1150", + "-0.1150", + "-0.11498", + "-0.11498", + "-0.11498", + "-1.14978e-01", + "-1.14978e-01", + "-1.14978e-01", + "-0.11498", + "-0.11498", + "-0.11498", + "-0.114978", + "-0.114978", + "-0.114978", + "-1.149781e-01", + "-1.149781e-01", + "-1.149781e-01", + "-0.114978", + "-0.114978", + "-0.114978", + "-0.1149781", + "-0.1149781", + "-0.1149781", + "-1.1497809e-01", + "-1.1497809e-01", + "-1.1497809e-01", + "-0.1149781", + "-0.1149781", + "-0.1149781", + "-0.11497809", + "-0.11497809", + "-0.11497809", + "-1.14978095e-01", + "-1.14978095e-01", + "-1.14978095e-01", + "-0.11497809", + "-0.11497809", + "-0.11497809", + "-0.114978095", + "-0.114978095", + "-0.114978095", + "-1.149780946e-01", + "-1.149780946e-01", + "-1.149780946e-01", + "-0.114978095", + "-0.114978095", + "-0.114978095", + "-0.1149780946", + "-0.1149780946", + "-0.1149780946", + "-1.1497809459e-01", + "-1.1497809459e-01", + "-1.1497809459e-01", + "-0.1149780946", + "-0.1149780946", + "-0.1149780946", + "-0.11497809459", + "-0.11497809459", + "-0.11497809459", + "-1.14978094585e-01", + "-1.14978094585e-01", + "-1.14978094585e-01", + "-0.11497809459", + "-0.11497809459", + "-0.11497809459", + "-0.114978094585", + "-0.114978094585", + "-0.114978094585", + "-1.149780945852e-01", + "-1.149780945852e-01", + "-1.149780945852e-01", + "-0.114978094585", + "-0.114978094585", + "-0.114978094585", + "-0.1149780945852", + "-0.1149780945852", + "-0.1149780945852", + "-1.1497809458524e-01", + "-1.1497809458524e-01", + "-1.1497809458524e-01", + "-0.1149780945852", + "-0.1149780945852", + "-0.1149780945852", + }}, + {{ + "0.01", + "0.01", + "+0.01", + "1.4e-02", + "+1.4e-02", + "1.4e-02", + "0.0", + "0.0", + "+0.0", + "0.014", + "0.014", + "+0.014", + "1.44e-02", + "+1.44e-02", + "1.44e-02", + "0.01", + "0.01", + "+0.01", + "0.0144", + "0.0144", + "+0.0144", + "1.437e-02", + "+1.437e-02", + "1.437e-02", + "0.014", + "0.014", + "+0.014", + "0.01437", + "0.01437", + "+0.01437", + "1.4372e-02", + "+1.4372e-02", + "1.4372e-02", + "0.0144", + "0.0144", + "+0.0144", + "0.014372", + "0.014372", + "+0.014372", + "1.43723e-02", + "+1.43723e-02", + "1.43723e-02", + "0.01437", + "0.01437", + "+0.01437", + "0.0143723", + "0.0143723", + "+0.0143723", + "1.437226e-02", + "+1.437226e-02", + "1.437226e-02", + "0.014372", + "0.014372", + "+0.014372", + "0.01437226", + "0.01437226", + "+0.01437226", + "1.4372262e-02", + "+1.4372262e-02", + "1.4372262e-02", + "0.0143723", + "0.0143723", + "+0.0143723", + "0.014372262", + "0.014372262", + "+0.014372262", + "1.43722618e-02", + "+1.43722618e-02", + "1.43722618e-02", + "0.01437226", + "0.01437226", + "+0.01437226", + "0.0143722618", + "0.0143722618", + "+0.0143722618", + "1.437226182e-02", + "+1.437226182e-02", + "1.437226182e-02", + "0.014372262", + "0.014372262", + "+0.014372262", + "0.01437226182", + "0.01437226182", + "+0.01437226182", + "1.4372261823e-02", + "+1.4372261823e-02", + "1.4372261823e-02", + "0.0143722618", + "0.0143722618", + "+0.0143722618", + "0.014372261823", + "0.014372261823", + "+0.014372261823", + "1.43722618232e-02", + "+1.43722618232e-02", + "1.43722618232e-02", + "0.01437226182", + "0.01437226182", + "+0.01437226182", + "0.0143722618232", + "0.0143722618232", + "+0.0143722618232", + "1.437226182315e-02", + "+1.437226182315e-02", + "1.437226182315e-02", + "0.014372261823", + "0.014372261823", + "+0.014372261823", + "0.01437226182315", + "0.01437226182315", + "+0.01437226182315", + "1.4372261823155e-02", + "+1.4372261823155e-02", + "1.4372261823155e-02", + "0.0143722618232", + "0.0143722618232", + "+0.0143722618232", + }}, + {{ + "-0.01", + "-0.01", + "-0.01", + "-1.4e-02", + "-1.4e-02", + "-1.4e-02", + "-0.0", + "-0.0", + "-0.0", + "-0.014", + "-0.014", + "-0.014", + "-1.44e-02", + "-1.44e-02", + "-1.44e-02", + "-0.01", + "-0.01", + "-0.01", + "-0.0144", + "-0.0144", + "-0.0144", + "-1.437e-02", + "-1.437e-02", + "-1.437e-02", + "-0.014", + "-0.014", + "-0.014", + "-0.01437", + "-0.01437", + "-0.01437", + "-1.4372e-02", + "-1.4372e-02", + "-1.4372e-02", + "-0.0144", + "-0.0144", + "-0.0144", + "-0.014372", + "-0.014372", + "-0.014372", + "-1.43723e-02", + "-1.43723e-02", + "-1.43723e-02", + "-0.01437", + "-0.01437", + "-0.01437", + "-0.0143723", + "-0.0143723", + "-0.0143723", + "-1.437226e-02", + "-1.437226e-02", + "-1.437226e-02", + "-0.014372", + "-0.014372", + "-0.014372", + "-0.01437226", + "-0.01437226", + "-0.01437226", + "-1.4372262e-02", + "-1.4372262e-02", + "-1.4372262e-02", + "-0.0143723", + "-0.0143723", + "-0.0143723", + "-0.014372262", + "-0.014372262", + "-0.014372262", + "-1.43722618e-02", + "-1.43722618e-02", + "-1.43722618e-02", + "-0.01437226", + "-0.01437226", + "-0.01437226", + "-0.0143722618", + "-0.0143722618", + "-0.0143722618", + "-1.437226182e-02", + "-1.437226182e-02", + "-1.437226182e-02", + "-0.014372262", + "-0.014372262", + "-0.014372262", + "-0.01437226182", + "-0.01437226182", + "-0.01437226182", + "-1.4372261823e-02", + "-1.4372261823e-02", + "-1.4372261823e-02", + "-0.0143722618", + "-0.0143722618", + "-0.0143722618", + "-0.014372261823", + "-0.014372261823", + "-0.014372261823", + "-1.43722618232e-02", + "-1.43722618232e-02", + "-1.43722618232e-02", + "-0.01437226182", + "-0.01437226182", + "-0.01437226182", + "-0.0143722618232", + "-0.0143722618232", + "-0.0143722618232", + "-1.437226182315e-02", + "-1.437226182315e-02", + "-1.437226182315e-02", + "-0.014372261823", + "-0.014372261823", + "-0.014372261823", + "-0.01437226182315", + "-0.01437226182315", + "-0.01437226182315", + "-1.4372261823155e-02", + "-1.4372261823155e-02", + "-1.4372261823155e-02", + "-0.0143722618232", + "-0.0143722618232", + "-0.0143722618232", + }}, + {{ + "0.002", + "0.002", + "+0.002", + "1.8e-03", + "+1.8e-03", + "1.8e-03", + "0.0", + "0.0", + "+0.0", + "0.0018", + "0.0018", + "+0.0018", + "1.80e-03", + "+1.80e-03", + "1.80e-03", + "0.00", + "0.00", + "+0.00", + "0.0018", + "0.00180", + "+0.0018", + "1.797e-03", + "+1.797e-03", + "1.797e-03", + "0.002", + "0.002", + "+0.002", + "0.001797", + "0.001797", + "+0.001797", + "1.7965e-03", + "+1.7965e-03", + "1.7965e-03", + "0.0018", + "0.0018", + "+0.0018", + "0.0017965", + "0.0017965", + "+0.0017965", + "1.79653e-03", + "+1.79653e-03", + "1.79653e-03", + "0.00180", + "0.00180", + "+0.00180", + "0.00179653", + "0.00179653", + "+0.00179653", + "1.796533e-03", + "+1.796533e-03", + "1.796533e-03", + "0.001797", + "0.001797", + "+0.001797", + "0.001796533", + "0.001796533", + "+0.001796533", + "1.7965327e-03", + "+1.7965327e-03", + "1.7965327e-03", + "0.0017965", + "0.0017965", + "+0.0017965", + "0.0017965327", + "0.0017965327", + "+0.0017965327", + "1.79653273e-03", + "+1.79653273e-03", + "1.79653273e-03", + "0.00179653", + "0.00179653", + "+0.00179653", + "0.00179653273", + "0.00179653273", + "+0.00179653273", + "1.796532728e-03", + "+1.796532728e-03", + "1.796532728e-03", + "0.001796533", + "0.001796533", + "+0.001796533", + "0.001796532728", + "0.001796532728", + "+0.001796532728", + "1.7965327279e-03", + "+1.7965327279e-03", + "1.7965327279e-03", + "0.0017965327", + "0.0017965327", + "+0.0017965327", + "0.0017965327279", + "0.0017965327279", + "+0.0017965327279", + "1.79653272789e-03", + "+1.79653272789e-03", + "1.79653272789e-03", + "0.00179653273", + "0.00179653273", + "+0.00179653273", + "0.00179653272789", + "0.00179653272789", + "+0.00179653272789", + "1.796532727894e-03", + "+1.796532727894e-03", + "1.796532727894e-03", + "0.001796532728", + "0.001796532728", + "+0.001796532728", + "0.001796532727894", + "0.001796532727894", + "+0.001796532727894", + "1.7965327278944e-03", + "+1.7965327278944e-03", + "1.7965327278944e-03", + "0.0017965327279", + "0.0017965327279", + "+0.0017965327279", + }}, + {{ + "-0.002", + "-0.002", + "-0.002", + "-1.8e-03", + "-1.8e-03", + "-1.8e-03", + "-0.0", + "-0.0", + "-0.0", + "-0.0018", + "-0.0018", + "-0.0018", + "-1.80e-03", + "-1.80e-03", + "-1.80e-03", + "-0.00", + "-0.00", + "-0.00", + "-0.0018", + "-0.00180", + "-0.0018", + "-1.797e-03", + "-1.797e-03", + "-1.797e-03", + "-0.002", + "-0.002", + "-0.002", + "-0.001797", + "-0.001797", + "-0.001797", + "-1.7965e-03", + "-1.7965e-03", + "-1.7965e-03", + "-0.0018", + "-0.0018", + "-0.0018", + "-0.0017965", + "-0.0017965", + "-0.0017965", + "-1.79653e-03", + "-1.79653e-03", + "-1.79653e-03", + "-0.00180", + "-0.00180", + "-0.00180", + "-0.00179653", + "-0.00179653", + "-0.00179653", + "-1.796533e-03", + "-1.796533e-03", + "-1.796533e-03", + "-0.001797", + "-0.001797", + "-0.001797", + "-0.001796533", + "-0.001796533", + "-0.001796533", + "-1.7965327e-03", + "-1.7965327e-03", + "-1.7965327e-03", + "-0.0017965", + "-0.0017965", + "-0.0017965", + "-0.0017965327", + "-0.0017965327", + "-0.0017965327", + "-1.79653273e-03", + "-1.79653273e-03", + "-1.79653273e-03", + "-0.00179653", + "-0.00179653", + "-0.00179653", + "-0.00179653273", + "-0.00179653273", + "-0.00179653273", + "-1.796532728e-03", + "-1.796532728e-03", + "-1.796532728e-03", + "-0.001796533", + "-0.001796533", + "-0.001796533", + "-0.001796532728", + "-0.001796532728", + "-0.001796532728", + "-1.7965327279e-03", + "-1.7965327279e-03", + "-1.7965327279e-03", + "-0.0017965327", + "-0.0017965327", + "-0.0017965327", + "-0.0017965327279", + "-0.0017965327279", + "-0.0017965327279", + "-1.79653272789e-03", + "-1.79653272789e-03", + "-1.79653272789e-03", + "-0.00179653273", + "-0.00179653273", + "-0.00179653273", + "-0.00179653272789", + "-0.00179653272789", + "-0.00179653272789", + "-1.796532727894e-03", + "-1.796532727894e-03", + "-1.796532727894e-03", + "-0.001796532728", + "-0.001796532728", + "-0.001796532728", + "-0.001796532727894", + "-0.001796532727894", + "-0.001796532727894", + "-1.7965327278944e-03", + "-1.7965327278944e-03", + "-1.7965327278944e-03", + "-0.0017965327279", + "-0.0017965327279", + "-0.0017965327279", + }}, + {{ + "0.0002", + "0.0002", + "+0.0002", + "2.2e-04", + "+2.2e-04", + "2.2e-04", + "0.0", + "0.0", + "+0.0", + "0.00022", + "0.00022", + "+0.00022", + "2.25e-04", + "+2.25e-04", + "2.25e-04", + "0.00", + "0.00", + "+0.00", + "0.000225", + "0.000225", + "+0.000225", + "2.246e-04", + "+2.246e-04", + "2.246e-04", + "0.000", + "0.000", + "+0.000", + "0.0002246", + "0.0002246", + "+0.0002246", + "2.2457e-04", + "+2.2457e-04", + "2.2457e-04", + "0.0002", + "0.0002", + "+0.0002", + "0.00022457", + "0.00022457", + "+0.00022457", + "2.24567e-04", + "+2.24567e-04", + "2.24567e-04", + "0.00022", + "0.00022", + "+0.00022", + "0.000224567", + "0.000224567", + "+0.000224567", + "2.245666e-04", + "+2.245666e-04", + "2.245666e-04", + "0.000225", + "0.000225", + "+0.000225", + "0.0002245666", + "0.0002245666", + "+0.0002245666", + "2.2456659e-04", + "+2.2456659e-04", + "2.2456659e-04", + "0.0002246", + "0.0002246", + "+0.0002246", + "0.00022456659", + "0.00022456659", + "+0.00022456659", + "2.24566591e-04", + "+2.24566591e-04", + "2.24566591e-04", + "0.00022457", + "0.00022457", + "+0.00022457", + "0.000224566591", + "0.000224566591", + "+0.000224566591", + "2.245665910e-04", + "+2.245665910e-04", + "2.245665910e-04", + "0.000224567", + "0.000224567", + "+0.000224567", + "0.000224566591", + "0.0002245665910", + "+0.000224566591", + "2.2456659099e-04", + "+2.2456659099e-04", + "2.2456659099e-04", + "0.0002245666", + "0.0002245666", + "+0.0002245666", + "0.00022456659099", + "0.00022456659099", + "+0.00022456659099", + "2.24566590987e-04", + "+2.24566590987e-04", + "2.24566590987e-04", + "0.00022456659", + "0.00022456659", + "+0.00022456659", + "0.000224566590987", + "0.000224566590987", + "+0.000224566590987", + "2.245665909868e-04", + "+2.245665909868e-04", + "2.245665909868e-04", + "0.000224566591", + "0.000224566591", + "+0.000224566591", + "0.0002245665909868", + "0.0002245665909868", + "+0.0002245665909868", + "2.2456659098680e-04", + "+2.2456659098680e-04", + "2.2456659098680e-04", + "0.0002245665910", + "0.0002245665910", + "+0.0002245665910", + }}, + {{ + "-0.0002", + "-0.0002", + "-0.0002", + "-2.2e-04", + "-2.2e-04", + "-2.2e-04", + "-0.0", + "-0.0", + "-0.0", + "-0.00022", + "-0.00022", + "-0.00022", + "-2.25e-04", + "-2.25e-04", + "-2.25e-04", + "-0.00", + "-0.00", + "-0.00", + "-0.000225", + "-0.000225", + "-0.000225", + "-2.246e-04", + "-2.246e-04", + "-2.246e-04", + "-0.000", + "-0.000", + "-0.000", + "-0.0002246", + "-0.0002246", + "-0.0002246", + "-2.2457e-04", + "-2.2457e-04", + "-2.2457e-04", + "-0.0002", + "-0.0002", + "-0.0002", + "-0.00022457", + "-0.00022457", + "-0.00022457", + "-2.24567e-04", + "-2.24567e-04", + "-2.24567e-04", + "-0.00022", + "-0.00022", + "-0.00022", + "-0.000224567", + "-0.000224567", + "-0.000224567", + "-2.245666e-04", + "-2.245666e-04", + "-2.245666e-04", + "-0.000225", + "-0.000225", + "-0.000225", + "-0.0002245666", + "-0.0002245666", + "-0.0002245666", + "-2.2456659e-04", + "-2.2456659e-04", + "-2.2456659e-04", + "-0.0002246", + "-0.0002246", + "-0.0002246", + "-0.00022456659", + "-0.00022456659", + "-0.00022456659", + "-2.24566591e-04", + "-2.24566591e-04", + "-2.24566591e-04", + "-0.00022457", + "-0.00022457", + "-0.00022457", + "-0.000224566591", + "-0.000224566591", + "-0.000224566591", + "-2.245665910e-04", + "-2.245665910e-04", + "-2.245665910e-04", + "-0.000224567", + "-0.000224567", + "-0.000224567", + "-0.000224566591", + "-0.0002245665910", + "-0.000224566591", + "-2.2456659099e-04", + "-2.2456659099e-04", + "-2.2456659099e-04", + "-0.0002245666", + "-0.0002245666", + "-0.0002245666", + "-0.00022456659099", + "-0.00022456659099", + "-0.00022456659099", + "-2.24566590987e-04", + "-2.24566590987e-04", + "-2.24566590987e-04", + "-0.00022456659", + "-0.00022456659", + "-0.00022456659", + "-0.000224566590987", + "-0.000224566590987", + "-0.000224566590987", + "-2.245665909868e-04", + "-2.245665909868e-04", + "-2.245665909868e-04", + "-0.000224566591", + "-0.000224566591", + "-0.000224566591", + "-0.0002245665909868", + "-0.0002245665909868", + "-0.0002245665909868", + "-2.2456659098680e-04", + "-2.2456659098680e-04", + "-2.2456659098680e-04", + "-0.0002245665910", + "-0.0002245665910", + "-0.0002245665910", + }}, + {{ + "3e-05", + "3.e-05", + "+3e-05", + "2.8e-05", + "+2.8e-05", + "2.8e-05", + "0.0", + "0.0", + "+0.0", + "2.8e-05", + "2.8e-05", + "+2.8e-05", + "2.81e-05", + "+2.81e-05", + "2.81e-05", + "0.00", + "0.00", + "+0.00", + "2.81e-05", + "2.81e-05", + "+2.81e-05", + "2.807e-05", + "+2.807e-05", + "2.807e-05", + "0.000", + "0.000", + "+0.000", + "2.807e-05", + "2.807e-05", + "+2.807e-05", + "2.8071e-05", + "+2.8071e-05", + "2.8071e-05", + "0.0000", + "0.0000", + "+0.0000", + "2.8071e-05", + "2.8071e-05", + "+2.8071e-05", + "2.80708e-05", + "+2.80708e-05", + "2.80708e-05", + "0.00003", + "0.00003", + "+0.00003", + "2.80708e-05", + "2.80708e-05", + "+2.80708e-05", + "2.807082e-05", + "+2.807082e-05", + "2.807082e-05", + "0.000028", + "0.000028", + "+0.000028", + "2.807082e-05", + "2.807082e-05", + "+2.807082e-05", + "2.8070824e-05", + "+2.8070824e-05", + "2.8070824e-05", + "0.0000281", + "0.0000281", + "+0.0000281", + "2.8070824e-05", + "2.8070824e-05", + "+2.8070824e-05", + "2.80708239e-05", + "+2.80708239e-05", + "2.80708239e-05", + "0.00002807", + "0.00002807", + "+0.00002807", + "2.80708239e-05", + "2.80708239e-05", + "+2.80708239e-05", + "2.807082387e-05", + "+2.807082387e-05", + "2.807082387e-05", + "0.000028071", + "0.000028071", + "+0.000028071", + "2.807082387e-05", + "2.807082387e-05", + "+2.807082387e-05", + "2.8070823873e-05", + "+2.8070823873e-05", + "2.8070823873e-05", + "0.0000280708", + "0.0000280708", + "+0.0000280708", + "2.8070823873e-05", + "2.8070823873e-05", + "+2.8070823873e-05", + "2.80708238733e-05", + "+2.80708238733e-05", + "2.80708238733e-05", + "0.00002807082", + "0.00002807082", + "+0.00002807082", + "2.80708238733e-05", + "2.80708238733e-05", + "+2.80708238733e-05", + "2.807082387335e-05", + "+2.807082387335e-05", + "2.807082387335e-05", + "0.000028070824", + "0.000028070824", + "+0.000028070824", + "2.807082387335e-05", + "2.807082387335e-05", + "+2.807082387335e-05", + "2.8070823873350e-05", + "+2.8070823873350e-05", + "2.8070823873350e-05", + "0.0000280708239", + "0.0000280708239", + "+0.0000280708239", + }}, + {{ + "-3e-05", + "-3.e-05", + "-3e-05", + "-2.8e-05", + "-2.8e-05", + "-2.8e-05", + "-0.0", + "-0.0", + "-0.0", + "-2.8e-05", + "-2.8e-05", + "-2.8e-05", + "-2.81e-05", + "-2.81e-05", + "-2.81e-05", + "-0.00", + "-0.00", + "-0.00", + "-2.81e-05", + "-2.81e-05", + "-2.81e-05", + "-2.807e-05", + "-2.807e-05", + "-2.807e-05", + "-0.000", + "-0.000", + "-0.000", + "-2.807e-05", + "-2.807e-05", + "-2.807e-05", + "-2.8071e-05", + "-2.8071e-05", + "-2.8071e-05", + "-0.0000", + "-0.0000", + "-0.0000", + "-2.8071e-05", + "-2.8071e-05", + "-2.8071e-05", + "-2.80708e-05", + "-2.80708e-05", + "-2.80708e-05", + "-0.00003", + "-0.00003", + "-0.00003", + "-2.80708e-05", + "-2.80708e-05", + "-2.80708e-05", + "-2.807082e-05", + "-2.807082e-05", + "-2.807082e-05", + "-0.000028", + "-0.000028", + "-0.000028", + "-2.807082e-05", + "-2.807082e-05", + "-2.807082e-05", + "-2.8070824e-05", + "-2.8070824e-05", + "-2.8070824e-05", + "-0.0000281", + "-0.0000281", + "-0.0000281", + "-2.8070824e-05", + "-2.8070824e-05", + "-2.8070824e-05", + "-2.80708239e-05", + "-2.80708239e-05", + "-2.80708239e-05", + "-0.00002807", + "-0.00002807", + "-0.00002807", + "-2.80708239e-05", + "-2.80708239e-05", + "-2.80708239e-05", + "-2.807082387e-05", + "-2.807082387e-05", + "-2.807082387e-05", + "-0.000028071", + "-0.000028071", + "-0.000028071", + "-2.807082387e-05", + "-2.807082387e-05", + "-2.807082387e-05", + "-2.8070823873e-05", + "-2.8070823873e-05", + "-2.8070823873e-05", + "-0.0000280708", + "-0.0000280708", + "-0.0000280708", + "-2.8070823873e-05", + "-2.8070823873e-05", + "-2.8070823873e-05", + "-2.80708238733e-05", + "-2.80708238733e-05", + "-2.80708238733e-05", + "-0.00002807082", + "-0.00002807082", + "-0.00002807082", + "-2.80708238733e-05", + "-2.80708238733e-05", + "-2.80708238733e-05", + "-2.807082387335e-05", + "-2.807082387335e-05", + "-2.807082387335e-05", + "-0.000028070824", + "-0.000028070824", + "-0.000028070824", + "-2.807082387335e-05", + "-2.807082387335e-05", + "-2.807082387335e-05", + "-2.8070823873350e-05", + "-2.8070823873350e-05", + "-2.8070823873350e-05", + "-0.0000280708239", + "-0.0000280708239", + "-0.0000280708239", + }}, + {{ + "4e-06", + "4.e-06", + "+4e-06", + "3.5e-06", + "+3.5e-06", + "3.5e-06", + "0.0", + "0.0", + "+0.0", + "3.5e-06", + "3.5e-06", + "+3.5e-06", + "3.51e-06", + "+3.51e-06", + "3.51e-06", + "0.00", + "0.00", + "+0.00", + "3.51e-06", + "3.51e-06", + "+3.51e-06", + "3.509e-06", + "+3.509e-06", + "3.509e-06", + "0.000", + "0.000", + "+0.000", + "3.509e-06", + "3.509e-06", + "+3.509e-06", + "3.5089e-06", + "+3.5089e-06", + "3.5089e-06", + "0.0000", + "0.0000", + "+0.0000", + "3.5089e-06", + "3.5089e-06", + "+3.5089e-06", + "3.50885e-06", + "+3.50885e-06", + "3.50885e-06", + "0.00000", + "0.00000", + "+0.00000", + "3.50885e-06", + "3.50885e-06", + "+3.50885e-06", + "3.508853e-06", + "+3.508853e-06", + "3.508853e-06", + "0.000004", + "0.000004", + "+0.000004", + "3.508853e-06", + "3.508853e-06", + "+3.508853e-06", + "3.5088530e-06", + "+3.5088530e-06", + "3.5088530e-06", + "0.0000035", + "0.0000035", + "+0.0000035", + "3.508853e-06", + "3.5088530e-06", + "+3.508853e-06", + "3.50885298e-06", + "+3.50885298e-06", + "3.50885298e-06", + "0.00000351", + "0.00000351", + "+0.00000351", + "3.50885298e-06", + "3.50885298e-06", + "+3.50885298e-06", + "3.508852984e-06", + "+3.508852984e-06", + "3.508852984e-06", + "0.000003509", + "0.000003509", + "+0.000003509", + "3.508852984e-06", + "3.508852984e-06", + "+3.508852984e-06", + "3.5088529842e-06", + "+3.5088529842e-06", + "3.5088529842e-06", + "0.0000035089", + "0.0000035089", + "+0.0000035089", + "3.5088529842e-06", + "3.5088529842e-06", + "+3.5088529842e-06", + "3.50885298417e-06", + "+3.50885298417e-06", + "3.50885298417e-06", + "0.00000350885", + "0.00000350885", + "+0.00000350885", + "3.50885298417e-06", + "3.50885298417e-06", + "+3.50885298417e-06", + "3.508852984169e-06", + "+3.508852984169e-06", + "3.508852984169e-06", + "0.000003508853", + "0.000003508853", + "+0.000003508853", + "3.508852984169e-06", + "3.508852984169e-06", + "+3.508852984169e-06", + "3.5088529841687e-06", + "+3.5088529841687e-06", + "3.5088529841687e-06", + "0.0000035088530", + "0.0000035088530", + "+0.0000035088530", + }}, + {{ + "-4e-06", + "-4.e-06", + "-4e-06", + "-3.5e-06", + "-3.5e-06", + "-3.5e-06", + "-0.0", + "-0.0", + "-0.0", + "-3.5e-06", + "-3.5e-06", + "-3.5e-06", + "-3.51e-06", + "-3.51e-06", + "-3.51e-06", + "-0.00", + "-0.00", + "-0.00", + "-3.51e-06", + "-3.51e-06", + "-3.51e-06", + "-3.509e-06", + "-3.509e-06", + "-3.509e-06", + "-0.000", + "-0.000", + "-0.000", + "-3.509e-06", + "-3.509e-06", + "-3.509e-06", + "-3.5089e-06", + "-3.5089e-06", + "-3.5089e-06", + "-0.0000", + "-0.0000", + "-0.0000", + "-3.5089e-06", + "-3.5089e-06", + "-3.5089e-06", + "-3.50885e-06", + "-3.50885e-06", + "-3.50885e-06", + "-0.00000", + "-0.00000", + "-0.00000", + "-3.50885e-06", + "-3.50885e-06", + "-3.50885e-06", + "-3.508853e-06", + "-3.508853e-06", + "-3.508853e-06", + "-0.000004", + "-0.000004", + "-0.000004", + "-3.508853e-06", + "-3.508853e-06", + "-3.508853e-06", + "-3.5088530e-06", + "-3.5088530e-06", + "-3.5088530e-06", + "-0.0000035", + "-0.0000035", + "-0.0000035", + "-3.508853e-06", + "-3.5088530e-06", + "-3.508853e-06", + "-3.50885298e-06", + "-3.50885298e-06", + "-3.50885298e-06", + "-0.00000351", + "-0.00000351", + "-0.00000351", + "-3.50885298e-06", + "-3.50885298e-06", + "-3.50885298e-06", + "-3.508852984e-06", + "-3.508852984e-06", + "-3.508852984e-06", + "-0.000003509", + "-0.000003509", + "-0.000003509", + "-3.508852984e-06", + "-3.508852984e-06", + "-3.508852984e-06", + "-3.5088529842e-06", + "-3.5088529842e-06", + "-3.5088529842e-06", + "-0.0000035089", + "-0.0000035089", + "-0.0000035089", + "-3.5088529842e-06", + "-3.5088529842e-06", + "-3.5088529842e-06", + "-3.50885298417e-06", + "-3.50885298417e-06", + "-3.50885298417e-06", + "-0.00000350885", + "-0.00000350885", + "-0.00000350885", + "-3.50885298417e-06", + "-3.50885298417e-06", + "-3.50885298417e-06", + "-3.508852984169e-06", + "-3.508852984169e-06", + "-3.508852984169e-06", + "-0.000003508853", + "-0.000003508853", + "-0.000003508853", + "-3.508852984169e-06", + "-3.508852984169e-06", + "-3.508852984169e-06", + "-3.5088529841687e-06", + "-3.5088529841687e-06", + "-3.5088529841687e-06", + "-0.0000035088530", + "-0.0000035088530", + "-0.0000035088530", + }}, + {{ + "4e-07", + "4.e-07", + "+4e-07", + "4.4e-07", + "+4.4e-07", + "4.4e-07", + "0.0", + "0.0", + "+0.0", + "4.4e-07", + "4.4e-07", + "+4.4e-07", + "4.39e-07", + "+4.39e-07", + "4.39e-07", + "0.00", + "0.00", + "+0.00", + "4.39e-07", + "4.39e-07", + "+4.39e-07", + "4.386e-07", + "+4.386e-07", + "4.386e-07", + "0.000", + "0.000", + "+0.000", + "4.386e-07", + "4.386e-07", + "+4.386e-07", + "4.3861e-07", + "+4.3861e-07", + "4.3861e-07", + "0.0000", + "0.0000", + "+0.0000", + "4.3861e-07", + "4.3861e-07", + "+4.3861e-07", + "4.38607e-07", + "+4.38607e-07", + "4.38607e-07", + "0.00000", + "0.00000", + "+0.00000", + "4.38607e-07", + "4.38607e-07", + "+4.38607e-07", + "4.386066e-07", + "+4.386066e-07", + "4.386066e-07", + "0.000000", + "0.000000", + "+0.000000", + "4.386066e-07", + "4.386066e-07", + "+4.386066e-07", + "4.3860662e-07", + "+4.3860662e-07", + "4.3860662e-07", + "0.0000004", + "0.0000004", + "+0.0000004", + "4.3860662e-07", + "4.3860662e-07", + "+4.3860662e-07", + "4.38606623e-07", + "+4.38606623e-07", + "4.38606623e-07", + "0.00000044", + "0.00000044", + "+0.00000044", + "4.38606623e-07", + "4.38606623e-07", + "+4.38606623e-07", + "4.386066230e-07", + "+4.386066230e-07", + "4.386066230e-07", + "0.000000439", + "0.000000439", + "+0.000000439", + "4.38606623e-07", + "4.386066230e-07", + "+4.38606623e-07", + "4.3860662302e-07", + "+4.3860662302e-07", + "4.3860662302e-07", + "0.0000004386", + "0.0000004386", + "+0.0000004386", + "4.3860662302e-07", + "4.3860662302e-07", + "+4.3860662302e-07", + "4.38606623021e-07", + "+4.38606623021e-07", + "4.38606623021e-07", + "0.00000043861", + "0.00000043861", + "+0.00000043861", + "4.38606623021e-07", + "4.38606623021e-07", + "+4.38606623021e-07", + "4.386066230211e-07", + "+4.386066230211e-07", + "4.386066230211e-07", + "0.000000438607", + "0.000000438607", + "+0.000000438607", + "4.386066230211e-07", + "4.386066230211e-07", + "+4.386066230211e-07", + "4.3860662302109e-07", + "+4.3860662302109e-07", + "4.3860662302109e-07", + "0.0000004386066", + "0.0000004386066", + "+0.0000004386066", + }}, + {{ + "-4e-07", + "-4.e-07", + "-4e-07", + "-4.4e-07", + "-4.4e-07", + "-4.4e-07", + "-0.0", + "-0.0", + "-0.0", + "-4.4e-07", + "-4.4e-07", + "-4.4e-07", + "-4.39e-07", + "-4.39e-07", + "-4.39e-07", + "-0.00", + "-0.00", + "-0.00", + "-4.39e-07", + "-4.39e-07", + "-4.39e-07", + "-4.386e-07", + "-4.386e-07", + "-4.386e-07", + "-0.000", + "-0.000", + "-0.000", + "-4.386e-07", + "-4.386e-07", + "-4.386e-07", + "-4.3861e-07", + "-4.3861e-07", + "-4.3861e-07", + "-0.0000", + "-0.0000", + "-0.0000", + "-4.3861e-07", + "-4.3861e-07", + "-4.3861e-07", + "-4.38607e-07", + "-4.38607e-07", + "-4.38607e-07", + "-0.00000", + "-0.00000", + "-0.00000", + "-4.38607e-07", + "-4.38607e-07", + "-4.38607e-07", + "-4.386066e-07", + "-4.386066e-07", + "-4.386066e-07", + "-0.000000", + "-0.000000", + "-0.000000", + "-4.386066e-07", + "-4.386066e-07", + "-4.386066e-07", + "-4.3860662e-07", + "-4.3860662e-07", + "-4.3860662e-07", + "-0.0000004", + "-0.0000004", + "-0.0000004", + "-4.3860662e-07", + "-4.3860662e-07", + "-4.3860662e-07", + "-4.38606623e-07", + "-4.38606623e-07", + "-4.38606623e-07", + "-0.00000044", + "-0.00000044", + "-0.00000044", + "-4.38606623e-07", + "-4.38606623e-07", + "-4.38606623e-07", + "-4.386066230e-07", + "-4.386066230e-07", + "-4.386066230e-07", + "-0.000000439", + "-0.000000439", + "-0.000000439", + "-4.38606623e-07", + "-4.386066230e-07", + "-4.38606623e-07", + "-4.3860662302e-07", + "-4.3860662302e-07", + "-4.3860662302e-07", + "-0.0000004386", + "-0.0000004386", + "-0.0000004386", + "-4.3860662302e-07", + "-4.3860662302e-07", + "-4.3860662302e-07", + "-4.38606623021e-07", + "-4.38606623021e-07", + "-4.38606623021e-07", + "-0.00000043861", + "-0.00000043861", + "-0.00000043861", + "-4.38606623021e-07", + "-4.38606623021e-07", + "-4.38606623021e-07", + "-4.386066230211e-07", + "-4.386066230211e-07", + "-4.386066230211e-07", + "-0.000000438607", + "-0.000000438607", + "-0.000000438607", + "-4.386066230211e-07", + "-4.386066230211e-07", + "-4.386066230211e-07", + "-4.3860662302109e-07", + "-4.3860662302109e-07", + "-4.3860662302109e-07", + "-0.0000004386066", + "-0.0000004386066", + "-0.0000004386066", + }}, + {{ + "5e-08", + "5.e-08", + "+5e-08", + "5.5e-08", + "+5.5e-08", + "5.5e-08", + "0.0", + "0.0", + "+0.0", + "5.5e-08", + "5.5e-08", + "+5.5e-08", + "5.48e-08", + "+5.48e-08", + "5.48e-08", + "0.00", + "0.00", + "+0.00", + "5.48e-08", + "5.48e-08", + "+5.48e-08", + "5.483e-08", + "+5.483e-08", + "5.483e-08", + "0.000", + "0.000", + "+0.000", + "5.483e-08", + "5.483e-08", + "+5.483e-08", + "5.4826e-08", + "+5.4826e-08", + "5.4826e-08", + "0.0000", + "0.0000", + "+0.0000", + "5.4826e-08", + "5.4826e-08", + "+5.4826e-08", + "5.48258e-08", + "+5.48258e-08", + "5.48258e-08", + "0.00000", + "0.00000", + "+0.00000", + "5.48258e-08", + "5.48258e-08", + "+5.48258e-08", + "5.482583e-08", + "+5.482583e-08", + "5.482583e-08", + "0.000000", + "0.000000", + "+0.000000", + "5.482583e-08", + "5.482583e-08", + "+5.482583e-08", + "5.4825828e-08", + "+5.4825828e-08", + "5.4825828e-08", + "0.0000001", + "0.0000001", + "+0.0000001", + "5.4825828e-08", + "5.4825828e-08", + "+5.4825828e-08", + "5.48258279e-08", + "+5.48258279e-08", + "5.48258279e-08", + "0.00000005", + "0.00000005", + "+0.00000005", + "5.48258279e-08", + "5.48258279e-08", + "+5.48258279e-08", + "5.482582788e-08", + "+5.482582788e-08", + "5.482582788e-08", + "0.000000055", + "0.000000055", + "+0.000000055", + "5.482582788e-08", + "5.482582788e-08", + "+5.482582788e-08", + "5.4825827878e-08", + "+5.4825827878e-08", + "5.4825827878e-08", + "0.0000000548", + "0.0000000548", + "+0.0000000548", + "5.4825827878e-08", + "5.4825827878e-08", + "+5.4825827878e-08", + "5.48258278776e-08", + "+5.48258278776e-08", + "5.48258278776e-08", + "0.00000005483", + "0.00000005483", + "+0.00000005483", + "5.48258278776e-08", + "5.48258278776e-08", + "+5.48258278776e-08", + "5.482582787764e-08", + "+5.482582787764e-08", + "5.482582787764e-08", + "0.000000054826", + "0.000000054826", + "+0.000000054826", + "5.482582787764e-08", + "5.482582787764e-08", + "+5.482582787764e-08", + "5.4825827877636e-08", + "+5.4825827877636e-08", + "5.4825827877636e-08", + "0.0000000548258", + "0.0000000548258", + "+0.0000000548258", + }}, + {{ + "-5e-08", + "-5.e-08", + "-5e-08", + "-5.5e-08", + "-5.5e-08", + "-5.5e-08", + "-0.0", + "-0.0", + "-0.0", + "-5.5e-08", + "-5.5e-08", + "-5.5e-08", + "-5.48e-08", + "-5.48e-08", + "-5.48e-08", + "-0.00", + "-0.00", + "-0.00", + "-5.48e-08", + "-5.48e-08", + "-5.48e-08", + "-5.483e-08", + "-5.483e-08", + "-5.483e-08", + "-0.000", + "-0.000", + "-0.000", + "-5.483e-08", + "-5.483e-08", + "-5.483e-08", + "-5.4826e-08", + "-5.4826e-08", + "-5.4826e-08", + "-0.0000", + "-0.0000", + "-0.0000", + "-5.4826e-08", + "-5.4826e-08", + "-5.4826e-08", + "-5.48258e-08", + "-5.48258e-08", + "-5.48258e-08", + "-0.00000", + "-0.00000", + "-0.00000", + "-5.48258e-08", + "-5.48258e-08", + "-5.48258e-08", + "-5.482583e-08", + "-5.482583e-08", + "-5.482583e-08", + "-0.000000", + "-0.000000", + "-0.000000", + "-5.482583e-08", + "-5.482583e-08", + "-5.482583e-08", + "-5.4825828e-08", + "-5.4825828e-08", + "-5.4825828e-08", + "-0.0000001", + "-0.0000001", + "-0.0000001", + "-5.4825828e-08", + "-5.4825828e-08", + "-5.4825828e-08", + "-5.48258279e-08", + "-5.48258279e-08", + "-5.48258279e-08", + "-0.00000005", + "-0.00000005", + "-0.00000005", + "-5.48258279e-08", + "-5.48258279e-08", + "-5.48258279e-08", + "-5.482582788e-08", + "-5.482582788e-08", + "-5.482582788e-08", + "-0.000000055", + "-0.000000055", + "-0.000000055", + "-5.482582788e-08", + "-5.482582788e-08", + "-5.482582788e-08", + "-5.4825827878e-08", + "-5.4825827878e-08", + "-5.4825827878e-08", + "-0.0000000548", + "-0.0000000548", + "-0.0000000548", + "-5.4825827878e-08", + "-5.4825827878e-08", + "-5.4825827878e-08", + "-5.48258278776e-08", + "-5.48258278776e-08", + "-5.48258278776e-08", + "-0.00000005483", + "-0.00000005483", + "-0.00000005483", + "-5.48258278776e-08", + "-5.48258278776e-08", + "-5.48258278776e-08", + "-5.482582787764e-08", + "-5.482582787764e-08", + "-5.482582787764e-08", + "-0.000000054826", + "-0.000000054826", + "-0.000000054826", + "-5.482582787764e-08", + "-5.482582787764e-08", + "-5.482582787764e-08", + "-5.4825827877636e-08", + "-5.4825827877636e-08", + "-5.4825827877636e-08", + "-0.0000000548258", + "-0.0000000548258", + "-0.0000000548258", + }}, + {{ + "7e-09", + "7.e-09", + "+7e-09", + "6.9e-09", + "+6.9e-09", + "6.9e-09", + "0.0", + "0.0", + "+0.0", + "6.9e-09", + "6.9e-09", + "+6.9e-09", + "6.85e-09", + "+6.85e-09", + "6.85e-09", + "0.00", + "0.00", + "+0.00", + "6.85e-09", + "6.85e-09", + "+6.85e-09", + "6.853e-09", + "+6.853e-09", + "6.853e-09", + "0.000", + "0.000", + "+0.000", + "6.853e-09", + "6.853e-09", + "+6.853e-09", + "6.8532e-09", + "+6.8532e-09", + "6.8532e-09", + "0.0000", + "0.0000", + "+0.0000", + "6.8532e-09", + "6.8532e-09", + "+6.8532e-09", + "6.85323e-09", + "+6.85323e-09", + "6.85323e-09", + "0.00000", + "0.00000", + "+0.00000", + "6.85323e-09", + "6.85323e-09", + "+6.85323e-09", + "6.853228e-09", + "+6.853228e-09", + "6.853228e-09", + "0.000000", + "0.000000", + "+0.000000", + "6.853228e-09", + "6.853228e-09", + "+6.853228e-09", + "6.8532285e-09", + "+6.8532285e-09", + "6.8532285e-09", + "0.0000000", + "0.0000000", + "+0.0000000", + "6.8532285e-09", + "6.8532285e-09", + "+6.8532285e-09", + "6.85322848e-09", + "+6.85322848e-09", + "6.85322848e-09", + "0.00000001", + "0.00000001", + "+0.00000001", + "6.85322848e-09", + "6.85322848e-09", + "+6.85322848e-09", + "6.853228485e-09", + "+6.853228485e-09", + "6.853228485e-09", + "0.000000007", + "0.000000007", + "+0.000000007", + "6.853228485e-09", + "6.853228485e-09", + "+6.853228485e-09", + "6.8532284847e-09", + "+6.8532284847e-09", + "6.8532284847e-09", + "0.0000000069", + "0.0000000069", + "+0.0000000069", + "6.8532284847e-09", + "6.8532284847e-09", + "+6.8532284847e-09", + "6.85322848470e-09", + "+6.85322848470e-09", + "6.85322848470e-09", + "0.00000000685", + "0.00000000685", + "+0.00000000685", + "6.8532284847e-09", + "6.85322848470e-09", + "+6.8532284847e-09", + "6.853228484704e-09", + "+6.853228484704e-09", + "6.853228484704e-09", + "0.000000006853", + "0.000000006853", + "+0.000000006853", + "6.853228484704e-09", + "6.853228484704e-09", + "+6.853228484704e-09", + "6.8532284847045e-09", + "+6.8532284847045e-09", + "6.8532284847045e-09", + "0.0000000068532", + "0.0000000068532", + "+0.0000000068532", + }}, + {{ + "-7e-09", + "-7.e-09", + "-7e-09", + "-6.9e-09", + "-6.9e-09", + "-6.9e-09", + "-0.0", + "-0.0", + "-0.0", + "-6.9e-09", + "-6.9e-09", + "-6.9e-09", + "-6.85e-09", + "-6.85e-09", + "-6.85e-09", + "-0.00", + "-0.00", + "-0.00", + "-6.85e-09", + "-6.85e-09", + "-6.85e-09", + "-6.853e-09", + "-6.853e-09", + "-6.853e-09", + "-0.000", + "-0.000", + "-0.000", + "-6.853e-09", + "-6.853e-09", + "-6.853e-09", + "-6.8532e-09", + "-6.8532e-09", + "-6.8532e-09", + "-0.0000", + "-0.0000", + "-0.0000", + "-6.8532e-09", + "-6.8532e-09", + "-6.8532e-09", + "-6.85323e-09", + "-6.85323e-09", + "-6.85323e-09", + "-0.00000", + "-0.00000", + "-0.00000", + "-6.85323e-09", + "-6.85323e-09", + "-6.85323e-09", + "-6.853228e-09", + "-6.853228e-09", + "-6.853228e-09", + "-0.000000", + "-0.000000", + "-0.000000", + "-6.853228e-09", + "-6.853228e-09", + "-6.853228e-09", + "-6.8532285e-09", + "-6.8532285e-09", + "-6.8532285e-09", + "-0.0000000", + "-0.0000000", + "-0.0000000", + "-6.8532285e-09", + "-6.8532285e-09", + "-6.8532285e-09", + "-6.85322848e-09", + "-6.85322848e-09", + "-6.85322848e-09", + "-0.00000001", + "-0.00000001", + "-0.00000001", + "-6.85322848e-09", + "-6.85322848e-09", + "-6.85322848e-09", + "-6.853228485e-09", + "-6.853228485e-09", + "-6.853228485e-09", + "-0.000000007", + "-0.000000007", + "-0.000000007", + "-6.853228485e-09", + "-6.853228485e-09", + "-6.853228485e-09", + "-6.8532284847e-09", + "-6.8532284847e-09", + "-6.8532284847e-09", + "-0.0000000069", + "-0.0000000069", + "-0.0000000069", + "-6.8532284847e-09", + "-6.8532284847e-09", + "-6.8532284847e-09", + "-6.85322848470e-09", + "-6.85322848470e-09", + "-6.85322848470e-09", + "-0.00000000685", + "-0.00000000685", + "-0.00000000685", + "-6.8532284847e-09", + "-6.85322848470e-09", + "-6.8532284847e-09", + "-6.853228484704e-09", + "-6.853228484704e-09", + "-6.853228484704e-09", + "-0.000000006853", + "-0.000000006853", + "-0.000000006853", + "-6.853228484704e-09", + "-6.853228484704e-09", + "-6.853228484704e-09", + "-6.8532284847045e-09", + "-6.8532284847045e-09", + "-6.8532284847045e-09", + "-0.0000000068532", + "-0.0000000068532", + "-0.0000000068532", + }}, + {{ + "9e-10", + "9.e-10", + "+9e-10", + "8.6e-10", + "+8.6e-10", + "8.6e-10", + "0.0", + "0.0", + "+0.0", + "8.6e-10", + "8.6e-10", + "+8.6e-10", + "8.57e-10", + "+8.57e-10", + "8.57e-10", + "0.00", + "0.00", + "+0.00", + "8.57e-10", + "8.57e-10", + "+8.57e-10", + "8.567e-10", + "+8.567e-10", + "8.567e-10", + "0.000", + "0.000", + "+0.000", + "8.567e-10", + "8.567e-10", + "+8.567e-10", + "8.5665e-10", + "+8.5665e-10", + "8.5665e-10", + "0.0000", + "0.0000", + "+0.0000", + "8.5665e-10", + "8.5665e-10", + "+8.5665e-10", + "8.56654e-10", + "+8.56654e-10", + "8.56654e-10", + "0.00000", + "0.00000", + "+0.00000", + "8.56654e-10", + "8.56654e-10", + "+8.56654e-10", + "8.566536e-10", + "+8.566536e-10", + "8.566536e-10", + "0.000000", + "0.000000", + "+0.000000", + "8.566536e-10", + "8.566536e-10", + "+8.566536e-10", + "8.5665356e-10", + "+8.5665356e-10", + "8.5665356e-10", + "0.0000000", + "0.0000000", + "+0.0000000", + "8.5665356e-10", + "8.5665356e-10", + "+8.5665356e-10", + "8.56653561e-10", + "+8.56653561e-10", + "8.56653561e-10", + "0.00000000", + "0.00000000", + "+0.00000000", + "8.56653561e-10", + "8.56653561e-10", + "+8.56653561e-10", + "8.566535606e-10", + "+8.566535606e-10", + "8.566535606e-10", + "0.000000001", + "0.000000001", + "+0.000000001", + "8.566535606e-10", + "8.566535606e-10", + "+8.566535606e-10", + "8.5665356059e-10", + "+8.5665356059e-10", + "8.5665356059e-10", + "0.0000000009", + "0.0000000009", + "+0.0000000009", + "8.5665356059e-10", + "8.5665356059e-10", + "+8.5665356059e-10", + "8.56653560588e-10", + "+8.56653560588e-10", + "8.56653560588e-10", + "0.00000000086", + "0.00000000086", + "+0.00000000086", + "8.56653560588e-10", + "8.56653560588e-10", + "+8.56653560588e-10", + "8.566535605881e-10", + "+8.566535605881e-10", + "8.566535605881e-10", + "0.000000000857", + "0.000000000857", + "+0.000000000857", + "8.566535605881e-10", + "8.566535605881e-10", + "+8.566535605881e-10", + "8.5665356058806e-10", + "+8.5665356058806e-10", + "8.5665356058806e-10", + "0.0000000008567", + "0.0000000008567", + "+0.0000000008567", + }}, + {{ + "-9e-10", + "-9.e-10", + "-9e-10", + "-8.6e-10", + "-8.6e-10", + "-8.6e-10", + "-0.0", + "-0.0", + "-0.0", + "-8.6e-10", + "-8.6e-10", + "-8.6e-10", + "-8.57e-10", + "-8.57e-10", + "-8.57e-10", + "-0.00", + "-0.00", + "-0.00", + "-8.57e-10", + "-8.57e-10", + "-8.57e-10", + "-8.567e-10", + "-8.567e-10", + "-8.567e-10", + "-0.000", + "-0.000", + "-0.000", + "-8.567e-10", + "-8.567e-10", + "-8.567e-10", + "-8.5665e-10", + "-8.5665e-10", + "-8.5665e-10", + "-0.0000", + "-0.0000", + "-0.0000", + "-8.5665e-10", + "-8.5665e-10", + "-8.5665e-10", + "-8.56654e-10", + "-8.56654e-10", + "-8.56654e-10", + "-0.00000", + "-0.00000", + "-0.00000", + "-8.56654e-10", + "-8.56654e-10", + "-8.56654e-10", + "-8.566536e-10", + "-8.566536e-10", + "-8.566536e-10", + "-0.000000", + "-0.000000", + "-0.000000", + "-8.566536e-10", + "-8.566536e-10", + "-8.566536e-10", + "-8.5665356e-10", + "-8.5665356e-10", + "-8.5665356e-10", + "-0.0000000", + "-0.0000000", + "-0.0000000", + "-8.5665356e-10", + "-8.5665356e-10", + "-8.5665356e-10", + "-8.56653561e-10", + "-8.56653561e-10", + "-8.56653561e-10", + "-0.00000000", + "-0.00000000", + "-0.00000000", + "-8.56653561e-10", + "-8.56653561e-10", + "-8.56653561e-10", + "-8.566535606e-10", + "-8.566535606e-10", + "-8.566535606e-10", + "-0.000000001", + "-0.000000001", + "-0.000000001", + "-8.566535606e-10", + "-8.566535606e-10", + "-8.566535606e-10", + "-8.5665356059e-10", + "-8.5665356059e-10", + "-8.5665356059e-10", + "-0.0000000009", + "-0.0000000009", + "-0.0000000009", + "-8.5665356059e-10", + "-8.5665356059e-10", + "-8.5665356059e-10", + "-8.56653560588e-10", + "-8.56653560588e-10", + "-8.56653560588e-10", + "-0.00000000086", + "-0.00000000086", + "-0.00000000086", + "-8.56653560588e-10", + "-8.56653560588e-10", + "-8.56653560588e-10", + "-8.566535605881e-10", + "-8.566535605881e-10", + "-8.566535605881e-10", + "-0.000000000857", + "-0.000000000857", + "-0.000000000857", + "-8.566535605881e-10", + "-8.566535605881e-10", + "-8.566535605881e-10", + "-8.5665356058806e-10", + "-8.5665356058806e-10", + "-8.5665356058806e-10", + "-0.0000000008567", + "-0.0000000008567", + "-0.0000000008567", + }}, diff --git a/src/boost/libs/multiprecision/test/test.hpp b/src/boost/libs/multiprecision/test/test.hpp new file mode 100644 index 00000000..1bf06862 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test.hpp @@ -0,0 +1,348 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// + +#ifndef BOOST_MULTIPRECISION_TEST_HPP +#define BOOST_MULTIPRECISION_TEST_HPP + +#include <limits> +#include <cmath> +#include <typeinfo> + +#include <boost/detail/lightweight_test.hpp> +#include <boost/current_function.hpp> +#include <boost/static_assert.hpp> +#include <boost/utility/enable_if.hpp> +#include <boost/type_traits/is_unsigned.hpp> +#include <boost/multiprecision/number.hpp> + +namespace detail { + +template <class T> +inline typename boost::disable_if_c<boost::is_unsigned<T>::value || boost::multiprecision::is_unsigned_number<T>::value, T>::type +abs(const T& a) +{ + return a < 0 ? -a : a; +} + +template <class T> +inline typename boost::enable_if_c<boost::is_unsigned<T>::value || boost::multiprecision::is_unsigned_number<T>::value, T>::type +abs(const T& a) +{ + return a; +} + +} // namespace detail + +template <class T> +typename boost::enable_if_c<boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_integer, T>::type relative_error(T a, T b) +{ + return a > b ? a - b : b - a; +} + +template <class T> +typename boost::disable_if_c<(boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_integer) || boost::multiprecision::is_interval_number<T>::value, T>::type relative_error(T a, T b) +{ + using ::detail::abs; + using std::abs; + + T min_val = (std::numeric_limits<T>::min)(); + T max_val = (std::numeric_limits<T>::max)(); + + if ((a != 0) && (b != 0)) + { + if (a == b) + return 0; + + // TODO: use isfinite: + if (abs(b) >= max_val) + { + if (abs(a) >= max_val) + return 0; // one infinity is as good as another! + } + // If the result is denormalised, treat all denorms as equivalent: + if ((a < min_val) && (a > 0)) + a = min_val; + else if ((a > -min_val) && (a < 0)) + a = -min_val; + if ((b < min_val) && (b > 0)) + b = min_val; + else if ((b > -min_val) && (b < 0)) + b = -min_val; + + return (std::max)(abs(T((a - b) / a)), abs(T((a - b) / b))) / std::numeric_limits<T>::epsilon(); + } + + // Handle special case where one or both are zero: + if (min_val == 0) + return abs(T(a - b)); + if (abs(a) < min_val) + a = min_val; + if (abs(b) < min_val) + b = min_val; + + return (std::max)(abs(T((a - b) / a)), abs(T((a - b) / b))) / std::numeric_limits<T>::epsilon(); +} + +template <class T, class U> +typename boost::mpl::if_c<boost::is_convertible<T, U>::value, U, T>::type +relative_error(T a, U b) +{ + typedef typename boost::mpl::if_c<boost::is_convertible<T, U>::value, U, T>::type cast_type; + return relative_error<cast_type>(static_cast<cast_type>(a), static_cast<cast_type>(b)); +} + +template <class T> +typename boost::enable_if_c<boost::multiprecision::is_interval_number<T>::value, T>::type relative_error(T a, T b) +{ + typename boost::multiprecision::component_type<T>::type am = median(a); + typename boost::multiprecision::component_type<T>::type bm = median(b); + return relative_error<typename boost::multiprecision::component_type<T>::type>(am, bm); +} + +enum +{ + warn_on_fail, + error_on_fail, + abort_on_fail +}; + +template <class T> +inline T epsilon_of(const T&) +{ + BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_specialized); + return std::numeric_limits<T>::is_integer ? static_cast<T>(1) : std::numeric_limits<T>::epsilon(); +} + +template <class T> +inline int digits_of(const T&) +{ + return std::numeric_limits<T>::is_specialized ? std::numeric_limits<T>::digits10 + 3 : std::numeric_limits<long double>::digits10 + 3; +} + +inline std::ostream& report_where(const char* file, int line, const char* function) +{ + if (function) + BOOST_LIGHTWEIGHT_TEST_OSTREAM << "In function: " << function << std::endl; + BOOST_LIGHTWEIGHT_TEST_OSTREAM << file << ":" << line; + return BOOST_LIGHTWEIGHT_TEST_OSTREAM; +} + +#define BOOST_MP_REPORT_WHERE report_where(__FILE__, __LINE__, BOOST_CURRENT_FUNCTION) + +inline void report_severity(int severity) +{ + if (severity == error_on_fail) + ++boost::detail::test_errors(); + else if (severity == abort_on_fail) + { + ++boost::detail::test_errors(); + abort(); + } +} + +#define BOOST_MP_REPORT_SEVERITY(severity) report_severity(severity) + +template <class E> +void report_unexpected_exception(const E& e, int severity, const char* file, int line, const char* function) +{ + report_where(file, line, function) << " Unexpected exception of type " << typeid(e).name() << std::endl; + BOOST_LIGHTWEIGHT_TEST_OSTREAM << "Errot message was: " << e.what() << std::endl; + BOOST_MP_REPORT_SEVERITY(severity); +} + +#ifndef BOOST_NO_EXCEPTIONS +#define BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) \ + catch (const std::exception& e) \ + { \ + report_unexpected_exception(e, severity, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \ + } \ + catch (...) \ + { \ + std::cout << "Exception of unknown type was thrown" << std::endl; \ + report_severity(severity); \ + } +#define BOOST_MP_TRY try +#else +#define BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) +#define BOOST_MP_TRY +#endif + +#define BOOST_CHECK_IMP(x, severity) \ + BOOST_MP_TRY \ + { \ + if (x) \ + { \ + } \ + else \ + { \ + BOOST_MP_REPORT_WHERE << " Failed predicate: " << BOOST_STRINGIZE(x) << std::endl; \ + BOOST_MP_REPORT_SEVERITY(severity); \ + } \ + } \ + BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) + +#define BOOST_CHECK(x) BOOST_CHECK_IMP(x, error_on_fail) +#define BOOST_WARN(x) BOOST_CHECK_IMP(x, warn_on_fail) +#define BOOST_REQUIRE(x) BOOST_CHECK_IMP(x, abort_on_fail) + +#define BOOST_CLOSE_IMP(x, y, tol, severity) \ + BOOST_MP_TRY \ + { \ + if (relative_error(x, y) > tol) \ + { \ + BOOST_MP_REPORT_WHERE << " Failed check for closeness: \n" \ + << std::setprecision(digits_of(x)) << std::scientific \ + << "Value of LHS was: " << x << "\n" \ + << "Value of RHS was: " << y << "\n" \ + << std::setprecision(5) << std::fixed \ + << "Relative error was: " << relative_error(x, y) << "eps\n" \ + << "Tolerance was: " << tol << "eps" << std::endl; \ + BOOST_MP_REPORT_SEVERITY(severity); \ + } \ + } \ + BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) + +#define BOOST_EQUAL_IMP(x, y, severity) \ + BOOST_MP_TRY \ + { \ + if (!((x) == (y))) \ + { \ + BOOST_MP_REPORT_WHERE << " Failed check for equality: \n" \ + << std::setprecision(digits_of(x)) << std::scientific \ + << "Value of LHS was: " << (x) << "\n" \ + << "Value of RHS was: " << (y) << "\n" \ + << std::setprecision(3) << std::endl; \ + BOOST_MP_REPORT_SEVERITY(severity); \ + } \ + } \ + BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) + +#define BOOST_NE_IMP(x, y, severity) \ + BOOST_MP_TRY \ + { \ + if (!(x != y)) \ + { \ + BOOST_MP_REPORT_WHERE << " Failed check for non-equality: \n" \ + << std::setprecision(digits_of(x)) << std::scientific \ + << "Value of LHS was: " << x << "\n" \ + << "Value of RHS was: " << y << "\n" \ + << std::setprecision(3) << std::endl; \ + BOOST_MP_REPORT_SEVERITY(severity); \ + } \ + } \ + BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) + +#define BOOST_LT_IMP(x, y, severity) \ + BOOST_MP_TRY \ + { \ + if (!(x < y)) \ + { \ + BOOST_MP_REPORT_WHERE << " Failed check for less than: \n" \ + << std::setprecision(digits_of(x)) << std::scientific \ + << "Value of LHS was: " << x << "\n" \ + << "Value of RHS was: " << y << "\n" \ + << std::setprecision(3) << std::endl; \ + BOOST_MP_REPORT_SEVERITY(severity); \ + } \ + } \ + BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) + +#define BOOST_GT_IMP(x, y, severity) \ + BOOST_MP_TRY \ + { \ + if (!(x > y)) \ + { \ + BOOST_MP_REPORT_WHERE << " Failed check for greater than: \n" \ + << std::setprecision(digits_of(x)) << std::scientific \ + << "Value of LHS was: " << x << "\n" \ + << "Value of RHS was: " << y << "\n" \ + << std::setprecision(3) << std::endl; \ + BOOST_MP_REPORT_SEVERITY(severity); \ + } \ + } \ + BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) + +#define BOOST_LE_IMP(x, y, severity) \ + BOOST_MP_TRY \ + { \ + if (!(x <= y)) \ + { \ + BOOST_MP_REPORT_WHERE << " Failed check for less-than-equal-to: \n" \ + << std::setprecision(digits_of(x)) << std::scientific \ + << "Value of LHS was: " << x << "\n" \ + << "Value of RHS was: " << y << "\n" \ + << std::setprecision(3) << std::endl; \ + BOOST_MP_REPORT_SEVERITY(severity); \ + } \ + } \ + BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) + +#define BOOST_GE_IMP(x, y, severity) \ + BOOST_MP_TRY \ + { \ + if (!(x >= y)) \ + { \ + BOOST_MP_REPORT_WHERE << " Failed check for greater-than-equal-to \n" \ + << std::setprecision(digits_of(x)) << std::scientific \ + << "Value of LHS was: " << x << "\n" \ + << "Value of RHS was: " << y << "\n" \ + << std::setprecision(3) << std::endl; \ + BOOST_MP_REPORT_SEVERITY(severity); \ + } \ + } \ + BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) + +#ifndef BOOST_NO_EXCEPTIONS +#define BOOST_MT_CHECK_THROW_IMP(x, E, severity) \ + BOOST_MP_TRY \ + { \ + x; \ + BOOST_MP_REPORT_WHERE << " Expected exception not thrown in expression " << BOOST_STRINGIZE(x) << std::endl; \ + BOOST_MP_REPORT_SEVERITY(severity); \ + } \ + catch (const E&) {} \ + BOOST_MP_UNEXPECTED_EXCEPTION_CHECK(severity) +#else +#define BOOST_MT_CHECK_THROW_IMP(x, E, severity) +#endif + +#define BOOST_CHECK_CLOSE(x, y, tol) BOOST_CLOSE_IMP(x, y, ((tol / (100 * epsilon_of(x)))), error_on_fail) +#define BOOST_WARN_CLOSE(x, y, tol) BOOST_CLOSE_IMP(x, y, (tol / (100 * epsilon_of(x))), warn_on_fail) +#define BOOST_REQUIRE_CLOSE(x, y, tol) BOOST_CLOSE_IMP(x, y, (tol / (100 * epsilon_of(x))), abort_on_fail) + +#define BOOST_CHECK_CLOSE_FRACTION(x, y, tol) BOOST_CLOSE_IMP(x, y, ((tol / (epsilon_of(x)))), error_on_fail) +#define BOOST_WARN_CLOSE_FRACTION(x, y, tol) BOOST_CLOSE_IMP(x, y, (tol / (epsilon_of(x))), warn_on_fail) +#define BOOST_REQUIRE_CLOSE_FRACTION(x, y, tol) BOOST_CLOSE_IMP(x, y, (tol / (epsilon_of(x))), abort_on_fail) + +#define BOOST_CHECK_EQUAL(x, y) BOOST_EQUAL_IMP(x, y, error_on_fail) +#define BOOST_WARN_EQUAL(x, y) BOOST_EQUAL_IMP(x, y, warn_on_fail) +#define BOOST_REQUIRE_EQUAL(x, y) BOOST_EQUAL_IMP(x, y, abort_on_fail) + +#define BOOST_CHECK_NE(x, y) BOOST_NE_IMP(x, y, error_on_fail) +#define BOOST_WARN_NE(x, y) BOOST_NE_IMP(x, y, warn_on_fail) +#define BOOST_REQUIRE_NE(x, y) BOOST_NE_IMP(x, y, abort_on_fail) + +#define BOOST_CHECK_LT(x, y) BOOST_LT_IMP(x, y, error_on_fail) +#define BOOST_WARN_LT(x, y) BOOST_LT_IMP(x, y, warn_on_fail) +#define BOOST_REQUIRE_LT(x, y) BOOST_LT_IMP(x, y, abort_on_fail) + +#define BOOST_CHECK_GT(x, y) BOOST_GT_IMP(x, y, error_on_fail) +#define BOOST_WARN_GT(x, y) BOOST_GT_IMP(x, y, warn_on_fail) +#define BOOST_REQUIRE_GT(x, y) BOOST_GT_IMP(x, y, abort_on_fail) + +#define BOOST_CHECK_LE(x, y) BOOST_LE_IMP(x, y, error_on_fail) +#define BOOST_WARN_LE(x, y) BOOST_LE_IMP(x, y, warn_on_fail) +#define BOOST_REQUIRE_LE(x, y) BOOST_LE_IMP(x, y, abort_on_fail) + +#define BOOST_CHECK_GE(x, y) BOOST_GE_IMP(x, y, error_on_fail) +#define BOOST_WARN_GE(x, y) BOOST_GE_IMP(x, y, warn_on_fail) +#define BOOST_REQUIRE_GE(x, y) BOOST_GE_IMP(x, y, abort_on_fail) + +#define BOOST_CHECK_THROW(x, E) BOOST_MT_CHECK_THROW_IMP(x, E, error_on_fail) +#define BOOST_WARN_THROW(x, E) BOOST_MT_CHECK_THROW_IMP(x, E, warn_on_fail) +#define BOOST_REQUIRE_THROW(x, E) BOOST_MT_CHECK_THROW_IMP(x, E, abort_on_fail) + +#endif diff --git a/src/boost/libs/multiprecision/test/test_acos.cpp b/src/boost/libs/multiprecision/test/test_acos.cpp new file mode 100644 index 00000000..e165eef6 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_acos.cpp @@ -0,0 +1,145 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +//# define TEST_MPF +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFI_50 +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +void test() +{ + std::cout << "Testing type: " << typeid(T).name() << std::endl; + // + // Test with some exact binary values as input - this tests our code + // rather than the test data: + // + static const boost::array<boost::array<T, 2>, 13> exact_data = + {{ + {{0.5, static_cast<T>("1.04719755119659774615421446109316762806572313312503527365831486410260546876206966620934494178070568932738269550442743555")}}, + {{0.25, static_cast<T>("1.31811607165281796574566425464604046984639096659071471685354851741333314266208327690226867044304393238598144034722708676")}}, + {{0.75, static_cast<T>("0.722734247813415611178377352641333362025218486424440267626754132583707381914630264964827610939101303690078815991333621490")}}, + {{1 - std::ldexp(1.0, -20), static_cast<T>("0.00138106804176241718210883847756746694048570648553426714212025111150044290934710742282266738617709904634187850607042604204")}}, + {{std::ldexp(1.0, -20), static_cast<T>("1.57079537312058021283676140197495835299636605165647561806789944133748780804448843729970624018104090863783682329820313127")}}, + {{1, static_cast<T>("0")}}, + + {{0, static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332")}}, + + {{-0.5, static_cast<T>("2.09439510239319549230842892218633525613144626625007054731662972820521093752413933241868988356141137865476539100885487110")}}, + {{-0.25, static_cast<T>("1.82347658193697527271697912863346241435077843278439110412139607489448326362412572172576615489907313559616664616605521989")}}, + {{-0.75, static_cast<T>("2.41885840577637762728426603063816952217195091295066555334819045972410902437157873366320721440301576429206927052194868516")}}, + {{-1 + std::ldexp(1.0, -20), static_cast<T>("3.14021158554803082128053454480193541725668369288957155383282434119631596337686189120521215795593996893580620800721188061")}}, + {{-std::ldexp(1.0, -20), static_cast<T>("1.57079728046921302562588198130454453120080334771863020290704515097032859824172056132832858516107615934431126321507917538")}}, + {{-1, static_cast<T>("3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230665")}}, + }}; + unsigned max_err = 0; + for (unsigned k = 0; k < exact_data.size(); k++) + { + T val = acos(exact_data[k][0]); + T e = relative_error(val, exact_data[k][1]); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + } + std::cout << "Max error was: " << max_err << std::endl; +#ifdef TEST_CPP_BIN_FLOAT + BOOST_TEST(max_err < 320); +#else + BOOST_TEST(max_err < 60); +#endif + BOOST_TEST(asin(T(0)) == 0); +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_adapt_serial.cpp b/src/boost/libs/multiprecision/test/test_adapt_serial.cpp new file mode 100644 index 00000000..96fbca2c --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_adapt_serial.cpp @@ -0,0 +1,200 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/logged_adaptor.hpp> +#include <boost/multiprecision/debug_adaptor.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/timer.hpp> +#include "test.hpp" + +#include <iostream> +#include <iomanip> +#include <sstream> +#include <boost/archive/text_iarchive.hpp> +#include <boost/archive/text_oarchive.hpp> +#include <boost/archive/binary_iarchive.hpp> +#include <boost/archive/binary_oarchive.hpp> +#include <boost/archive/xml_iarchive.hpp> +#include <boost/archive/xml_oarchive.hpp> +#include <boost/exception/all.hpp> + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class T> +void test_neg(const T& x, const boost::mpl::true_&) +{ + T val = -x; +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + T val2; + { + std::stringstream ss; + boost::archive::text_oarchive oa(ss); + oa << static_cast<const T&>(val); + boost::archive::text_iarchive ia(ss); + ia >> val2; + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss; + { + boost::archive::xml_oarchive oa(ss); + oa << boost::serialization::make_nvp("value", static_cast<const T&>(val)); + } + boost::archive::xml_iarchive ia(ss); + ia >> boost::serialization::make_nvp("value", val2); + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss; + boost::archive::binary_oarchive ob(ss); + ob << static_cast<const T&>(val); + boost::archive::binary_iarchive ib(ss); + ib >> val2; + BOOST_CHECK_EQUAL(val, val2); + } +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + } +#endif +} +template <class T> +void test_neg(const T&, const boost::mpl::false_&) {} + +template <class T> +void test() +{ + using namespace boost::multiprecision; + + boost::random::mt19937 gen; + boost::uniform_int<> d(3, std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits : 3000); + boost::timer tim; + + while (true) + { + T val = generate_random<T>(d(gen)); +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + T val2; + { + std::stringstream ss; + boost::archive::text_oarchive oa(ss); + oa << static_cast<const T&>(val); + boost::archive::text_iarchive ia(ss); + ia >> val2; + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss; + { + boost::archive::xml_oarchive oa(ss); + oa << boost::serialization::make_nvp("value", static_cast<const T&>(val)); + } + boost::archive::xml_iarchive ia(ss); + ia >> boost::serialization::make_nvp("value", val2); + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss; + boost::archive::binary_oarchive ob(ss); + ob << static_cast<const T&>(val); + boost::archive::binary_iarchive ib(ss); + ib >> val2; + BOOST_CHECK_EQUAL(val, val2); + } +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + } +#endif + test_neg(val, boost::mpl::bool_<std::numeric_limits<T>::is_signed>()); + // + // Check to see if test is taking too long. + // Tests run on the compiler farm time out after 300 seconds, + // so don't get too close to that: + // +#ifndef CI_SUPPRESS_KNOWN_ISSUES + if (tim.elapsed() > 30) +#else + if (tim.elapsed() > 10) +#endif + { + std::cout << "Timeout reached, aborting tests now....\n"; + break; + } + } +} + +int main() +{ + using namespace boost::multiprecision; + test<number<logged_adaptor<cpp_int_backend<> > > >(); + test<number<debug_adaptor<cpp_int_backend<> > > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic.hpp b/src/boost/libs/multiprecision/test/test_arithmetic.hpp new file mode 100644 index 00000000..58699fde --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic.hpp @@ -0,0 +1,3020 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef TEST_VLD +#include <vld.h> +#endif + +#include <boost/math/special_functions/pow.hpp> +#include <boost/integer/common_factor_rt.hpp> +#include <boost/functional/hash.hpp> +#include <functional> +#include "test.hpp" + +template <class T> +struct is_boost_rational : public boost::mpl::false_ +{}; +template <class T> +struct is_checked_cpp_int : public boost::mpl::false_ +{}; + +#ifdef BOOST_MSVC +// warning C4127: conditional expression is constant +#pragma warning(disable : 4127) +#endif + +template <class Target, class Source> +Target checked_lexical_cast(const Source& val) +{ +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + return boost::lexical_cast<Target>(val); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (...) + { + std::cerr << "Error in lexical cast\nSource type = " << typeid(Source).name() << " \"" << val << "\"\n"; + std::cerr << "Target type = " << typeid(Target).name() << std::endl; + throw; + } +#endif +} + +bool isfloat(float) { return true; } +bool isfloat(double) { return true; } +bool isfloat(long double) { return true; } +template <class T> +bool isfloat(T) { return false; } + +namespace detail { + +template <class tag, class Arg1, class Arg2, class Arg3, class Arg4> +typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type +abs(boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4> const& v) +{ + typedef typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type result_type; + return v < 0 ? result_type(-v) : result_type(v); +} + +} // namespace detail + +template <class T> +struct is_twos_complement_integer : public boost::mpl::true_ +{}; + +template <class T> +struct related_type +{ + typedef T type; +}; + +template <class Real, class Val> +void test_comparisons(Val, Val, const boost::mpl::false_) +{} + +int normalize_compare_result(int r) +{ + return r > 0 ? 1 : r < 0 ? -1 : 0; +} + +template <class Real, class Val> +typename boost::disable_if_c<boost::multiprecision::number_category<Real>::value == boost::multiprecision::number_kind_complex>::type +test_comparisons(Val a, Val b, const boost::mpl::true_) +{ + Real r1(a); + Real r2(b); + Real z(1); + + int cr = a < b ? -1 : a > b ? 1 : 0; + + BOOST_CHECK_EQUAL(r1 == r2, a == b); + BOOST_CHECK_EQUAL(r1 != r2, a != b); + BOOST_CHECK_EQUAL(r1 <= r2, a <= b); + BOOST_CHECK_EQUAL(r1 < r2, a < b); + BOOST_CHECK_EQUAL(r1 >= r2, a >= b); + BOOST_CHECK_EQUAL(r1 > r2, a > b); + + BOOST_CHECK_EQUAL(r1 == b, a == b); + BOOST_CHECK_EQUAL(r1 != b, a != b); + BOOST_CHECK_EQUAL(r1 <= b, a <= b); + BOOST_CHECK_EQUAL(r1 < b, a < b); + BOOST_CHECK_EQUAL(r1 >= b, a >= b); + BOOST_CHECK_EQUAL(r1 > b, a > b); + + BOOST_CHECK_EQUAL(a == r2, a == b); + BOOST_CHECK_EQUAL(a != r2, a != b); + BOOST_CHECK_EQUAL(a <= r2, a <= b); + BOOST_CHECK_EQUAL(a < r2, a < b); + BOOST_CHECK_EQUAL(a >= r2, a >= b); + BOOST_CHECK_EQUAL(a > r2, a > b); + + BOOST_CHECK_EQUAL(r1 * z == r2, a == b); + BOOST_CHECK_EQUAL(r1 * z != r2, a != b); + BOOST_CHECK_EQUAL(r1 * z <= r2, a <= b); + BOOST_CHECK_EQUAL(r1 * z < r2, a < b); + BOOST_CHECK_EQUAL(r1 * z >= r2, a >= b); + BOOST_CHECK_EQUAL(r1 * z > r2, a > b); + + BOOST_CHECK_EQUAL(r1 == r2 * z, a == b); + BOOST_CHECK_EQUAL(r1 != r2 * z, a != b); + BOOST_CHECK_EQUAL(r1 <= r2 * z, a <= b); + BOOST_CHECK_EQUAL(r1 < r2 * z, a < b); + BOOST_CHECK_EQUAL(r1 >= r2 * z, a >= b); + BOOST_CHECK_EQUAL(r1 > r2 * z, a > b); + + BOOST_CHECK_EQUAL(r1 * z == r2 * z, a == b); + BOOST_CHECK_EQUAL(r1 * z != r2 * z, a != b); + BOOST_CHECK_EQUAL(r1 * z <= r2 * z, a <= b); + BOOST_CHECK_EQUAL(r1 * z < r2 * z, a < b); + BOOST_CHECK_EQUAL(r1 * z >= r2 * z, a >= b); + BOOST_CHECK_EQUAL(r1 * z > r2 * z, a > b); + + BOOST_CHECK_EQUAL(r1 * z == b, a == b); + BOOST_CHECK_EQUAL(r1 * z != b, a != b); + BOOST_CHECK_EQUAL(r1 * z <= b, a <= b); + BOOST_CHECK_EQUAL(r1 * z < b, a < b); + BOOST_CHECK_EQUAL(r1 * z >= b, a >= b); + BOOST_CHECK_EQUAL(r1 * z > b, a > b); + + BOOST_CHECK_EQUAL(a == r2 * z, a == b); + BOOST_CHECK_EQUAL(a != r2 * z, a != b); + BOOST_CHECK_EQUAL(a <= r2 * z, a <= b); + BOOST_CHECK_EQUAL(a < r2 * z, a < b); + BOOST_CHECK_EQUAL(a >= r2 * z, a >= b); + BOOST_CHECK_EQUAL(a > r2 * z, a > b); + + BOOST_CHECK_EQUAL(normalize_compare_result(r1.compare(r2)), cr); + BOOST_CHECK_EQUAL(normalize_compare_result(r2.compare(r1)), -cr); + BOOST_CHECK_EQUAL(normalize_compare_result(r1.compare(b)), cr); + BOOST_CHECK_EQUAL(normalize_compare_result(r2.compare(a)), -cr); +} + +template <class Real, class Val> +typename boost::enable_if_c<boost::multiprecision::number_category<Real>::value == boost::multiprecision::number_kind_complex>::type +test_comparisons(Val a, Val b, const boost::mpl::true_) +{ + Real r1(a); + Real r2(b); + Real z(1); + + int cr = a < b ? -1 : a > b ? 1 : 0; + (void)cr; + + BOOST_CHECK_EQUAL(r1 == r2, a == b); + BOOST_CHECK_EQUAL(r1 != r2, a != b); + + BOOST_CHECK_EQUAL(r1 == b, a == b); + BOOST_CHECK_EQUAL(r1 != b, a != b); + + BOOST_CHECK_EQUAL(a == r2, a == b); + BOOST_CHECK_EQUAL(a != r2, a != b); + + BOOST_CHECK_EQUAL(r1 * z == r2, a == b); + BOOST_CHECK_EQUAL(r1 * z != r2, a != b); + + BOOST_CHECK_EQUAL(r1 == r2 * z, a == b); + BOOST_CHECK_EQUAL(r1 != r2 * z, a != b); + + BOOST_CHECK_EQUAL(r1 * z == r2 * z, a == b); + BOOST_CHECK_EQUAL(r1 * z != r2 * z, a != b); + + BOOST_CHECK_EQUAL(r1 * z == b, a == b); + BOOST_CHECK_EQUAL(r1 * z != b, a != b); + + BOOST_CHECK_EQUAL(a == r2 * z, a == b); + BOOST_CHECK_EQUAL(a != r2 * z, a != b); + + if (r1 == r2) + { + BOOST_CHECK_EQUAL(normalize_compare_result(r1.compare(r2)), 0); + BOOST_CHECK_EQUAL(normalize_compare_result(r2.compare(r1)), 0); + BOOST_CHECK_EQUAL(normalize_compare_result(r1.compare(b)), 0); + BOOST_CHECK_EQUAL(normalize_compare_result(r2.compare(a)), 0); + } + else + { + BOOST_CHECK_NE(normalize_compare_result(r1.compare(r2)), 0); + BOOST_CHECK_NE(normalize_compare_result(r2.compare(r1)), 0); + BOOST_CHECK_NE(normalize_compare_result(r1.compare(b)), 0); + BOOST_CHECK_NE(normalize_compare_result(r2.compare(a)), 0); + } +} + +template <class Real, class Exp> +void test_conditional(Real v, Exp e) +{ + // + // Verify that Exp is usable in Boolean contexts, and has the same value as v: + // + if (e) + { + BOOST_CHECK(v); + } + else + { + BOOST_CHECK(!v); + } + if (!e) + { + BOOST_CHECK(!v); + } + else + { + BOOST_CHECK(v); + } +} + +template <class Real> +void test_complement(Real a, Real b, Real c, const boost::mpl::true_&) +{ + int i = 1020304; + int j = 56789123; + int sign_mask = ~0; + if (std::numeric_limits<Real>::is_signed) + { + BOOST_CHECK_EQUAL(~a, (~i & sign_mask)); + c = a & ~b; + BOOST_CHECK_EQUAL(c, (i & (~j & sign_mask))); + c = ~(a | b); + BOOST_CHECK_EQUAL(c, (~(i | j) & sign_mask)); + } + else + { + BOOST_CHECK_EQUAL((~a & a), 0); + } +} + +template <class Real> +void test_complement(Real, Real, Real, const boost::mpl::false_&) +{ +} + +template <class Real, class T> +void test_integer_ops(const T&) {} + +template <class Real> +void test_rational(const boost::mpl::true_&) +{ + Real a(2); + a /= 3; + BOOST_CHECK_EQUAL(numerator(a), 2); + BOOST_CHECK_EQUAL(denominator(a), 3); + Real b(4); + b /= 6; + BOOST_CHECK_EQUAL(a, b); + + // + // Check IO code: + // + std::stringstream ss; + ss << a; + ss >> b; + BOOST_CHECK_EQUAL(a, b); +} + +template <class Real> +void test_rational(const boost::mpl::false_&) +{ + Real a(2); + a /= 3; + BOOST_CHECK_EQUAL(numerator(a), 2); + BOOST_CHECK_EQUAL(denominator(a), 3); + Real b(4); + b /= 6; + BOOST_CHECK_EQUAL(a, b); + +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(Real(a / 0), std::overflow_error); + BOOST_CHECK_THROW(Real("3.14"), std::runtime_error); +#endif + b = Real("2/3"); + BOOST_CHECK_EQUAL(a, b); + // + // Check IO code: + // + std::stringstream ss; + ss << a; + ss >> b; + BOOST_CHECK_EQUAL(a, b); +} + +template <class Real> +void test_integer_ops(const boost::mpl::int_<boost::multiprecision::number_kind_rational>&) +{ + test_rational<Real>(is_boost_rational<Real>()); +} + +template <class Real> +void test_signed_integer_ops(const boost::mpl::true_&) +{ + Real a(20); + Real b(7); + Real c(5); + BOOST_CHECK_EQUAL(-a % c, 0); + BOOST_CHECK_EQUAL(-a % b, -20 % 7); + BOOST_CHECK_EQUAL(-a % -b, -20 % -7); + BOOST_CHECK_EQUAL(a % -b, 20 % -7); + BOOST_CHECK_EQUAL(-a % 7, -20 % 7); + BOOST_CHECK_EQUAL(-a % -7, -20 % -7); + BOOST_CHECK_EQUAL(a % -7, 20 % -7); + BOOST_CHECK_EQUAL(-a % 7u, -20 % 7); + BOOST_CHECK_EQUAL(-a % a, 0); + BOOST_CHECK_EQUAL(-a % 5, 0); + BOOST_CHECK_EQUAL(-a % -5, 0); + BOOST_CHECK_EQUAL(a % -5, 0); + + b = -b; + BOOST_CHECK_EQUAL(a % b, 20 % -7); + a = -a; + BOOST_CHECK_EQUAL(a % b, -20 % -7); + BOOST_CHECK_EQUAL(a % -7, -20 % -7); + b = 7; + BOOST_CHECK_EQUAL(a % b, -20 % 7); + BOOST_CHECK_EQUAL(a % 7, -20 % 7); + BOOST_CHECK_EQUAL(a % 7u, -20 % 7); + + a = 20; + a %= b; + BOOST_CHECK_EQUAL(a, 20 % 7); + a = -20; + a %= b; + BOOST_CHECK_EQUAL(a, -20 % 7); + a = 20; + a %= -b; + BOOST_CHECK_EQUAL(a, 20 % -7); + a = -20; + a %= -b; + BOOST_CHECK_EQUAL(a, -20 % -7); + a = 5; + a %= b - a; + BOOST_CHECK_EQUAL(a, 5 % (7 - 5)); + a = -20; + a %= 7; + BOOST_CHECK_EQUAL(a, -20 % 7); + a = 20; + a %= -7; + BOOST_CHECK_EQUAL(a, 20 % -7); + a = -20; + a %= -7; + BOOST_CHECK_EQUAL(a, -20 % -7); +#ifndef BOOST_NO_LONG_LONG + a = -20; + a %= 7uLL; + BOOST_CHECK_EQUAL(a, -20 % 7); + a = 20; + a %= -7LL; + BOOST_CHECK_EQUAL(a, 20 % -7); + a = -20; + a %= -7LL; + BOOST_CHECK_EQUAL(a, -20 % -7); +#endif + a = 400; + b = 45; + BOOST_CHECK_EQUAL(gcd(a, -45), boost::integer::gcd(400, 45)); + BOOST_CHECK_EQUAL(lcm(a, -45), boost::integer::lcm(400, 45)); + BOOST_CHECK_EQUAL(gcd(-400, b), boost::integer::gcd(400, 45)); + BOOST_CHECK_EQUAL(lcm(-400, b), boost::integer::lcm(400, 45)); + a = -20; + BOOST_CHECK_EQUAL(abs(a), 20); + BOOST_CHECK_EQUAL(abs(-a), 20); + BOOST_CHECK_EQUAL(abs(+a), 20); + a = 20; + BOOST_CHECK_EQUAL(abs(a), 20); + BOOST_CHECK_EQUAL(abs(-a), 20); + BOOST_CHECK_EQUAL(abs(+a), 20); + a = -400; + b = 45; + BOOST_CHECK_EQUAL(gcd(a, b), boost::integer::gcd(-400, 45)); + BOOST_CHECK_EQUAL(lcm(a, b), boost::integer::lcm(-400, 45)); + BOOST_CHECK_EQUAL(gcd(a, 45), boost::integer::gcd(-400, 45)); + BOOST_CHECK_EQUAL(lcm(a, 45), boost::integer::lcm(-400, 45)); + BOOST_CHECK_EQUAL(gcd(-400, b), boost::integer::gcd(-400, 45)); + BOOST_CHECK_EQUAL(lcm(-400, b), boost::integer::lcm(-400, 45)); + Real r; + divide_qr(a, b, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + BOOST_CHECK_EQUAL(integer_modulus(a, 57), abs(a % 57)); + b = -57; + divide_qr(a, b, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + BOOST_CHECK_EQUAL(integer_modulus(a, -57), abs(a % -57)); + a = 458; + divide_qr(a, b, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + BOOST_CHECK_EQUAL(integer_modulus(a, -57), abs(a % -57)); +#ifndef TEST_CHECKED_INT + if (is_checked_cpp_int<Real>::value) + { + a = -1; +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(a << 2, std::range_error); + BOOST_CHECK_THROW(a >> 2, std::range_error); + BOOST_CHECK_THROW(a <<= 2, std::range_error); + BOOST_CHECK_THROW(a >>= 2, std::range_error); +#endif + } + else + { + a = -1; + BOOST_CHECK_EQUAL(a << 10, -1024); + a = -23; + BOOST_CHECK_EQUAL(a << 10, -23552); + a = -23456; + BOOST_CHECK_EQUAL(a >> 10, -23); + a = -3; + BOOST_CHECK_EQUAL(a >> 10, -1); + } +#endif +} +template <class Real> +void test_signed_integer_ops(const boost::mpl::false_&) +{ +} + +template <class Real> +inline Real negate_if_signed(Real r, const boost::mpl::bool_<true>&) +{ + return -r; +} +template <class Real> +inline Real negate_if_signed(Real r, const boost::mpl::bool_<false>&) +{ + return r; +} + +template <class Real, class Int> +void test_integer_overflow() +{ + if (std::numeric_limits<Real>::digits > std::numeric_limits<Int>::digits) + { + Real m((std::numeric_limits<Int>::max)()); + Int r; + ++m; + if (is_checked_cpp_int<Real>::value) + { + BOOST_CHECK_THROW(m.template convert_to<Int>(), std::overflow_error); + } + else if (boost::is_signed<Int>::value) + { + r = m.template convert_to<Int>(); + BOOST_CHECK_EQUAL(r, (std::numeric_limits<Int>::max)()); + } + else + { + r = m.template convert_to<Int>(); + BOOST_CHECK_EQUAL(r, 0); + } + // Again with much larger value: + m = 1u; + m <<= (std::min)(std::numeric_limits<Real>::digits - 1, 1000); + if (is_checked_cpp_int<Real>::value) + { + BOOST_CHECK_THROW(m.template convert_to<Int>(), std::overflow_error); + } + else if (boost::is_signed<Int>::value) + { + r = m.template convert_to<Int>(); + BOOST_CHECK_EQUAL(r, (std::numeric_limits<Int>::max)()); + } + else + { + r = m.template convert_to<Int>(); + BOOST_CHECK_EQUAL(r, 0); + } + + if (std::numeric_limits<Real>::is_signed && (boost::is_signed<Int>::value)) + { + m = (std::numeric_limits<Int>::min)(); + --m; + if (is_checked_cpp_int<Real>::value) + { + BOOST_CHECK_THROW(m.template convert_to<Int>(), std::overflow_error); + } + else + { + r = m.template convert_to<Int>(); + BOOST_CHECK_EQUAL(r, (std::numeric_limits<Int>::min)()); + } + // Again with much larger value: + m = 2u; + m = pow(m, (std::min)(std::numeric_limits<Real>::digits - 1, 1000)); + ++m; + m = negate_if_signed(m, boost::mpl::bool_<std::numeric_limits<Real>::is_signed>()); + if (is_checked_cpp_int<Real>::value) + { + BOOST_CHECK_THROW(m.template convert_to<Int>(), std::overflow_error); + } + else + { + r = m.template convert_to<Int>(); + BOOST_CHECK_EQUAL(r, (std::numeric_limits<Int>::min)()); + } + } + else if (std::numeric_limits<Real>::is_signed && !boost::is_signed<Int>::value) + { + // signed to unsigned converison with overflow, it's really not clear what should happen here! + m = (std::numeric_limits<Int>::max)(); + ++m; + m = negate_if_signed(m, boost::mpl::bool_<std::numeric_limits<Real>::is_signed>()); + BOOST_CHECK_THROW(m.template convert_to<Int>(), std::range_error); + // Again with much larger value: + m = 2u; + m = pow(m, (std::min)(std::numeric_limits<Real>::digits - 1, 1000)); + m = negate_if_signed(m, boost::mpl::bool_<std::numeric_limits<Real>::is_signed>()); + BOOST_CHECK_THROW(m.template convert_to<Int>(), std::range_error); + } + } +} + +template <class Real, class Int> +void test_integer_round_trip() +{ + if (std::numeric_limits<Real>::digits >= std::numeric_limits<Int>::digits) + { + Real m((std::numeric_limits<Int>::max)()); + Int r = m.template convert_to<Int>(); + BOOST_CHECK_EQUAL(m, r); + if (std::numeric_limits<Real>::is_signed && (std::numeric_limits<Real>::digits > std::numeric_limits<Int>::digits)) + { + m = (std::numeric_limits<Int>::min)(); + r = m.template convert_to<Int>(); + BOOST_CHECK_EQUAL(m, r); + } + } + test_integer_overflow<Real, Int>(); +} + +template <class Real> +void test_integer_ops(const boost::mpl::int_<boost::multiprecision::number_kind_integer>&) +{ + test_signed_integer_ops<Real>(boost::mpl::bool_<std::numeric_limits<Real>::is_signed>()); + + Real a(20); + Real b(7); + Real c(5); + BOOST_CHECK_EQUAL(a % b, 20 % 7); + BOOST_CHECK_EQUAL(a % 7, 20 % 7); + BOOST_CHECK_EQUAL(a % 7u, 20 % 7); + BOOST_CHECK_EQUAL(a % a, 0); + BOOST_CHECK_EQUAL(a % c, 0); + BOOST_CHECK_EQUAL(a % 5, 0); + a = a % (b + 0); + BOOST_CHECK_EQUAL(a, 20 % 7); + a = 20; + c = (a + 2) % (a - 1); + BOOST_CHECK_EQUAL(c, 22 % 19); + c = 5; + a = b % (a - 15); + BOOST_CHECK_EQUAL(a, 7 % 5); + a = 20; + + a = 20; + a %= 7; + BOOST_CHECK_EQUAL(a, 20 % 7); +#ifndef BOOST_NO_LONG_LONG + a = 20; + a %= 7uLL; + BOOST_CHECK_EQUAL(a, 20 % 7); +#endif + a = 20; + ++a; + BOOST_CHECK_EQUAL(a, 21); + --a; + BOOST_CHECK_EQUAL(a, 20); + BOOST_CHECK_EQUAL(a++, 20); + BOOST_CHECK_EQUAL(a, 21); + BOOST_CHECK_EQUAL(a--, 21); + BOOST_CHECK_EQUAL(a, 20); + a = 2000; + a <<= 20; + BOOST_CHECK_EQUAL(a, 2000L << 20); + a >>= 20; + BOOST_CHECK_EQUAL(a, 2000); + a <<= 20u; + BOOST_CHECK_EQUAL(a, 2000L << 20); + a >>= 20u; + BOOST_CHECK_EQUAL(a, 2000); +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(a <<= -20, std::out_of_range); + BOOST_CHECK_THROW(a >>= -20, std::out_of_range); + BOOST_CHECK_THROW(Real(a << -20), std::out_of_range); + BOOST_CHECK_THROW(Real(a >> -20), std::out_of_range); +#endif +#ifndef BOOST_NO_LONG_LONG + if (sizeof(long long) > sizeof(std::size_t)) + { + // extreme values should trigger an exception: +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(a >>= (1uLL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range); + BOOST_CHECK_THROW(a <<= (1uLL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range); + BOOST_CHECK_THROW(a >>= -(1LL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range); + BOOST_CHECK_THROW(a <<= -(1LL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range); + BOOST_CHECK_THROW(a >>= (1LL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range); + BOOST_CHECK_THROW(a <<= (1LL << (sizeof(long long) * CHAR_BIT - 2)), std::out_of_range); +#endif + // Unless they fit within range: + a = 2000L; + a <<= 20uLL; + BOOST_CHECK_EQUAL(a, (2000L << 20)); + a = 2000; + a <<= 20LL; + BOOST_CHECK_EQUAL(a, (2000L << 20)); + +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(Real(a >> (1uLL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range); + BOOST_CHECK_THROW(Real(a <<= (1uLL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range); + BOOST_CHECK_THROW(Real(a >>= -(1LL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range); + BOOST_CHECK_THROW(Real(a <<= -(1LL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range); + BOOST_CHECK_THROW(Real(a >>= (1LL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range); + BOOST_CHECK_THROW(Real(a <<= (1LL << (sizeof(long long) * CHAR_BIT - 2))), std::out_of_range); +#endif + // Unless they fit within range: + a = 2000L; + BOOST_CHECK_EQUAL(Real(a << 20uLL), (2000L << 20)); + a = 2000; + BOOST_CHECK_EQUAL(Real(a << 20LL), (2000L << 20)); + } +#endif + a = 20; + b = a << 20; + BOOST_CHECK_EQUAL(b, (20 << 20)); + b = a >> 2; + BOOST_CHECK_EQUAL(b, (20 >> 2)); + b = (a + 2) << 10; + BOOST_CHECK_EQUAL(b, (22 << 10)); + b = (a + 3) >> 3; + BOOST_CHECK_EQUAL(b, (23 >> 3)); + // + // Bit fiddling: + // + int i = 1020304; + int j = 56789123; + int k = 4523187; + a = i; + b = j; + c = a; + c &= b; + BOOST_CHECK_EQUAL(c, (i & j)); + c = a; + c &= j; + BOOST_CHECK_EQUAL(c, (i & j)); + c = a; + c &= a + b; + BOOST_CHECK_EQUAL(c, (i & (i + j))); + BOOST_CHECK_EQUAL((a & b), (i & j)); + c = k; + a = a & (b + k); + BOOST_CHECK_EQUAL(a, (i & (j + k))); + a = i; + a = (b + k) & a; + BOOST_CHECK_EQUAL(a, (i & (j + k))); + a = i; + c = a & b & k; + BOOST_CHECK_EQUAL(c, (i & j & k)); + c = a; + c &= (c + b); + BOOST_CHECK_EQUAL(c, (i & (i + j))); + c = a & (b | 1); + BOOST_CHECK_EQUAL(c, (i & (j | 1))); + + test_complement<Real>(a, b, c, typename is_twos_complement_integer<Real>::type()); + + a = i; + b = j; + c = a; + c |= b; + BOOST_CHECK_EQUAL(c, (i | j)); + c = a; + c |= j; + BOOST_CHECK_EQUAL(c, (i | j)); + c = a; + c |= a + b; + BOOST_CHECK_EQUAL(c, (i | (i + j))); + BOOST_CHECK_EQUAL((a | b), (i | j)); + c = k; + a = a | (b + k); + BOOST_CHECK_EQUAL(a, (i | (j + k))); + a = i; + a = (b + k) | a; + BOOST_CHECK_EQUAL(a, (i | (j + k))); + a = i; + c = a | b | k; + BOOST_CHECK_EQUAL(c, (i | j | k)); + c = a; + c |= (c + b); + BOOST_CHECK_EQUAL(c, (i | (i + j))); + c = a | (b | 1); + BOOST_CHECK_EQUAL(c, (i | (j | 1))); + + a = i; + b = j; + c = a; + c ^= b; + BOOST_CHECK_EQUAL(c, (i ^ j)); + c = a; + c ^= j; + BOOST_CHECK_EQUAL(c, (i ^ j)); + c = a; + c ^= a + b; + BOOST_CHECK_EQUAL(c, (i ^ (i + j))); + BOOST_CHECK_EQUAL((a ^ b), (i ^ j)); + c = k; + a = a ^ (b + k); + BOOST_CHECK_EQUAL(a, (i ^ (j + k))); + a = i; + a = (b + k) ^ a; + BOOST_CHECK_EQUAL(a, (i ^ (j + k))); + a = i; + c = a ^ b ^ k; + BOOST_CHECK_EQUAL(c, (i ^ j ^ k)); + c = a; + c ^= (c + b); + BOOST_CHECK_EQUAL(c, (i ^ (i + j))); + c = a ^ (b | 1); + BOOST_CHECK_EQUAL(c, (i ^ (j | 1))); + + a = i; + b = j; + c = k; + // + // Non-member functions: + // + a = 400; + b = 45; + BOOST_CHECK_EQUAL(gcd(a, b), boost::integer::gcd(400, 45)); + BOOST_CHECK_EQUAL(lcm(a, b), boost::integer::lcm(400, 45)); + BOOST_CHECK_EQUAL(gcd(a, 45), boost::integer::gcd(400, 45)); + BOOST_CHECK_EQUAL(lcm(a, 45), boost::integer::lcm(400, 45)); + BOOST_CHECK_EQUAL(gcd(a, 45u), boost::integer::gcd(400, 45)); + BOOST_CHECK_EQUAL(lcm(a, 45u), boost::integer::lcm(400, 45)); + BOOST_CHECK_EQUAL(gcd(400, b), boost::integer::gcd(400, 45)); + BOOST_CHECK_EQUAL(lcm(400, b), boost::integer::lcm(400, 45)); + BOOST_CHECK_EQUAL(gcd(400u, b), boost::integer::gcd(400, 45)); + BOOST_CHECK_EQUAL(lcm(400u, b), boost::integer::lcm(400, 45)); + + // + // Conditionals involving 2 arg functions: + // + test_conditional(Real(gcd(a, b)), gcd(a, b)); + + Real r; + divide_qr(a, b, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + divide_qr(a + 0, b, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + divide_qr(a, b + 0, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + divide_qr(a + 0, b + 0, c, r); + BOOST_CHECK_EQUAL(c, a / b); + BOOST_CHECK_EQUAL(r, a % b); + BOOST_CHECK_EQUAL(integer_modulus(a, 57), a % 57); + for (i = 0; i < 20; ++i) + { + if (std::numeric_limits<Real>::is_specialized && (!std::numeric_limits<Real>::is_bounded || ((int)i * 17 < std::numeric_limits<Real>::digits))) + { + BOOST_CHECK_EQUAL(lsb(Real(1) << (i * 17)), static_cast<unsigned>(i * 17)); + BOOST_CHECK_EQUAL(msb(Real(1) << (i * 17)), static_cast<unsigned>(i * 17)); + BOOST_CHECK(bit_test(Real(1) << (i * 17), i * 17)); + BOOST_CHECK(!bit_test(Real(1) << (i * 17), i * 17 + 1)); + if (i) + { + BOOST_CHECK(!bit_test(Real(1) << (i * 17), i * 17 - 1)); + } + Real zero(0); + BOOST_CHECK(bit_test(bit_set(zero, i * 17), i * 17)); + zero = 0; + BOOST_CHECK_EQUAL(bit_flip(zero, i * 17), Real(1) << i * 17); + zero = Real(1) << i * 17; + BOOST_CHECK_EQUAL(bit_flip(zero, i * 17), 0); + zero = Real(1) << i * 17; + BOOST_CHECK_EQUAL(bit_unset(zero, i * 17), 0); + } + } + // + // pow, powm: + // + BOOST_CHECK_EQUAL(pow(Real(3), 4u), 81); + BOOST_CHECK_EQUAL(pow(Real(3) + Real(0), 4u), 81); + BOOST_CHECK_EQUAL(powm(Real(3), Real(4), Real(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3), Real(4), 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3), Real(4), Real(13) + 0), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3), Real(4) + 0, Real(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3), Real(4) + 0, 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3), Real(4) + 0, Real(13) + 0), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3), 4 + 0, Real(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3), 4 + 0, 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3), 4 + 0, Real(13) + 0), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4), Real(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4), 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4), Real(13) + 0), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4) + 0, Real(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4) + 0, 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3) + 0, Real(4) + 0, Real(13) + 0), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3) + 0, 4 + 0, Real(13)), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3) + 0, 4 + 0, 13), 81 % 13); + BOOST_CHECK_EQUAL(powm(Real(3) + 0, 4 + 0, Real(13) + 0), 81 % 13); + // + // Conditionals involving 3 arg functions: + // + test_conditional(Real(powm(Real(3), Real(4), Real(13))), powm(Real(3), Real(4), Real(13))); + +#ifndef BOOST_NO_EXCEPTIONS + // + // Things that are expected errors: + // + BOOST_CHECK_THROW(Real("3.14"), std::runtime_error); + BOOST_CHECK_THROW(Real("3L"), std::runtime_error); + BOOST_CHECK_THROW(Real(Real(20) / 0u), std::overflow_error); +#endif + // + // Extra tests added for full coverage: + // + a = 20; + b = 7; + c = 20 % b; + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = 20 % (b + 0); + BOOST_CHECK_EQUAL(c, (20 % 7)); + c = a & 10; + BOOST_CHECK_EQUAL(c, (20 & 10)); + c = 10 & a; + BOOST_CHECK_EQUAL(c, (20 & 10)); + c = (a + 0) & (b + 0); + BOOST_CHECK_EQUAL(c, (20 & 7)); + c = 10 & (a + 0); + BOOST_CHECK_EQUAL(c, (20 & 10)); + c = 10 | a; + BOOST_CHECK_EQUAL(c, (20 | 10)); + c = (a + 0) | (b + 0); + BOOST_CHECK(c == (20 | 7)) + c = 20 | (b + 0); + BOOST_CHECK_EQUAL(c, (20 | 7)); + c = a ^ 7; + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = 20 ^ b; + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = (a + 0) ^ (b + 0); + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + c = 20 ^ (b + 0); + BOOST_CHECK_EQUAL(c, (20 ^ 7)); + + // + // Round tripping of built in integers: + // + test_integer_round_trip<Real, short>(); + test_integer_round_trip<Real, unsigned short>(); + test_integer_round_trip<Real, int>(); + test_integer_round_trip<Real, unsigned int>(); + test_integer_round_trip<Real, long>(); + test_integer_round_trip<Real, unsigned long>(); +#ifndef BOOST_NO_CXX11_LONG_LONG + test_integer_round_trip<Real, long long>(); + test_integer_round_trip<Real, unsigned long long>(); +#endif +} + +template <class Real, class T> +void test_float_funcs(const T&) {} + +template <class Real> +void test_float_funcs(const boost::mpl::true_&) +{ + if (boost::multiprecision::is_interval_number<Real>::value) + return; + // + // Test variable reuse in function calls, see https://svn.boost.org/trac/boost/ticket/8326 + // + Real a(2), b(10), c, d; + a = pow(a, b); + BOOST_CHECK_EQUAL(a, 1024); + a = 2; + b = pow(a, b); + BOOST_CHECK_EQUAL(b, 1024); + b = 10; + a = pow(a, 10); + BOOST_CHECK_EQUAL(a, 1024); + a = -2; + a = abs(a); + BOOST_CHECK_EQUAL(a, 2); + a = -2; + a = fabs(a); + BOOST_CHECK_EQUAL(a, 2); + a = 2.5; + a = floor(a); + BOOST_CHECK_EQUAL(a, 2); + a = 2.5; + a = ceil(a); + BOOST_CHECK_EQUAL(a, 3); + a = 2.5; + a = trunc(a); + BOOST_CHECK_EQUAL(a, 2); + a = 2.25; + a = round(a); + BOOST_CHECK_EQUAL(a, 2); + a = 2; + a = ldexp(a, 1); + BOOST_CHECK_EQUAL(a, 4); + int i; + a = frexp(a, &i); + BOOST_CHECK_EQUAL(a, 0.5); + + Real tol = std::numeric_limits<Real>::epsilon() * 3; + a = 4; + a = sqrt(a); + BOOST_CHECK_CLOSE_FRACTION(a, 2, tol); + a = 3; + a = exp(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(exp(Real(3))), tol); + a = 3; + a = log(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(log(Real(3))), tol); + a = 3; + a = log10(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(log10(Real(3))), tol); + + a = 0.5; + a = sin(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(sin(Real(0.5))), tol); + a = 0.5; + a = cos(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(cos(Real(0.5))), tol); + a = 0.5; + a = tan(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(tan(Real(0.5))), tol); + a = 0.5; + a = asin(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(asin(Real(0.5))), tol); + a = 0.5; + a = acos(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(acos(Real(0.5))), tol); + a = 0.5; + a = atan(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(atan(Real(0.5))), tol); + a = 0.5; + a = sinh(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(sinh(Real(0.5))), tol); + a = 0.5; + a = cosh(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(cosh(Real(0.5))), tol); + a = 0.5; + a = tanh(a); + BOOST_CHECK_CLOSE_FRACTION(a, Real(tanh(Real(0.5))), tol); + // fmod, need to check all the sign permutations: + a = 4; + b = 2; + a = fmod(a, b); + BOOST_CHECK_CLOSE_FRACTION(a, Real(fmod(Real(4), Real(2))), tol); + a = 4; + b = fmod(a, b); + BOOST_CHECK_CLOSE_FRACTION(b, Real(fmod(Real(4), Real(2))), tol); + a = 4; + b = 2; + a = fmod(-a, b); + BOOST_CHECK_CLOSE_FRACTION(a, Real(fmod(-Real(4), Real(2))), tol); + a = 4; + b = fmod(-a, b); + BOOST_CHECK_CLOSE_FRACTION(b, Real(-fmod(Real(4), Real(2))), tol); + a = 4; + b = 2; + a = fmod(a, -b); + BOOST_CHECK_CLOSE_FRACTION(a, Real(fmod(Real(4), -Real(2))), tol); + a = 4; + b = fmod(a, -b); + BOOST_CHECK_CLOSE_FRACTION(b, Real(fmod(Real(4), -Real(2))), tol); + a = 4; + b = 2; + a = fmod(-a, -b); + BOOST_CHECK_CLOSE_FRACTION(a, Real(fmod(-Real(4), -Real(2))), tol); + a = 4; + b = fmod(-a, -b); + BOOST_CHECK_CLOSE_FRACTION(b, Real(fmod(-Real(4), -Real(2))), tol); + // modf: + a = 5; + a /= 2; + b = modf(a, &c); + BOOST_CHECK_EQUAL(b + c, a); + BOOST_CHECK_EQUAL(b > 0, a > 0); + BOOST_CHECK_EQUAL(c > 0, a > 0); + a = -a; + b = modf(a, &c); + BOOST_CHECK_EQUAL(b + c, a); + BOOST_CHECK_EQUAL(b > 0, a > 0); + BOOST_CHECK_EQUAL(c > 0, a > 0); + b = modf(a, &c); + c = 0; + modf(a, &c); + BOOST_CHECK_EQUAL(b + c, a); + BOOST_CHECK_EQUAL(b > 0, a > 0); + BOOST_CHECK_EQUAL(c > 0, a > 0); + a = -a; + b = modf(a, &c); + c = 0; + modf(a, &c); + BOOST_CHECK_EQUAL(b + c, a); + BOOST_CHECK_EQUAL(b > 0, a > 0); + BOOST_CHECK_EQUAL(c > 0, a > 0); + + if (std::numeric_limits<Real>::has_infinity) + { + a = std::numeric_limits<Real>::infinity(); + b = modf(a, &c); + BOOST_CHECK_EQUAL(a, c); + BOOST_CHECK_EQUAL(b, 0); + a = -std::numeric_limits<Real>::infinity(); + b = modf(a, &c); + BOOST_CHECK_EQUAL(a, c); + BOOST_CHECK_EQUAL(b, 0); + } + if (std::numeric_limits<Real>::has_quiet_NaN) + { + a = std::numeric_limits<Real>::quiet_NaN(); + b = modf(a, &c); + BOOST_CHECK((boost::math::isnan)(b)); + BOOST_CHECK((boost::math::isnan)(c)); + } + + a = 4; + b = 2; + a = atan2(a, b); + BOOST_CHECK_CLOSE_FRACTION(a, Real(atan2(Real(4), Real(2))), tol); + a = 4; + b = atan2(a, b); + BOOST_CHECK_CLOSE_FRACTION(b, Real(atan2(Real(4), Real(2))), tol); + + // fma: + a = 2; + b = 4; + c = 6; + BOOST_CHECK_EQUAL(fma(a, b, c), 14); + BOOST_CHECK_EQUAL(fma(a, 4, c), 14); + BOOST_CHECK_EQUAL(fma(a, b, 6), 14); + BOOST_CHECK_EQUAL(fma(a, 4, 6), 14); + BOOST_CHECK_EQUAL(fma(a + 0, b, c), 14); + BOOST_CHECK_EQUAL(fma(a - 0, 4, c), 14); + BOOST_CHECK_EQUAL(fma(a * 1, b, 6), 14); + BOOST_CHECK_EQUAL(fma(a / 1, 4, 6), 14); + BOOST_CHECK_EQUAL(fma(2, b, c), 14); + BOOST_CHECK_EQUAL(fma(2, b, 6), 14); + BOOST_CHECK_EQUAL(fma(2, b * 1, c), 14); + BOOST_CHECK_EQUAL(fma(2, b + 0, 6), 14); + BOOST_CHECK_EQUAL(fma(2, 4, c), 14); + BOOST_CHECK_EQUAL(fma(2, 4, c + 0), 14); + + // Default construct, for consistency with native floats, default constructed values are zero: + Real zero; + BOOST_CHECK_EQUAL(zero, 0); + + // + // Complex number functions on scalars: + // + a = 40; + BOOST_CHECK_EQUAL(Real(arg(a)), 0); + BOOST_CHECK_EQUAL(Real(arg(a + 0)), 0); + a - 20; + BOOST_CHECK_EQUAL(Real(arg(a)), 0); + BOOST_CHECK_EQUAL(Real(arg(a - 20)), 0); +} + +template <class T, class U> +void compare_NaNs(const T& a, const U& b) +{ + BOOST_CHECK_EQUAL(a == b, false); + BOOST_CHECK_EQUAL(a != b, true); + BOOST_CHECK_EQUAL(a <= b, false); + BOOST_CHECK_EQUAL(a >= b, false); + BOOST_CHECK_EQUAL(a > b, false); + BOOST_CHECK_EQUAL(a < b, false); + // + // Again where LHS may be an expression template: + // + BOOST_CHECK_EQUAL(1 * a == b, false); + BOOST_CHECK_EQUAL(1 * a != b, true); + BOOST_CHECK_EQUAL(1 * a <= b, false); + BOOST_CHECK_EQUAL(1 * a >= b, false); + BOOST_CHECK_EQUAL(1 * a > b, false); + BOOST_CHECK_EQUAL(1 * a < b, false); + // + // Again where RHS may be an expression template: + // + BOOST_CHECK_EQUAL(a == b * 1, false); + BOOST_CHECK_EQUAL(a != b * 1, true); + BOOST_CHECK_EQUAL(a <= b * 1, false); + BOOST_CHECK_EQUAL(a >= b * 1, false); + BOOST_CHECK_EQUAL(a > b * 1, false); + BOOST_CHECK_EQUAL(a < b * 1, false); + // + // Again where LHS and RHS may be an expression templates: + // + BOOST_CHECK_EQUAL(1 * a == b * 1, false); + BOOST_CHECK_EQUAL(1 * a != b * 1, true); + BOOST_CHECK_EQUAL(1 * a <= b * 1, false); + BOOST_CHECK_EQUAL(1 * a >= b * 1, false); + BOOST_CHECK_EQUAL(1 * a > b * 1, false); + BOOST_CHECK_EQUAL(1 * a < b * 1, false); +} + +template <class Real, class T> +void test_float_ops(const T&) {} + +template <class Real> +void test_float_ops(const boost::mpl::int_<boost::multiprecision::number_kind_floating_point>&) +{ + BOOST_CHECK_EQUAL(abs(Real(2)), 2); + BOOST_CHECK_EQUAL(abs(Real(-2)), 2); + BOOST_CHECK_EQUAL(fabs(Real(2)), 2); + BOOST_CHECK_EQUAL(fabs(Real(-2)), 2); + BOOST_CHECK_EQUAL(floor(Real(5) / 2), 2); + BOOST_CHECK_EQUAL(ceil(Real(5) / 2), 3); + BOOST_CHECK_EQUAL(floor(Real(-5) / 2), -3); + BOOST_CHECK_EQUAL(ceil(Real(-5) / 2), -2); + BOOST_CHECK_EQUAL(trunc(Real(5) / 2), 2); + BOOST_CHECK_EQUAL(trunc(Real(-5) / 2), -2); + // + // ldexp and frexp, these pretty much have to be implemented by each backend: + // + typedef typename Real::backend_type::exponent_type e_type; + BOOST_CHECK_EQUAL(ldexp(Real(2), 5), 64); + BOOST_CHECK_EQUAL(ldexp(Real(2), -5), Real(2) / 32); + Real v(512); + e_type exponent; + Real r = frexp(v, &exponent); + BOOST_CHECK_EQUAL(r, 0.5); + BOOST_CHECK_EQUAL(exponent, 10); + BOOST_CHECK_EQUAL(v, 512); + v = 1 / v; + r = frexp(v, &exponent); + BOOST_CHECK_EQUAL(r, 0.5); + BOOST_CHECK_EQUAL(exponent, -8); + BOOST_CHECK_EQUAL(ldexp(Real(2), e_type(5)), 64); + BOOST_CHECK_EQUAL(ldexp(Real(2), e_type(-5)), Real(2) / 32); + v = 512; + e_type exp2; + r = frexp(v, &exp2); + BOOST_CHECK_EQUAL(r, 0.5); + BOOST_CHECK_EQUAL(exp2, 10); + BOOST_CHECK_EQUAL(v, 512); + v = 1 / v; + r = frexp(v, &exp2); + BOOST_CHECK_EQUAL(r, 0.5); + BOOST_CHECK_EQUAL(exp2, -8); + // + // scalbn and logb, these are the same as ldexp and frexp unless the radix is + // something other than 2: + // + if (std::numeric_limits<Real>::is_specialized && std::numeric_limits<Real>::radix) + { + BOOST_CHECK_EQUAL(scalbn(Real(2), 5), 2 * pow(double(std::numeric_limits<Real>::radix), 5)); + BOOST_CHECK_EQUAL(scalbn(Real(2), -5), Real(2) / pow(double(std::numeric_limits<Real>::radix), 5)); + v = 512; + exponent = ilogb(v); + r = scalbn(v, -exponent); + BOOST_CHECK(r >= 1); + BOOST_CHECK(r < std::numeric_limits<Real>::radix); + BOOST_CHECK_EQUAL(exponent, logb(v)); + BOOST_CHECK_EQUAL(v, scalbn(r, exponent)); + v = 1 / v; + exponent = ilogb(v); + r = scalbn(v, -exponent); + BOOST_CHECK(r >= 1); + BOOST_CHECK(r < std::numeric_limits<Real>::radix); + BOOST_CHECK_EQUAL(exponent, logb(v)); + BOOST_CHECK_EQUAL(v, scalbn(r, exponent)); + } + // + // pow and exponent: + // + v = 3.25; + r = pow(v, 0); + BOOST_CHECK_EQUAL(r, 1); + r = pow(v, 1); + BOOST_CHECK_EQUAL(r, 3.25); + r = pow(v, 2); + BOOST_CHECK_EQUAL(r, boost::math::pow<2>(3.25)); + r = pow(v, 3); + BOOST_CHECK_EQUAL(r, boost::math::pow<3>(3.25)); + r = pow(v, 4); + BOOST_CHECK_EQUAL(r, boost::math::pow<4>(3.25)); + r = pow(v, 5); + BOOST_CHECK_EQUAL(r, boost::math::pow<5>(3.25)); + r = pow(v, 6); + BOOST_CHECK_EQUAL(r, boost::math::pow<6>(3.25)); + r = pow(v, 25); + BOOST_CHECK_EQUAL(r, boost::math::pow<25>(Real(3.25))); + +#ifndef BOOST_NO_EXCEPTIONS + // + // Things that are expected errors: + // + BOOST_CHECK_THROW(Real("3.14L"), std::runtime_error); + if (std::numeric_limits<Real>::is_specialized) + { + if (std::numeric_limits<Real>::has_infinity) + { + BOOST_CHECK((boost::math::isinf)(Real(20) / 0u)); + } + else + { + BOOST_CHECK_THROW(r = Real(Real(20) / 0u), std::overflow_error); + } + } +#endif + // + // Comparisons of NaN's should always fail: + // + if (std::numeric_limits<Real>::has_quiet_NaN) + { + r = v = std::numeric_limits<Real>::quiet_NaN(); + compare_NaNs(r, v); + v = 0; + compare_NaNs(r, v); + r.swap(v); + compare_NaNs(r, v); + // + // Conmpare NaN to int: + // + compare_NaNs(v, 0); + compare_NaNs(0, v); + // + // Compare to floats: + // + compare_NaNs(v, 0.5); + compare_NaNs(0.5, v); + if (std::numeric_limits<double>::has_quiet_NaN) + { + compare_NaNs(r, std::numeric_limits<double>::quiet_NaN()); + compare_NaNs(std::numeric_limits<double>::quiet_NaN(), r); + } + } + + // + // Operations involving NaN's as one argument: + // + if (std::numeric_limits<Real>::has_quiet_NaN) + { + v = 20.25; + r = std::numeric_limits<Real>::quiet_NaN(); + BOOST_CHECK((boost::math::isnan)(v + r)); + BOOST_CHECK((boost::math::isnan)(r + v)); + BOOST_CHECK((boost::math::isnan)(r - v)); + BOOST_CHECK((boost::math::isnan)(v - r)); + BOOST_CHECK((boost::math::isnan)(r * v)); + BOOST_CHECK((boost::math::isnan)(v * r)); + BOOST_CHECK((boost::math::isnan)(r / v)); + BOOST_CHECK((boost::math::isnan)(v / r)); + Real t = v; + BOOST_CHECK((boost::math::isnan)(t += r)); + t = r; + BOOST_CHECK((boost::math::isnan)(t += v)); + t = r; + BOOST_CHECK((boost::math::isnan)(t -= v)); + t = v; + BOOST_CHECK((boost::math::isnan)(t -= r)); + t = r; + BOOST_CHECK((boost::math::isnan)(t *= v)); + t = v; + BOOST_CHECK((boost::math::isnan)(t *= r)); + t = r; + BOOST_CHECK((boost::math::isnan)(t /= v)); + t = v; + BOOST_CHECK((boost::math::isnan)(t /= r)); + } + // + // Operations involving infinities as one argument: + // + if (std::numeric_limits<Real>::has_infinity) + { + v = 20.25; + r = std::numeric_limits<Real>::infinity(); + BOOST_CHECK((boost::math::isinf)(v + r)); + BOOST_CHECK((boost::math::isinf)(r + v)); + BOOST_CHECK((boost::math::isinf)(r - v)); + BOOST_CHECK((boost::math::isinf)(v - r)); + BOOST_CHECK_LT(v - r, 0); + BOOST_CHECK((boost::math::isinf)(r * v)); + BOOST_CHECK((boost::math::isinf)(v * r)); + BOOST_CHECK((boost::math::isinf)(r / v)); + BOOST_CHECK_EQUAL(v / r, 0); + Real t = v; + BOOST_CHECK((boost::math::isinf)(t += r)); + t = r; + BOOST_CHECK((boost::math::isinf)(t += v)); + t = r; + BOOST_CHECK((boost::math::isinf)(t -= v)); + t = v; + BOOST_CHECK((boost::math::isinf)(t -= r)); + t = v; + BOOST_CHECK(t -= r < 0); + t = r; + BOOST_CHECK((boost::math::isinf)(t *= v)); + t = v; + BOOST_CHECK((boost::math::isinf)(t *= r)); + t = r; + BOOST_CHECK((boost::math::isinf)(t /= v)); + t = v; + BOOST_CHECK((t /= r) == 0); + } + // + // Operations that should produce NaN as a result: + // + if (std::numeric_limits<Real>::has_quiet_NaN) + { + v = r = 0; + Real t = v / r; + BOOST_CHECK((boost::math::isnan)(t)); + v /= r; + BOOST_CHECK((boost::math::isnan)(v)); + t = v / 0; + BOOST_CHECK((boost::math::isnan)(v)); + if (std::numeric_limits<Real>::has_infinity) + { + v = 0; + r = std::numeric_limits<Real>::infinity(); + t = v * r; + if (!boost::multiprecision::is_interval_number<Real>::value) + { + BOOST_CHECK((boost::math::isnan)(t)); + t = r * 0; + BOOST_CHECK((boost::math::isnan)(t)); + } + v = r; + t = r / v; + BOOST_CHECK((boost::math::isnan)(t)); + } + } + + test_float_funcs<Real>(boost::mpl::bool_<std::numeric_limits<Real>::is_specialized>()); +} + +template <class T> +struct lexical_cast_target_type +{ + typedef typename boost::mpl::if_< + boost::is_signed<T>, + boost::intmax_t, + typename boost::mpl::if_< + boost::is_unsigned<T>, + boost::uintmax_t, + T>::type>::type type; +}; + +template <class Real, class Num> +void test_negative_mixed_minmax(boost::mpl::true_ const&) +{ + if (!std::numeric_limits<Real>::is_bounded || (std::numeric_limits<Real>::digits >= std::numeric_limits<Num>::digits)) + { + Real mx1((std::numeric_limits<Num>::max)() - 1); + ++mx1; + Real mx2((std::numeric_limits<Num>::max)()); + BOOST_CHECK_EQUAL(mx1, mx2); + mx1 = (std::numeric_limits<Num>::max)() - 1; + ++mx1; + mx2 = (std::numeric_limits<Num>::max)(); + BOOST_CHECK_EQUAL(mx1, mx2); + + if (!std::numeric_limits<Real>::is_bounded || (std::numeric_limits<Real>::digits > std::numeric_limits<Num>::digits)) + { + Real mx3((std::numeric_limits<Num>::min)() + 1); + --mx3; + Real mx4((std::numeric_limits<Num>::min)()); + BOOST_CHECK_EQUAL(mx3, mx4); + mx3 = (std::numeric_limits<Num>::min)() + 1; + --mx3; + mx4 = (std::numeric_limits<Num>::min)(); + BOOST_CHECK_EQUAL(mx3, mx4); + } + } +} +template <class Real, class Num> +void test_negative_mixed_minmax(boost::mpl::false_ const&) +{ +} + +template <class Real, class Num> +void test_negative_mixed_numeric_limits(boost::mpl::true_ const&) +{ + typedef typename lexical_cast_target_type<Num>::type target_type; +#if defined(TEST_MPFR) + Num tol = 10 * std::numeric_limits<Num>::epsilon(); +#else + Num tol = 0; +#endif + static const int left_shift = std::numeric_limits<Num>::digits - 1; + Num n1 = -static_cast<Num>(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10)); + Num n2 = -1; + Num n3 = 0; + Num n4 = -20; + std::ios_base::fmtflags f = boost::is_floating_point<Num>::value ? std::ios_base::scientific : std::ios_base::fmtflags(0); + int digits_to_print = boost::is_floating_point<Num>::value && std::numeric_limits<Num>::is_specialized + ? std::numeric_limits<Num>::digits10 + 5 + : 0; + if (std::numeric_limits<target_type>::digits <= std::numeric_limits<Real>::digits) + { + BOOST_CHECK_CLOSE(n1, checked_lexical_cast<target_type>(Real(n1).str(digits_to_print, f)), tol); + } + BOOST_CHECK_CLOSE(n2, checked_lexical_cast<target_type>(Real(n2).str(digits_to_print, f)), 0); + BOOST_CHECK_CLOSE(n3, checked_lexical_cast<target_type>(Real(n3).str(digits_to_print, f)), 0); + BOOST_CHECK_CLOSE(n4, checked_lexical_cast<target_type>(Real(n4).str(digits_to_print, f)), 0); +} + +template <class Real, class Num> +void test_negative_mixed_numeric_limits(boost::mpl::false_ const&) {} + +template <class Real, class Num> +void test_negative_mixed(boost::mpl::true_ const&) +{ + typedef typename boost::mpl::if_< + boost::is_convertible<Num, Real>, + typename boost::mpl::if_c<boost::is_integral<Num>::value && (sizeof(Num) < sizeof(int)), int, Num>::type, + Real>::type cast_type; + typedef typename boost::mpl::if_< + boost::is_convertible<Num, Real>, + Num, + Real>::type simple_cast_type; + std::cout << "Testing mixed arithmetic with type: " << typeid(Real).name() << " and " << typeid(Num).name() << std::endl; + static const int left_shift = std::numeric_limits<Num>::digits - 1; + Num n1 = -static_cast<Num>(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10)); + Num n2 = -1; + Num n3 = 0; + Num n4 = -20; + Num n5 = -8; + + test_comparisons<Real>(n1, n2, boost::is_convertible<Num, Real>()); + test_comparisons<Real>(n1, n3, boost::is_convertible<Num, Real>()); + test_comparisons<Real>(n3, n1, boost::is_convertible<Num, Real>()); + test_comparisons<Real>(n2, n1, boost::is_convertible<Num, Real>()); + test_comparisons<Real>(n1, n1, boost::is_convertible<Num, Real>()); + test_comparisons<Real>(n3, n3, boost::is_convertible<Num, Real>()); + + // Default construct: + BOOST_CHECK_EQUAL(Real(n1), static_cast<cast_type>(n1)); + BOOST_CHECK_EQUAL(Real(n2), static_cast<cast_type>(n2)); + BOOST_CHECK_EQUAL(Real(n3), static_cast<cast_type>(n3)); + BOOST_CHECK_EQUAL(Real(n4), static_cast<cast_type>(n4)); + BOOST_CHECK_EQUAL(static_cast<cast_type>(n1), Real(n1)); + BOOST_CHECK_EQUAL(static_cast<cast_type>(n2), Real(n2)); + BOOST_CHECK_EQUAL(static_cast<cast_type>(n3), Real(n3)); + BOOST_CHECK_EQUAL(static_cast<cast_type>(n4), Real(n4)); + BOOST_CHECK_EQUAL(Real(n1).template convert_to<Num>(), n1); + BOOST_CHECK_EQUAL(Real(n2).template convert_to<Num>(), n2); + BOOST_CHECK_EQUAL(Real(n3).template convert_to<Num>(), n3); + BOOST_CHECK_EQUAL(Real(n4).template convert_to<Num>(), n4); +#ifndef BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n1)), n1); + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n2)), n2); + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n3)), n3); + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n4)), n4); +#endif + // Conversions when source is an expression template: + BOOST_CHECK_EQUAL((Real(n1) + 0).template convert_to<Num>(), n1); + BOOST_CHECK_EQUAL((Real(n2) + 0).template convert_to<Num>(), n2); + BOOST_CHECK_EQUAL((Real(n3) + 0).template convert_to<Num>(), n3); + BOOST_CHECK_EQUAL((Real(n4) + 0).template convert_to<Num>(), n4); +#ifndef BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS + BOOST_CHECK_EQUAL(static_cast<Num>((Real(n1) + 0)), n1); + BOOST_CHECK_EQUAL(static_cast<Num>((Real(n2) + 0)), n2); + BOOST_CHECK_EQUAL(static_cast<Num>((Real(n3) + 0)), n3); + BOOST_CHECK_EQUAL(static_cast<Num>((Real(n4) + 0)), n4); +#endif + test_negative_mixed_numeric_limits<Real, Num>(boost::mpl::bool_<std::numeric_limits<Real>::is_specialized>()); + // Assignment: + Real r(0); + BOOST_CHECK(r != static_cast<cast_type>(n1)); + r = static_cast<simple_cast_type>(n1); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n1)); + r = static_cast<simple_cast_type>(n2); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2)); + r = static_cast<simple_cast_type>(n3); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n3)); + r = static_cast<simple_cast_type>(n4); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4)); + // Addition: + r = static_cast<simple_cast_type>(n2); + BOOST_CHECK_EQUAL(r + static_cast<simple_cast_type>(n4), static_cast<cast_type>(n2 + n4)); + BOOST_CHECK_EQUAL(Real(r + static_cast<simple_cast_type>(n4)), static_cast<cast_type>(n2 + n4)); + r += static_cast<simple_cast_type>(n4); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2 + n4)); + // subtraction: + r = static_cast<simple_cast_type>(n4); + BOOST_CHECK_EQUAL(r - static_cast<simple_cast_type>(n5), static_cast<cast_type>(n4 - n5)); + BOOST_CHECK_EQUAL(Real(r - static_cast<simple_cast_type>(n5)), static_cast<cast_type>(n4 - n5)); + r -= static_cast<simple_cast_type>(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 - n5)); + // Multiplication: + r = static_cast<simple_cast_type>(n2); + BOOST_CHECK_EQUAL(r * static_cast<simple_cast_type>(n4), static_cast<cast_type>(n2 * n4)); + BOOST_CHECK_EQUAL(Real(r * static_cast<simple_cast_type>(n4)), static_cast<cast_type>(n2 * n4)); + r *= static_cast<simple_cast_type>(n4); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2 * n4)); + // Division: + r = static_cast<simple_cast_type>(n1); + BOOST_CHECK_EQUAL(r / static_cast<simple_cast_type>(n5), static_cast<cast_type>(n1 / n5)); + BOOST_CHECK_EQUAL(Real(r / static_cast<simple_cast_type>(n5)), static_cast<cast_type>(n1 / n5)); + r /= static_cast<simple_cast_type>(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n1 / n5)); + // + // Extra cases for full coverage: + // + r = Real(n4) + static_cast<simple_cast_type>(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 + n5)); + r = static_cast<simple_cast_type>(n4) + Real(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 + n5)); + r = Real(n4) - static_cast<simple_cast_type>(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 - n5)); + r = static_cast<simple_cast_type>(n4) - Real(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 - n5)); + r = static_cast<simple_cast_type>(n4) * Real(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 * n5)); + r = static_cast<cast_type>(Num(4) * n4) / Real(4); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4)); + + Real a, b, c; + a = 20; + b = 30; + c = -a + b; + BOOST_CHECK_EQUAL(c, 10); + c = b + -a; + BOOST_CHECK_EQUAL(c, 10); + n4 = 30; + c = -a + static_cast<cast_type>(n4); + BOOST_CHECK_EQUAL(c, 10); + c = static_cast<cast_type>(n4) + -a; + BOOST_CHECK_EQUAL(c, 10); + c = -a + -b; + BOOST_CHECK_EQUAL(c, -50); + n4 = 4; + c = -(a + b) + static_cast<cast_type>(n4); + BOOST_CHECK_EQUAL(c, -50 + 4); + n4 = 50; + c = (a + b) - static_cast<cast_type>(n4); + BOOST_CHECK_EQUAL(c, 0); + c = (a + b) - static_cast<cast_type>(n4); + BOOST_CHECK_EQUAL(c, 0); + c = a - -(b + static_cast<cast_type>(n4)); + BOOST_CHECK_EQUAL(c, 20 - -(30 + 50)); + c = -(b + static_cast<cast_type>(n4)) - a; + BOOST_CHECK_EQUAL(c, -(30 + 50) - 20); + c = a - -b; + BOOST_CHECK_EQUAL(c, 50); + c = -a - b; + BOOST_CHECK_EQUAL(c, -50); + c = -a - static_cast<cast_type>(n4); + BOOST_CHECK_EQUAL(c, -20 - 50); + c = static_cast<cast_type>(n4) - -a; + BOOST_CHECK_EQUAL(c, 50 + 20); + c = -(a + b) - Real(n4); + BOOST_CHECK_EQUAL(c, -(20 + 30) - 50); + c = static_cast<cast_type>(n4) - (a + b); + BOOST_CHECK_EQUAL(c, 0); + c = (a + b) * static_cast<cast_type>(n4); + BOOST_CHECK_EQUAL(c, 50 * 50); + c = static_cast<cast_type>(n4) * (a + b); + BOOST_CHECK_EQUAL(c, 50 * 50); + c = a * -(b + static_cast<cast_type>(n4)); + BOOST_CHECK_EQUAL(c, 20 * -(30 + 50)); + c = -(b + static_cast<cast_type>(n4)) * a; + BOOST_CHECK_EQUAL(c, 20 * -(30 + 50)); + c = a * -b; + BOOST_CHECK_EQUAL(c, 20 * -30); + c = -a * b; + BOOST_CHECK_EQUAL(c, 20 * -30); + c = -a * static_cast<cast_type>(n4); + BOOST_CHECK_EQUAL(c, -20 * 50); + c = static_cast<cast_type>(n4) * -a; + BOOST_CHECK_EQUAL(c, -20 * 50); + c = -(a + b) + a; + BOOST_CHECK(-50 + 20); + c = static_cast<cast_type>(n4) - (a + b); + BOOST_CHECK_EQUAL(c, 0); + Real d = 10; + c = (a + b) / d; + BOOST_CHECK_EQUAL(c, 5); + c = (a + b) / (d + 0); + BOOST_CHECK_EQUAL(c, 5); + c = (a + b) / static_cast<cast_type>(n4); + BOOST_CHECK_EQUAL(c, 1); + c = static_cast<cast_type>(n4) / (a + b); + BOOST_CHECK_EQUAL(c, 1); + d = 50; + c = d / -(a + b); + BOOST_CHECK_EQUAL(c, -1); + c = -(a + b) / d; + BOOST_CHECK_EQUAL(c, -1); + d = 2; + c = a / -d; + BOOST_CHECK_EQUAL(c, 20 / -2); + c = -a / d; + BOOST_CHECK_EQUAL(c, 20 / -2); + d = 50; + c = -d / static_cast<cast_type>(n4); + BOOST_CHECK_EQUAL(c, -1); + c = static_cast<cast_type>(n4) / -d; + BOOST_CHECK_EQUAL(c, -1); + c = static_cast<cast_type>(n4) + a; + BOOST_CHECK_EQUAL(c, 70); + c = static_cast<cast_type>(n4) - a; + BOOST_CHECK_EQUAL(c, 30); + c = static_cast<cast_type>(n4) * a; + BOOST_CHECK_EQUAL(c, 50 * 20); + + n1 = -2; + n2 = -3; + n3 = -4; + a = static_cast<cast_type>(n1); + b = static_cast<cast_type>(n2); + c = static_cast<cast_type>(n3); + d = a + b * c; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = static_cast<cast_type>(n1) + b * c; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = a + static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = a + b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = static_cast<cast_type>(n1) + static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = static_cast<cast_type>(n1) + b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + a += static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(a, -2 + -3 * -4); + a = static_cast<cast_type>(n1); + a += b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(a, -2 + -3 * -4); + a = static_cast<cast_type>(n1); + + d = b * c + a; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = b * c + static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = static_cast<cast_type>(n2) * c + a; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = b * static_cast<cast_type>(n3) + a; + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = static_cast<cast_type>(n2) * c + static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + d = b * static_cast<cast_type>(n3) + static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, -2 + -3 * -4); + + a = -20; + d = a - b * c; + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + n1 = -20; + d = static_cast<cast_type>(n1) - b * c; + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + d = a - static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + d = a - b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + d = static_cast<cast_type>(n1) - static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + d = static_cast<cast_type>(n1) - b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(d, -20 - -3 * -4); + a -= static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(a, -20 - -3 * -4); + a = static_cast<cast_type>(n1); + a -= b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(a, -20 - -3 * -4); + + a = -2; + d = b * c - a; + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + n1 = -2; + d = b * c - static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + d = static_cast<cast_type>(n2) * c - a; + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + d = b * static_cast<cast_type>(n3) - a; + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + d = static_cast<cast_type>(n2) * c - static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + d = b * static_cast<cast_type>(n3) - static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, -3 * -4 - -2); + // + // Conversion from min and max values: + // + test_negative_mixed_minmax<Real, Num>(boost::mpl::bool_ < std::numeric_limits<Real>::is_integer && std::numeric_limits<Num>::is_integer > ()); +} + +template <class Real, class Num> +void test_negative_mixed(boost::mpl::false_ const&) +{ +} + +template <class Real, class Num> +void test_mixed(const boost::mpl::false_&) +{ +} + +template <class Real> +inline bool check_is_nan(const Real& val, const boost::mpl::true_&) +{ + return (boost::math::isnan)(val); +} +template <class Real> +inline bool check_is_nan(const Real&, const boost::mpl::false_&) +{ + return false; +} +template <class Real> +inline Real negate_value(const Real& val, const boost::mpl::true_&) +{ + return -val; +} +template <class Real> +inline Real negate_value(const Real& val, const boost::mpl::false_&) +{ + return val; +} + +template <class Real, class Num> +void test_mixed_numeric_limits(const boost::mpl::true_&) +{ + typedef typename lexical_cast_target_type<Num>::type target_type; +#if defined(TEST_MPFR) + Num tol = 10 * std::numeric_limits<Num>::epsilon(); +#else + Num tol = 0; +#endif + + Real d; + if (std::numeric_limits<Real>::has_infinity && std::numeric_limits<Num>::has_infinity) + { + d = static_cast<Real>(std::numeric_limits<Num>::infinity()); + BOOST_CHECK_GT(d, (std::numeric_limits<Real>::max)()); + d = static_cast<Real>(negate_value(std::numeric_limits<Num>::infinity(), boost::mpl::bool_<std::numeric_limits<Num>::is_signed>())); + BOOST_CHECK_LT(d, negate_value((std::numeric_limits<Real>::max)(), boost::mpl::bool_<std::numeric_limits<Real>::is_signed>())); + } + if (std::numeric_limits<Real>::has_quiet_NaN && std::numeric_limits<Num>::has_quiet_NaN) + { + d = static_cast<Real>(std::numeric_limits<Num>::quiet_NaN()); + BOOST_CHECK(check_is_nan(d, boost::mpl::bool_<std::numeric_limits<Real>::has_quiet_NaN>())); + d = static_cast<Real>(negate_value(std::numeric_limits<Num>::quiet_NaN(), boost::mpl::bool_<std::numeric_limits<Num>::is_signed>())); + BOOST_CHECK(check_is_nan(d, boost::mpl::bool_<std::numeric_limits<Real>::has_quiet_NaN>())); + } + + static const int left_shift = std::numeric_limits<Num>::digits - 1; + Num n1 = static_cast<Num>(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10)); + Num n2 = 1; + Num n3 = 0; + Num n4 = 20; + + std::ios_base::fmtflags f = boost::is_floating_point<Num>::value ? std::ios_base::scientific : std::ios_base::fmtflags(0); + int digits_to_print = boost::is_floating_point<Num>::value && std::numeric_limits<Num>::is_specialized + ? std::numeric_limits<Num>::digits10 + 5 + : 0; + if (std::numeric_limits<target_type>::digits <= std::numeric_limits<Real>::digits) + { + BOOST_CHECK_CLOSE(n1, checked_lexical_cast<target_type>(Real(n1).str(digits_to_print, f)), tol); + } + BOOST_CHECK_CLOSE(n2, checked_lexical_cast<target_type>(Real(n2).str(digits_to_print, f)), 0); + BOOST_CHECK_CLOSE(n3, checked_lexical_cast<target_type>(Real(n3).str(digits_to_print, f)), 0); + BOOST_CHECK_CLOSE(n4, checked_lexical_cast<target_type>(Real(n4).str(digits_to_print, f)), 0); +} +template <class Real, class Num> +void test_mixed_numeric_limits(const boost::mpl::false_&) +{ +} + +template <class Real, class Num> +void test_mixed(const boost::mpl::true_&) +{ + typedef typename boost::mpl::if_< + boost::is_convertible<Num, Real>, + typename boost::mpl::if_c<boost::is_integral<Num>::value && (sizeof(Num) < sizeof(int)), int, Num>::type, + Real>::type cast_type; + typedef typename boost::mpl::if_< + boost::is_convertible<Num, Real>, + Num, + Real>::type simple_cast_type; + + if (std::numeric_limits<Real>::is_specialized && std::numeric_limits<Real>::is_bounded && std::numeric_limits<Real>::digits < std::numeric_limits<Num>::digits) + return; + + std::cout << "Testing mixed arithmetic with type: " << typeid(Real).name() << " and " << typeid(Num).name() << std::endl; + static const int left_shift = std::numeric_limits<Num>::digits - 1; + Num n1 = static_cast<Num>(1uLL << ((left_shift < 63) && (left_shift > 0) ? left_shift : 10)); + Num n2 = 1; + Num n3 = 0; + Num n4 = 20; + Num n5 = 8; + + test_comparisons<Real>(n1, n2, boost::is_convertible<Num, Real>()); + test_comparisons<Real>(n1, n3, boost::is_convertible<Num, Real>()); + test_comparisons<Real>(n1, n1, boost::is_convertible<Num, Real>()); + test_comparisons<Real>(n3, n1, boost::is_convertible<Num, Real>()); + test_comparisons<Real>(n2, n1, boost::is_convertible<Num, Real>()); + test_comparisons<Real>(n3, n3, boost::is_convertible<Num, Real>()); + + // Default construct: + BOOST_CHECK_EQUAL(Real(n1), static_cast<cast_type>(n1)); + BOOST_CHECK_EQUAL(Real(n2), static_cast<cast_type>(n2)); + BOOST_CHECK_EQUAL(Real(n3), static_cast<cast_type>(n3)); + BOOST_CHECK_EQUAL(Real(n4), static_cast<cast_type>(n4)); + BOOST_CHECK_EQUAL(Real(n1).template convert_to<Num>(), n1); + BOOST_CHECK_EQUAL(Real(n2).template convert_to<Num>(), n2); + BOOST_CHECK_EQUAL(Real(n3).template convert_to<Num>(), n3); + BOOST_CHECK_EQUAL(Real(n4).template convert_to<Num>(), n4); +#ifndef BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n1)), n1); + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n2)), n2); + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n3)), n3); + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n4)), n4); +#endif + // Again with expression templates: + BOOST_CHECK_EQUAL((Real(n1) + 0).template convert_to<Num>(), n1); + BOOST_CHECK_EQUAL((Real(n2) + 0).template convert_to<Num>(), n2); + BOOST_CHECK_EQUAL((Real(n3) + 0).template convert_to<Num>(), n3); + BOOST_CHECK_EQUAL((Real(n4) + 0).template convert_to<Num>(), n4); +#ifndef BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n1) + 0), n1); + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n2) + 0), n2); + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n3) + 0), n3); + BOOST_CHECK_EQUAL(static_cast<Num>(Real(n4) + 0), n4); +#endif + BOOST_CHECK_EQUAL(static_cast<cast_type>(n1), Real(n1)); + BOOST_CHECK_EQUAL(static_cast<cast_type>(n2), Real(n2)); + BOOST_CHECK_EQUAL(static_cast<cast_type>(n3), Real(n3)); + BOOST_CHECK_EQUAL(static_cast<cast_type>(n4), Real(n4)); + // Assignment: + Real r(0); + BOOST_CHECK(r != static_cast<cast_type>(n1)); + r = static_cast<simple_cast_type>(n1); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n1)); + r = static_cast<simple_cast_type>(n2); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2)); + r = static_cast<simple_cast_type>(n3); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n3)); + r = static_cast<simple_cast_type>(n4); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4)); + // Addition: + r = static_cast<simple_cast_type>(n2); + BOOST_CHECK_EQUAL(r + static_cast<simple_cast_type>(n4), static_cast<cast_type>(n2 + n4)); + BOOST_CHECK_EQUAL(Real(r + static_cast<simple_cast_type>(n4)), static_cast<cast_type>(n2 + n4)); + r += static_cast<simple_cast_type>(n4); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2 + n4)); + // subtraction: + r = static_cast<simple_cast_type>(n4); + BOOST_CHECK_EQUAL(r - static_cast<simple_cast_type>(n5), static_cast<cast_type>(n4 - n5)); + BOOST_CHECK_EQUAL(Real(r - static_cast<simple_cast_type>(n5)), static_cast<cast_type>(n4 - n5)); + r -= static_cast<simple_cast_type>(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 - n5)); + // Multiplication: + r = static_cast<simple_cast_type>(n2); + BOOST_CHECK_EQUAL(r * static_cast<simple_cast_type>(n4), static_cast<cast_type>(n2 * n4)); + BOOST_CHECK_EQUAL(Real(r * static_cast<simple_cast_type>(n4)), static_cast<cast_type>(n2 * n4)); + r *= static_cast<simple_cast_type>(n4); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n2 * n4)); + // Division: + r = static_cast<simple_cast_type>(n1); + BOOST_CHECK_EQUAL(r / static_cast<simple_cast_type>(n5), static_cast<cast_type>(n1 / n5)); + BOOST_CHECK_EQUAL(Real(r / static_cast<simple_cast_type>(n5)), static_cast<cast_type>(n1 / n5)); + r /= static_cast<simple_cast_type>(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n1 / n5)); + // + // special cases for full coverage: + // + r = static_cast<simple_cast_type>(n5) + Real(n4); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 + n5)); + r = static_cast<simple_cast_type>(n4) - Real(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 - n5)); + r = static_cast<simple_cast_type>(n4) * Real(n5); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4 * n5)); + r = static_cast<cast_type>(Num(4) * n4) / Real(4); + BOOST_CHECK_EQUAL(r, static_cast<cast_type>(n4)); + + typedef boost::mpl::bool_< + (!std::numeric_limits<Num>::is_specialized || std::numeric_limits<Num>::is_signed) && (!std::numeric_limits<Real>::is_specialized || std::numeric_limits<Real>::is_signed)> + signed_tag; + + test_negative_mixed<Real, Num>(signed_tag()); + + n1 = 2; + n2 = 3; + n3 = 4; + Real a(n1), b(n2), c(n3), d; + d = a + b * c; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = static_cast<cast_type>(n1) + b * c; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = a + static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = a + b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = static_cast<cast_type>(n1) + static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = static_cast<cast_type>(n1) + b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + a += static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(a, 2 + 3 * 4); + a = static_cast<cast_type>(n1); + a += b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(a, 2 + 3 * 4); + a = static_cast<cast_type>(n1); + + d = b * c + a; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = b * c + static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = static_cast<cast_type>(n2) * c + a; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = b * static_cast<cast_type>(n3) + a; + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = static_cast<cast_type>(n2) * c + static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + d = b * static_cast<cast_type>(n3) + static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, 2 + 3 * 4); + + a = 20; + d = a - b * c; + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + n1 = 20; + d = static_cast<cast_type>(n1) - b * c; + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + d = a - static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + d = a - b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + d = static_cast<cast_type>(n1) - static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + d = static_cast<cast_type>(n1) - b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(d, 20 - 3 * 4); + a -= static_cast<cast_type>(n2) * c; + BOOST_CHECK_EQUAL(a, 20 - 3 * 4); + a = static_cast<cast_type>(n1); + a -= b * static_cast<cast_type>(n3); + BOOST_CHECK_EQUAL(a, 20 - 3 * 4); + + a = 2; + d = b * c - a; + BOOST_CHECK_EQUAL(d, 3 * 4 - 2); + n1 = 2; + d = b * c - static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, 3 * 4 - 2); + d = static_cast<cast_type>(n2) * c - a; + BOOST_CHECK_EQUAL(d, 3 * 4 - 2); + d = b * static_cast<cast_type>(n3) - a; + BOOST_CHECK_EQUAL(d, 3 * 4 - a); + d = static_cast<cast_type>(n2) * c - static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, 3 * 4 - 2); + d = b * static_cast<cast_type>(n3) - static_cast<cast_type>(n1); + BOOST_CHECK_EQUAL(d, 3 * 4 - 2); + + test_mixed_numeric_limits<Real, Num>(boost::mpl::bool_<std::numeric_limits<Real>::is_specialized>()); +} + +template <class Real> +typename boost::enable_if_c<boost::multiprecision::number_category<Real>::value == boost::multiprecision::number_kind_complex>::type test_members(Real) +{ + // + // Test sign and zero functions: + // + Real a = 20; + Real b = 30; + BOOST_CHECK(!a.is_zero()); + a = -20; + BOOST_CHECK(!a.is_zero()); + a = 0; + BOOST_CHECK(a.is_zero()); + + a = 20; + b = 30; + a.swap(b); + BOOST_CHECK_EQUAL(a, 30); + BOOST_CHECK_EQUAL(b, 20); + + Real c(2, 3); + + BOOST_CHECK_EQUAL(a.real(), 30); + BOOST_CHECK_EQUAL(a.imag(), 0); + BOOST_CHECK_EQUAL(c.real(), 2); + BOOST_CHECK_EQUAL(c.imag(), 3); + + // + // try some more 2-argument constructors: + // + { + Real d(40.5, 2); + BOOST_CHECK_EQUAL(d.real(), 40.5); + BOOST_CHECK_EQUAL(d.imag(), 2); + } + { + Real d("40.5", "2"); + BOOST_CHECK_EQUAL(d.real(), 40.5); + BOOST_CHECK_EQUAL(d.imag(), 2); + } + { + Real d("40.5", std::string("2")); + BOOST_CHECK_EQUAL(d.real(), 40.5); + BOOST_CHECK_EQUAL(d.imag(), 2); + } +#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW + { + std::string sx("40.550"), sy("222"); + std::string_view vx(sx.c_str(), 4), vy(sy.c_str(), 1); + Real d(vx, vy); + BOOST_CHECK_EQUAL(d.real(), 40.5); + BOOST_CHECK_EQUAL(d.imag(), 2); + } +#endif + { + typename Real::value_type x(40.5), y(2); + Real d(x, y); + BOOST_CHECK_EQUAL(d.real(), 40.5); + BOOST_CHECK_EQUAL(d.imag(), 2); + } +#ifdef TEST_MPC + { + typename Real::value_type x(40.5), y(2); + Real d(x.backend().data(), y.backend().data()); + BOOST_CHECK_EQUAL(d.real(), 40.5); + BOOST_CHECK_EQUAL(d.imag(), 2); + } +#endif + { + typename Real::value_type x(40.5); + Real d(x, 2); + BOOST_CHECK_EQUAL(d.real(), 40.5); + BOOST_CHECK_EQUAL(d.imag(), 2); + } + { + typename Real::value_type x(40.5); + Real d(2, x); + BOOST_CHECK_EQUAL(d.imag(), 40.5); + BOOST_CHECK_EQUAL(d.real(), 2); + } + { + typename Real::value_type x(real(a) * real(b) + imag(a) * imag(b)), y(imag(a) * real(b) - real(a) * imag(b)); + Real d(real(a) * real(b) + imag(a) * imag(b), imag(a) * real(b) - real(a) * imag(b)); + Real e(x, y); + BOOST_CHECK_EQUAL(d, e); + } + // + // real and imag setters: + // + c.real(4); + BOOST_CHECK_EQUAL(real(c), 4); + c.imag(-55); + BOOST_CHECK_EQUAL(imag(c), -55); + typename Real::value_type z(20); + c.real(z); + BOOST_CHECK_EQUAL(real(c), 20); + c.real(21L); + BOOST_CHECK_EQUAL(real(c), 21); + c.real(22L); + BOOST_CHECK_EQUAL(real(c), 22); + c.real(23UL); + BOOST_CHECK_EQUAL(real(c), 23); + c.real(24U); + BOOST_CHECK_EQUAL(real(c), 24); + c.real(25.0f); + BOOST_CHECK_EQUAL(real(c), 25); + c.real(26.0); + BOOST_CHECK_EQUAL(real(c), 26); + c.real(27.0L); + BOOST_CHECK_EQUAL(real(c), 27); +#if defined(BOOST_HAS_LONG_LONG) + c.real(28LL); + BOOST_CHECK_EQUAL(real(c), 28); + c.real(29ULL); + BOOST_CHECK_EQUAL(real(c), 29); +#endif + c.imag(z); + BOOST_CHECK_EQUAL(imag(c), 20); + c.imag(21L); + BOOST_CHECK_EQUAL(imag(c), 21); + c.imag(22L); + BOOST_CHECK_EQUAL(imag(c), 22); + c.imag(23UL); + BOOST_CHECK_EQUAL(imag(c), 23); + c.imag(24U); + BOOST_CHECK_EQUAL(imag(c), 24); + c.imag(25.0f); + BOOST_CHECK_EQUAL(imag(c), 25); + c.imag(26.0); + BOOST_CHECK_EQUAL(imag(c), 26); + c.imag(27.0L); + BOOST_CHECK_EQUAL(imag(c), 27); +#if defined(BOOST_HAS_LONG_LONG) + c.imag(28LL); + BOOST_CHECK_EQUAL(imag(c), 28); + c.imag(29ULL); + BOOST_CHECK_EQUAL(imag(c), 29); +#endif + + c.real(2).imag(3); + + BOOST_CHECK_EQUAL(real(a), 30); + BOOST_CHECK_EQUAL(imag(a), 0); + BOOST_CHECK_EQUAL(real(c), 2); + BOOST_CHECK_EQUAL(imag(c), 3); + BOOST_CHECK_EQUAL(real(a + 0), 30); + BOOST_CHECK_EQUAL(imag(a + 0), 0); + BOOST_CHECK_EQUAL(real(c + 0), 2); + BOOST_CHECK_EQUAL(imag(c + 0), 3); + + // string construction: + a = Real("2"); + BOOST_CHECK_EQUAL(real(a), 2); + BOOST_CHECK_EQUAL(imag(a), 0); + a = Real("(2)"); + BOOST_CHECK_EQUAL(real(a), 2); + BOOST_CHECK_EQUAL(imag(a), 0); + a = Real("(,2)"); + BOOST_CHECK_EQUAL(real(a), 0); + BOOST_CHECK_EQUAL(imag(a), 2); + a = Real("(2,3)"); + BOOST_CHECK_EQUAL(real(a), 2); + BOOST_CHECK_EQUAL(imag(a), 3); + + typedef typename boost::multiprecision::component_type<Real>::type real_type; + + real_type r(3); + real_type tol = std::numeric_limits<real_type>::epsilon() * 30; + + a = r; + BOOST_CHECK_EQUAL(real(a), 3); + BOOST_CHECK_EQUAL(imag(a), 0); + + a += r; + BOOST_CHECK_EQUAL(real(a), 6); + BOOST_CHECK_EQUAL(imag(a), 0); + + a *= r; + BOOST_CHECK_EQUAL(real(a), 18); + BOOST_CHECK_EQUAL(imag(a), 0); + + a = a / r; + BOOST_CHECK_EQUAL(real(a), 6); + BOOST_CHECK_EQUAL(imag(a), 0); + a = a - r; + BOOST_CHECK_EQUAL(real(a), 3); + BOOST_CHECK_EQUAL(imag(a), 0); + a = r + a; + BOOST_CHECK_EQUAL(real(a), 6); + BOOST_CHECK_EQUAL(imag(a), 0); + + r = abs(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("3.60555127546398929311922126747049594625129657384524621271045305622716694829301044520461908201849071767351418202406"), r, tol); + r = arg(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.98279372324732906798571061101466601449687745363162855676142508831798807154979603538970653437281731110816513970201"), r, tol); + r = norm(c); + BOOST_CHECK_CLOSE_FRACTION(real_type(13), r, tol); + a = conj(c); + BOOST_CHECK_EQUAL(real(a), 2); + BOOST_CHECK_EQUAL(imag(a), -3); + a = proj(c); + BOOST_CHECK_EQUAL(real(a), 2); + BOOST_CHECK_EQUAL(imag(a), 3); + a = polar(real_type(3), real_type(-10)); + BOOST_CHECK_CLOSE_FRACTION(real_type("-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478"), imag(a), tol); + a = polar(real_type(3) + 0, real_type(-10)); + BOOST_CHECK_CLOSE_FRACTION(real_type("-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478"), imag(a), tol); + a = polar(real_type(3), real_type(-10) + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478"), imag(a), tol); + a = polar(real_type(3) + 0, real_type(-10) + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478"), imag(a), tol); + a = polar(3, real_type(-10)); + BOOST_CHECK_CLOSE_FRACTION(real_type("-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478"), imag(a), tol); + a = polar(3.0, real_type(-10) + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-2.517214587229357356776591843472194503559790495399505640507861193146377760598812305202801138281266416782353163216"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.63206333266810944021424298555413184505092903874867167472255203785027162892148027712122702168494964847488147271478"), imag(a), tol); + + a = polar(real_type(3)); + BOOST_CHECK_EQUAL(3, real(a)); + BOOST_CHECK_EQUAL(0, imag(a)); + a = polar(real_type(3) + 0); + BOOST_CHECK_EQUAL(3, real(a)); + BOOST_CHECK_EQUAL(0, imag(a)); + + r = abs(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("3.60555127546398929311922126747049594625129657384524621271045305622716694829301044520461908201849071767351418202406"), r, tol); + r = arg(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.98279372324732906798571061101466601449687745363162855676142508831798807154979603538970653437281731110816513970201"), r, tol); + r = norm(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type(13), r, tol); + a = conj(c + 0); + BOOST_CHECK_EQUAL(real(a), 2); + BOOST_CHECK_EQUAL(imag(a), -3); + a = proj(c + 0); + BOOST_CHECK_EQUAL(real(a), 2); + BOOST_CHECK_EQUAL(imag(a), 3); + + a = exp(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("-7.3151100949011025174865361510507893218698794489446322367845159660828327860599907104337742108443234172141249777"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.0427436562359044141015039404625521939183300604422348975424523449538886779880818796291971422701951470533151185"), imag(a), tol); + + a = log(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.282474678730768368026743720782659302402633972380103558209522755331732333662205089699787331720244744384629096046"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.9827937232473290679857106110146660144968774536316285567614250883179880715497960353897065343728173111081651397020"), imag(a), tol); + + a = log10(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.556971676153418384603252578971164215414864594193534135900595487498776545815097120403823727129449829836488977743"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.426821890855466638944275673291166123449562356934437957244904971730668088711719757900679614536803436424488603794"), imag(a), tol); + + a = exp(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-7.3151100949011025174865361510507893218698794489446322367845159660828327860599907104337742108443234172141249777"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.0427436562359044141015039404625521939183300604422348975424523449538886779880818796291971422701951470533151185"), imag(a), tol); + + a = log(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.282474678730768368026743720782659302402633972380103558209522755331732333662205089699787331720244744384629096046"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.9827937232473290679857106110146660144968774536316285567614250883179880715497960353897065343728173111081651397020"), imag(a), tol); + + a = log10(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.556971676153418384603252578971164215414864594193534135900595487498776545815097120403823727129449829836488977743"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.426821890855466638944275673291166123449562356934437957244904971730668088711719757900679614536803436424488603794"), imag(a), tol); + + // Powers where one arg is an integer. + b = Real(5, -2); + a = pow(c, b); + BOOST_CHECK_CLOSE_FRACTION(real_type("-3053.8558566606567369633610140423321260211388217942246293871310470377722279440084474789529228008638668934381183"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("3097.9975862915005132449772136982559285192410496951232473245540634244845290672745578327467396750607773968246915"), imag(a), tol); + a = pow(c, 3); + BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol); + a = pow(3, c); + BOOST_CHECK_CLOSE_FRACTION(real_type("-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118"), imag(a), tol * 3); + a = pow(c + 0, b); + BOOST_CHECK_CLOSE_FRACTION(real_type("-3053.8558566606567369633610140423321260211388217942246293871310470377722279440084474789529228008638668934381183"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("3097.9975862915005132449772136982559285192410496951232473245540634244845290672745578327467396750607773968246915"), imag(a), tol); + a = pow(c + 0, 3); + BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol); + a = pow(3, c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118"), imag(a), tol * 3); + + r = 3; + // Powers where one arg is a real_type. + a = pow(c, r); + BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol); + a = pow(r, c); + BOOST_CHECK_CLOSE_FRACTION(real_type("-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118"), imag(a), tol * 3); + a = pow(c + 0, r); + BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol); + a = pow(r, c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118"), imag(a), tol * 3); + a = pow(c, r + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol); + a = pow(r + 0, c); + BOOST_CHECK_CLOSE_FRACTION(real_type("-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118"), imag(a), tol * 3); + + // Powers where one arg is an float. + a = pow(c, 3.0); + BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol); + a = pow(3.0, c); + BOOST_CHECK_CLOSE_FRACTION(real_type("-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118"), imag(a), tol * 3); + a = pow(c + 0, 3.0); + BOOST_CHECK_CLOSE_FRACTION(real_type(-46), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type(9), imag(a), tol); + a = pow(3.0, c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-8.8931513442797186948734782808862447235385767991868219480917324534839621090167050538805196124711247247992169338"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-1.3826999557878897572499699021550296885662132089951379549068064961882821777067532977546360861176011175070188118"), imag(a), tol * 3); + + a = sqrt(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.674149228035540040448039300849051821674708677883920366727287836003399240343274891876712629708287692163156802065"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.8959774761298381247157337552900434410433241995549314932449006989874470582160955817053273057885402621549320588976"), imag(a), tol); + a = sin(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("9.154499146911429573467299544609832559158860568765182977899828142590020335321896403936690014669532606510294425039"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-4.168906959966564350754813058853754843573565604758055889965478710592666260138453299795649308385497563475115931624"), imag(a), tol); + a = cos(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("-4.1896256909688072301325550196159737286219454041279210357407905058369727912162626993926269783331491034500484583"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-9.1092278937553365979791972627788621213326202389201695649104967309554222940748568716960841549279996556547993373"), imag(a), tol); + a = tan(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("-0.0037640256415042482927512211303226908396306202016580864328644932511249097100916559688254811519914564480500042311"), real(a), tol * 5); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.0032386273536098014463585978219272598077897241071003399272426939850671219193120708438426543945017427085738411"), imag(a), tol); + a = asin(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.5706527843210994007102838796856696501828032450960401365302732598209740064262509342420347149436326252483895113827"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132"), imag(a), tol); + a = acos(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.000143542473797218521037811954081791915781454591512773957199036332934196716853565071982697727425908742684531873"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132"), imag(a), tol); + a = atan(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.409921049596575522530619384460420782588207051908724814771070766475530084440199227135813201495737846771570458568"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.2290726829685387662958818029420027678625253049770656169479919704951963414344907622560676377741902308144912055002"), imag(a), tol); + a = sqrt(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.674149228035540040448039300849051821674708677883920366727287836003399240343274891876712629708287692163156802065"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.8959774761298381247157337552900434410433241995549314932449006989874470582160955817053273057885402621549320588976"), imag(a), tol); + a = sin(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("9.154499146911429573467299544609832559158860568765182977899828142590020335321896403936690014669532606510294425039"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-4.168906959966564350754813058853754843573565604758055889965478710592666260138453299795649308385497563475115931624"), imag(a), tol); + a = cos(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-4.1896256909688072301325550196159737286219454041279210357407905058369727912162626993926269783331491034500484583"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-9.1092278937553365979791972627788621213326202389201695649104967309554222940748568716960841549279996556547993373"), imag(a), tol); + a = tan(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-0.0037640256415042482927512211303226908396306202016580864328644932511249097100916559688254811519914564480500042311"), real(a), tol * 5); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.0032386273536098014463585978219272598077897241071003399272426939850671219193120708438426543945017427085738411"), imag(a), tol); + a = asin(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.5706527843210994007102838796856696501828032450960401365302732598209740064262509342420347149436326252483895113827"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132"), imag(a), tol); + a = acos(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.000143542473797218521037811954081791915781454591512773957199036332934196716853565071982697727425908742684531873"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132"), imag(a), tol); + a = atan(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.409921049596575522530619384460420782588207051908724814771070766475530084440199227135813201495737846771570458568"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.2290726829685387662958818029420027678625253049770656169479919704951963414344907622560676377741902308144912055002"), imag(a), tol); + + a = sinh(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("-3.5905645899857799520125654477948167931949136757293015099986213974178826801534614215227593814301490087307920223"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.53092108624851980526704009066067655967277345095149103008706855371803528753067068552935673000832252607835087747"), imag(a), tol); + a = cosh(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("-3.7245455049153225654739707032559725286749657732153307267858945686649501059065292889110148294141744084833329553"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.51182256998738460883446384980187563424555660949074386745538379123585339045741119409984041226187262097496424111"), imag(a), tol); + a = tanh(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.965385879022133124278480269394560685879729650005757773636908240066639772853967550095754361348005358178253777920"), real(a), tol * 5); + BOOST_CHECK_CLOSE_FRACTION(real_type("-0.00988437503832249372031403430350121097961813353467039031861010606115560355679254344335582852193041894874685555114"), imag(a), tol); + a = asinh(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.968637925793096291788665095245498189520731012682010573842811017352748255492485345887875752070076230641308014923"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.9646585044076027920454110594995323555197773725073316527132580297155508786089335572049608301897631767195194427315"), imag(a), tol); + a = acosh(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.000143542473797218521037811954081791915781454591512773957199036332934196716853565071982697727425908742684531873"), imag(a), tol); + a = atanh(c); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.1469466662255297520474327851547159424423449403442452953891851939502023996823900422792744078835711416939934387775"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.338972522294493561124193575909144241084316172544492778582005751793809271060233646663717270678614587712809117131"), imag(a), tol); + a = sinh(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-3.5905645899857799520125654477948167931949136757293015099986213974178826801534614215227593814301490087307920223"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.53092108624851980526704009066067655967277345095149103008706855371803528753067068552935673000832252607835087747"), imag(a), tol); + a = cosh(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("-3.7245455049153225654739707032559725286749657732153307267858945686649501059065292889110148294141744084833329553"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.51182256998738460883446384980187563424555660949074386745538379123585339045741119409984041226187262097496424111"), imag(a), tol); + a = tanh(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.965385879022133124278480269394560685879729650005757773636908240066639772853967550095754361348005358178253777920"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("-0.00988437503832249372031403430350121097961813353467039031861010606115560355679254344335582852193041894874685555114"), imag(a), tol); + a = asinh(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.968637925793096291788665095245498189520731012682010573842811017352748255492485345887875752070076230641308014923"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.9646585044076027920454110594995323555197773725073316527132580297155508786089335572049608301897631767195194427315"), imag(a), tol); + a = acosh(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.983387029916535432347076902894039565014248302909345356125267430944752731616095111727103650117987412058949254132"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.000143542473797218521037811954081791915781454591512773957199036332934196716853565071982697727425908742684531873"), imag(a), tol); + a = atanh(c + 0); + BOOST_CHECK_CLOSE_FRACTION(real_type("0.1469466662255297520474327851547159424423449403442452953891851939502023996823900422792744078835711416939934387775"), real(a), tol); + BOOST_CHECK_CLOSE_FRACTION(real_type("1.338972522294493561124193575909144241084316172544492778582005751793809271060233646663717270678614587712809117131"), imag(a), tol); +} + +template <class Real> +typename boost::enable_if_c<boost::multiprecision::number_category<Real>::value != boost::multiprecision::number_kind_complex>::type test_members(Real) +{ + // + // Test sign and zero functions: + // + Real a = 20; + Real b = 30; + BOOST_CHECK(a.sign() > 0); + BOOST_CHECK(!a.is_zero()); + if (std::numeric_limits<Real>::is_signed) + { + a = -20; + BOOST_CHECK(a.sign() < 0); + BOOST_CHECK(!a.is_zero()); + } + a = 0; + BOOST_CHECK_EQUAL(a.sign(), 0); + BOOST_CHECK(a.is_zero()); + + a = 20; + b = 30; + a.swap(b); + BOOST_CHECK_EQUAL(a, 30); + BOOST_CHECK_EQUAL(b, 20); + // + // Test complex number functions which are also overloaded for scalar type: + // + BOOST_CHECK_EQUAL(real(a), a); + BOOST_CHECK_EQUAL(imag(a), 0); + BOOST_CHECK_EQUAL(real(a + 0), a); + BOOST_CHECK_EQUAL(imag(a + 2), 0); + BOOST_CHECK_EQUAL(norm(a), a * a); + BOOST_CHECK_EQUAL(norm(a * 1), a * a); + BOOST_CHECK_EQUAL(conj(a), a); + BOOST_CHECK_EQUAL(conj(a * 1), a); + BOOST_CHECK_EQUAL(proj(a), a); + BOOST_CHECK_EQUAL(proj(a * 1), a); + BOOST_CHECK_EQUAL(a.real(), a); + BOOST_CHECK_EQUAL(a.imag(), 0); + a.real(55); + BOOST_CHECK_EQUAL(a, 55); +} + +template <class Real> +void test_members(boost::rational<Real>) +{ +} + +template <class Real> +void test_signed_ops(const boost::mpl::true_&) +{ + Real a(8); + Real b(64); + Real c(500); + Real d(1024); + Real ac; + BOOST_CHECK_EQUAL(-a, -8); + ac = a; + ac = ac - b; + BOOST_CHECK_EQUAL(ac, 8 - 64); + ac = a; + ac -= a + b; + BOOST_CHECK_EQUAL(ac, -64); + ac = a; + ac -= b - a; + BOOST_CHECK_EQUAL(ac, 16 - 64); + ac = -a; + BOOST_CHECK_EQUAL(ac, -8); + ac = a; + ac -= -a; + BOOST_CHECK_EQUAL(ac, 16); + ac = a; + ac += -a; + BOOST_CHECK_EQUAL(ac, 0); + ac = b; + ac /= -a; + BOOST_CHECK_EQUAL(ac, -8); + ac = a; + ac *= -a; + BOOST_CHECK_EQUAL(ac, -64); + ac = a + -b; + BOOST_CHECK_EQUAL(ac, 8 - 64); + ac = -a + b; + BOOST_CHECK_EQUAL(ac, -8 + 64); + ac = -a + -b; + BOOST_CHECK_EQUAL(ac, -72); + ac = a + -+-b; // lots of unary operators!! + BOOST_CHECK_EQUAL(ac, 72); + test_conditional(Real(-a), -a); +} +template <class Real> +void test_signed_ops(const boost::mpl::false_&) +{ +} + +template <class Real> +void test_basic_conditionals(Real a, Real b) +{ + if (a) + { + BOOST_ERROR("Unexpected non-zero result"); + } + if (!a) + { + } + else + { + BOOST_ERROR("Unexpected zero result"); + } + b = 2; + if (!b) + { + BOOST_ERROR("Unexpected zero result"); + } + if (b) + { + } + else + { + BOOST_ERROR("Unexpected non-zero result"); + } + if (a && b) + { + BOOST_ERROR("Unexpected zero result"); + } + if (!(a || b)) + { + BOOST_ERROR("Unexpected zero result"); + } + if (a + b) + { + } + else + { + BOOST_ERROR("Unexpected zero result"); + } + if (b - 2) + { + BOOST_ERROR("Unexpected non-zero result"); + } +} + +template <class T> +typename boost::enable_if_c<boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_complex>::type +test_relationals(T a, T b) +{ + BOOST_CHECK_EQUAL((a == b), false); + BOOST_CHECK_EQUAL((a != b), true); + + BOOST_CHECK_EQUAL((a + b == b), false); + BOOST_CHECK_EQUAL((a + b != b), true); + + BOOST_CHECK_EQUAL((a == b + a), false); + BOOST_CHECK_EQUAL((a != b + a), true); + + BOOST_CHECK_EQUAL((a + b == b + a), true); + BOOST_CHECK_EQUAL((a + b != b + a), false); + + BOOST_CHECK_EQUAL((8 == b + a), false); + BOOST_CHECK_EQUAL((8 != b + a), true); + BOOST_CHECK_EQUAL((800 == b + a), false); + BOOST_CHECK_EQUAL((800 != b + a), true); + BOOST_CHECK_EQUAL((72 == b + a), true); + BOOST_CHECK_EQUAL((72 != b + a), false); + + BOOST_CHECK_EQUAL((b + a == 8), false); + BOOST_CHECK_EQUAL((b + a != 8), true); + BOOST_CHECK_EQUAL((b + a == 800), false); + BOOST_CHECK_EQUAL((b + a != 800), true); + BOOST_CHECK_EQUAL((b + a == 72), true); + BOOST_CHECK_EQUAL((b + a != 72), false); +} + +template <class T> +typename boost::disable_if_c<boost::multiprecision::number_category<T>::value == boost::multiprecision::number_kind_complex>::type +test_relationals(T a, T b) +{ + BOOST_CHECK_EQUAL((a == b), false); + BOOST_CHECK_EQUAL((a != b), true); + BOOST_CHECK_EQUAL((a <= b), true); + BOOST_CHECK_EQUAL((a < b), true); + BOOST_CHECK_EQUAL((a >= b), false); + BOOST_CHECK_EQUAL((a > b), false); + + BOOST_CHECK_EQUAL((a + b == b), false); + BOOST_CHECK_EQUAL((a + b != b), true); + BOOST_CHECK_EQUAL((a + b >= b), true); + BOOST_CHECK_EQUAL((a + b > b), true); + BOOST_CHECK_EQUAL((a + b <= b), false); + BOOST_CHECK_EQUAL((a + b < b), false); + + BOOST_CHECK_EQUAL((a == b + a), false); + BOOST_CHECK_EQUAL((a != b + a), true); + BOOST_CHECK_EQUAL((a <= b + a), true); + BOOST_CHECK_EQUAL((a < b + a), true); + BOOST_CHECK_EQUAL((a >= b + a), false); + BOOST_CHECK_EQUAL((a > b + a), false); + + BOOST_CHECK_EQUAL((a + b == b + a), true); + BOOST_CHECK_EQUAL((a + b != b + a), false); + BOOST_CHECK_EQUAL((a + b <= b + a), true); + BOOST_CHECK_EQUAL((a + b < b + a), false); + BOOST_CHECK_EQUAL((a + b >= b + a), true); + BOOST_CHECK_EQUAL((a + b > b + a), false); + + BOOST_CHECK_EQUAL((8 == b + a), false); + BOOST_CHECK_EQUAL((8 != b + a), true); + BOOST_CHECK_EQUAL((8 <= b + a), true); + BOOST_CHECK_EQUAL((8 < b + a), true); + BOOST_CHECK_EQUAL((8 >= b + a), false); + BOOST_CHECK_EQUAL((8 > b + a), false); + BOOST_CHECK_EQUAL((800 == b + a), false); + BOOST_CHECK_EQUAL((800 != b + a), true); + BOOST_CHECK_EQUAL((800 >= b + a), true); + BOOST_CHECK_EQUAL((800 > b + a), true); + BOOST_CHECK_EQUAL((800 <= b + a), false); + BOOST_CHECK_EQUAL((800 < b + a), false); + BOOST_CHECK_EQUAL((72 == b + a), true); + BOOST_CHECK_EQUAL((72 != b + a), false); + BOOST_CHECK_EQUAL((72 <= b + a), true); + BOOST_CHECK_EQUAL((72 < b + a), false); + BOOST_CHECK_EQUAL((72 >= b + a), true); + BOOST_CHECK_EQUAL((72 > b + a), false); + + BOOST_CHECK_EQUAL((b + a == 8), false); + BOOST_CHECK_EQUAL((b + a != 8), true); + BOOST_CHECK_EQUAL((b + a >= 8), true); + BOOST_CHECK_EQUAL((b + a > 8), true); + BOOST_CHECK_EQUAL((b + a <= 8), false); + BOOST_CHECK_EQUAL((b + a < 8), false); + BOOST_CHECK_EQUAL((b + a == 800), false); + BOOST_CHECK_EQUAL((b + a != 800), true); + BOOST_CHECK_EQUAL((b + a <= 800), true); + BOOST_CHECK_EQUAL((b + a < 800), true); + BOOST_CHECK_EQUAL((b + a >= 800), false); + BOOST_CHECK_EQUAL((b + a > 800), false); + BOOST_CHECK_EQUAL((b + a == 72), true); + BOOST_CHECK_EQUAL((b + a != 72), false); + BOOST_CHECK_EQUAL((b + a >= 72), true); + BOOST_CHECK_EQUAL((b + a > 72), false); + BOOST_CHECK_EQUAL((b + a <= 72), true); + BOOST_CHECK_EQUAL((b + a < 72), false); + + T c; + // + // min and max overloads: + // +#if !defined(min) && !defined(max) +// using std::max; +// using std::min; +// This works, but still causes complaints from inspect.exe, so use brackets to prevent macrosubstitution, +// and to explicitly specify type T seems necessary, for reasons unclear. + a = 2; + b = 5; + c = 6; + BOOST_CHECK_EQUAL( (std::min<T>)(a, b), a); + BOOST_CHECK_EQUAL( (std::min<T>)(b, a), a); + BOOST_CHECK_EQUAL( (std::max<T>)(a, b), b); + BOOST_CHECK_EQUAL( (std::max<T>)(b, a), b); + BOOST_CHECK_EQUAL( (std::min<T>)(a, b + c), a); + BOOST_CHECK_EQUAL( (std::min<T>)(b + c, a), a); + BOOST_CHECK_EQUAL( (std::min<T>)(a, c - b), 1); + BOOST_CHECK_EQUAL( (std::min<T>)(c - b, a), 1); + BOOST_CHECK_EQUAL( (std::max<T>)(a, b + c), 11); + BOOST_CHECK_EQUAL( (std::max<T>)(b + c, a), 11); + BOOST_CHECK_EQUAL( (std::max<T>)(a, c - b), a); + BOOST_CHECK_EQUAL( (std::max<T>)(c - b, a), a); + BOOST_CHECK_EQUAL( (std::min<T>)(a + b, b + c), 7); + BOOST_CHECK_EQUAL( (std::min<T>)(b + c, a + b), 7); + BOOST_CHECK_EQUAL( (std::max<T>)(a + b, b + c), 11); + BOOST_CHECK_EQUAL( (std::max<T>)(b + c, a + b), 11); + BOOST_CHECK_EQUAL( (std::min<T>)(a + b, c - a), 4); + BOOST_CHECK_EQUAL( (std::min<T>)(c - a, a + b), 4); + BOOST_CHECK_EQUAL( (std::max<T>)(a + b, c - a), 7); + BOOST_CHECK_EQUAL( (std::max<T>)(c - a, a + b), 7); + + long l1(2), l2(3), l3; + l3 = (std::min)(l1, l2) + (std::max)(l1, l2) + (std::max<long>)(l1, l2) + (std::min<long>)(l1, l2); + BOOST_CHECK_EQUAL(l3, 10); + +#endif +} + +template <class T> +const T& self(const T& a) { return a; } + +template <class Real> +void test() +{ +#if !defined(NO_MIXED_OPS) && !defined(SLOW_COMPILER) + boost::multiprecision::is_number<Real> tag; + test_mixed<Real, unsigned char>(tag); + test_mixed<Real, signed char>(tag); + test_mixed<Real, char>(tag); + test_mixed<Real, short>(tag); + test_mixed<Real, unsigned short>(tag); + test_mixed<Real, int>(tag); + test_mixed<Real, unsigned int>(tag); + test_mixed<Real, long>(tag); + test_mixed<Real, unsigned long>(tag); +#ifdef BOOST_HAS_LONG_LONG + test_mixed<Real, long long>(tag); + test_mixed<Real, unsigned long long>(tag); +#endif + test_mixed<Real, float>(tag); + test_mixed<Real, double>(tag); + test_mixed<Real, long double>(tag); + + typedef typename related_type<Real>::type related_type; + boost::mpl::bool_<boost::multiprecision::is_number<Real>::value && !boost::is_same<related_type, Real>::value> tag2; + + test_mixed<Real, related_type>(tag2); + + boost::mpl::bool_<boost::multiprecision::is_number<Real>::value && (boost::multiprecision::number_category<Real>::value == boost::multiprecision::number_kind_complex)> complex_tag; + test_mixed<Real, std::complex<float> >(complex_tag); + test_mixed<Real, std::complex<double> >(complex_tag); + test_mixed<Real, std::complex<long double> >(complex_tag); + +#endif +#ifndef MIXED_OPS_ONLY + // + // Integer only functions: + // + test_integer_ops<Real>(typename boost::multiprecision::number_category<Real>::type()); + // + // Real number only functions: + // + test_float_ops<Real>(typename boost::multiprecision::number_category<Real>::type()); + // + // Test basic arithmetic: + // + Real a(8); + Real b(64); + Real c(500); + Real d(1024); + BOOST_CHECK_EQUAL(a + b, 72); + a += b; + BOOST_CHECK_EQUAL(a, 72); + BOOST_CHECK_EQUAL(a - b, 8); + a -= b; + BOOST_CHECK_EQUAL(a, 8); + BOOST_CHECK_EQUAL(a * b, 8 * 64L); + a *= b; + BOOST_CHECK_EQUAL(a, 8 * 64L); + BOOST_CHECK_EQUAL(a / b, 8); + a /= b; + BOOST_CHECK_EQUAL(a, 8); + Real ac(a); + BOOST_CHECK_EQUAL(ac, a); + ac = a * c; + BOOST_CHECK_EQUAL(ac, 8 * 500L); + ac = 8 * 500L; + ac = ac + b + c; + BOOST_CHECK_EQUAL(ac, 8 * 500L + 64 + 500); + ac = a; + ac = b + c + ac; + BOOST_CHECK_EQUAL(ac, 8 + 64 + 500); + ac = ac - b + c; + BOOST_CHECK_EQUAL(ac, 8 + 64 + 500 - 64 + 500); + ac = a; + ac = b + c - ac; + BOOST_CHECK_EQUAL(ac, -8 + 64 + 500); + ac = a; + ac = ac * b; + BOOST_CHECK_EQUAL(ac, 8 * 64); + ac = a; + ac *= b * ac; + BOOST_CHECK_EQUAL(ac, 8 * 8 * 64); + ac = b; + ac = ac / a; + BOOST_CHECK_EQUAL(ac, 64 / 8); + ac = b; + ac /= ac / a; + BOOST_CHECK_EQUAL(ac, 64 / (64 / 8)); + ac = a; + ac = b + ac * a; + BOOST_CHECK_EQUAL(ac, 64 * 2); + ac = a; + ac = b - ac * a; + BOOST_CHECK_EQUAL(ac, 0); + ac = a; + ac = b * (ac + a); + BOOST_CHECK_EQUAL(ac, 64 * (16)); + ac = a; + ac = b / (ac * 1); + BOOST_CHECK_EQUAL(ac, 64 / 8); + ac = a; + ac = ac + b; + BOOST_CHECK_EQUAL(ac, 8 + 64); + ac = a; + ac = a + ac; + BOOST_CHECK_EQUAL(ac, 16); + ac = a; + ac = a - ac; + BOOST_CHECK_EQUAL(ac, 0); + ac = a; + ac += a + b; + BOOST_CHECK_EQUAL(ac, 80); + ac = a; + ac += b + a; + BOOST_CHECK_EQUAL(ac, 80); + ac = +a; + BOOST_CHECK_EQUAL(ac, 8); + ac = 8; + ac = a * ac; + BOOST_CHECK_EQUAL(ac, 8 * 8); + ac = a; + ac = a; + ac += +a; + BOOST_CHECK_EQUAL(ac, 16); + ac = a; + ac += b - a; + BOOST_CHECK_EQUAL(ac, 8 + 64 - 8); + ac = a; + ac += b * c; + BOOST_CHECK_EQUAL(ac, 8 + 64 * 500); + ac = a; + ac = a; + ac -= +a; + BOOST_CHECK_EQUAL(ac, 0); + ac = a; + if (std::numeric_limits<Real>::is_signed || is_twos_complement_integer<Real>::value) + { + ac = a; + ac -= c - b; + BOOST_CHECK_EQUAL(ac, 8 - (500 - 64)); + ac = a; + ac -= b * c; + BOOST_CHECK_EQUAL(ac, 8 - 500 * 64); + } + ac = a; + ac += ac * b; + BOOST_CHECK_EQUAL(ac, 8 + 8 * 64); + if (std::numeric_limits<Real>::is_signed || is_twos_complement_integer<Real>::value) + { + ac = a; + ac -= ac * b; + BOOST_CHECK_EQUAL(ac, 8 - 8 * 64); + } + ac = a * 8; + ac *= +a; + BOOST_CHECK_EQUAL(ac, 64 * 8); + ac = a; + ac *= b * c; + BOOST_CHECK_EQUAL(ac, 8 * 64 * 500); + ac = a; + ac *= b / a; + BOOST_CHECK_EQUAL(ac, 8 * 64 / 8); + ac = a; + ac *= b + c; + BOOST_CHECK_EQUAL(ac, 8 * (64 + 500)); + ac = b; + ac /= +a; + BOOST_CHECK_EQUAL(ac, 8); + ac = b; + ac /= b / a; + BOOST_CHECK_EQUAL(ac, 64 / (64 / 8)); + ac = b; + ac /= a + Real(0); + BOOST_CHECK_EQUAL(ac, 8); + // + // simple tests with immediate values, these calls can be optimised in many backends: + // + ac = a + b; + BOOST_CHECK_EQUAL(ac, 72); + ac = a + +b; + BOOST_CHECK_EQUAL(ac, 72); + ac = +a + b; + BOOST_CHECK_EQUAL(ac, 72); + ac = +a + +b; + BOOST_CHECK_EQUAL(ac, 72); + ac = a; + ac = b / ac; + BOOST_CHECK_EQUAL(ac, b / a); + // + // Comparisons: + // + test_relationals(a, b); + test_members(a); + // + // Use in Boolean context: + // + a = 0; + b = 2; + test_basic_conditionals(a, b); + // + // Test iostreams: + // + std::stringstream ss; + a = 20; + b = 2; + ss << a; + ss >> c; + BOOST_CHECK_EQUAL(a, c); + ss.clear(); + ss << a + b; + ss >> c; + BOOST_CHECK_EQUAL(c, 22); + BOOST_CHECK_EQUAL(c, a + b); + // + // More cases for complete code coverage: + // + a = 20; + b = 30; + swap(a, b); + BOOST_CHECK_EQUAL(a, 30); + BOOST_CHECK_EQUAL(b, 20); + a = 20; + b = 30; + std::swap(a, b); + BOOST_CHECK_EQUAL(a, 30); + BOOST_CHECK_EQUAL(b, 20); + a = 20; + b = 30; + a = a + b * 2; + BOOST_CHECK_EQUAL(a, 20 + 30 * 2); + a = 100; + a = a - b * 2; + BOOST_CHECK_EQUAL(a, 100 - 30 * 2); + a = 20; + a = a * (b + 2); + BOOST_CHECK_EQUAL(a, 20 * (32)); + a = 20; + a = (b + 2) * a; + BOOST_CHECK_EQUAL(a, 20 * (32)); + a = 90; + b = 2; + a = a / (b + 0); + BOOST_CHECK_EQUAL(a, 45); + a = 20; + b = 30; + c = (a * b) + 22; + BOOST_CHECK_EQUAL(c, 20 * 30 + 22); + c = 22 + (a * b); + BOOST_CHECK_EQUAL(c, 20 * 30 + 22); + c = 10; + ac = a + b * c; + BOOST_CHECK_EQUAL(ac, 20 + 30 * 10); + ac = b * c + a; + BOOST_CHECK_EQUAL(ac, 20 + 30 * 10); + a = a + b * c; + BOOST_CHECK_EQUAL(a, 20 + 30 * 10); + a = 20; + b = a + b * c; + BOOST_CHECK_EQUAL(b, 20 + 30 * 10); + b = 30; + c = a + b * c; + BOOST_CHECK_EQUAL(c, 20 + 30 * 10); + c = 10; + c = a + b / c; + BOOST_CHECK_EQUAL(c, 20 + 30 / 10); + + // + // Test conditionals: + // + a = 20; + test_conditional(a, +a); + test_conditional(a, (a + 0)); + + test_signed_ops<Real>(boost::mpl::bool_<std::numeric_limits<Real>::is_signed>()); + // + // Test hashing: + // + boost::hash<Real> hasher; + std::size_t s = hasher(a); + BOOST_CHECK_NE(s, 0); +#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL + std::hash<Real> hasher2; + s = hasher2(a); + BOOST_CHECK_NE(s, 0); +#endif + + // + // Test move: + // +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + Real m(static_cast<Real&&>(a)); + BOOST_CHECK_EQUAL(m, 20); + // Move from already moved from object: + Real m2(static_cast<Real&&>(a)); + // assign from moved from object + // (may result in "a" being left in valid state as implementation artifact): + c = static_cast<Real&&>(a); + // assignment to moved-from objects: + c = static_cast<Real&&>(m); + BOOST_CHECK_EQUAL(c, 20); + m2 = c; + BOOST_CHECK_EQUAL(c, 20); + // Destructor of "a" checks destruction of moved-from-object... + Real m3(static_cast<Real&&>(a)); +#endif +#ifndef BOOST_MP_NOT_TESTING_NUMBER + // + // string and string_view: + // + { + std::string s1("2"); + Real x(s1); + BOOST_CHECK_EQUAL(x, 2); + s1 = "3"; + x.assign(s1); + BOOST_CHECK_EQUAL(x, 3); +#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW + s1 = "20"; + std::string_view v(s1.c_str(), 1); + Real y(v); + BOOST_CHECK_EQUAL(y, 2); + std::string_view v2(s1.c_str(), 2); + y.assign(v2); + BOOST_CHECK_EQUAL(y, 20); +#endif + } +#endif + // + // Bug cases, self assignment first: + // + a = 20; + a = self(a); + BOOST_CHECK_EQUAL(a, 20); + + a = 2; + a = a * a * a; + BOOST_CHECK_EQUAL(a, 8); + a = 2; + a = a + a + a; + BOOST_CHECK_EQUAL(a, 6); + a = 2; + a = a - a + a; + BOOST_CHECK_EQUAL(a, 2); + a = 2; + a = a + a - a; + BOOST_CHECK_EQUAL(a, 2); + a = 2; + a = a * a - a; + BOOST_CHECK_EQUAL(a, 2); + a = 2; + a = a + a * a; + BOOST_CHECK_EQUAL(a, 6); + a = 2; + a = (a + a) * a; + BOOST_CHECK_EQUAL(a, 8); +#endif +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_ab_1.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_ab_1.cpp new file mode 100644 index 00000000..d6af0450 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_ab_1.cpp @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include "../performance/arithmetic_backend.hpp" + +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<double> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_ab_2.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_ab_2.cpp new file mode 100644 index 00000000..ac89a398 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_ab_2.cpp @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include "../performance/arithmetic_backend.hpp" + +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<int> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_ab_3.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_ab_3.cpp new file mode 100644 index 00000000..39ab3c89 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_ab_3.cpp @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include "../performance/arithmetic_backend.hpp" + +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::arithmetic_backend<unsigned int> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_backend_concept.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_backend_concept.cpp new file mode 100644 index 00000000..4cd04b48 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_backend_concept.cpp @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> + +#include "test_arithmetic.hpp" + +int main() +{ + // + // Orininal Mingw32 has issues with long double that break this, mingw64 is fine (and supported): + // +#if !(defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__MINGW32__) && !defined(_WIN64) && BOOST_WORKAROUND(BOOST_GCC, <= 50300)) + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_complex128.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_complex128.cpp new file mode 100644 index 00000000..9bef30cd --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_complex128.cpp @@ -0,0 +1,19 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/config.hpp> +#ifdef BOOST_HAS_FLOAT128 +#include <boost/multiprecision/complex128.hpp> +#endif + +#include "libs/multiprecision/test/test_arithmetic.hpp" + +int main() +{ +#ifdef BOOST_HAS_FLOAT128 + test<boost::multiprecision::complex128>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_complex_adaptor.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_complex_adaptor.cpp new file mode 100644 index 00000000..5bd37d9a --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_complex_adaptor.cpp @@ -0,0 +1,17 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define NO_MIXED_OPS + +#include <boost/multiprecision/cpp_complex.hpp> + +#include "libs/multiprecision/test/test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::cpp_complex_50>(); + test<boost::multiprecision::number<boost::multiprecision::complex_adaptor<boost::multiprecision::cpp_bin_float<50> >, boost::multiprecision::et_on> >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_complex_adaptor_2.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_complex_adaptor_2.cpp new file mode 100644 index 00000000..469230d5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_complex_adaptor_2.cpp @@ -0,0 +1,17 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define MIXED_OPS_ONLY + +#include <boost/multiprecision/cpp_complex.hpp> + +#include "libs/multiprecision/test/test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::cpp_complex_50>(); + test<boost::multiprecision::number<boost::multiprecision::complex_adaptor<boost::multiprecision::cpp_bin_float<50> >, boost::multiprecision::et_on> >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_1.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_1.cpp new file mode 100644 index 00000000..7fa2553a --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_1.cpp @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_bin_float.hpp> + +#include "libs/multiprecision/test/test_arithmetic.hpp" + +template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> number_type; + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<((std::numeric_limits<number_type>::digits / 2) > std::numeric_limits<long double>::digits ? Digits / 2 : Digits), DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::cpp_bin_float_50>(); + //test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<21> > >(); + //test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<1000, boost::multiprecision::digit_base_10, std::allocator<char> > > >(); + //test<boost::multiprecision::cpp_bin_float_quad>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_2.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_2.cpp new file mode 100644 index 00000000..c891e1e5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_2.cpp @@ -0,0 +1,25 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define NO_MIXED_OPS + +#include <boost/multiprecision/cpp_bin_float.hpp> + +#include "libs/multiprecision/test/test_arithmetic.hpp" + +template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> number_type; + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<((std::numeric_limits<number_type>::digits / 2) > std::numeric_limits<long double>::digits ? Digits / 2 : Digits), DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> type; +}; + +int main() +{ + //test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<1000, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); + //test<boost::multiprecision::cpp_bin_float_quad>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_2m.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_2m.cpp new file mode 100644 index 00000000..45e72cde --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_2m.cpp @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define MIXED_OPS_ONLY + +#include <boost/multiprecision/cpp_bin_float.hpp> + +#include "libs/multiprecision/test/test_arithmetic.hpp" + +#ifndef _WIN64 // object file too large +template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> number_type; + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<((std::numeric_limits<number_type>::digits / 2) > std::numeric_limits<long double>::digits ? Digits / 2 : Digits), DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> type; +}; +#endif + +int main() +{ + //test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<1000, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); + //test<boost::multiprecision::cpp_bin_float_quad>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_3.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_3.cpp new file mode 100644 index 00000000..2e4b97d9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_bin_float_3.cpp @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_bin_float.hpp> + +#include "libs/multiprecision/test/test_arithmetic.hpp" + +template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinExponent, Exponent MaxExponent, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> number_type; + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<((std::numeric_limits<number_type>::digits / 2) > std::numeric_limits<long double>::digits ? Digits / 2 : Digits), DigitBase, Allocator, Exponent, MinExponent, MaxExponent>, ET> type; +}; + +int main() +{ + //test<boost::multiprecision::cpp_bin_float_50>(); + //test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<1000, boost::multiprecision::digit_base_10, std::allocator<char> > > >(); + test<boost::multiprecision::cpp_bin_float_quad>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_1.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_1.cpp new file mode 100644 index 00000000..fabc1bd0 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_1.cpp @@ -0,0 +1,20 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D / 2> > type; +}; + +int main() +{ + test<boost::multiprecision::cpp_dec_float_50>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_2.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_2.cpp new file mode 100644 index 00000000..b6eba7ba --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_2.cpp @@ -0,0 +1,20 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D / 2> > type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100, long long>, boost::multiprecision::et_off> >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_3.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_3.cpp new file mode 100644 index 00000000..ff776376 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_3.cpp @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define NO_MIXED_OPS + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D / 2> > type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100, long long, std::allocator<char> >, boost::multiprecision::et_on> >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_3m.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_3m.cpp new file mode 100644 index 00000000..6d7b226e --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_dec_float_3m.cpp @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define MIXED_OPS_ONLY + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D / 2> > type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100, long long, std::allocator<char> >, boost::multiprecision::et_on> >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_1.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_1.cpp new file mode 100644 index 00000000..d74e0b74 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_1.cpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::cpp_int>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_10.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_10.cpp new file mode 100644 index 00000000..fcc6fa1b --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_10.cpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::checked_cpp_rational>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_11.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_11.cpp new file mode 100644 index 00000000..575a2473 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_11.cpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET> +struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public boost::mpl::true_ +{}; + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<0, 0, boost::multiprecision::signed_magnitude, boost::multiprecision::checked>, boost::multiprecision::et_off> >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_12.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_12.cpp new file mode 100644 index 00000000..030d055f --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_12.cpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET> +struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public boost::mpl::true_ +{}; + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<500, 500, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_13.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_13.cpp new file mode 100644 index 00000000..76d26def --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_13.cpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET> +struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public boost::mpl::true_ +{}; + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_14.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_14.cpp new file mode 100644 index 00000000..b3825c06 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_14.cpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_15.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_15.cpp new file mode 100644 index 00000000..6be2ace9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_15.cpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET> +struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public boost::mpl::true_ +{}; + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<31, 31, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_16.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_16.cpp new file mode 100644 index 00000000..df2da56a --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_16.cpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET> +struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public boost::mpl::true_ +{}; + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_17.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_17.cpp new file mode 100644 index 00000000..0aa0c02b --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_17.cpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +template <> +struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > > : public boost::mpl::true_ +{}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_18.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_18.cpp new file mode 100644 index 00000000..a822d112 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_18.cpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET> +struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public boost::mpl::true_ +{}; + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<31, 31, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_19.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_19.cpp new file mode 100644 index 00000000..8b49e01e --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_19.cpp @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::int128_t::backend_type> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_2.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_2.cpp new file mode 100644 index 00000000..f2de6dfa --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_2.cpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::int512_t>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_3.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_3.cpp new file mode 100644 index 00000000..b2e48253 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_3.cpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::uint1024_t>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_4.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_4.cpp new file mode 100644 index 00000000..04487c41 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_4.cpp @@ -0,0 +1,35 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define TEST_CHECKED_INT + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +template <> +struct is_checked_cpp_int<boost::multiprecision::checked_cpp_int> : public boost::mpl::true_ +{}; + +int main() +{ + test<boost::multiprecision::checked_cpp_int>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_5.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_5.cpp new file mode 100644 index 00000000..70ca66a1 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_5.cpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET> +struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public boost::mpl::true_ +{}; + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::checked_int512_t>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_6.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_6.cpp new file mode 100644 index 00000000..538ba803 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_6.cpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +template <> +struct is_checked_cpp_int<boost::multiprecision::checked_uint1024_t> : public boost::mpl::true_ +{}; + +int main() +{ + test<boost::multiprecision::checked_uint1024_t>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_7.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_7.cpp new file mode 100644 index 00000000..408f4c41 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_7.cpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::cpp_rational>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_8.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_8.cpp new file mode 100644 index 00000000..89a3d9bd --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_8.cpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<>, boost::multiprecision::et_off> >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_9.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_9.cpp new file mode 100644 index 00000000..41aae94f --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_9.cpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<500, 500, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_br.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_br.cpp new file mode 100644 index 00000000..59a5e41e --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_cpp_int_br.cpp @@ -0,0 +1,31 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#define BOOST_MP_NOT_TESTING_NUMBER + +#include <boost/multiprecision/cpp_int.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct is_twos_complement_integer<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ExpressionTemplates> > : public boost::mpl::false_ +{}; + +template <> +struct related_type<boost::multiprecision::cpp_int> +{ + typedef boost::multiprecision::int256_t type; +}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ET> +struct related_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ET> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits / 2, MaxBits / 2, SignType, Checked, Allocator>, ET> type; +}; + +int main() +{ + test<boost::rational<boost::multiprecision::cpp_int> >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_dbg_adptr1.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_dbg_adptr1.cpp new file mode 100644 index 00000000..5406a7e2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_dbg_adptr1.cpp @@ -0,0 +1,20 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#define NO_MIXED_OPS + +#include <boost/multiprecision/debug_adaptor.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::cpp_dec_float<50> > > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_dbg_adptr1m.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_dbg_adptr1m.cpp new file mode 100644 index 00000000..46b15a14 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_dbg_adptr1m.cpp @@ -0,0 +1,20 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#define MIXED_OPS_ONLY + +#include <boost/multiprecision/debug_adaptor.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::cpp_dec_float<50> > > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_dbg_adptr2.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_dbg_adptr2.cpp new file mode 100644 index 00000000..0feb9907 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_dbg_adptr2.cpp @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/debug_adaptor.hpp> +#include <boost/multiprecision/cpp_int.hpp> +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::cpp_int_backend<> > > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_float_128.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_float_128.cpp new file mode 100644 index 00000000..782fa747 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_float_128.cpp @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/float128.hpp> + +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::float128>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_logged_1.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_logged_1.cpp new file mode 100644 index 00000000..0e4ca377 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_logged_1.cpp @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/logged_adaptor.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_dec_float<50> > > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_logged_2.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_logged_2.cpp new file mode 100644 index 00000000..39f3c75b --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_logged_2.cpp @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/logged_adaptor.hpp> +#include <boost/multiprecision/cpp_int.hpp> +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_int_backend<> > > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpc.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpc.cpp new file mode 100644 index 00000000..4bb82477 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpc.cpp @@ -0,0 +1,21 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/mpc.hpp> +#define TEST_MPC + +#include "libs/multiprecision/test/test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::mpc_complex_backend<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D> > type; +}; + +int main() +{ + test<boost::multiprecision::mpc_complex_50>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpf.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpf.cpp new file mode 100644 index 00000000..138871b3 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpf.cpp @@ -0,0 +1,31 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/gmp.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::gmp_float<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::gmp_float<D / 2> > type; +}; +template <> +struct related_type<boost::multiprecision::mpf_float> +{ + typedef boost::multiprecision::mpz_int type; +}; + +int main() +{ + boost::multiprecision::mpf_float::default_precision(1000); + BOOST_CHECK_EQUAL(boost::multiprecision::mpf_float::default_precision(), 1000); + test<boost::multiprecision::mpf_float>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpf_50.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpf_50.cpp new file mode 100644 index 00000000..c0c8fe9f --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpf_50.cpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/gmp.hpp> + +#include "test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::gmp_float<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::gmp_float<D / 2> > type; +}; +template <> +struct related_type<boost::multiprecision::mpf_float> +{ + typedef boost::multiprecision::mpz_int type; +}; + +int main() +{ + test<boost::multiprecision::mpf_float_50>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpfi_50.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpfi_50.cpp new file mode 100644 index 00000000..25f87c25 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpfi_50.cpp @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/mpfi.hpp> +#define TEST_MPFR +#include "test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<D / 2> > type; +}; + +int main() +{ + test<boost::multiprecision::mpfi_float_50>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpfr.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpfr.cpp new file mode 100644 index 00000000..b5d22239 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpfr.cpp @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/mpfr.hpp> +#define TEST_MPFR +#include "test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D / 2> > type; +}; + +int main() +{ + test<boost::multiprecision::mpfr_float>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpfr_50.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpfr_50.cpp new file mode 100644 index 00000000..99a38aa0 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpfr_50.cpp @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/mpfr.hpp> +#define TEST_MPFR +#include "test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D / 2> > type; +}; + +int main() +{ + test<boost::multiprecision::mpfr_float_50>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpfr_50_static.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpfr_50_static.cpp new file mode 100644 index 00000000..8f391821 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpfr_50_static.cpp @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/mpfr.hpp> +#define TEST_MPFR +#include "test_arithmetic.hpp" + +template <unsigned D> +struct related_type<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D> > > +{ + typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D / 2> > type; +}; + +int main() +{ + test<boost::multiprecision::static_mpfr_float_50>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpq.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpq.cpp new file mode 100644 index 00000000..7d42c2b9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpq.cpp @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/gmp.hpp> + +#include "test_arithmetic.hpp" + +template <> +struct related_type<boost::multiprecision::mpq_rational> +{ + typedef boost::multiprecision::mpz_int type; +}; + +int main() +{ + test<boost::multiprecision::mpq_rational>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpz.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpz.cpp new file mode 100644 index 00000000..18c15ae0 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpz.cpp @@ -0,0 +1,19 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/gmp.hpp> +#include <boost/multiprecision/rational_adaptor.hpp> + +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::mpz_int>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpz_br.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpz_br.cpp new file mode 100644 index 00000000..44df14d6 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpz_br.cpp @@ -0,0 +1,34 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/gmp.hpp> + +#define NO_MIXED_OPS +#define BOOST_MP_NOT_TESTING_NUMBER + +#include "test_arithmetic.hpp" +#include <boost/rational.hpp> + +template <class T> +struct is_boost_rational<boost::rational<T> > : public boost::mpl::true_ +{}; + +namespace boost { namespace multiprecision { + +template <> +struct number_category<rational<mpz_int> > : public mpl::int_<number_kind_rational> +{}; + +}} // namespace boost::multiprecision + +int main() +{ + test<boost::rational<boost::multiprecision::mpz_int> >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_mpz_rat.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_mpz_rat.cpp new file mode 100644 index 00000000..ddbd0b2a --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_mpz_rat.cpp @@ -0,0 +1,19 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/gmp.hpp> +#include <boost/multiprecision/rational_adaptor.hpp> + +#include "test_arithmetic.hpp" + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_tommath.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_tommath.cpp new file mode 100644 index 00000000..904d1564 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_tommath.cpp @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/tommath.hpp> + +#include "test_arithmetic.hpp" + +template <> +struct is_twos_complement_integer<boost::multiprecision::tom_int> : public boost::mpl::false_ +{}; + +int main() +{ + test<boost::multiprecision::tom_int>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_tommath_br.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_tommath_br.cpp new file mode 100644 index 00000000..bf6913c2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_tommath_br.cpp @@ -0,0 +1,35 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/tommath.hpp> + +#define NO_MIXED_OPS +#define BOOST_MP_NOT_TESTING_NUMBER + +#include "test_arithmetic.hpp" + +#include <boost/rational.hpp> + +template <class T> +struct is_boost_rational<boost::rational<T> > : public boost::mpl::true_ +{}; + +namespace boost { namespace multiprecision { + +template <> +struct number_category<rational<tom_int> > : public mpl::int_<number_kind_rational> +{}; + +}} // namespace boost::multiprecision + +int main() +{ + test<boost::rational<boost::multiprecision::tom_int> >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_arithmetic_tommath_rat.cpp b/src/boost/libs/multiprecision/test/test_arithmetic_tommath_rat.cpp new file mode 100644 index 00000000..4f042fce --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_arithmetic_tommath_rat.cpp @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/tommath.hpp> + +#include "test_arithmetic.hpp" + +template <> +struct is_twos_complement_integer<boost::multiprecision::tom_int> : public boost::mpl::false_ +{}; + +int main() +{ + test<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::tommath_int> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_asin.cpp b/src/boost/libs/multiprecision/test/test_asin.cpp new file mode 100644 index 00000000..fc817dce --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_asin.cpp @@ -0,0 +1,140 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +//# define TEST_MPF +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFI_50 +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +void test() +{ + std::cout << "Testing type: " << typeid(T).name() << std::endl; + // + // Test with some exact binary values as input - this tests our code + // rather than the test data: + // + static const boost::array<boost::array<T, 2>, 6> exact_data = + {{ + {{0.5, static_cast<T>("0.523598775598298873077107230546583814032861566562517636829157432051302734381034833104672470890352844663691347752213717775")}}, + {{0.25, static_cast<T>("0.252680255142078653485657436993710972252193733096838193633923778740575060481021222411748742228014601605092602909414066566")}}, + {{0.75, static_cast<T>("0.848062078981481008052944338998418080073366213263112642860718163570200821228474234349189801731957230300995227265307531834")}}, + {{std::ldexp(1.0, -20), static_cast<T>("9.53674316406394560289664793089102218648031077292419572854816420395098616062014311172490017625353237219958438022056661501e-7")}}, + {{1 - std::ldexp(1.0, -20), static_cast<T>("1.56941525875313420204921285316218397515809899320201864334535204504240776023375739189119474528488143494473216475057072728")}}, + {{1, static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064")}}, + }}; + unsigned max_err = 0; + for (unsigned k = 0; k < exact_data.size(); k++) + { + T val = asin(exact_data[k][0]); + T e = relative_error(val, exact_data[k][1]); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + val = asin(-exact_data[k][0]); + e = relative_error(val, T(-exact_data[k][1])); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 20); + BOOST_TEST(asin(T(0)) == 0); +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); + // Check low multiprecision digit counts. + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_atan.cpp b/src/boost/libs/multiprecision/test/test_atan.cpp new file mode 100644 index 00000000..a1c2cbc2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_atan.cpp @@ -0,0 +1,296 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +//# define TEST_MPF +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFI_50 +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T atan2_def(T y, T x) +{ + T t; + t.backend() = boost::multiprecision::default_ops::get_constant_pi<typename T::backend_type>(); + T t2; + if (x) + t2 = atan(y / x); + else + t2 = y.sign() * t / 2; + return t2 + (t / 2) * (1 - x.sign()) * T(y.sign() + 0.5).sign(); +} + +template <class T> +struct is_mpfr_type : public boost::mpl::false_ +{}; + +#ifdef TEST_MPFR_50 +template <unsigned Digits10> +struct is_mpfr_type<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10> > > : public boost::mpl::true_ +{}; +#endif + +template <class T> +void test() +{ + std::cout << "Testing type: " << typeid(T).name() << std::endl; + static const boost::array<const char*, 51u> data = + {{ + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-101", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666667e-97", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666667e-93", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666667e-89", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666666666666666666666666666666666666666666666666666667e-85", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666666666666666666666666666666666666666666666666666667e-81", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-77", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-73", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-69", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238e-65", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238e-61", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238e-57", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238095238095238095238095238e-53", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666668666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238095238095238095238095238095238096349206349206349e-49", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238095238095238095238095238206349206349206349206349206349206349206349206349e-45", + "9.999999999999999999999999999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238095238095238095249206349206349206349206349206349206349206349206349206349206349206349206349206349e-41", + "9.99999999999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666666666666666666666523809523809523809523809523809523809523809523809523809523809523809523809634920634920634920634920634920634920634920634920634920634920634920634920544011544011544011544011544011544011544e-37", + "9.999999999999999999999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666666666666666666686666666666666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095238095238206349206349206349206349206349206349206349206349206349206349206340115440115440115440115440115440115440115440115440115440115440116209346209346209e-33", + "9.999999999999999999999999999999999999999999999999999999966666666666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666666666665238095238095238095238095238095238095238095238095238095249206349206349206349206349206349206349206349206349206349115440115440115440115440115440115440115440115440115440116209346209346209346209346209346209346209346209346209346202679543e-29", + "9.99999999999999999999999999999999999999999999999666666666666666666666666666666666666666666666666866666666666666666666666666666666666666666666666523809523809523809523809523809523809523809523809634920634920634920634920634920634920634920634920544011544011544011544011544011544011544011544011620934620934620934620934620934620934620934620934554267954267954267954267954267954267954267954268013091483679719e-25", + "9.999999999999999999999999999999999999999666666666666666666666666666666666666666686666666666666666666666666666666666666665238095238095238095238095238095238095238206349206349206349206349206349206349206340115440115440115440115440115440115440116209346209346209346209346209346209346209279542679542679542679542679542679542679548561895620719150130914836797189738366208428128459088211410192834341441152586663e-21", + "9.999999999999999999999999999999966666666666666666666666666666666866666666666666666666666666666665238095238095238095238095238095249206349206349206349206349206349115440115440115440115440115440116209346209346209346209346209346202679542679542679542679542679542738366208954444248561895620719149604599047323505527839893164970569113274066834438351466215243304983108499463325146458811824271509689681318218133e-17", + "9.999999999999999999999996666666666666666666666668666666666666666666666665238095238095238095238096349206349206349206349205440115440115440115440116209346209346209346209345542679542679542679542680130914836797189738366208428128459088211410192834817631628777139613052925311641589740930163598087002528653948764327011735444703713649735994600714288656350334489593033695272837185114343249547095046272603174268e-13", + "9.999999999999999666666666666666686666666666666665238095238095238206349206349206340115440115440116209346209346209279542679542679548561895620719149604599047323505575458940784018179051162265592202726621494746410579611835097095566286199717626418813764642659343446728207455753397291482030056516178836684094391777365260695851470017381944166954115569576329193296454393446430574957840819236721213626802085619e-9", + "0.00009999999966666666866666665238095249206349115440116209346202679542738366208428128463850116128619335776637836253560167434464812879197215298894881707269927081030999737549925482008672363799937606915962379247584324159094536421375755997513179578610677454920512897850953612762990732913046921088456079984429888220262137400213929962691532176198436788640624698990926490105259050461938357510947570244880435664081", + "0.78539816339744830961566084581987572104929234984377645524373614807695410157155224965700870633552926699553702162832057666177346115238764555793133985203212027936257102567548463027638991115573723873259549110720274391648336153211891205844669579131780047728641214173086508715261358166205334840181506228531843114675165157889704372038023024070731352292884109197314759000283263263720511663034603673798537790236", + "1.5706963267952299525626550249873704896065212085331517483940102693584808194810202180293789115097723406333076648941055516492022741759833189628737308869915412879148320539754700057326930986734751013960313584219296445913757777000240665569182597868494941800236191544832206381775972559949762275927455637707925634113006817837919481411335451596526426779712759369563859151046126747697908496855825977735219514481", + "1.5707963167948966192313220249730847754318980330208862438222342009158129649367552929648110725556184185509578339104318071142673796252326115673007840833450909541260947278453938016119958041324233151995987794877839930865561434524027270213271053829179745357590596408023867275770197075707094053216000680544580256094089113804288267449089904640326828789035666143699659867092108718279796583028512542392495421779", + "1.5707963267938966192313216916397514424319180330208862438208054294872415364764378326474936031472490101815502336217205184029120016698547471043186681600526965471042074304163483259318452680435202095109230279463923963492870040904012032740805456738144599352893425202988524603439218707929425378295371082108281620406379082813613862672159901100496534463976107550806601465567059619048829495421806391510160463001", + "1.5707963267948965192313216916397514420985846996878862438208056294872415364764378306473507460043918673244073765899887723711659699238229101634817272120007484952330785592874771970616254211570733230640365810600043257395046296021443620234312981206088055277773974880349347475097997796620171523611445056144296707974573126845590321623615288317089359131170138395627805178532322154433252386274406088878525130896", + "1.5707963267948966192213216916397514420985846996875529104874726294872415364764378326473507460043918673044073765899744866568802556381086244491974416088261453206299039561128740224575416159622681282588417758651991386266175167241223840014532761425201608391327088433455208280958809539778973505942839152244275827508237604782514078980809178018719474972957865632271450490908284680846718670522639450168825443945", + "1.5707963267948966192313206916397514420985846996875529104874722961539082034764378326473507460043918673244073765899744866566802556381086244491960130373975738920584753846844454510289702985019506679413814584048816783091570881436029034819727566620006803196521893628268096302936831517800951527920861130266253182819592915368594665061395258604800061112367475630116742454513973110064559653064241192080164878504", + "1.5707963267948966192313216915397514420985846996875529104874722961539082031431044993143507460043918673244073765899744866568802556381086244491940130373975738920584753846843025938861131556448078107985386012620245354520143421118568717359410106302546485736203322199696666822417350998320432047401380610785733702300121487566396862863593060802602258914565277827918940256045031718123167711672299800138772937113", + "1.5707963267948966192313216916397414420985846996875529104874722961539082031431044993140174126710588673244073765899744866568802556381086244491960130373975738920584553846843025938861131556448078107985243155477388211663000563975725860216552963445403628593347290453664920790671319252288686015654237753642876559442969539514448810915541112750654206966513329776061797398902251498342947931452519580358553156893", + "1.5707963267948966192313216916397514410985846996875529104874722961539082031431044993140174126710585339910740435899744866568802556381086244491960130373975738920584753846843025938861129556448078107985243155477388211663000563975711574502267249159689342879063004739379206504957033538002971729941063150468273384839794936339845636311255398464939921252227615490256602593707446303537753126257714385553358352607", + "1.5707963267948966192313216916397514420984846996875529104874722961539082031431044993140174126710585339910740432566411533238802556381086244491960130373975738920584753846843025938861131556448078107985243135477388211663000563975711574502267249159689342879061576167950635076385604966574543158512491721896844813411223507768417064883795081004622460934767298029939142275136017732109181697686285814124786923127", + "1.5707963267948966192313216916397514420985846896875529104874722961539082031431044993140174126710585339910740432566411533235469223047756244491960130373975738920584753846843025938861131556448078107985243155477388211663000563775711574502267249159689342879061576167950635076385604966574400301369634579039701956268380650625559922026652223861765318077624440887081999419104271700363149951654539782378755175984", + "1.5707963267948966192313216916397514420985846996865529104874722961539082031431044993140174126710585339910740432566411533235469223047752911158626800373975738920584753846843025938861131556448078107985243155477388211663000563975711574502267249157689342879061576167950635076385604966574400301369634579039701956268366364911274207740937938147481032363338726601367713704818557414648864237368825496664469462809", + "1.5707963267948966192313216916397514420985846996875528104874722961539082031431044993140174126710585339910740432566411533235469223047752911158626797040642405590584753846843025938861131556448078107985243155477388211663000563975711574502267249159689342879061576167930635076385604966574400301369634579039701956268366364911274207740937938147479603791910155172796285133390128843220292808797396925235898034238", + "1.5707963267948966192313216916397514420985846996875529104774722961539082031431044993140174126710585339910740432566411533235469223047752911158626797040642405587251420513513025938861131556448078107985243155477388211663000563975711574502267249159689342879061576167950635076385604966574200301369634579039701956268366364911274207740937938147479603791910155172796285133389985986077435665940254068093055177095", + "1.570796326794896619231321691639751442098584699687552910487471296153908203143104499314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552780155644807810798524315547738821166300056397571157450226724915968934287906157616795063507638560496657440030136963457903969995626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138", + "1.570796326794896619231321691639751442098584699687552910487472296053908203143104499314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477798524315547738821166300056397571157450226724915968934287906157616795063507638560496657440030136963457903970195626836636491127418774093793814747960379191015517279628513338998598607743566594025406809304089138", + "1.570796326794896619231321691639751442098584699687552910487472296153898203143104499314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214738821166300056397571157450226724915968934287906157616795063507638560496657440030136963457903970195626836636491127420774093793814747960359191015517279628513338998598607743566594025406809304089138", + "1.570796326794896619231321691639751442098584699687552910487472296153908202143104499314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832967056397571157450226724915968934287906157616795063507638560496657440030136963457903970195626836636491127420774093793814747960379191015517279628513138998598607743566594025406809304089138", + "1.570796326794896619231321691639751442098584699687552910487472296153908203143004499314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824450226724915968934287906157616795063507638560496657440030136963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566592025406809304089138", + "1.570796326794896619231321691639751442098584699687552910487472296153908203143104489314017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582968934287906157616795063507638560496657440030136963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138", + "1.570796326794896619231321691639751442098584699687552910487472296153908203143104499313017412671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954573157616795063507638560496657440030136963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138", + "1.570796326794896619231321691639751442098584699687552910487472296153908203143104499314017312671058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954572824283461730507638560496657440030136963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138", + "1.570796326794896619231321691639751442098584699687552910487472296153908203143104499314017412661058533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954572824283461730174305227163657440030136963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138", + "1.570796326794896619231321691639751442098584699687552910487472296153908203143104499314017412671057533991074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954572824283461730174305227163324106696803963457903970195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138", + "1.570796326794896619231321691639751442098584699687552910487472296153908203143104499314017412671058533891074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954572824283461730174305227163324106696803630124570637195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138", + }}; + + T arg = static_cast<T>("1e-100"); + + unsigned max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + T val = atan(arg); + T e = relative_error(val, T(data[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + val = atan(-arg); + e = relative_error(val, T(-T(data[k]))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + arg *= 10000; + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 10); + BOOST_TEST(atan(T(0)) == 0); + + // + // And again, but test all the phases of atan2: + // + arg = static_cast<T>("1e-100"); + unsigned err; + for (unsigned k = 0; k < data.size(); k++) + { + T val = atan2(arg, 1); + T e = relative_error(val, atan2_def(arg, T(1))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + val = atan2(-arg, 1); + e = relative_error(val, atan2_def(T(-arg), T(1))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + val = atan2(arg, -1); + e = relative_error(val, atan2_def(arg, T(-1))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + val = atan2(-arg, -1); + e = relative_error(val, atan2_def(T(-arg), T(-1))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + arg *= 10000; + } + // + // special cases: + // + err = relative_error(T(atan2(T(0), T(1))), atan2_def(T(0), T(1))).template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + if (!boost::multiprecision::is_interval_number<T>::value) + { + // We don't test this with intervals as [-0,0] leads to strange behaviour in atan2... + err = relative_error(T(atan2(T(0), T(-1))), atan2_def(T(0), T(-1))).template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + + T pi; + pi.backend() = boost::multiprecision::default_ops::get_constant_pi<typename T::backend_type>(); + + err = relative_error(T(atan2(T(1), T(0))), T(pi / 2)).template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + + err = relative_error(T(atan2(T(-1), T(0))), T(pi / -2)).template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + + T mv = (std::numeric_limits<T>::max)(); + err = relative_error(T(atan2(mv, T(1))), T(pi / 2)).template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + err = relative_error(T(atan2(-mv, T(1))), T(pi / -2)).template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + + if (std::numeric_limits<T>::has_infinity) + { + mv = (std::numeric_limits<T>::infinity)(); + err = relative_error(T(atan2(mv, T(1))), T(pi / 2)).template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + err = relative_error(T(atan2(-mv, T(1))), T(pi / -2)).template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 2000); +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); + // Check low multiprecision digit counts. + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_checked_cpp_int.cpp b/src/boost/libs/multiprecision/test/test_checked_cpp_int.cpp new file mode 100644 index 00000000..0fd256a9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_checked_cpp_int.cpp @@ -0,0 +1,197 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include "test.hpp" +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class Number> +void test_signed_overflow(Number a, Number b, const boost::mpl::true_&) +{ + a = -a; + BOOST_CHECK_THROW(Number(a * b), std::overflow_error); + ++a; + BOOST_CHECK(Number(a * b) >= (std::numeric_limits<Number>::min)()); +} +template <class Number> +void test_signed_overflow(Number a, Number b, const boost::mpl::false_&) +{ +} + +template <class Number> +void test() +{ + using namespace boost::multiprecision; + typedef Number test_type; + + if (std::numeric_limits<test_type>::is_bounded) + { + test_type val = (std::numeric_limits<test_type>::max)(); +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(++val, std::overflow_error); + val = (std::numeric_limits<test_type>::max)(); + BOOST_CHECK_THROW(test_type(1 + val), std::overflow_error); + BOOST_CHECK_THROW(test_type(val + 1), std::overflow_error); + BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error); + val /= 2; + val += 1; + BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error); + + if (std::numeric_limits<test_type>::is_signed) + { + val = (std::numeric_limits<test_type>::min)(); + BOOST_CHECK_THROW(--val, std::overflow_error); + val = (std::numeric_limits<test_type>::min)(); + BOOST_CHECK_THROW(test_type(val - 1), std::overflow_error); + BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error); + val /= 2; + val -= 1; + BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error); + } + else + { + val = (std::numeric_limits<test_type>::min)(); + BOOST_CHECK_THROW(--val, std::range_error); + val = (std::numeric_limits<test_type>::min)(); + BOOST_CHECK_THROW(test_type(val - 1), std::range_error); + } +#endif + // + // Test overflow in random values: + // + for (unsigned bits = 30; bits < std::numeric_limits<test_type>::digits; bits += 30) + { + for (unsigned i = 0; i < 100; ++i) + { + val = static_cast<test_type>(generate_random<cpp_int>(bits)); + test_type val2 = 1 + (std::numeric_limits<test_type>::max)() / val; + BOOST_CHECK_THROW(test_type(val2 * val), std::overflow_error); + test_signed_overflow(val2, val, boost::mpl::bool_<std::numeric_limits<test_type>::is_signed>()); + --val2; + BOOST_CHECK(cpp_int(val2) * cpp_int(val) <= cpp_int((std::numeric_limits<test_type>::max)())); + BOOST_CHECK(val2 * val <= (std::numeric_limits<test_type>::max)()); + val2 = (std::numeric_limits<test_type>::max)() - val; + ++val2; + BOOST_CHECK_THROW(test_type(val2 + val), std::overflow_error); + BOOST_CHECK((val2 - 1) + val == (std::numeric_limits<test_type>::max)()); + if (std::numeric_limits<test_type>::is_signed) + { + val2 = (std::numeric_limits<test_type>::min)() + val; + --val2; + BOOST_CHECK_THROW(test_type(val2 - val), std::overflow_error); + ++val2; + BOOST_CHECK(val2 - val == (std::numeric_limits<test_type>::min)()); + } + unsigned shift = std::numeric_limits<test_type>::digits - msb(val); + BOOST_CHECK_THROW((val << shift) > 0, std::overflow_error); + } + } + } + +#ifndef BOOST_NO_EXCEPTIONS + if (std::numeric_limits<test_type>::is_signed) + { + test_type a = -1; + test_type b = 1; + BOOST_CHECK_THROW(test_type(a | b), std::range_error); + BOOST_CHECK_THROW(test_type(a & b), std::range_error); + BOOST_CHECK_THROW(test_type(a ^ b), std::range_error); + } + else + { + // Constructing from a negative value is not allowed: + BOOST_CHECK_THROW(test_type(-2), std::range_error); + BOOST_CHECK_THROW(test_type("-2"), std::range_error); + } + if (std::numeric_limits<test_type>::digits < std::numeric_limits<long long>::digits) + { + long long llm = (std::numeric_limits<long long>::max)(); + test_type t; + BOOST_CHECK_THROW(t = llm, std::range_error); + BOOST_CHECK_THROW(t = static_cast<test_type>(llm), std::range_error); + unsigned long long ullm = (std::numeric_limits<unsigned long long>::max)(); + BOOST_CHECK_THROW(t = ullm, std::range_error); + BOOST_CHECK_THROW(t = static_cast<test_type>(ullm), std::range_error); + + static const checked_uint512_t big = (std::numeric_limits<checked_uint512_t>::max)(); + BOOST_CHECK_THROW(t = static_cast<test_type>(big), std::range_error); + } + // + // String errors: + // + BOOST_CHECK_THROW(test_type("12A"), std::runtime_error); + BOOST_CHECK_THROW(test_type("0658"), std::runtime_error); + + if (std::numeric_limits<test_type>::is_signed) + { + BOOST_CHECK_THROW(test_type(-2).str(0, std::ios_base::hex), std::runtime_error); + BOOST_CHECK_THROW(test_type(-2).str(0, std::ios_base::oct), std::runtime_error); + } +#endif +} + +int main() +{ + using namespace boost::multiprecision; + + test<number<cpp_int_backend<0, 0, signed_magnitude, checked> > >(); + test<checked_int512_t>(); + test<checked_uint512_t>(); + test<number<cpp_int_backend<32, 32, signed_magnitude, checked, void> > >(); + test<number<cpp_int_backend<32, 32, unsigned_magnitude, checked, void> > >(); + + // + // We also need to test type with "odd" bit counts in order to ensure full code coverage: + // + test<number<cpp_int_backend<528, 528, signed_magnitude, checked, void> > >(); + test<number<cpp_int_backend<528, 528, unsigned_magnitude, checked, void> > >(); + test<number<cpp_int_backend<48, 48, signed_magnitude, checked, void> > >(); + test<number<cpp_int_backend<48, 48, unsigned_magnitude, checked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_checked_mixed_cpp_int.cpp b/src/boost/libs/multiprecision/test/test_checked_mixed_cpp_int.cpp new file mode 100644 index 00000000..21204703 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_checked_mixed_cpp_int.cpp @@ -0,0 +1,99 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include "test.hpp" + +template <class T, class U> +void check_result_type(const T&, const U&) +{ + BOOST_CHECK(0); +} + +void check_result_type(const boost::multiprecision::checked_int1024_t&, const boost::multiprecision::checked_int1024_t&) {} + +int main() +{ +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + typedef boost::multiprecision::checked_int1024_t big_type; + typedef boost::multiprecision::checked_int512_t small_type; + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void>, boost::multiprecision::et_off> little_type; + + big_type big_val = (big_type(1) << 1000) + 1; + small_type small_val = 1; + little_type little_val = 1; + + check_result_type(big_val, big_val + small_val); + check_result_type(big_val, big_val - small_val); + check_result_type(big_val, big_val * small_val); + check_result_type(big_val, big_val / small_val); + check_result_type(big_val, big_val | small_val); + check_result_type(big_val, big_val & small_val); + check_result_type(big_val, big_val ^ small_val); + check_result_type(big_val, small_val + big_val); + check_result_type(big_val, small_val - big_val); + check_result_type(big_val, small_val * big_val); + check_result_type(big_val, small_val / big_val); + check_result_type(big_val, small_val | big_val); + check_result_type(big_val, small_val & big_val); + check_result_type(big_val, small_val ^ big_val); + + check_result_type(big_val, big_val + little_val); + check_result_type(big_val, big_val - little_val); + check_result_type(big_val, big_val * little_val); + check_result_type(big_val, big_val / little_val); + check_result_type(big_val, big_val | little_val); + check_result_type(big_val, big_val & little_val); + check_result_type(big_val, big_val ^ little_val); + check_result_type(big_val, little_val + big_val); + check_result_type(big_val, little_val - big_val); + check_result_type(big_val, little_val * big_val); + check_result_type(big_val, little_val / big_val); + check_result_type(big_val, little_val | big_val); + check_result_type(big_val, little_val & big_val); + check_result_type(big_val, little_val ^ big_val); + + BOOST_CHECK_EQUAL(big_val == small_val, false); + BOOST_CHECK_EQUAL(big_val <= small_val, false); + BOOST_CHECK_EQUAL(big_val >= small_val, true); + BOOST_CHECK_EQUAL(big_val < small_val, false); + BOOST_CHECK_EQUAL(big_val > small_val, true); + BOOST_CHECK_EQUAL(big_val != small_val, true); + BOOST_CHECK_EQUAL(small_val == big_val, false); + BOOST_CHECK_EQUAL(small_val <= big_val, true); + BOOST_CHECK_EQUAL(small_val >= big_val, false); + BOOST_CHECK_EQUAL(small_val < big_val, true); + BOOST_CHECK_EQUAL(small_val > big_val, false); + BOOST_CHECK_EQUAL(small_val != big_val, true); + + BOOST_CHECK_EQUAL(big_val == little_val, false); + BOOST_CHECK_EQUAL(big_val <= little_val, false); + BOOST_CHECK_EQUAL(big_val >= little_val, true); + BOOST_CHECK_EQUAL(big_val < little_val, false); + BOOST_CHECK_EQUAL(big_val > little_val, true); + BOOST_CHECK_EQUAL(big_val != little_val, true); + BOOST_CHECK_EQUAL(little_val == big_val, false); + BOOST_CHECK_EQUAL(little_val <= big_val, true); + BOOST_CHECK_EQUAL(little_val >= big_val, false); + BOOST_CHECK_EQUAL(little_val < big_val, true); + BOOST_CHECK_EQUAL(little_val > big_val, false); + BOOST_CHECK_EQUAL(little_val != big_val, true); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const std::exception& e) + { + std::cout << "Failed with unexpected exception: " << e.what() << std::endl; + return 1; + } +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_complex.cpp b/src/boost/libs/multiprecision/test/test_complex.cpp new file mode 100644 index 00000000..02b5db55 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_complex.cpp @@ -0,0 +1,170 @@ + +/////////////////////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2016. +// Distributed under the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include <cmath> +#include <iomanip> +#include <iostream> +#include <limits> +#include <string> + +#include <boost/lexical_cast.hpp> +#ifdef TEST_MPC +#include <boost/multiprecision/mpc.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/complex_adaptor.hpp> +#ifdef BOOST_HAS_FLOAT128 +#include <boost/multiprecision/complex128.hpp> +#endif + +#include "test.hpp" + +namespace local { +template <typename complex_type> +void test() +{ + + typedef typename complex_type::value_type float_type; + + const std::string str_tol("0." + std::string(std::size_t(std::numeric_limits<float_type>::digits10 - 2), char('0')) + std::string(std::size_t(2U), char('9'))); + + const float_type tol = boost::lexical_cast<float_type>(str_tol.c_str()); + + std::cout << "Testing with tolerance: " << tol << std::endl; + + const complex_type z1(float_type(12U) / 10U, float_type(34U) / 10U); + const complex_type z2(float_type(56U) / 10U, float_type(78U) / 10U); + const complex_type i(float_type(0U), float_type(1U)); + + // See also, for example, numerical evaluation at Wolfram's Alpha. + + const complex_type result_01 = z1 / z2; // N[((12/10) + ((34 I)/10)) / ((56/10) + ((78 I)/10)), 100] + const complex_type result_02 = complex_type(z1) /= z2; // Same as above. + const complex_type result_03 = z1 / (i * z2); // N[((12/10) + ((34 I)/10)) / ((-78/10) + ((56 I)/10)), 100] + const complex_type result_04 = complex_type(z1) /= (i * z2); // Same as above. + const complex_type result_05 = z1.real() / z2; // N[((12/10) / ((56/10) + ((78 I)/10)), 100] + const complex_type result_06 = z1.real() / (i * z2); // N[((12/10) / ((-78/10) + ((56 I)/10)), 100] + const complex_type result_07 = sqrt(z1); // N[Sqrt[(12/10) + ((34 I)/10)], 100] + const complex_type result_08 = sqrt(-z1); // N[Sqrt[(-12/10) - ((34 I)/10)], 100] + const complex_type result_09 = sin(z1); // N[Sin[(12/10) + ((34 I)/10)], 100] + const complex_type result_10 = sinh(z1); // N[Sinh[(12/10) + ((34 I)/10)], 100] + const complex_type result_11 = cosh(z1); // N[Cosh[(12/10) + ((34 I)/10)], 100] + const complex_type result_12 = log(z1); // N[Log[(12/10) + ((34 I)/10)], 100] + const complex_type result_13 = asin(z1); // N[ArcSin[(12/10) + ((34 I)/10)], 100] + const complex_type result_14 = acos(z1); // N[ArcCos[(12/10) + ((34 I)/10)], 100] + const complex_type result_15 = atan(z1); // N[ArcTan[(12/10) + ((34 I)/10)], 100] + const complex_type result_16 = acosh(z1); // N[ArcCosh[(12/10) + ((34 I)/10)], 100] + const complex_type result_17 = atanh(z1); // N[ArcTanh[(12/10) + ((34 I)/10)], 100] + const complex_type result_18 = exp(z1); // N[Exp[(12/10) + ((34 I)/10)], 100] + const complex_type result_19 = pow(z1, 5); // N[((12/10) + ((34 I)/10)) ^ 5, 100] + const complex_type result_20 = pow(z1, z2); // N[((12/10) + ((34 I)/10)) ^ ((56/10) + ((78 I)/10)), 100] + const complex_type result_21 = pow(z1.real(), z2); // N[(12/10)^((56/10) + ((78 I)/10)), 100] + const complex_type result_22 = cos(z1); + const complex_type result_23 = asinh(z1); + const complex_type result_24 = tanh(z1); + const complex_type result_25 = log10(z1); + const complex_type result_26 = tan(z1); + + const complex_type control_01(boost::lexical_cast<float_type>("+0.3605206073752711496746203904555314533622559652928416485900216919739696312364425162689804772234273319"), boost::lexical_cast<float_type>("+0.1049891540130151843817787418655097613882863340563991323210412147505422993492407809110629067245119306")); + const complex_type control_02(boost::lexical_cast<float_type>("+0.3605206073752711496746203904555314533622559652928416485900216919739696312364425162689804772234273319"), boost::lexical_cast<float_type>("+0.1049891540130151843817787418655097613882863340563991323210412147505422993492407809110629067245119306")); + const complex_type control_03(boost::lexical_cast<float_type>("+0.1049891540130151843817787418655097613882863340563991323210412147505422993492407809110629067245119306"), boost::lexical_cast<float_type>("-0.3605206073752711496746203904555314533622559652928416485900216919739696312364425162689804772234273319")); + const complex_type control_04(boost::lexical_cast<float_type>("+0.1049891540130151843817787418655097613882863340563991323210412147505422993492407809110629067245119306"), boost::lexical_cast<float_type>("-0.3605206073752711496746203904555314533622559652928416485900216919739696312364425162689804772234273319")); + const complex_type control_05(boost::lexical_cast<float_type>("+0.07288503253796095444685466377440347071583514099783080260303687635574837310195227765726681127982646421"), boost::lexical_cast<float_type>("-0.10151843817787418655097613882863340563991323210412147505422993492407809110629067245119305856832971800")); + const complex_type control_06(boost::lexical_cast<float_type>("-0.10151843817787418655097613882863340563991323210412147505422993492407809110629067245119305856832971800"), boost::lexical_cast<float_type>("-0.07288503253796095444685466377440347071583514099783080260303687635574837310195227765726681127982646421")); + const complex_type control_07(boost::lexical_cast<float_type>("+1.5500889128472581416161256546038815669761567486848749301860666965618993040312647033986371788677357208"), boost::lexical_cast<float_type>("+1.096711282759503047577277387056220643003106823143745046422869808875853261131777962620301480493467395")); + const complex_type control_08(boost::lexical_cast<float_type>("+1.096711282759503047577277387056220643003106823143745046422869808875853261131777962620301480493467395"), boost::lexical_cast<float_type>("-1.550088912847258141616125654603881566976156748684874930186066696561899304031264703398637178867735721")); + const complex_type control_09(boost::lexical_cast<float_type>("+13.97940880601799793712580492576613541257396172944193599059708688128463118206190268215536541838594224"), boost::lexical_cast<float_type>("+5.42281547246340124509840716106599160358961329374827042575715571177243361237429170135167564889390308")); + const complex_type control_10(boost::lexical_cast<float_type>("-1.459344510181031985739679928789446132188487461323488604725673812272622166868694452733557505015403343"), boost::lexical_cast<float_type>("-0.462696919065088203665190427736980818788403809123239459086853242811288735966522197819049006036217659")); + const complex_type control_11(boost::lexical_cast<float_type>("-1.750538529873144139045226521462954860931070703406867443705575327698120127693949444003491179539803540"), boost::lexical_cast<float_type>("-0.385729418228941114585783287542904778761684113049496885765699906882071623161614865310950661528173196")); + const complex_type control_12(boost::lexical_cast<float_type>("+1.282474678730768368026743720782659302402633972380103558209522755331732333662205089699787331720244744"), boost::lexical_cast<float_type>("+1.231503712340851938048420309342408065643217837171236736591653326549432606404929552637127722999523972")); + const complex_type control_13(boost::lexical_cast<float_type>("+0.327743052014525194927829972510958755346463574500092232271394201982853487105798907461836716106793827"), boost::lexical_cast<float_type>("+1.990465064891068704855135027843677587369707826516050430927052768488360486375325411568355926052994795")); + const complex_type control_14(boost::lexical_cast<float_type>("+1.243053274780371424303491719128792686752121125187460678216078094171054716037305591852180696564264707"), boost::lexical_cast<float_type>("-1.990465064891068704855135027843677587369707826516050430927052768488360486375325411568355926052994795")); + const complex_type control_15(boost::lexical_cast<float_type>("+1.472098546869956240046296809042356295374792147793626859728627826033391218153982606447668498652414512"), boost::lexical_cast<float_type>("+0.265217990171315665670057272294610940896446740868740866767584213220467425714221740314551620202361000")); + const complex_type control_16(boost::lexical_cast<float_type>("+1.990465064891068704855135027843677587369707826516050430927052768488360486375325411568355926052994795"), boost::lexical_cast<float_type>("+1.243053274780371424303491719128792686752121125187460678216078094171054716037305591852180696564264707")); + const complex_type control_17(boost::lexical_cast<float_type>("+0.0865690591794584441708728351688739957204743888691393886743981396542994588169512931672375066385325971"), boost::lexical_cast<float_type>("+1.3130218230654070842957152910299990808349983340931830855923498117237087784015805687823303378344863815")); + const complex_type control_18(boost::lexical_cast<float_type>("-3.209883040054176124784906450252400993119558164730356048431249139970742294562643896737048684555206883"), boost::lexical_cast<float_type>("-0.848426337294029318250973715279885597550087922172736344852553149693360359128137063129999667564390855")); + const complex_type control_19(boost::lexical_cast<float_type>("+604.5331200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), boost::lexical_cast<float_type>("-76.3721600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")); + const complex_type control_20(boost::lexical_cast<float_type>("-0.03277613870122620601990858385164868868755535963372013573012556184586155243067581560513902047571175876"), boost::lexical_cast<float_type>("-0.08229096285844296094766104540456274850393339107196281307901532754610012233461478959682645571793968423")); + const complex_type control_21(boost::lexical_cast<float_type>("+0.411234943477464115466545795217592784968613499972731227382657362718492707513495252941835813107553442"), boost::lexical_cast<float_type>("+2.745341999926603737618437066482640101524732307796305942046035072295581269096378050886721641340275877")); + const complex_type control_22(boost::lexical_cast<float_type>("+5.434908535625768828356755041961059164496984604872689362797531800548498933607521437636349622508613554091586385714"), boost::lexical_cast<float_type>("-13.94830361398843812562310928749334812612948167559995042721295554487075295893311479161719058895913730856339351903")); + const complex_type control_23(boost::lexical_cast<float_type>("1.960545624274756532757863147926614306606344023611895252748744677291286163242757958621205801565261867742512464966"), boost::lexical_cast<float_type>("1.218868916639890129907167289780557894460959308403278313426586722860313100564201336738382323265397208095855244598")); + const complex_type control_24(boost::lexical_cast<float_type>("0.850596957549373767077286649475619401136709177565015571227494818854489310955671601843121766190907188858336389856"), boost::lexical_cast<float_type>("0.0768887100657045933256083080177585250084258780189064853743639639730289473609169028321092839605973770873615254969")); + const complex_type control_25(boost::lexical_cast<float_type>("0.556971676153418384603252578971164215414864594193534135900595487498776545815097120403823727129449829836488977743"), boost::lexical_cast<float_type>("0.534835266713001566463607491752731752251883431441322590506193641481222966948925488019132991641807563958917938106")); + const complex_type control_26(boost::lexical_cast<float_type>("0.001507101875805783093387404217890750536099188330196632424994845319829605048223792684300657269522163036773069001022"), boost::lexical_cast<float_type>("1.001642796989141044331404504473463720289288872859072985897399123485040632782581390249339681901758734269277005380")); + + BOOST_CHECK_CLOSE_FRACTION(result_01.real(), control_01.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_01.imag(), control_01.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_02.real(), control_02.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_02.imag(), control_02.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_03.real(), control_03.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_03.imag(), control_03.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_04.real(), control_04.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_04.imag(), control_04.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_05.real(), control_05.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_05.imag(), control_05.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_06.real(), control_06.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_06.imag(), control_06.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_07.real(), control_07.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_07.imag(), control_07.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_08.real(), control_08.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_08.imag(), control_08.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_09.real(), control_09.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_09.imag(), control_09.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_10.real(), control_10.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_10.imag(), control_10.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_11.real(), control_11.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_11.imag(), control_11.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_12.real(), control_12.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_12.imag(), control_12.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_13.real(), control_13.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_13.imag(), control_13.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_14.real(), control_14.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_14.imag(), control_14.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_15.real(), control_15.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_15.imag(), control_15.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_16.real(), control_16.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_16.imag(), control_16.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_17.real(), control_17.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_17.imag(), control_17.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_18.real(), control_18.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_18.imag(), control_18.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_19.real(), control_19.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_19.imag(), control_19.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_20.real(), control_20.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_20.imag(), control_20.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_21.real(), control_21.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_21.imag(), control_21.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_22.real(), control_22.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_22.imag(), control_22.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_23.real(), control_23.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_23.imag(), control_23.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_24.real(), control_24.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_24.imag(), control_24.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_25.real(), control_25.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_25.imag(), control_25.imag(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_26.real(), control_26.real(), tol); + BOOST_CHECK_CLOSE_FRACTION(result_26.imag(), control_26.imag(), tol); + + BOOST_CHECK_CLOSE_FRACTION(abs(z1), boost::lexical_cast<float_type>("3.60555127546398929311922126747049594625129657384524621271045305622716694829301044520461908201849071767351418202406"), tol) +} +} // namespace local + +int main() +{ + //local::test<std::complex<double> >(); +#ifdef TEST_MPC + local::test<boost::multiprecision::mpc_complex_50>(); + local::test<boost::multiprecision::mpc_complex_100>(); +#endif + local::test<boost::multiprecision::number<boost::multiprecision::complex_adaptor<boost::multiprecision::cpp_bin_float<50> >, boost::multiprecision::et_on> >(); + local::test<boost::multiprecision::number<boost::multiprecision::complex_adaptor<boost::multiprecision::cpp_bin_float<50> >, boost::multiprecision::et_off> >(); +#ifdef BOOST_HAS_FLOAT128 + local::test<boost::multiprecision::complex128>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_constants.cpp b/src/boost/libs/multiprecision/test/test_constants.cpp new file mode 100644 index 00000000..206d4530 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_constants.cpp @@ -0,0 +1,197 @@ +// Copyright John Maddock 2012. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if !defined(TEST_MPF_50) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) +#define TEST_MPF_50 +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFR_50 + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif + +#include "test.hpp" + +static const char* ln2 = + "0.693147180559945309417232121458176568075500134360255254120680009493393621969694" + "71560586332699641868754200148102057068573368552023575813055703267075163507596193" + "07275708283714351903070386238916734711233501153644979552391204751726815749320651" + "55524734139525882950453007095326366642654104239157814952043740430385500801944170" + "64167151864471283996817178454695702627163106454615025720740248163777338963855069" + "52606683411372738737229289564935470257626520988596932019650585547647033067936544" + "32547632744951250406069438147104689946506220167720424524529612687946546193165174" + "68139267250410380254625965686914419287160829380317271436778265487756648508567407" + "76484514644399404614226031930967354025744460703080960850474866385231381816767514" + "38667476647890881437141985494231519973548803751658612753529166100071053558249879" + "41472950929311389715599820565439287170007218085761025236889213244971389320378439" + "35308877482597017155910708823683627589842589185353024363421436706118923678919237" + "23146723217205340164925687274778234453534764811494186423867767744060695626573796" + "00867076257199184734022651462837904883062033061144630073719489002743643965002580" + "93651944304119115060809487930678651588709006052034684297361938412896525565396860" + "22194122924207574321757489097706752687115817051137009158942665478595964890653058" + "46025866838294002283300538207400567705304678700184162404418833232798386349001563" + "12188956065055315127219939833203075140842609147900126516824344389357247278820548" + "62715527418772430024897945401961872339808608316648114909306675193393128904316413" + "70681397776498176974868903887789991296503619270710889264105230924783917373501229" + "84242049956893599220660220465494151061391878857442455775102068370308666194808964" + "12186807790208181588580001688115973056186676199187395200766719214592236720602539" + "59543654165531129517598994005600036651356756905124592682574394648316833262490180" + "38242408242314523061409638057007025513877026817851630690255137032340538021450190" + "15374029509942262995779647427138157363801729873940704242179972266962979939312706" + "93574724049338653087975872169964512944649188377115670167859880498183889678413493" + "83140140731664727653276359192335112333893387095132090592721854713289754707978913" + "84445466676192702885533423429899321803769154973340267546758873236778342916191810" + "43011609169526554785973289176354555674286387746398710191243175425588830120677921" + "02803412068797591430812833072303008834947057924965910058600123415617574132724659" + "43068435465211135021544341539955381856522750221424566440006276183303206472725721" + "97515290827856842132079598863896727711955221881904660395700977470651261950527893" + "22960889314056254334425523920620303439417773579455921259019925591148440242390125" + "54259003129537051922061506434583787873002035414421785758013236451660709914383145" + "00498589668857722214865288216941812704886075897220321666312837832915676307498729" + "85746389282693735098407780493950049339987626475507031622161390348452994249172483" + "73406136622638349368111684167056925214751383930638455371862687797328895558871634" + "429756244755392366369488877823890174981027"; +static const char* pi = + "3.141592653589793238462643383279502884197169399375105820974944592307816406286208" + "99862803482534211706798214808651328230664709384460955058223172535940812848111745" + "02841027019385211055596446229489549303819644288109756659334461284756482337867831" + "65271201909145648566923460348610454326648213393607260249141273724587006606315588" + "17488152092096282925409171536436789259036001133053054882046652138414695194151160" + "94330572703657595919530921861173819326117931051185480744623799627495673518857527" + "24891227938183011949129833673362440656643086021394946395224737190702179860943702" + "77053921717629317675238467481846766940513200056812714526356082778577134275778960" + "91736371787214684409012249534301465495853710507922796892589235420199561121290219" + "60864034418159813629774771309960518707211349999998372978049951059731732816096318" + "59502445945534690830264252230825334468503526193118817101000313783875288658753320" + "83814206171776691473035982534904287554687311595628638823537875937519577818577805" + "32171226806613001927876611195909216420198938095257201065485863278865936153381827" + "96823030195203530185296899577362259941389124972177528347913151557485724245415069" + "59508295331168617278558890750983817546374649393192550604009277016711390098488240" + "12858361603563707660104710181942955596198946767837449448255379774726847104047534" + "64620804668425906949129331367702898915210475216205696602405803815019351125338243" + "00355876402474964732639141992726042699227967823547816360093417216412199245863150" + "30286182974555706749838505494588586926995690927210797509302955321165344987202755" + "96023648066549911988183479775356636980742654252786255181841757467289097777279380" + "00816470600161452491921732172147723501414419735685481613611573525521334757418494" + "68438523323907394143334547762416862518983569485562099219222184272550254256887671" + "79049460165346680498862723279178608578438382796797668145410095388378636095068006" + "42251252051173929848960841284886269456042419652850222106611863067442786220391949" + "45047123713786960956364371917287467764657573962413890865832645995813390478027590" + "09946576407895126946839835259570982582262052248940772671947826848260147699090264" + "01363944374553050682034962524517493996514314298091906592509372216964615157098583" + "87410597885959772975498930161753928468138268683868942774155991855925245953959431" + "04997252468084598727364469584865383673622262609912460805124388439045124413654976" + "27807977156914359977001296160894416948685558484063534220722258284886481584560285" + "06016842739452267467678895252138522549954666727823986456596116354886230577456498" + "03559363456817432411251507606947945109659609402522887971089314566913686722874894" + "05601015033086179286809208747609178249385890097149096759852613655497818931297848" + "21682998948722658804857564014270477555132379641451523746234364542858444795265867" + "82105114135473573952311342716610213596953623144295248493718711014576540359027993" + "44037420073105785390621983874478084784896833214457138687519435064302184531910484" + "81005370614680674919278191197939952061419663428754440643745123718192179998391015" + "91956181467514269123974894090718649423196"; +static const char* e = + "2.718281828459045235360287471352662497757247093699959574966967627724076630353547" + "59457138217852516642742746639193200305992181741359662904357290033429526059563073" + "81323286279434907632338298807531952510190115738341879307021540891499348841675092" + "44761460668082264800168477411853742345442437107539077744992069551702761838606261" + "33138458300075204493382656029760673711320070932870912744374704723069697720931014" + "16928368190255151086574637721112523897844250569536967707854499699679468644549059" + "87931636889230098793127736178215424999229576351482208269895193668033182528869398" + "49646510582093923982948879332036250944311730123819706841614039701983767932068328" + "23764648042953118023287825098194558153017567173613320698112509961818815930416903" + "51598888519345807273866738589422879228499892086805825749279610484198444363463244" + "96848756023362482704197862320900216099023530436994184914631409343173814364054625" + "31520961836908887070167683964243781405927145635490613031072085103837505101157477" + "04171898610687396965521267154688957035035402123407849819334321068170121005627880" + "23519303322474501585390473041995777709350366041699732972508868769664035557071622" + "68447162560798826517871341951246652010305921236677194325278675398558944896970964" + "09754591856956380236370162112047742722836489613422516445078182442352948636372141" + "74023889344124796357437026375529444833799801612549227850925778256209262264832627" + "79333865664816277251640191059004916449982893150566047258027786318641551956532442" + "58698294695930801915298721172556347546396447910145904090586298496791287406870504" + "89585867174798546677575732056812884592054133405392200011378630094556068816674001" + "69842055804033637953764520304024322566135278369511778838638744396625322498506549" + "95886234281899707733276171783928034946501434558897071942586398772754710962953741" + "52111513683506275260232648472870392076431005958411661205452970302364725492966693" + "81151373227536450988890313602057248176585118063036442812314965507047510254465011" + "72721155519486685080036853228183152196003735625279449515828418829478761085263981" + "39559900673764829224437528718462457803619298197139914756448826260390338144182326" + "25150974827987779964373089970388867782271383605772978824125611907176639465070633" + "04527954661855096666185664709711344474016070462621568071748187784437143698821855" + "96709591025968620023537185887485696522000503117343920732113908032936344797273559" + "55277349071783793421637012050054513263835440001863239914907054797780566978533580" + "48966906295119432473099587655236812859041383241160722602998330535370876138939639" + "17795745401613722361878936526053815584158718692553860616477983402543512843961294" + "60352913325942794904337299085731580290958631382683291477116396337092400316894586" + "36060645845925126994655724839186564209752685082307544254599376917041977780085362" + "73094171016343490769642372229435236612557250881477922315197477806056967253801718" + "07763603462459278778465850656050780844211529697521890874019660906651803516501792" + "50461950136658543663271254963990854914420001457476081930221206602433009641270489" + "43903971771951806990869986066365832322787"; + +template <class T> +inline bool is_mpfr(const T&) +{ + return false; +} +#if defined(TEST_MPFR_50) +template <unsigned N, boost::multiprecision::expression_template_option ET> +inline bool is_mpfr(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<N>, ET>&) +{ + return true; +} +#endif + +template <class T> +void test() +{ + typedef typename T::backend_type backend_type; + T num, expect; + num.backend() = boost::multiprecision::default_ops::get_constant_pi<backend_type>(); + expect = static_cast<T>(pi); + BOOST_CHECK_CLOSE_FRACTION(num, expect, std::numeric_limits<T>::epsilon() * (is_mpfr(num) ? 1200 : 2)); + num.backend() = boost::multiprecision::default_ops::get_constant_ln2<backend_type>(); + expect = static_cast<T>(ln2); + BOOST_CHECK_CLOSE_FRACTION(num, expect, std::numeric_limits<T>::epsilon() * (is_mpfr(num) ? 30 : 1)); + num.backend() = boost::multiprecision::default_ops::get_constant_e<backend_type>(); + expect = static_cast<T>(e); + BOOST_CHECK_CLOSE_FRACTION(num, expect, std::numeric_limits<T>::epsilon() * (is_mpfr(num) ? 2 : 1)); +} + +int main() +{ +#ifdef TEST_MPFR_50 + test<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<2000> > >(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<2000> > >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::number<boost::multiprecision::gmp_float<2000> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_constexpr.cpp b/src/boost/libs/multiprecision/test/test_constexpr.cpp new file mode 100644 index 00000000..2b810279 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_constexpr.cpp @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#if defined(HAVE_FLOAT128) +#include <boost/multiprecision/float128.hpp> +#endif + +#ifndef BOOST_NO_CXX11_CONSTEXPR + +template <class T> +void silence_unused(const T&) {} + +template <class T> +void test1() +{ + constexpr T i1 = 2u; + constexpr T i2; + constexpr T i3 = -3; + constexpr T i4(i1); + + silence_unused(i1); + silence_unused(i2); + silence_unused(i3); + silence_unused(i4); +} +template <class T> +void test2() +{ + constexpr T i1 = 2u; + constexpr T i2; + constexpr T i3 = -3; + + silence_unused(i1); + silence_unused(i2); + silence_unused(i3); +} +template <class T> +void test3() +{ + constexpr T i1 = 2u; + constexpr T i2; + + silence_unused(i1); + silence_unused(i2); +} + +using namespace boost::multiprecision; + +template void test1<number<cpp_int_backend<64, 64, unsigned_magnitude, unchecked, void>, et_off> >(); +template void test1<number<cpp_int_backend<64, 64, signed_magnitude, unchecked, void>, et_off> >(); +template void test3<number<cpp_int_backend<2048, 2048, unsigned_magnitude, unchecked, void>, et_off> >(); +template void test2<number<cpp_int_backend<2048, 2048, signed_magnitude, unchecked, void>, et_off> >(); + +#if defined(HAVE_FLOAT128) +template void test1<float128>(); +#endif + +#endif diff --git a/src/boost/libs/multiprecision/test/test_convert_from_cpp_bin_float.cpp b/src/boost/libs/multiprecision/test/test_convert_from_cpp_bin_float.cpp new file mode 100644 index 00000000..a30bf08a --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_cpp_bin_float.cpp @@ -0,0 +1,184 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "test.hpp" + +#if defined(HAS_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random() +{ + typedef int e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(-20, 20); + return ldexp(val, ui(gen)); +} + +template <class From, class To> +void test_convert_neg_int(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t3)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t4)); +} +template <class From, class To> +void test_convert_neg_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_integer> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t1)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t2)); + test_convert_neg_int<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(t3), from); + BOOST_CHECK_EQUAL(From(t4), from); +} +template <class From, class To> +void test_convert_rat_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_rational> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(t1), from); + BOOST_CHECK_EQUAL(From(t2), from); + test_convert_neg_rat<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + To answer(from.str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol); +} +template <class From, class To> +void test_convert_neg_float(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + To answer(from.str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol); + test_convert_neg_float<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + test_convert<cpp_bin_float_50, cpp_int>(); + test_convert<cpp_bin_float_50, int128_t>(); + test_convert<cpp_bin_float_50, uint128_t>(); + test_convert<cpp_bin_float_quad, checked_int1024_t>(); + test_convert<cpp_bin_float_quad, checked_uint1024_t>(); + + test_convert<cpp_bin_float_50, cpp_rational>(); + + test_convert<cpp_bin_float_50, cpp_dec_float_50>(); + +#if defined(HAS_GMP) + test_convert<cpp_bin_float_50, mpz_int>(); + test_convert<cpp_bin_float_50, mpq_rational>(); + test_convert<cpp_bin_float_50, mpf_float_50>(); +#endif +#if defined(HAS_MPFR) + test_convert<cpp_bin_float_50, mpfr_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<cpp_bin_float_50, mpfi_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<cpp_bin_float_50, tom_int>(); + test_convert<cpp_bin_float_50, tom_rational>(); +#endif +#ifdef HAS_FLOAT128 + test_convert<cpp_bin_float_50, float128>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_convert_from_cpp_dec_float.cpp b/src/boost/libs/multiprecision/test/test_convert_from_cpp_dec_float.cpp new file mode 100644 index 00000000..fd599a1e --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_cpp_dec_float.cpp @@ -0,0 +1,184 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "test.hpp" + +#if defined(HAS_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random() +{ + typedef int e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(-20, 20); + return ldexp(val, ui(gen)); +} + +template <class From, class To> +void test_convert_neg_int(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t3)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t4)); +} +template <class From, class To> +void test_convert_neg_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_integer> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t1)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t2)); + test_convert_neg_int<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + From tol = std::numeric_limits<From>::epsilon(); + BOOST_CHECK_CLOSE_FRACTION(From(t3), from, tol); + BOOST_CHECK_CLOSE_FRACTION(From(t4), from, tol); +} +template <class From, class To> +void test_convert_rat_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_rational> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + From tol = std::numeric_limits<From>::epsilon(); + BOOST_CHECK_CLOSE_FRACTION(From(t1), from, tol); + BOOST_CHECK_CLOSE_FRACTION(From(t2), from, tol); + test_convert_neg_rat<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + To answer(from.str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol); +} +template <class From, class To> +void test_convert_neg_float(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + To answer(from.str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol); + test_convert_neg_float<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + test_convert<cpp_dec_float_50, cpp_int>(); + test_convert<cpp_dec_float_50, int128_t>(); + test_convert<cpp_dec_float_50, uint128_t>(); + + test_convert<cpp_dec_float_50, cpp_rational>(); + + test_convert<cpp_dec_float_50, cpp_bin_float_50>(); + +#if defined(HAS_GMP) + test_convert<cpp_dec_float_50, mpz_int>(); + test_convert<cpp_dec_float_50, mpq_rational>(); + test_convert<cpp_dec_float_50, mpf_float_50>(); +#endif +#if defined(HAS_MPFR) + test_convert<cpp_dec_float_50, mpfr_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<cpp_dec_float_50, mpfi_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<cpp_dec_float_50, tom_int>(); + test_convert<cpp_dec_float_50, tom_rational>(); +#endif +#ifdef HAS_FLOAT128 + test_convert<cpp_dec_float_50, float128>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_convert_from_cpp_int.cpp b/src/boost/libs/multiprecision/test/test_convert_from_cpp_int.cpp new file mode 100644 index 00000000..63dfdd7b --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_cpp_int.cpp @@ -0,0 +1,226 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include "test.hpp" + +#if defined(HAS_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class From, class To> +void test_convert_neg_int(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t3.str()); + BOOST_CHECK_EQUAL(from.str(), t4.str()); +} +template <class From, class To> +void test_convert_neg_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_integer> const&, boost::mpl::int_<number_kind_integer> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t1.str()); + BOOST_CHECK_EQUAL(from.str(), t2.str()); + test_convert_neg_int<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), numerator(t3).str()); + BOOST_CHECK_EQUAL(from.str(), numerator(t4).str()); +} +template <class From, class To> +void test_convert_neg_rat(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_integer> const&, boost::mpl::int_<number_kind_rational> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), numerator(t1).str()); + BOOST_CHECK_EQUAL(from.str(), numerator(t2).str()); + test_convert_neg_rat<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + To check(from.str() + ".0"); + BOOST_CHECK_EQUAL(t3, check); + BOOST_CHECK_EQUAL(t4, check); +} +template <class From, class To> +void test_convert_neg_float(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_integer> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + To check(from.str() + ".0"); + BOOST_CHECK_EQUAL(t1, check); + BOOST_CHECK_EQUAL(t2, check); + test_convert_neg_float<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + test_convert<cpp_int, int128_t>(); + test_convert<int128_t, cpp_int>(); + + test_convert<cpp_int, cpp_rational>(); + test_convert<int128_t, cpp_rational>(); + test_convert<uint128_t, cpp_rational>(); + + test_convert<cpp_int, cpp_bin_float_50>(); + test_convert<int128_t, cpp_bin_float_50>(); + test_convert<uint128_t, cpp_bin_float_50>(); + + test_convert<cpp_int, cpp_dec_float_50>(); + test_convert<int128_t, cpp_dec_float_50>(); + test_convert<uint128_t, cpp_dec_float_50>(); + +#if defined(HAS_GMP) + test_convert<cpp_int, mpz_int>(); + test_convert<int128_t, mpz_int>(); + test_convert<uint128_t, mpz_int>(); + + test_convert<cpp_int, mpq_rational>(); + test_convert<int128_t, mpq_rational>(); + test_convert<uint128_t, mpq_rational>(); + + test_convert<cpp_int, mpf_float_50>(); + test_convert<int128_t, mpf_float_50>(); + test_convert<uint128_t, mpf_float_50>(); +#endif +#if defined(HAS_MPFR) + test_convert<cpp_int, mpfr_float_50>(); + test_convert<int128_t, mpfr_float_50>(); + test_convert<uint128_t, mpfr_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<cpp_int, mpfi_float_50>(); + test_convert<int128_t, mpfi_float_50>(); + test_convert<uint128_t, mpfi_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<cpp_int, tom_int>(); + test_convert<int128_t, tom_int>(); + test_convert<uint128_t, tom_int>(); + + test_convert<cpp_int, tom_rational>(); + test_convert<int128_t, tom_rational>(); + test_convert<uint128_t, tom_rational>(); +#endif +#ifdef HAS_FLOAT128 + test_convert<cpp_int, float128>(); + test_convert<int128_t, float128>(); + test_convert<uint128_t, float128>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_convert_from_cpp_rational.cpp b/src/boost/libs/multiprecision/test/test_convert_from_cpp_rational.cpp new file mode 100644 index 00000000..16b89996 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_cpp_rational.cpp @@ -0,0 +1,209 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include "test.hpp" + +#if defined(HAS_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random_int(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class T> +T generate_random(unsigned bits_wanted) +{ + typedef typename component_type<T>::type int_type; + T val(generate_random_int<int_type>(bits_wanted), generate_random_int<int_type>(bits_wanted)); + return val; +} + +template <class From, class To> +void test_convert_neg_val(From from, const boost::mpl::true_&) +{ + from = -from; + typename component_type<From>::type answer = numerator(from) / denominator(from); + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(answer.str(), t3.str()); + BOOST_CHECK_EQUAL(answer.str(), t4.str()); +} +template <class From, class To> +void test_convert_neg_val(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_rational> const&, boost::mpl::int_<number_kind_integer> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + typename component_type<From>::type answer = numerator(from) / denominator(from); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(answer.str(), t1.str()); + BOOST_CHECK_EQUAL(answer.str(), t2.str()); + test_convert_neg_val<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float_val(From from, To const& tol, const boost::mpl::true_&) +{ + from = -from; + To answer = To(numerator(from)) / To(denominator(from)); + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_CLOSE_FRACTION(answer, t3, tol); + BOOST_CHECK_CLOSE_FRACTION(answer, t4, tol); +} +template <class From, class To> +void test_convert_neg_float_val(From const&, To const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_rational> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To answer = To(numerator(from)) / To(denominator(from)); + To t1(from); + To t2 = from.template convert_to<To>(); + To tol = std::numeric_limits<To>::is_specialized ? std::numeric_limits<To>::epsilon() : ldexp(To(1), 1 - bits_wanted); + tol *= 2; + BOOST_CHECK_CLOSE_FRACTION(answer, t1, tol); + BOOST_CHECK_CLOSE_FRACTION(answer, t2, tol); + test_convert_neg_float_val<From, To>(from, tol, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat_val(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t3.str()); + BOOST_CHECK_EQUAL(from.str(), t4.str()); +} +template <class From, class To> +void test_convert_neg_rat_val(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_rational> const&, boost::mpl::int_<number_kind_rational> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t1.str()); + BOOST_CHECK_EQUAL(from.str(), t2.str()); + test_convert_neg_rat_val<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + test_convert<cpp_rational, cpp_int>(); + test_convert<cpp_rational, int128_t>(); + test_convert<cpp_rational, uint128_t>(); + + test_convert<cpp_rational, cpp_bin_float_50>(); + + test_convert<cpp_rational, cpp_dec_float_50>(); + +#if defined(HAS_GMP) + test_convert<cpp_rational, mpz_int>(); + test_convert<cpp_rational, mpq_rational>(); + test_convert<cpp_rational, mpf_float_50>(); +#endif +#if defined(HAS_MPFR) + test_convert<cpp_rational, mpfr_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<cpp_rational, mpfi_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<cpp_rational, tom_int>(); + test_convert<cpp_rational, tom_rational>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_convert_from_float128.cpp b/src/boost/libs/multiprecision/test/test_convert_from_float128.cpp new file mode 100644 index 00000000..bbe250d4 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_float128.cpp @@ -0,0 +1,198 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#ifdef HAS_FLOAT128 + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "test.hpp" + +#if defined(HAS_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random() +{ + typedef int e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(-20, 20); + return ldexp(val, ui(gen)); +} + +template <class From, class To> +void test_convert_neg_int(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t3)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t4)); +} +template <class From, class To> +void test_convert_neg_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_integer> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t1)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t2)); + test_convert_neg_int<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(t3), from); + BOOST_CHECK_EQUAL(From(t4), from); +} +template <class From, class To> +void test_convert_rat_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_rational> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(t1), from); + BOOST_CHECK_EQUAL(From(t2), from); + test_convert_neg_rat<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + To answer(from.str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol); +} +template <class From, class To> +void test_convert_neg_float(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + To answer(from.str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol); + test_convert_neg_float<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + // + // Some basic sanity checks first: + // + BOOST_CHECK_EQUAL(std::numeric_limits<float128>::epsilon(), float128("1.92592994438723585305597794258492732e-34")); + BOOST_CHECK_EQUAL((std::numeric_limits<float128>::min)(), float128("3.36210314311209350626267781732175260e-4932")); + BOOST_CHECK_EQUAL((std::numeric_limits<float128>::max)(), float128("1.18973149535723176508575932662800702e4932")); + BOOST_CHECK_EQUAL((std::numeric_limits<float128>::denorm_min)(), float128("6.475175119438025110924438958227646552e-4966")); + BOOST_CHECK((boost::math::isinf)((std::numeric_limits<float128>::infinity)())); + BOOST_CHECK((std::numeric_limits<float128>::infinity)() > 0); + BOOST_CHECK((boost::math::isnan)((std::numeric_limits<float128>::quiet_NaN)())); + + test_convert<float128, cpp_int>(); + test_convert<float128, int128_t>(); + test_convert<float128, uint128_t>(); + + test_convert<float128, cpp_rational>(); + + test_convert<float128, cpp_dec_float_50>(); + +#if defined(HAS_GMP) + test_convert<float128, mpz_int>(); + test_convert<float128, mpq_rational>(); + test_convert<float128, mpf_float_50>(); +#endif +#if defined(HAS_MPFR) + test_convert<float128, mpfr_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<float128, mpfi_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<float128, tom_int>(); + test_convert<float128, tom_rational>(); +#endif + return boost::report_errors(); +} + +#else + +int main() { return 0; } + +#endif diff --git a/src/boost/libs/multiprecision/test/test_convert_from_gmp_rational.cpp b/src/boost/libs/multiprecision/test/test_convert_from_gmp_rational.cpp new file mode 100644 index 00000000..8b2c9ebb --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_gmp_rational.cpp @@ -0,0 +1,213 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if defined(HAS_GMP) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include "test.hpp" +#include <boost/multiprecision/gmp.hpp> + +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random_int(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class T> +T generate_random(unsigned bits_wanted) +{ + typedef typename component_type<T>::type int_type; + T val(generate_random_int<int_type>(bits_wanted), generate_random_int<int_type>(bits_wanted)); + return val; +} + +template <class From, class To> +void test_convert_neg_val(From from, const boost::mpl::true_&) +{ + from = -from; + typename component_type<From>::type answer = numerator(from) / denominator(from); + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(answer.str(), t3.str()); + BOOST_CHECK_EQUAL(answer.str(), t4.str()); +} +template <class From, class To> +void test_convert_neg_val(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_rational> const&, boost::mpl::int_<number_kind_integer> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + typename component_type<From>::type answer = numerator(from) / denominator(from); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(answer.str(), t1.str()); + BOOST_CHECK_EQUAL(answer.str(), t2.str()); + test_convert_neg_val<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float_val(From from, To const& tol, const boost::mpl::true_&) +{ + from = -from; + To answer = To(numerator(from)) / To(denominator(from)); + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_CLOSE_FRACTION(answer, t3, tol); + BOOST_CHECK_CLOSE_FRACTION(answer, t4, tol); +} +template <class From, class To> +void test_convert_neg_float_val(From const&, To const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_rational> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To answer = To(numerator(from)) / To(denominator(from)); + To t1(from); + To t2 = from.template convert_to<To>(); + To tol = std::numeric_limits<To>::is_specialized ? std::numeric_limits<To>::epsilon() : ldexp(To(1), 1 - bits_wanted); + tol *= 2; + BOOST_CHECK_CLOSE_FRACTION(answer, t1, tol); + BOOST_CHECK_CLOSE_FRACTION(answer, t2, tol); + test_convert_neg_float_val<From, To>(from, tol, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat_val(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t3.str()); + BOOST_CHECK_EQUAL(from.str(), t4.str()); +} +template <class From, class To> +void test_convert_neg_rat_val(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_rational> const&, boost::mpl::int_<number_kind_rational> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t1.str()); + BOOST_CHECK_EQUAL(from.str(), t2.str()); + test_convert_neg_rat_val<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + test_convert<mpq_rational, cpp_int>(); + test_convert<mpq_rational, int128_t>(); + test_convert<mpq_rational, uint128_t>(); + test_convert<mpq_rational, cpp_rational>(); + + test_convert<mpq_rational, cpp_bin_float_50>(); + + test_convert<mpq_rational, cpp_dec_float_50>(); + + test_convert<mpq_rational, mpz_int>(); + test_convert<mpq_rational, mpf_float_50>(); +#if defined(HAS_MPFR) + test_convert<mpq_rational, mpfr_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<mpq_rational, mpfi_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<mpq_rational, tom_int>(); + test_convert<mpq_rational, tom_rational>(); +#endif + return boost::report_errors(); +} + +#else + +int main() { return 0; } + +#endif diff --git a/src/boost/libs/multiprecision/test/test_convert_from_mpf_float.cpp b/src/boost/libs/multiprecision/test/test_convert_from_mpf_float.cpp new file mode 100644 index 00000000..f898bfbe --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_mpf_float.cpp @@ -0,0 +1,189 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if defined(HAS_GMP) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "test.hpp" + +#if defined(HAS_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random() +{ + typedef int e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(-20, 20); + return ldexp(val, ui(gen)); +} + +template <class From, class To> +void test_convert_neg_int(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t3)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t4)); +} +template <class From, class To> +void test_convert_neg_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_integer> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t1)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t2)); + test_convert_neg_int<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + From tol = std::numeric_limits<From>::epsilon(); + BOOST_CHECK_CLOSE_FRACTION(From(t3), from, tol); + BOOST_CHECK_CLOSE_FRACTION(From(t4), from, tol); +} +template <class From, class To> +void test_convert_rat_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_rational> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + From tol = std::numeric_limits<From>::epsilon(); + BOOST_CHECK_CLOSE_FRACTION(From(t1), from, tol); + BOOST_CHECK_CLOSE_FRACTION(From(t2), from, tol); + test_convert_neg_rat<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + To answer(from.str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol); +} +template <class From, class To> +void test_convert_neg_float(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + To answer(from.str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol); + test_convert_neg_float<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + test_convert<mpf_float_50, cpp_int>(); + test_convert<mpf_float_50, int128_t>(); + test_convert<mpf_float_50, uint128_t>(); + + test_convert<mpf_float_50, cpp_rational>(); + + test_convert<mpf_float_50, cpp_dec_float_50>(); + + test_convert<mpf_float_50, mpz_int>(); + test_convert<mpf_float_50, mpq_rational>(); +#if defined(HAS_MPFR) + test_convert<mpf_float_50, mpfr_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<mpf_float_50, mpfi_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<mpf_float_50, tom_int>(); + test_convert<mpf_float_50, tom_rational>(); +#endif +#ifdef HAS_FLOAT128 + test_convert<mpf_float_50, float128>(); +#endif + return boost::report_errors(); +} + +#else + +int main() { return 0; } + +#endif diff --git a/src/boost/libs/multiprecision/test/test_convert_from_mpfi_float.cpp b/src/boost/libs/multiprecision/test/test_convert_from_mpfi_float.cpp new file mode 100644 index 00000000..b7a24585 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_mpfi_float.cpp @@ -0,0 +1,196 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if defined(HAS_MPFI) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "test.hpp" + +#if defined(HAS_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random() +{ + typedef int e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + int digits_so_far = 0; + while (digits_so_far < std::numeric_limits<T>::digits) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + digits_so_far += std::numeric_limits<boost::random::mt19937::result_type>::digits; + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(-20, 20); + return ldexp(val, ui(gen)); +} + +template <class From, class To> +void test_convert_neg_int(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t3)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t4)); +} +template <class From, class To> +void test_convert_neg_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_integer> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t1)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t2)); + test_convert_neg_int<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(t3), median(from)); + BOOST_CHECK_EQUAL(From(t4), median(from)); +} +template <class From, class To> +void test_convert_rat_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_rational> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(t1), median(from)); + BOOST_CHECK_EQUAL(From(t2), median(from)); + test_convert_neg_rat<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + To answer(median(from).str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol); +} +template <class From, class To> +void test_convert_neg_float(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + To answer(median(from).str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol); + test_convert_neg_float<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + try + { + test_convert<mpfi_float_50, cpp_int>(); + test_convert<mpfi_float_50, int128_t>(); + test_convert<mpfi_float_50, uint128_t>(); + + test_convert<mpfi_float_50, cpp_rational>(); + + test_convert<mpfi_float_50, cpp_dec_float_50>(); + +#if defined(HAS_GMP) + test_convert<mpfi_float_50, mpz_int>(); + test_convert<mpfi_float_50, mpq_rational>(); + test_convert<mpfi_float_50, mpf_float_50>(); +#endif +#if defined(HAS_MPFR) + test_convert<mpfi_float_50, mpfr_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<mpfi_float_50, tom_int>(); + test_convert<mpfi_float_50, tom_rational>(); +#endif +#ifdef HAS_FLOAT128 + test_convert<mpfi_float_50, float128>(); +#endif + } + catch (...) + { + return 1; + } + return boost::report_errors(); +} + +#else + +int main() { return 0; } + +#endif diff --git a/src/boost/libs/multiprecision/test/test_convert_from_mpfr_float.cpp b/src/boost/libs/multiprecision/test/test_convert_from_mpfr_float.cpp new file mode 100644 index 00000000..216afaad --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_mpfr_float.cpp @@ -0,0 +1,187 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if defined(HAS_MPFR) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "test.hpp" + +#if defined(HAS_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random() +{ + typedef int e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(-20, 20); + return ldexp(val, ui(gen)); +} + +template <class From, class To> +void test_convert_neg_int(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t3)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t4)); +} +template <class From, class To> +void test_convert_neg_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_integer> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t1)); + BOOST_CHECK_EQUAL(From(trunc(from)), From(t2)); + test_convert_neg_int<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(t3), from); + BOOST_CHECK_EQUAL(From(t4), from); +} +template <class From, class To> +void test_convert_rat_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_rational> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(From(t1), from); + BOOST_CHECK_EQUAL(From(t2), from); + test_convert_neg_rat<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + To answer(from.str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t3, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t4, answer, tol); +} +template <class From, class To> +void test_convert_neg_float(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_floating_point> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(); + To t1(from); + To t2 = from.template convert_to<To>(); + To answer(from.str()); + To tol = (std::max)(std::numeric_limits<To>::epsilon(), To(std::numeric_limits<From>::epsilon())) * 2; + BOOST_CHECK_CLOSE_FRACTION(t1, answer, tol); + BOOST_CHECK_CLOSE_FRACTION(t2, answer, tol); + test_convert_neg_float<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + test_convert<mpfr_float_50, cpp_int>(); + test_convert<mpfr_float_50, int128_t>(); + test_convert<mpfr_float_50, uint128_t>(); + + test_convert<mpfr_float_50, cpp_rational>(); + + test_convert<mpfr_float_50, cpp_dec_float_50>(); + +#if defined(HAS_GMP) + test_convert<mpfr_float_50, mpz_int>(); + test_convert<mpfr_float_50, mpq_rational>(); + test_convert<mpfr_float_50, mpf_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<mpfr_float_50, mpfi_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<mpfr_float_50, tom_int>(); + test_convert<mpfr_float_50, tom_rational>(); +#endif +#ifdef HAS_FLOAT128 + test_convert<mpfr_float_50, float128>(); +#endif + return boost::report_errors(); +} + +#else + +int main() { return 0; } + +#endif diff --git a/src/boost/libs/multiprecision/test/test_convert_from_mpz_int.cpp b/src/boost/libs/multiprecision/test/test_convert_from_mpz_int.cpp new file mode 100644 index 00000000..d1c74344 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_mpz_int.cpp @@ -0,0 +1,205 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if defined(HAS_GMP) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/multiprecision/gmp.hpp> +#include "test.hpp" + +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class From, class To> +void test_convert_neg_int(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t3.str()); + BOOST_CHECK_EQUAL(from.str(), t4.str()); +} +template <class From, class To> +void test_convert_neg_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_integer> const&, boost::mpl::int_<number_kind_integer> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t1.str()); + BOOST_CHECK_EQUAL(from.str(), t2.str()); + test_convert_neg_int<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), numerator(t3).str()); + BOOST_CHECK_EQUAL(from.str(), numerator(t4).str()); +} +template <class From, class To> +void test_convert_neg_rat(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_integer> const&, boost::mpl::int_<number_kind_rational> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), numerator(t1).str()); + BOOST_CHECK_EQUAL(from.str(), numerator(t2).str()); + test_convert_neg_rat<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + To check(from.str() + ".0"); + BOOST_CHECK_EQUAL(t3, check); + BOOST_CHECK_EQUAL(t4, check); +} +template <class From, class To> +void test_convert_neg_float(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_integer> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + To check(from.str() + ".0"); + BOOST_CHECK_EQUAL(t1, check); + BOOST_CHECK_EQUAL(t2, check); + test_convert_neg_float<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + + test_convert<mpz_int, cpp_int>(); + test_convert<mpz_int, int128_t>(); + test_convert<mpz_int, uint128_t>(); + test_convert<mpz_int, cpp_rational>(); + + test_convert<mpz_int, cpp_dec_float_50>(); + test_convert<mpz_int, cpp_bin_float_50>(); + test_convert<mpz_int, mpq_rational>(); + test_convert<mpz_int, mpf_float_50>(); + +#if defined(HAS_MPFR) + test_convert<mpz_int, mpfr_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<mpz_int, mpfi_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<mpz_int, tom_int>(); + + test_convert<mpz_int, tom_rational>(); +#endif +#ifdef HAS_FLOAT128 + test_convert<mpz_int, float128>(); +#endif + return boost::report_errors(); +} + +#else + +int main() { return 0; } + +#endif diff --git a/src/boost/libs/multiprecision/test/test_convert_from_tom_int.cpp b/src/boost/libs/multiprecision/test/test_convert_from_tom_int.cpp new file mode 100644 index 00000000..e13b3e04 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_tom_int.cpp @@ -0,0 +1,211 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#ifdef HAS_TOMMATH + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/multiprecision/tommath.hpp> +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include "test.hpp" + +#if defined(HAS_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class From, class To> +void test_convert_neg_int(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t3.str()); + BOOST_CHECK_EQUAL(from.str(), t4.str()); +} +template <class From, class To> +void test_convert_neg_int(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_integer> const&, boost::mpl::int_<number_kind_integer> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t1.str()); + BOOST_CHECK_EQUAL(from.str(), t2.str()); + test_convert_neg_int<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), numerator(t3).str()); + BOOST_CHECK_EQUAL(from.str(), numerator(t4).str()); +} +template <class From, class To> +void test_convert_neg_rat(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_integer> const&, boost::mpl::int_<number_kind_rational> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), numerator(t1).str()); + BOOST_CHECK_EQUAL(from.str(), numerator(t2).str()); + test_convert_neg_rat<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + To check(from.str() + ".0"); + BOOST_CHECK_EQUAL(t3, check); + BOOST_CHECK_EQUAL(t4, check); +} +template <class From, class To> +void test_convert_neg_float(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_integer> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + To check(from.str() + ".0"); + BOOST_CHECK_EQUAL(t1, check); + BOOST_CHECK_EQUAL(t2, check); + test_convert_neg_float<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + test_convert<tom_int, cpp_int>(); + test_convert<tom_int, int128_t>(); + test_convert<tom_int, uint128_t>(); + + test_convert<tom_int, cpp_dec_float_50>(); + + test_convert<tom_int, cpp_rational>(); + + test_convert<tom_int, cpp_bin_float_50>(); + +#if defined(HAS_GMP) + test_convert<tom_int, mpz_int>(); + + test_convert<tom_int, mpq_rational>(); + + test_convert<tom_int, mpf_float_50>(); +#endif +#if defined(HAS_MPFR) + test_convert<tom_int, mpfr_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<tom_int, mpfi_float_50>(); +#endif +#ifdef HAS_TOMMATH + test_convert<tom_int, tom_int>(); + + test_convert<tom_int, tom_rational>(); +#endif +#ifdef HAS_FLOAT128 + test_convert<tom_int, float128>(); +#endif + return boost::report_errors(); +} + +#else + +int main() { return 0; } + +#endif diff --git a/src/boost/libs/multiprecision/test/test_convert_from_tom_rational.cpp b/src/boost/libs/multiprecision/test/test_convert_from_tom_rational.cpp new file mode 100644 index 00000000..3b1432e5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_convert_from_tom_rational.cpp @@ -0,0 +1,213 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#ifdef HAS_TOMMATH +#include <boost/multiprecision/tommath.hpp> + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include "test.hpp" + +#if defined(HAS_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(HAS_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(HAS_MPFI) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef HAS_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> + +using namespace boost::multiprecision; + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +T generate_random_int(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class T> +T generate_random(unsigned bits_wanted) +{ + typedef typename component_type<T>::type int_type; + T val(generate_random_int<int_type>(bits_wanted), generate_random_int<int_type>(bits_wanted)); + return val; +} + +template <class From, class To> +void test_convert_neg_val(From from, const boost::mpl::true_&) +{ + from = -from; + typename component_type<From>::type answer = numerator(from) / denominator(from); + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(answer.str(), t3.str()); + BOOST_CHECK_EQUAL(answer.str(), t4.str()); +} +template <class From, class To> +void test_convert_neg_val(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_rational> const&, boost::mpl::int_<number_kind_integer> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + typename component_type<From>::type answer = numerator(from) / denominator(from); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(answer.str(), t1.str()); + BOOST_CHECK_EQUAL(answer.str(), t2.str()); + test_convert_neg_val<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_float_val(From from, To const& tol, const boost::mpl::true_&) +{ + from = -from; + To answer = To(numerator(from)) / To(denominator(from)); + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_CLOSE_FRACTION(answer, t3, tol); + BOOST_CHECK_CLOSE_FRACTION(answer, t4, tol); +} +template <class From, class To> +void test_convert_neg_float_val(From const&, To const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_rational> const&, boost::mpl::int_<number_kind_floating_point> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To answer = To(numerator(from)) / To(denominator(from)); + To t1(from); + To t2 = from.template convert_to<To>(); + To tol = std::numeric_limits<To>::is_specialized ? std::numeric_limits<To>::epsilon() : ldexp(To(1), 1 - bits_wanted); + tol *= 2; + BOOST_CHECK_CLOSE_FRACTION(answer, t1, tol); + BOOST_CHECK_CLOSE_FRACTION(answer, t2, tol); + test_convert_neg_float_val<From, To>(from, tol, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert_neg_rat_val(From from, const boost::mpl::true_&) +{ + from = -from; + To t3(from); + To t4 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t3.str()); + BOOST_CHECK_EQUAL(from.str(), t4.str()); +} +template <class From, class To> +void test_convert_neg_rat_val(From const&, const boost::mpl::false_&) +{ +} + +template <class From, class To> +void test_convert_imp(boost::mpl::int_<number_kind_rational> const&, boost::mpl::int_<number_kind_rational> const&) +{ + int bits_wanted = (std::min)((std::min)(std::numeric_limits<From>::digits, std::numeric_limits<To>::digits), 2000); + + for (unsigned i = 0; i < 100; ++i) + { + From from = generate_random<From>(bits_wanted); + To t1(from); + To t2 = from.template convert_to<To>(); + BOOST_CHECK_EQUAL(from.str(), t1.str()); + BOOST_CHECK_EQUAL(from.str(), t2.str()); + test_convert_neg_rat_val<From, To>(from, boost::mpl::bool_ < std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed > ()); + } +} + +template <class From, class To> +void test_convert() +{ + test_convert_imp<From, To>(typename number_category<From>::type(), typename number_category<To>::type()); +} + +int main() +{ + test_convert<tom_rational, cpp_int>(); + test_convert<tom_rational, int128_t>(); + test_convert<tom_rational, uint128_t>(); + test_convert<tom_rational, cpp_rational>(); + + test_convert<tom_rational, cpp_bin_float_50>(); + + test_convert<tom_rational, cpp_dec_float_50>(); + +#if defined(HAS_GMP) + test_convert<tom_rational, mpz_int>(); + test_convert<tom_rational, mpq_rational>(); + test_convert<tom_rational, mpf_float_50>(); +#endif +#if defined(HAS_MPFR) + test_convert<tom_rational, mpfr_float_50>(); +#endif +#if defined(HAS_MPFI) + test_convert<tom_rational, mpfi_float_50>(); +#endif + test_convert<tom_rational, tom_int>(); + return boost::report_errors(); +} + +#else + +int main() { return 0; } + +#endif diff --git a/src/boost/libs/multiprecision/test/test_cos.cpp b/src/boost/libs/multiprecision/test/test_cos.cpp new file mode 100644 index 00000000..560dcfb8 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cos.cpp @@ -0,0 +1,385 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +//# define TEST_MPF +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFI_50 +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +struct has_poor_large_value_support +{ + static const bool value = false; +}; +#ifdef TEST_CPP_DEC_FLOAT +template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> > +{ + static const bool value = true; +}; +#endif +#ifdef TEST_CPP_BIN_FLOAT +template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates> +struct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> > +{ + static const bool value = true; +}; +#endif + +template <class T> +void test() +{ + std::cout << "Testing type " << typeid(T).name() << std::endl; + static const boost::array<const char*, 101u> data = + {{ + "-2.37609908807915949996042688873953402912174184373388399043229539427530802169622688886435380890546981798452174137747437590e-1", + "8.03406366226813589517543567844755380935198206635917017883860879215939165740799963435747185200486086864198723786516760875e-1", + "8.60219386510802105228997694366289682807721120146423711696179175800635220710279361583231346318224971127450760223168489952e-1", + "-1.36768951513839774357595871594675554406872039078811749027554673949684004409484639336417431285061889554892096426752261915e-1", + "-9.66210139195431691033548069227792927999642647449593184440815029076272297050360196975341458076547426373476590671462150981e-1", + "-6.12007278553856790723803948280976098970972124581361775428331444376106018942231526074915731012122426588769327127413045994e-1", + "4.91927698740873688392439262912409276430264703350691359723802294639643655296838880236042651349290074585311025856549893171e-1", + "9.93232596718899824059271235487971663771012607519717340071654721877802691370866768064059943491135925674950430467047724563e-1", + "2.77789911520199551017947550534057049374212876971194676010301098598339529915403722848373365985645657342475739669568931563e-1", + "-7.77955945956221239101360662190442739163791527953499629555756394261998892874934847131138921705713935365505245406994428077e-1", + "-8.80676278306736581575818642341143682410874043182925227659938804267878718513212454821032629378618345485453587099696563832e-1", + "9.54652155963865007116798560589970996367213754762169439269792747771200843006278637115722685610960738675814993576019945344e-2", + "9.54658201427917718824191302196929158303422390793460018465335986921801519149657723689322277773550748806000948225466432438e-1", + "6.44358700620889799575033272322899136331490664925359198096632560532437137894857803619177106562399406351419810452110265174e-1", + "-4.55304635273050571206400777159475409897339683148730716647371922365967582339285347105376503917296765204188604297021364549e-1", + "-9.97202532932553753622481171186283382950122646390227670693679248197349800205205290898290539070732778341271049474946533154e-1", + "-3.17489525058325500707686194437148362752290391406825231198381521862930317513649081353670386166519524315810546189268634469e-1", + "7.51160186640147504067744846462384089742696250681200524524912647858645140367792164416711871535116761744380912486921554617e-1", + "8.99610194168373157174515848193119670768490559799348397680196213249921436405001710937402190319584272526657508442591319630e-1", + "-5.39963892484342940823660554048696208293700871414984387094529796385334086703752106515008832585578915389731907422242902573e-2", + "-9.41455348900839346761557896365239742769987576963330061702397697388879776230596944312519157729410022380228287314835345969e-1", + "-6.75595816763857390859268297670835380459024839344154743310231115864242050771191159334664874097564054770066166961642073448e-1", + "4.17894201894880415042381733708896725748531223743344790054523182948440843948904650988733732381978194392219295696279423635e-1", + "9.99447981389824371458566861195586395552622718284098766856978062347139060489410032781030191080200904443096549587568037683e-1", + "3.56640095868759075150409032448421838265699043643228482503057299699740924345262819242042067863780263400092250418388628640e-1", + "-7.23065426868134142613141384486526262450487633432466529798821958977732347646832059032382447792655111641456570392189752211e-1", + "-9.16988391192434436877664999042786024703848714036221388727578305299843547352325574309860356272561772723624753484063972217e-1", + "1.24341855683226931265962750806821531283439413068694552738675989282017066737438591268502070364982899342633928417210588531e-2", + "9.26624413643579136646620112107410908114766812511471130116341925013001661546817531064974089666536893346764523464250445838e-1", + "7.05664607841658050248613256866289182754229289446384595719719495272020558391145537620968819401219414243210529013148958366e-1", + "-3.79761093422301890838671114556341706055562482358183402807224298533060188038450560241345615647754569347252101282386222173e-1", + "-9.99965058979463689113370264378210962384824970050865061898892508056811665771886385589295806419278045318841717598003331419e-1", + "-3.95173919871548266286836251448043149039940610894391718791244019288314418437411707835924620250473697245151743147215758686e-1", + "6.93720251624319621941983929806434090162802383400620564454074825718151625795576680427510026452063593762417421561201654156e-1", + "9.32780816819880202610269817418700102084277332259524791943833699964920012022753227823298655560837271746316929623378078695e-1", + "2.91495208658083070508005579692813621670878962971611104453227900103973434149303469066898102622556226584993895360896300290e-2", + "-9.10191043170480685360743788297835112117551819731152897291272407935139876953384666161532187572493791297095784055525159185e-1", + "-7.34513075127503122343910106816656237074878218180284276449954797048122379869002663646507706411949095015624141821039453971e-1", + "3.40971254411713599427147477626159847871020791931107106418841144080445813896332252160005593096670674809345703079384115052e-1", + "9.98752871506016936810666998588493462933191829230756181478046320353377054175122206889047094521687205093218701141334147081e-1", + "4.33024359542714849537532946954507232835434973891665238942502273464321666207117525270650546741831354943253652514490075246e-1", + "-6.63175408268187738636594884921931867786416057472876635147295424128144233911929585327601381618059327766986981109409782838e-1", + "-9.46960160806563725719808910991708075372282242401645009270517113290439792088443109178772446465191984149998211903724560065e-1", + "-7.06828182905581345108929510344440443421290640066613022421187316650733628538705972455891575947230299102119854983197703150e-2", + "8.92183656127948379886438402777950080111433733329436790239129260607557296960582455582584117031260710927499215646838011844e-1", + "7.62091330231640362984555508176991632755732840163230620595759320390970951235395195394649584713540498911356433919369698423e-1", + "-3.01591765120371930643555588643712101466544136366607065361801475091335195383846047491935017919396438040414024941341524187e-1", + "-9.95813515236177554177387795413035497724212540625760091518605741283184405719984044075159457509720410668598540884613985023e-1", + "-4.70125959152223022135690700550251564040118601846181392455764893020377582359429013073566263451488554529709131439092909247e-1", + "6.31483718775865440843182928017874708719203714677143270278178885379757350754752477512514449375355491054871712891789652146e-1", + "1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "3.87481045630097871028201331640164477694000480353342897357083794605539506785023570062767753819472037935010414476627195076e-1", + "-6.99716878554812023132822640034166338740077082416915046841339368979161296335086955803240899441098534898926193252558848693e-1", + "-9.29735101124991407032113033015438177585645722877060262785796302722011806301680288369763295777635760805579255008366302180e-1", + "-2.07925797310208845709174899248298159909010721767168338004516304026594885686024530923209628704670627250569637267490913462e-2", + "9.13621640053945104047985280883096238900189007462190433514805702721127019097915088259906184736442916334750420359005079959e-1", + "7.28814716527795995795780587639833705107995825167970668466246348938821997240383021826681253777014938636567626203524137506e-1", + "-3.48817863192357573536083313907744269588018702862402502601699983054718835012048372083235768555953613790431700360695537918e-1", + "-9.99135337256258278958854200595331742602280601557283993231562055717063052179292021052372510863057206152466386086657442382e-1", + "-4.25474147219713305654097901385832164424798803616095278869643928816776198489330071073326518019520590535564717523756486665e-1", + "6.69409002349720857726983952566596052122726437391092096671257338244059819036586172017092390651026654050631669646310910927e-1", + "9.44240747589054266930136705015787520728797286842746645573763175559132491628984502333043316023599487896169049499868916865e-1", + "6.23417820549832676844933182722733277887833220127638406914080428946880981800946578131712749910941183940944526141109771339e-2", + "-8.95928229794837090592434136137683839101829890460754766346170956577979909285084363961363023377587044303560652568203578379e-1", + "-7.56652196635835430995109388017590459596111729342964992503572530290981857981790620732129221157071082788019187787999930361e-1", + "3.09551461133309219674309651201007026752336319933918953736299690287371505733386433918863300129026763968979930342098019300e-1", + "9.96542844308353945757715814452637400116215448012622700698887257177706625278927018059066920597035660000571997275705962011e-1", + "4.62731465522276407764000677957978862104808823938378826581864482071733508960062598574638347814740748458034065235894523010e-1", + "-6.37943500095315456672541800050589670140910744260281868746767523730582697622604545933849801882909439609368258115114388202e-1", + "-9.57113494461990955768932962010819183910065445494138937651443249061391692258872250121438832853873660881630205561168895590e-1", + "-1.03783175146302830356973378710923690121182237844646430783773333188328606275124873219756415071202025673009660963930966273e-1", + "8.76685468012988943166112725030293740012198666616661362437433807594683780986916439696374569274720383546275206733493672834e-1", + "7.83181178815072182812568575402104911406191663934571600092749188502783771503475038116599065276589122015600004250624262132e-1", + "-2.69749743842835294071354429049113807280228918034124159074991560056663623624511602063409428877143567459307323934051784210e-1", + "-9.92227004420417932443416371636723983768124774541445787394585828303853075015733744933294181104002649816119116502663362907e-1", + "-4.99188570507651271652464431008309802023236218596632956064119419694573621896525872847587264755853127438644874992889777436e-1", + "6.05374785886620830935500306718810628353011877048386199574451402773468315797082901705593423724389976967865835641164117478e-1", + "9.68331080574540181354402420018944004334504868848934676984951546671476956051983469715128604348963016773169794077158289730e-1", + "1.45045093347669933436797325432376656017480150281100519869038554695618054318368975927557872948037203212941966706926758604e-1", + "-8.55926631706799584065153976496431313099942493164544290051315786450857575707615522517293656706329757352795226750189755758e-1", + "-8.08355785820466703104647317116964786017731181599256098405978700298563758509572188640629418770593008092680980412866065299e-1", + "2.29481541445091823694157468006983283649885473964756916206813927875661041834620526229807744443043682778028709792615798955e-1", + "9.86195281084368344446227722442335005500018635181693920385626820970119467136148305491035657795704047666385553672680209923e-1", + "5.34782415974986828906369231191245075731384342252264783019973387059318216570499447505623911253042567598873910043381675873e-1", + "-5.71759181631212640256161075896307515511612057247572886814941945052483422285718810088660759708176904381865453799197101481e-1", + "-9.77874107069129472007009478090869879295520839405452365411822873037906082086100232576241983901051327761231156641104065497e-1", + "-1.86056181372276495846711248156316208757691570931906856005697361080864028851991674077024223201008430626166447144444086146e-1", + "8.33687619660983803179149188531271900120055171980951416163724579833511897001564116810390933587615557717585362295882429826e-1", + "8.32132482562487183916482822112362004641509381783438374175226355792137053285527706239574867923387554339582561002247202518e-1", + "-1.88816490768820368180947188938258919466912959009058295775702554895970560887437777994365295452696990115940651570073217522e-1", + "-9.78458105113103660973458641126689066610890753079836635611789969774219913050456840122278188955139015473252491612410972950e-1", + "-5.69451448580118869157805059117807250106203230622762838051154208713065707949727035884250775206017528612930773233017928006e-1", + "5.37154819650306918873973169624898539483418364490295996462663218848771864764982600193558748568095521886456306061269765631e-1", + "9.85726070946814004698231423834505649751779161578718404221294527194525251740198034173542003704080544827976936213857653517e-1", + "2.26745517700332138489400566746499809209783385009289423848083137846668382711005704387134606000570923556980021574851618566e-1", + "-8.10006890365888881023982873786181048364505748637138923322482323010218991062084191379116946709356002103893071903481540337e-1", + "-8.54470151393449484710948210543666267680196067632693416660536443330720708402601669617638569732848938319544250428600991723e-1", + "1.47824914922605209542648603104533928946885824995208478684499907657728115943168395067575842431291755277452367320596435067e-1", + "9.69028856602232134498324179654622883463820270279077886397861028881882684131282848087869087883519707948141915733221980948e-1", + "6.03135714281336943093251136556365407562473924416812270469171432809743173719168209727199952532489544254928975940518615351e-1", + "-5.01621542149055350065079347615664213658089623368745676779267390227688581807037821041573344917735076902116221444127518632e-1", + }}; + + boost::uintmax_t max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + static const T euler_gamma = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1"); + T val = cos(euler_gamma * ((100 * k) - 5000)); + T e = relative_error(val, T(data[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + val = cos(-euler_gamma * ((100 * k) - 5000)); + e = relative_error(val, T(data[k])); + err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 5000000000ULL); + + static const boost::array<const char*, 51u> near_one = + {{ + "0.001103662615143147017601393734232421549156847219973314118949247990939859507971857976111288683988415478257878902917354105871236439563170045857810738102729287303674642020538722348587741395785016549139854168605590336633274890874911975139498047488076101124170425114828336211817830671418321600962996502656221412102902998671173649312277667706874059520046508702908872747388744526457997404065469953155187340837", + "0.0030157041572432190019717764776322147049224887913331212054173669461673516770769148735558540290915754514269097799280330158745508542936966046640795712691698490758472574837678659161855207596563250546269614348515005196657786359646020537231301121492728577410212550350070502426482802490452572415879214994201864402901595309726458026672888041860289772080407882673424767232857435141510615538430445535588448032261", + "0.0049277346741750694119109616231402901360500185022482787362616412856233338679208830974124749830793778323997684640684587346403570647040211088376986993615001420565608501262335822815041623056442245053684626079448221530207757672939048030945164948521320401574074802966260975904478775314730002799895049652983052125151436511589335123254582883803928373794668948878049089088843407672795237410750365571990834236348", + "0.0068397471757112108044544339281399968563253858411528016363900245610068161564091499398024110635089866212789583403491711476788985949178019078796740862827299289838108117219486357027460681238178010067475221327133396780718266880540272936860185783976937569903778160170225166328920201699827472893824363838439627437187765159770262282930293057633886299749088561182830982345936603553661004526800797082995898813903", + "0.008751734671690018552720976028788304981263251327799787402847843531098338033456389098956160956160597460869666211569183483587979772678557230743050583975270977754518475970489741156524119378847305446845331098526962579804361960647344836744631465315238254178161716870409320747176674142306881908614436607977326507761331050644035013756409444911127742401762647885817361924274132830920030936589562922803846509607", + "0.010663690172041286306192948782895990881227033104763005629047563262531418373465237876680529005058533981010793759446966868628480908709812402179047774888094761104238131843239037167212206469894485599085717216855637620318723457013401360290343196462723174177342294339229792213396006286331141933952648238459364417067676760977202812721209681621184724443514062993874571816382775241753902032787099435678672474841", + "0.012575606686811781116778815864446643746718166744927923785139233710240017201737625088406861185781739628293213436323314376708933534933748436720721568462267317026688561438144113855290140925120435317506169856461386623828941531577425811393721991195661429557079268566156800689149725770186985872449679872155877537432897653904213375816262709009448220490217917537801655330411526526290708967440087145630462068976", + "0.014487477226190798137230457835664944872810802211308342685055637400305474021552028493778559102552025380880477103065187688337931713540557562373991431880251553620947836940726544553647739994157300967262941976933375115946629204615918888689039777423610894099269527633757403818072000860056651445780074486612843419789636984117740884711882675016016919064788076097669389652323393864660933705259163296837955978748", + "0.016399294800535714798489384358524900105286836154421890562438917862501411947245037986455919696365301666112414890097246479762149456962809638588245466988584093380263545543023411087203351948681559905336010066900667101787138862856447778428938265451537422367650992162004154495705878092019403922006152498705687706013973674800621422751806347308220226407830977673540994341535381202679482907460136241543505771361", + "0.018311052420397544372537858201001145083914223029622271478159852925692124442640247100336262041440360412392318902558295108452513123454103504516607498763863728284797202978975409264141138861738184468257576157204552383675442780049333490201800526935793000727771598103735596829143729912656158790924063286176336412427525710457367751437348230246446466833498557166002214984255422115833828533909144072330080184872", + "0.020222743096546488827333191237246591760639730704704148795009602627175281013458865557238240830203973690492882935553111519759474835556686812553430134442713057622274348510526931333124437928482001301214776111358848026164688447150395879262705323533149853785508106018564787140458587165768350143018847840661371060583295055600185059031740386698369796694993301139380463919242175430688496936048982929502368583755", + "0.022134359839997490880406060727014362125793630864951833270601574861700025448109186301755833862830343973100181180995751924514611578149687732808840212399134735559355116816700346196685057916461444889179117142807858883574426062415931319905031345377305247124198345242221848293630112578508459623098934259229893301963120289071135120089672338617200639338087265986570094025605269870532431816151660553037324591448", + "0.024045895662035785157706623778569329505432699504171659064296747761761946910295074291838826981712792368282349553905175996858645967280135417577488810651594776626562252686758463813820791031580579721782251705600570838044158357396828391251385978824608388341556751951593319015721256942139947235672567093309227673005475237474351604086627391812539914665025071874865132198040631867741985556198082915821590691115", + "0.025957343574242448364285479040344211549214421772336408904791690210449825580868841229728937909141136116652894475476991471494524501035809956288247010861464302066154254736425460468024350571584780489213056428098560686376999562953811729945811217829999284678155635497607933780499844559793793320393174691097636750027421158473345884329284455326733063073401001936304522649050748641723222539485352644237494855455", + "0.027868696588519948373400137317728007608587427701668964330844960393232962659347088604492706251530487148805683505883152882204177723404307465324383408418716579280515871949790204586171885981761699066301009410176801635003961167315448162116236938093263170474354430610732127054993766008385425707409224417795873645410443727472246508894027549288331903202127478347028519320691939639175445464091747341289465807076", + "0.029779947717117692140641616959423088975059158964671307393654571763491553590582559015283533532986018614029995854278748039155177088839414450454409571267110720713374288363670804692289394770804051182510495900322915294613479146430103948686457060129295537542317247965142780968717375277053102667416124807987527429828758851341378395347636356414345553353015296944031211364374602764176767114282660874356057979248", + "0.03169108997265757234968007548831539092664261419258315028339932724609641378752993073240305448323210275610250474048387518003293691429670190316839718892647475151605557113852966925288722557261748981001717642661075734993748510506277165730472207647763678204813714194082852502621623007244214605646094787730992510318924772328958129857640953691466395972638014259980360897599169526022683004620965496473543834477", + "0.033602116368159512696233026049065446239504816931754722314316906991719894135599777826750609185018647633748023602662568553364455253741994701511752478506175671449029859193583332380924298164350627023797218098539441228986492601142199774579432202424360114528105854714450548265654769162069979862894518829365029262734944196495563243510942310738160350648115273816371164862001848102516957052031698646996790510953", + "0.035513019917067011716864665791693591701266221069066142988726516832036728613300457006403299601385922973285573124147669717618486570986860008564309641657943172757912451506572783449830586163814477502720341010870119231030511664725149033496023356743601581035789746158436049009960920433265660001864258067191594425969638702851317416487965304378219676062220223886417078628342731900948906319081697480745936074075", + "0.037423793633272685069230163289099410548201460485083250584815890545695501760634737348027106921155349564805321222282824709072582234185849564440670000847571561359324629877368620222775856068569278590582843550096096627510109210574429458414697641703261368397349100700647508781941466979105505468662952228018391181441110331804231754679360190526351574820397399161022517352576803713854137820941977691824804918229", + "0.039334430531143806170384413477273936914540782490679532559795199052084263353981243128408259086619593938946158294175465792633584421592350011455198124846778194417281005620258982615227234871780679327289232072858751285307955384102986030326321993554199425677956531006546270705693578070953933490084008156062047268010604414954653769711129551190023978078265436680151306319349753427763894284339669614362603225399", + "0.041244923625547845099780771389235760645292527949481044094490883777921290140650504322516472637184803214130714431279474404434513167088543202171922178874118967991301744186858054508473413647148744260057423931033177973119110921967581379650616945061418716237102199971097086754171168500651650526166023618723542873290120298640370217463634503988257867984189842393302366909916756244585593509804376197012137137735", + "0.043155265931878005673591620105503250213648422568500347993529171942176855000247082147052189275394127432389966427668413127665366489709229602926384588361071126297040547180622989395253518259197742053810419372452372506534313264090033740095357809571640645325965973975968081307185286025492280541542290934505383760407808393490207181258819590768103829347539943429968533891105456889889207923129412409325200337396", + "0.045065450466078760596989313842010956972889269629840996618541471076456145341576346037140737554087089598232657340541865108389258265511462307708855932308284610805209084413460614598570062354088931179587984702006847566162492414964136182928014974554852612762940578089297583097434972291633301329615187665009664697057933900728259220674217919826618275818024987757805509580781060051826778978395144370327934582031", + "0.046975470244671384601033063916347240271496301008030038885300525267985292259051299166038486168462131096926077920611254966322965395673221324506213593415263189667393727124978454125104192236004303056348320706091018781990803164595039969574510002737990997634364247271320535459089400357647302806652831431190979518269432197656547265417669309719787317687585776029758282182901563328846367691507505917911626458378", + "0.048885318284779485470814703449342779874157141188272539012461507790598796169844054420701400747288103863351008593834375336008952419161297787680355981672505884405645257094616683497040471721980241679616912483788844007649447969703512155758482444019770785766752697959554691538291379700303132353876869628124563105576278585509058450081192711918856522653293896204836307264696289474219755720645459588331890558889", + "0.050794987604154532871523976044438688478988546522275702591135165295075684834775069782087540212155311599924632216878717363279038406203747968637573994688146329296755023729170505930935028107359530042909822369245609091696704070694133386183688825674952803613566914142157159664703170379754943610785780639205752343103591085978554489192416588288410803225066825839880971435465232206429722600557780654218330146221", + "0.052704471221201384879102044313723519214541830844294339002006150295000261803629777930668202713875629368914012613840180174156598399096984605842000917709330893871365961242812860633022132663435078869433262371062200555333508565564704972551921154864927879748108180002977668648111714062992755985320189721615088748697314805428967770533095416911693326757965362169171309026356339280576158225848771071227224373815", + "0.054613762155003812122160305957618147686113745063989650607179163157398820817715079449268802189362998719256947035541552524839497119721884536865240705017403409053301625152685151644761334409897199810093505097528650897729279062117617766845257388412635800174656504897022571125534403010151970450307624961920347280823962725005822339087173498538012712497715370388872960900453285934131578336748483622553313648565", + "0.056522853425350019441850338124226420404372628229474954730316461224029279793449121148941830155705856364290655296696008865349058650396297667951745639266344993911111272076019522476315254920931469406381088740392436352997178777214659473302034620137440843681809428909274912969436139312159105442160243076856936138443854294531618433726198293972487505166088883354213979143973990964298454127970039847456893860203", + "0.058431738052758164976379864942430396555977098734986011309321413104802080798824039565461521608355122102022725461220269967251619843394860641070621951433765763369761658916816880868188275032453137184211673934079277285593935159478757148621410070196500221526968060556586710920750728824112282461003224923995158937905479480579208549847478185757177039153501786271361921802927586114942206193581554801605680183774", + "0.060340409058501876576879058406717550375449897922866349024612531373677724965692896763451690034750214807393086060232183962741893455630800282528706094634312497867863194252914455062127544671909424505367559503649890477570116767021509485710626043408265846213906257952113003324887350087083283630715857354116849013376841533857321740197047217435805280085872071354373524395263864933170034771001607559366437835689", + "0.06224885946463576546133123915706193746686049729742751789281333411875145041642253752249398319274836506892916659694331849766284472811963607782488993959669913942440995816339529777656740297867471191540909520680122909159182411803441391065468297111274482089347737322313334144161837035757661055283810143238846811496286086926075008068489724098160672664550444107807861952850135669761489736449089327971794824585", + "0.064157082294020937013292141108273585068933185681722806586173136512969086561151000586083228827704474922133659368208499428517560937267711287558275856325851735527047525549135602809953924346232393575354505341516408877034795144989051337120442048812961016500803766780090428411925756071299228254760633032932651170483895163866111455935100454818941073761804284777739005007991141161823471943803047351369535073521", + "0.066065070570350498632132342303164932774411476452581548988386145454309844170784631219900687545375669726062411278210148833761887075889382631711319762066717518842787273543143969874177059386003262516941215168234997245420735913778365997498382320917159517052861653706668051150014889560865161606396037665048820655743861710636504450723955435275019348223982732095398949832565423361714391500479155224225613768011", + "0.067972817318175064541548243754498015429928588516517183822313264446879635682093113384264993280408482780193047687370305892309106748875519486540879020142902362307237689684697063792225838111742241714789823601251998299331254097504567214769822096812914869886418586879378868131071702869283011709161582762527864014863950459121468893761825841337802563429112718615110803469902519051203360473993644451463303576859", + "0.069880315562928257463098098362562671709183706398122146969098129179472379455539984270317889382725678551314678030902515782188203802362460214070192378666311369730755912670660970378408284876465192356340335277225457776091515934608751710356445501169982098020701963512215973413220903547301855847279762573955110834619967590588317288171580291576756417265600792610005176888567344924086299458709493921684370833814", + "0.071787558330952207061531053207739391124226218288071373402959685303573894071937999096931283415397385296306228484128726125223568292760110763075739612174182840148193517540379302896938375357744754831885570482299802985278525692833941172622048860945698352794727105726197891701070706523197225463566498764869186174536278875440544967870368440256565084805804998877012238900798874720340885805165811704445925369809", + "0.07369453864952304506868897057861922170414313661538863465614770246556638808351254050794164760581857499175318127117745597595046399453737415234966090460819383278338184265518294393589316067434296307320873514873375534499000895507092920123162793722742278902956263178675873980121089525814840115300730124457959632013360479776554262210801798434607194598511786777350540581826836696200671400628870250659962729555", + "0.075601249546876396992772935963040077834759122887264324876826746597298507042570795315940378957369646666545616927930046677179646722187557860442506025110541968257406052679604681892086517951648112201767029044637142334937786145563391280677987040697732028896674786378870229133792190093646530752257521390201161387698590619925316803401938362974478273195688740273778224688121208296858072701246429755713258468481", + "0.077507684052232870319778844857360483087988665809157375994805235390695227945273826842335916971262245322463861698987988491433092759415620685754813456247989287157909601376742141647886684380473379403067343977633347655683745871434202230624968375294472571053679501320680048739346844244553807193670436672857163839591129928936603341033670518982144557944158002407590669543043048232580344768659176122645763500513", + "0.079413835195823539113919284592789131508074280056913456617148863190077260584186476150168101766032692499585019572300009477107342325731806003539645749720998260074894005503243715777788187754550286488316966320623707403846973934258796072434720381188302956748572794547906591019552569722211941807674118070825610462581312695693650893380241875873254675082431417454526920871842555422162216221640850141209989864308", + "0.081319696008915424923862092389736899811819511475112310887916890436246797704730704673729056088324784096921353721791055102563812592375189346816348952621603248827528923433998597558478366712658235656924601774921095079356565867874041683517103417362062033545480747089630436317004907748679995334911923789802669273406449877710501792905734235548100216242648355048174292232350538531258791292074224222773259366265", + "0.083225259523836973901629476483826882570495097409722948211156651871411915926347698443317606324912095013846386144848076019334983060323996364575622231284156371311209803383868297666027142776492604713451401116304951916037351315288808149328656282592946622481248077426878390562084748274992526750980236994304445617883874613002677387890383751048690275480465558930319669630406765794141303531112767626885032234711", + "0.085130518774003530041015433371012162123590338565297712899451572274044870858132401685294989726432756808251618198809497117031428754224182463768189333992610411750324249283786647605964593556580841488686189374310703328490638378071341189999989736919850819640255203388192531225871093915262442913255553964348789674386732423763999398384843950222967487918049677831350991752153610543052586794779289758903475438463", + "0.087035466793942804442393380943589773874807384137701777807755858606555806090045313793349743667697666495784828540247587627381581545620918795107877715086227932192756144780086856515641298195558204484728115519445514732755572178929839231921546119143469647706999890259163924570037168105911942268212237224359201159897493303064534985539474450028748960081579369980283792804593122976296597796047722827878891322393", + "0.088940096619320340510800454481897179643787714504988904779549430422905882044782054375828906100456879992313640144934242418129400679706865644316664458061953684856607341811667576418163339843372041295322709797007871604740491453013916791024918954258557372755707588171502529270934617054742841996068375532958173787119651672031238405892943090742861150287144368470297356054911834742041692715934237148148936307154", + "0.090844401286964974994199780075024285173534240616972938308566124002318176156233343333797652771250228033597767340846476094210813299723066344955542455246897302945908336756464582189829335315055318509171623072382573656172991307091055717376996812421994002305994837615827430425975713541786272473174908117299253875064746541808768776888139494200307162476704515967971265236163183394620211890252072718610942571965", + "0.092748373834894294768837248013614869545920040757666771889792264347367335922283987944081370356939214799510822558638935486112190359701790662792925773186897671244831971450474952036618937833706899006048469791213129922302798462311426294239282200248625552430083292818594731518350634587677158329361662244008606299358410273467156168469937529868888478684257396004386633746334360279683178784117372066095688934486", + "0.094652007302340089278624856973167138217258137565762699413364163993950641989798336903224059425798872308451866930780842878435503832366316245159154044350517727312654980455290163514021860802028251981954724580292247887851185639950862672925642859475325430465650514258094310141033116303195908372018392349011340787373492402788283020594141795669947097771918542864972570255253465754192708165241608041715996375567", + "0.09655529472977379853549858833033074225823562054271495313739665642376685099661084023094270272485976247900824483810911634635819558334630910267353320029261330296977292720266655308513559530586843550229208517388789783011887450865488554143475302590353915732321663418057567573042594801866258948380684000769091353165879953111046260532796891917772727185993569684246844052518121013717183610828519193371796413317", + }}; + + T half_pi = static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064"); + + max_err = 0; + for (unsigned k = 0; k < near_one.size(); k++) + { + static const T euler_gamma = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1"); + T val = cos(half_pi - (euler_gamma + k) / 523); + T e = relative_error(val, T(near_one[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + val = cos(-half_pi + (euler_gamma + k) / 523); + e = relative_error(val, T(near_one[k])); + err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + std::cout << "Max error was: " << max_err << std::endl; +#if defined(BOOST_INTEL) && defined(TEST_FLOAT128) + BOOST_TEST(max_err < 8000); +#else + BOOST_TEST(max_err < 750); +#endif + + // + // Test with some exact binary values as input - this tests our code + // rather than the test data: + // + static const boost::array<boost::array<T, 2>, 8> exact_data = + {{{{0.5, static_cast<T>("0.877582561890372716116281582603829651991645197109744052997610868315950763274213947405794184084682258355478400593109053993")}}, + {{0.25, static_cast<T>("0.968912421710644784144595449494189199804134190287442831148128124288942561184523327264655202799685025510352709626116202617")}}, + {{0.75, static_cast<T>("0.731688868873820886311838753000084543840541276050772482507683220220750082501569499540967562610201174960122884908227300721")}}, + {{std::ldexp(1.0, -20), static_cast<T>("0.99999999999954525264911357034690133684385823577463126432241468890539365027135494672267164697779879113636143901797362388")}}, + {{2, static_cast<T>("-0.416146836547142386997568229500762189766000771075544890755149973781964936124079169074531777860169140367366791365215728559")}}, + {{5, static_cast<T>("0.283662185463226264466639171513557308334422592252215944930359066586151456767382702286176981668344573238827368717546699737")}}, + {{10, static_cast<T>("-0.839071529076452452258863947824064834519930165133168546835953731048792586866270768400933712760422138927451054405350243624")}}, + {{8.5, static_cast<T>("-0.60201190268482361534842652295699870029606776360435523539636606145572515876770619546025351418378467287262574566665150299")}}}}; + max_err = 0; + for (unsigned k = 0; k < exact_data.size(); k++) + { + T val = cos(exact_data[k][0]); + T e = relative_error(val, exact_data[k][1]); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + val = cos(-exact_data[k][0]); + e = relative_error(val, exact_data[k][1]); + err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 20); + + BOOST_TEST(cos(T(0)) == 1); +#if defined(BOOST_INTEL) && defined(TEST_FLOAT128) + BOOST_TEST(fabs(cos(half_pi)) < 4 * std::numeric_limits<T>::epsilon()); +#else + BOOST_TEST(fabs(cos(half_pi)) < std::numeric_limits<T>::epsilon()); +#endif + +#include "sincos.ipp" + max_err = 0; + for (unsigned k = 0; k < sincos.size(); k++) + { + T val = cos(sincos[k][0]); + T e = relative_error(val, sincos[k][2]); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 20); + + if (has_poor_large_value_support<T>::value) + { + T bug_value = 12 / std::numeric_limits<T>::epsilon(); + for (unsigned i = 0; i < 20; ++i, bug_value *= 1.1) + { + BOOST_TEST(cos(bug_value) == 1); + } + } +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cosh.cpp b/src/boost/libs/multiprecision/test/test_cosh.cpp new file mode 100644 index 00000000..ab972989 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cosh.cpp @@ -0,0 +1,185 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +//# define TEST_MPF +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFI_50 +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +void test() +{ + std::cout << "Testing type: " << typeid(T).name() << std::endl; + static const boost::array<const char*, 51u> data = + {{ + "1.0560191127459844751259038114395241283965590525302917878166464679729562764239266483419824023679041866569431842053263976225991679105269492268050148624443706785607467750929028856273183654547152707568642275917435773104050171284580773949313906303074811586096214771879801872225500237540725592288167903987152007171391207680034517664218965133028298959753155835975555361514087618679892905973726581183754237665", + "6.0577917650974496023981039346694689204850927958941226507775366589415588030232830758139222010716099059155799853188868489737439396141346120898610181630988217093945337280471788812956307352429914669334599644412036010014302812555700905490062030666482387008384856645533100266205122930455496234252478878949675888122615795451076521244771554025667181070733415815608287241160724578541982548132473721865287585003", + "383.32956577005424506758441449272199796616394738942294350035763341369127219359132618750028176886177362785452836065735889720098699937365992620246167965376788963171659530350198190156275836547285437366012371175910490835823389352716981464503672749829183569550509561579181434088407652213421105693358960196044447948190823567291153397039759820680087749250557665869797605969680417240900163183563482342795870741", + "180470.88335034971169904627554690213669106779370247753503772451628313223853228134148123711258586005038324156900626143047383382773083164188515409766952843294484598668304799186411411329575367546332731190431166613267871177008493921416649792646568096789971466064344922873643120446759328638447781504932928745974584136039698220604099816877847080168890581112550484205291341188894903342677757367415636409890558", + "6.2781497954189513287619297175142770025826052476955600323495790530946900406209789437212923381830889846578651793922971071825731424267985994598149826652782605981764572599129753631344305259620294513472869937699509893247230674850025066547664563263958672029867981296029855675095947587305949634130736118694040608573981560192569935477462121110619100122692626135788198431038121227062383110684489973794745342204e8", + "1.613783114750852113223226710244634574082654363427931747177970610142560035434819323665197978270795707611590961019502906079030261920109649748962125930850198625621792763842224096823299250338750953491004408731082880660125641628213970297576817341593254767125933119462446651783267917469179893016103516988279473907996009458208097272806046395206212403180775656514566222835047724943633607736647735739948551096e13", + "3.0651210048650948869531196671342477415226643123350617715268971834881834615138925908518703584506447138436613632341330640449725016173384960626760387649747643297918807083363913015806893683786389067836005832038060734248371426886808175554210317756018846109627572546314172492701544345965940408777570519312837860014177872754358662463423939942202520475422342889660750666147940146262635303938752019875745307992e18", + "4.3016893602106215864771434464025735547192956887050537014696231526954713331351791376069506688795159316625154458115179050297716224800318064110052445970764898870599885508391064218065806885129697936678362276766771902589638957537168339190488273555753876162633237990462617955892238424402124353124736879474651977422350856642986446591941163073842974714357745162365700428610167249762162775568692443158879770006e24", + "4.4608685929681360001024935791890661655506049487122331222491789277138083092507844933483858468341107613657448783043064935174812965310544903547535217357996429824403225005261842368679242972243707736489629610256554995236901040773902962370130989883960298987808008001651650799892267761089302132749037069497452309074389846493140222931714618697738906019885122076310868220596765753447232222740129365498326869428e31", + "3.4181315955816806472569357441100390029536003312981931954091744304974491527743601285017456624487264929971022746516079644284683284072159616291298593217459064246713801084801182706805865477209408120733740982340972570739267039630582468876075574706187115643861449939429503730606743466086010115127464706315791765264572070452800816054590653675962889901898843712936126341807733200610910325052666512334161414655e39", + "1.935294628272790810141453021278524976364077691905248015888165919062516673344977091262644262832934899971824373171672037249361491844419302323587942915162859665992916625636813244576210109931852761921719987632855596663907494303248513195744818730879742963301327852160193919379798462926667740594397712731448572837824802330973561570848397758210619453310032286208701226098998940360395267237151018055781640126e48", + "8.0964449511890098565841496436016431651692307764702784234901741408135381374668439020986470675941110923614446905696411023621632714191313583360826598468217983223558130595633054971338824192327248896500337050246640453410159732184419096917171044075711156867804851018388576371530520943696439917673720450911725466781235347212700849702742625663288687644090935756560022610000629006347244369388824818661974220426e57", + "2.5028257092625174549175008952222569141816383637904981644379473858250736896174216539673733521627607209322019413420937570273676341726636307131078699799472622998437404149614292337267153201903296102921815263736653035269935857816159086496594269187082442244280898258397047045746728729079796167987895368614037770286371191530575814695859433478185016171380286325273493350193132538052551497175771289873181595171e68", + "5.7168370213792649967466315312864179662895170192695050789061362839510836418124645968032989149068311018994324517420345278843446068634292140996241291031113395887832891095928020095581695527354104986223411349657526888924224926675682032043363279774947976053895819671003276400297758359779703605970507328706064692923481168676751999124073697599262277247814864401196929320497117521176016017349797292609303756215e79", + "9.6487261169670031207955841899729386502708125098394777808615183927342163909284025992243201020435915122698808649711566042372911206942311277943247994427354130507790526857797833309691667380623792736661655695464087154725768656507603378053220212067894914686147301550764045337512361478831034999674296837635744344039906734109560908793921568633128400104314078575159786136202769893309913175064586488844295321363e91", + "1.2032977660238608232537005158851668311089986235965463249220377778638489972355974848209035082333822309902237165042868213438627625544096344578102199846440476859557339736747791529782018329078191477783605471526120466881600981869890379917878811691555316448842731085218988710571211956972016424649758226606500603194972966032036214213759991156778846329137084961334557845326183588274571457361004704490747798678e105", + "1.1088306081278288754492401130897590262404571813281460605683836139669281218442501421935533170636990866165181664561596333701204545493730707210930818738817252706131805203538144119244917164949716209095542194899833868499263375700313934257155601275526921302332118009966650991624878227108265079219497366770219141098050965023005919495048022616553249266192057652205987267068584616625670961423579715954410508985e119", + "7.5499880591625965663868042832675300901799245732418501707646792135512053284835138294796976048691668315442427834949618514094329533376442442492757936744857569785450769927581802961191319878260712808001736830227501518832554201816224207300614310712430470538022948957433004829725273067921443635526965673971412049693552004259820173389681647135125678701502084190660111860351299407405357314966388044340723077086e133", + "3.7985363580067976240250330165300706958269826851549371732460220923459822809007918495780412109700378352703982899561570150646963751463572075768540297484136809462018052149545042828665345287117150392150513078663739946623681053685054650372595872914400423446635806806461783139586204378680585507446218544068845246753010850565341852111017728985713047360191412931479535524815646071456825031827933342626130249175e149", + "1.4121319341572581270215359848706630542776633675711529687593487346259283960708095601494823112486631023721124235640943167173029348028743563902367757599140008654691320430919753414890689949599421028277624880392344132646738394546195638261279687543208503932172926275294218429086816560213399180179494004109164546844899632385177835442946174689070525154077366030192931540897742543089509897490703511310531249977e166", + "3.8790307719997974510664339744260233373881096199933152202662556556779783775106563986911859526413282055258612522499767709123313205863879946518297779104337686883587019222829967005608205535314284003183828513113021722123872387036435113517356676447376715595408179555267871947671679098986651665719279348025058713817796876795915844151719103197410787508530261619841035613531488383930867055908047961915279983259e183", + "7.8733605373835840397434523264038598405672829925651165847065668324385430746087633348848905637835428739401439679896923081980364912472282573695612463537585283007941057172128277340402716645674443632827653710173742423648839359547777694778576675604645880219833375227941998426325886558435214355022240854563558864080627758653439429917072753785194675103766900514602432580639079224631229479607396935864512990879e201", + "1.1808262995038900942517891457926200063018079695348469762725520377876370005771518954251015338402886097689762895044056273430051256244413916763438966705458118354189107806216991150264176024521937328179762640422127608560103802431672144866013216405157197709788484197720057702118788168789816074560208078260433548283881535909071116553897893659656781376448427981358955547508806938614921874867135186509274509121e221", + "1.3085817499987842655130548827168955655838432140245228169691892267707778790498773914833199368916114043966197329562444577848635313938483757629541576533880917215885485474416704968999200090496252044959849927443732134176975867869986011315975625868009065373046224716063168977788103866885720471095547385342868632018951910603936835789387464412366605713487321530237148912677199033012777178113821791621549557963e241", + "1.0715308148006899161903881353829644069217121138682658034413051575604561649576261428568888094218620444635013220705511245290719605273316790249367622122178650529000528086055415007045458486410501636380119413632657994999412652188430063128470336817401482172580366374079331295129200936246446347832380606353293858222758687479612927181530236387227215663399410099251455256898414199913458340065553949424990477448e262", + "6.483319651006309502237640505955012384293570932602353784849377890534620180296272226076424490097577093511886503973590409376477611667988893542117173598716788837179265384921201772013611631892729250835822804494742316330406688475091973437669111728949960922002370308207819760146543720499389938855072810566961589413895110830251224194598788696990065693705615156654866578134664648091752361824241438921952031149e283", + "2.8985391304542768293172709775230767981477721528885408305355619530690119426207269563049756824939397157221877775531212262059946098575425050827283362457005503261796116156917077778477251551070762614233325253060283603452216492681531839154649232080928787066338399915850327381614672456102374248950210248266796072457623370079195574322846594267768883120374288952014885152055438195794090975578878933873824774214e306", + "9.57524433627083921372674145950563946532138741951042299439035158875449060589509856903496678820625880407684156184675763001790613289835869844325821965070261880894138207436003366195024403902162467929095155787852409710735775347490909311196315332711680552044467458169615366116872469435840608534489425322247278926672059747911266981024366989976214521515026692183039600169984107883592297128416659318858313127e329", + "2.3372734503362369375381009524197350830316472034721759761797536237738670471009423543542251572488229045699598160834162677357730620072441755506075897500940629883044875771104686291523502165266242030847074909362622098365719455332359938746138629161304717385265309980898079489959955157644566232440805137701071311495653330606071611331941246434767948905863368638163788562679785940566685500460815077065003612487e354", + "4.2155879126937199240969909448599186868484717887298729605150033299123534992857332918168135230843738695925698383815575417820480732378749635394939513838137876524333991937836847074991505476867647762082587225838063325020413513077128321581439429001485977751765798011101092072613053687422983352140468569171564773941232256057064161142341661775359191159220450305300322654184921617310753474842253496677498824723e379", + "5.6181811613375701248970224378256740494692066242437602652469740512738297599235414593999616891945156186827736326184687322137498447792007445397397290336810468925670064733464757082986791232916898141597610692740388799796632396708149027243436859752526805112778790645096555770227809873695589969805678601106157556386974221647669590827712353133603091803570183764883405340587430017053183637835511899658145649708e405", + "5.532511069282205350923830187073466127274584467195468607886763750877294392993663821432158885753563495238131394373865428654052604326264330104646257659760161386620716716703631608643312613245804625511813964275109451513736558514977338129201153666764317441936156609643185133981728847167450887861106642311329612564652645663234240748195490808151911497393974690166034839217817023634217121406163178148652748479e432", + "4.0256666306761331240653217136731531623017017695713942917027851762705346357330788586411431378972009980532310757689380174461664677676028378924382554201434975574729861177781849023768222381429947872325368088023224591306630434887529215459580760863075907686248521168590309636468448648513752893851767315693469638980874648457114335557202115472595647478331668869318302753802858726588719006447471192697846325955e460", + "2.1644237346681663424601781769159797919834245365230735589058796985974745594485988855971413936820871935714602237643458356241187573307428309041919648027960168541647193436225977495680484218384107820095589356463058222584008532497069179993678533431131233629312850771528970443634604290143149079209513868130585713006080733488491160321145735562062411305931183571279530201672366980412430529846635995189699318073e489", + "8.5987580981195983662047247216936066485731760315371506386077056691409579856014763032619539539935299716110411688793466397984311640631361934500807639285587334983206556915704635831992012926186843826981296831658998834850783404713050829093753126189556625095994621605300047199962332098857236359801681157419606676412198783092816364336047306243999363335004760439115355072350465422891365411868472688286678516314e518", + "2.5241673163187127276134610716954724162270290228773641734420864618245211926017624829840685860130579257772126398622324109858115624706486522844752512951837805396709793171502497523431473021570806024043139443284538862368635312799539108264084028032731295487282188616820261689634926427135060887942797635147693849950058672753458576476491733064455826768562371858057444914175251596852571637211466017938478085247e549", + "5.475067911823387661325942057081957044927796274441278042805014835144678321092623034147031518807063234976073102574257079170283458172046752719724152941316842521196069804425876507927418423409523739261726681120662097159943049401039490818332686968135012747332468921142470970507219403290422458185430415836291605355383658657658638112408092789126678938878667507151950931633694006471359998448912249374833586727e580", + "8.7750549689950256776639468724574158629603320014390275681028674550826357080136422399476213432791376656222763800628593282303459051561266270006921840049305819767639184391149913915312831894296821356222752594264134130151457242713539248421883837353442181724530706933220158507240760325182068001553294949268596178418634164323874971937997072367419479635154591248667559627811893588163238012665671798461211917208e612", + "1.0392000158337773273751156576416024664653679689973856373456304843339302977923254238376497044027728158058903302390909588333829463843362779584402914847447592731182614369968957680281500946805571235013941407979569788567794900810257154433592958167545186687137810101848000107335074486050959387974516414654638879740966175786016492797845169374594168995878543584318334800124941205910589727264397237600733483158e646", + "9.0936326753636727240574546678839170665019169110943878894933093211555976995701468041449327370073681898690638466136204694745206283652338526673125958055131610409923286526192661778126811265116493171283319361595267283588121098349703951929669281966675596890266483864217591555707552765565756842701056144290075867893520379419521775913047964393758374891516340929062076304350159966063972713118995033247759001609e679", + "5.8798281636930489964162009429009257867906792508058801627042121953599912951265315933723440185825519080102988056836911095299854840387008575164090793635997912930561430335216151607097220208013034399895832350235280120270626904356196935166701773768680311063264380891331021514518757839220818506905997847228783439015252768055166165941582030353226255576433910936297965207260585437762430381969160714956727596198e714", + "2.8091881292911108404345975896815558958477835260737794579417284512413473388968057587088555041266297486841923628702282019643659456724373332519583025947015025975126598748630623031951723754960589046233996595466021913942587558326660593063197905288573353559106884645285531497626940379800500474282446929237914568534665868703742731713632349090897884403966643055728471509474896855575286123275564417626861566706e750", + "9.917129372597671132067673866739246238179742417231064062960232866725337575281938597212073697168000155027158148165861617400080837699968785505107579831803685516054837447325150388867488754170677228096524224392410232206238263933144338637103531441623303187445874039234973380151391274490746625993568552049954630793219419614845431626975962881182662815760423226111647056071831411664335144052772436215105801395e786", + "2.5869027163543111121878679987081647715187872826677398475096738640583659800068967379551376322170347537454918190603891312949716382621902484616361664158953484778255247083652726854621059785392022847887382779010079407502679229021085320675903109573769331277413372272363218896397965662581357886739691376204316908974081821980432178065394228926767529685562155837452626029223937027004015040825450642409597700449e824", + "4.9861251931207080923785686798881789193813879610842675205361210155894774686328710893906543682447029206928934967525495260314937837003448878215156341411477636831113484416124080974502217578408248150338565305116223944900839866528622960352723938548713319425798453345402992146078868053263606234074443024155243450623634720912438841022969909473424559262711669905282193529250216454066716533180418518228387188393e862", + "7.1012569014339068241101751233953234216522840280342406520909288232012799547871960723719836516359548198842749536961644100550279020276709043358260853581760590386456213180291689322352732545965831405519844109680619067101311180959399339922706596098526969148981173519865139508665631317310424178378833370605922449094745510812618563813537347841030916512147874232760564378443782164868016244561788356251308121716e901", + "7.4730215360486642135431754747074885377840195683583018254892502245011973712084221116813364423492802080799768174534590613188275471080608467087354983850284805514875889145266688973752185071777341375422809910165581997555433091939959406569831183459872344778707098094941193489061532160249775856426569696127193453339548371679229676272663084782830276508737129506676031759345288056484158647796152349867328841634e941", + "5.8109375364209112227579654658730977030869454388607076903639465992296616832002964138000947668837140543325908222688655359602408511410663722770167244801973012245657865182739637159804595049180263175014778215232564251739259624759589953677661356104554831551073263668188283861123521688445132164147762321111597028523130093864153999974376790494383016372210442340324038686843345053322425194077414241243050491297e982", + "3.33875955701899627718146291382268063073604182131575843695486667154496711979350813988644889979275310892951143249901398447859083674739840084454465850475774696325142148671937407108540250845900941142800157345665761403930889797424808979569550325271558518404559007551625637761142662107757913763221912282957681784053564387104062317729788737215450574233690655931888608424916152893688106181220341997128198692e1024", + "1.4174672877823334709610117319768830739080734407353905145632612088824955720198734996604261250019291955883620333545750761619015467840567122066622229379056280064206319780047687015558007624774062399477328822231085767309831266032616053065858739373818651687128093335640388513396191118537181280334430292439188737524362269789272308905723812818882228503013875816702686587035844437102478263525616196832018321602e1067", + "4.4466189016791091516801723880812533528438597080549410911235655611382010503145789286158745555771483577943662768773465284793798720178177605712848440200402906836390133865748188969184005230383247111166918721449908133920663776952786683837038180436264738937354101153867171804315769471050303182129269442292354388037298125177941217926845803005587166270803697433886463469168814941555804311717400657004050157245e1110", + }}; + + T eg = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1"); + + unsigned max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + const T x = eg + k; + T val = boost::multiprecision::cosh(x * x); + T e = relative_error(val, T(data[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + { + std::cout << x * x << std::endl; + max_err = err; + } + val = boost::multiprecision::cosh(-x * x); + e = relative_error(val, T(data[k])); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + std::cout << x * x << std::endl; + max_err = err; + } + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 2000); +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_bin_float.cpp b/src/boost/libs/multiprecision/test/test_cpp_bin_float.cpp new file mode 100644 index 00000000..8011ccd6 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_bin_float.cpp @@ -0,0 +1,699 @@ +// Copyright John Maddock 2013. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_bin_float.hpp> +#ifdef TEST_MPFR +#include <boost/multiprecision/mpfr.hpp> +#endif +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "libs/multiprecision/test/test.hpp" +#include <iostream> +#include <iomanip> + +template <class T> +T generate_random() +{ + typedef int e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(-20, 20); + return ldexp(val, ui(gen)); +} + +using namespace boost::multiprecision; +#ifdef TEST_MPFR +typedef number<mpfr_float_backend<35> > good_type; +#else +typedef double good_type; +#endif +typedef number<cpp_bin_float<std::numeric_limits<good_type>::digits, digit_base_2>, et_off> test_type; + +void test_special_cases() +{ + test_type max_val = (std::numeric_limits<test_type>::max)(); + test_type min_val = (std::numeric_limits<test_type>::min)(); + test_type eps = std::numeric_limits<test_type>::epsilon(); + test_type inf_val = (std::numeric_limits<test_type>::infinity)(); + test_type nan_val = (std::numeric_limits<test_type>::quiet_NaN)(); + test_type half = 0.5; + test_type one_point_5 = 1.5; + + BOOST_CHECK((boost::math::isnormal)(max_val)); + BOOST_CHECK((boost::math::isnormal)(-max_val)); + BOOST_CHECK((boost::math::isnormal)(min_val)); + BOOST_CHECK((boost::math::isnormal)(-min_val)); + BOOST_CHECK((boost::math::isinf)(inf_val)); + BOOST_CHECK((boost::math::isinf)(-inf_val)); + BOOST_CHECK((boost::math::isnan)(nan_val)); + BOOST_CHECK((boost::math::isnan)(-nan_val)); + + if (std::numeric_limits<test_type>::has_denorm) + min_val = std::numeric_limits<test_type>::denorm_min(); + + // Adding epsilon will increment 1.0: + BOOST_CHECK(test_type(1) + eps != test_type(1)); + BOOST_CHECK(test_type(1) + eps / 2 == test_type(1)); + // But it's not the smallest value that will do that: + test_type small = 1 + eps; + small = ldexp(small, -std::numeric_limits<test_type>::digits); + BOOST_CHECK(test_type(1) + small != test_type(1)); + // And if we increment 1.0 first, then an even smaller + // addition will round up: + test_type one_next = test_type(1) + eps; + BOOST_CHECK(one_next + eps / 2 != one_next); + + // Overflow: + BOOST_CHECK_EQUAL(max_val + max_val * eps, inf_val); + BOOST_CHECK_EQUAL(-max_val - max_val * eps, -inf_val); + BOOST_CHECK_EQUAL(max_val * 2, inf_val); + BOOST_CHECK_EQUAL(max_val * -2, -inf_val); + BOOST_CHECK_EQUAL(max_val / half, inf_val); + BOOST_CHECK_EQUAL(max_val / -half, -inf_val); + BOOST_CHECK_EQUAL(max_val / min_val, inf_val); + BOOST_CHECK_EQUAL(max_val / -min_val, -inf_val); + // Underflow: + BOOST_CHECK_EQUAL(min_val * 2 - one_point_5 * min_val, 0); + BOOST_CHECK_EQUAL(-min_val * 2 + one_point_5 * min_val, 0); + BOOST_CHECK_EQUAL(min_val / 2, 0); + BOOST_CHECK_EQUAL(min_val / max_val, 0); + BOOST_CHECK_EQUAL(min_val * half, 0); + BOOST_CHECK_EQUAL(min_val - min_val, 0); + BOOST_CHECK_EQUAL(max_val - max_val, 0); + BOOST_CHECK_EQUAL(-min_val + min_val, 0); + BOOST_CHECK_EQUAL(-max_val + max_val, 0); + // Things which should not over/underflow: + BOOST_CHECK_EQUAL((min_val * 2) / 2, min_val); + BOOST_CHECK_EQUAL((max_val / 2) * 2, max_val); + BOOST_CHECK_GE((min_val * 2.0000001) / 1.9999999999999999, min_val); + BOOST_CHECK_LE((max_val / 2.0000001) * 1.9999999999999999, max_val); + BOOST_CHECK_EQUAL(min_val * 2 - min_val, min_val); + BOOST_CHECK_EQUAL(max_val / 2 + max_val / 2, max_val); + // Things involving zero: + BOOST_CHECK_EQUAL(max_val + 0, max_val); + BOOST_CHECK_EQUAL(max_val - 0, max_val); + BOOST_CHECK_EQUAL(0 + max_val, max_val); + BOOST_CHECK_EQUAL(0 - max_val, -max_val); + BOOST_CHECK_EQUAL(max_val * 0, 0); + BOOST_CHECK_EQUAL(0 * max_val, 0); + BOOST_CHECK_EQUAL(max_val / 0, inf_val); + BOOST_CHECK_EQUAL(0 / max_val, 0); + BOOST_CHECK_EQUAL(-max_val / 0, -inf_val); + BOOST_CHECK_EQUAL(0 / -max_val, 0); + // Things involving infinity: + BOOST_CHECK_EQUAL(inf_val + 2, inf_val); + BOOST_CHECK_EQUAL(inf_val - 2, inf_val); + BOOST_CHECK_EQUAL(inf_val + -2, inf_val); + BOOST_CHECK_EQUAL(inf_val - -2, inf_val); + BOOST_CHECK_EQUAL(-inf_val + 2, -inf_val); + BOOST_CHECK_EQUAL(-inf_val - 2, -inf_val); + BOOST_CHECK_EQUAL(-inf_val + -2, -inf_val); + BOOST_CHECK_EQUAL(-inf_val - -2, -inf_val); + + BOOST_CHECK_EQUAL(2 + inf_val, inf_val); + BOOST_CHECK_EQUAL(2 - inf_val, -inf_val); + BOOST_CHECK_EQUAL(-2 + inf_val, inf_val); + BOOST_CHECK_EQUAL(-2 - inf_val, -inf_val); + BOOST_CHECK_EQUAL(2 + (-inf_val), -inf_val); + BOOST_CHECK_EQUAL(2 - (-inf_val), inf_val); + BOOST_CHECK_EQUAL(-2 + (-inf_val), -inf_val); + BOOST_CHECK_EQUAL(-2 - (-inf_val), inf_val); + + BOOST_CHECK_EQUAL(sqrt(inf_val), inf_val); + BOOST_CHECK(boost::math::isnan(sqrt(-inf_val))); + + BOOST_CHECK_EQUAL(inf_val + test_type(2), inf_val); + BOOST_CHECK_EQUAL(inf_val - test_type(2), inf_val); + BOOST_CHECK_EQUAL(inf_val + test_type(-2), inf_val); + BOOST_CHECK_EQUAL(inf_val - test_type(-2), inf_val); + BOOST_CHECK_EQUAL(-inf_val + test_type(2), -inf_val); + BOOST_CHECK_EQUAL(-inf_val - test_type(2), -inf_val); + BOOST_CHECK_EQUAL(-inf_val + test_type(-2), -inf_val); + BOOST_CHECK_EQUAL(-inf_val - test_type(-2), -inf_val); + + BOOST_CHECK_EQUAL(test_type(2) + inf_val, inf_val); + BOOST_CHECK_EQUAL(test_type(2) - inf_val, -inf_val); + BOOST_CHECK_EQUAL(test_type(-2) + inf_val, inf_val); + BOOST_CHECK_EQUAL(test_type(-2) - inf_val, -inf_val); + BOOST_CHECK_EQUAL(test_type(2) + (-inf_val), -inf_val); + BOOST_CHECK_EQUAL(test_type(2) - (-inf_val), inf_val); + BOOST_CHECK_EQUAL(test_type(-2) + (-inf_val), -inf_val); + BOOST_CHECK_EQUAL(test_type(-2) - (-inf_val), inf_val); + + BOOST_CHECK((boost::math::isnan)(inf_val - inf_val)); + BOOST_CHECK_EQUAL(inf_val * 2, inf_val); + BOOST_CHECK_EQUAL(-inf_val * 2, -inf_val); + BOOST_CHECK_EQUAL(inf_val * -2, -inf_val); + BOOST_CHECK_EQUAL(-inf_val * -2, inf_val); + BOOST_CHECK_EQUAL(inf_val * test_type(-2), -inf_val); + BOOST_CHECK_EQUAL(-inf_val * test_type(-2), inf_val); + BOOST_CHECK((boost::math::isnan)(inf_val * 0)); + BOOST_CHECK((boost::math::isnan)(-inf_val * 0)); + BOOST_CHECK_EQUAL(inf_val / 2, inf_val); + BOOST_CHECK_EQUAL(-inf_val / 2, -inf_val); + BOOST_CHECK_EQUAL(inf_val / -2, -inf_val); + BOOST_CHECK_EQUAL(-inf_val / -2, inf_val); + BOOST_CHECK_EQUAL(inf_val / test_type(-2), -inf_val); + BOOST_CHECK_EQUAL(-inf_val / test_type(-2), inf_val); + BOOST_CHECK_EQUAL(inf_val / 0, inf_val); + BOOST_CHECK_EQUAL(-inf_val / 0, -inf_val); + BOOST_CHECK((boost::math::isnan)(inf_val / inf_val)); + BOOST_CHECK((boost::math::isnan)(-inf_val / inf_val)); + // Things involving nan: + BOOST_CHECK((boost::math::isnan)(nan_val + 2)); + BOOST_CHECK((boost::math::isnan)(nan_val - 2)); + BOOST_CHECK((boost::math::isnan)(nan_val + 0)); + BOOST_CHECK((boost::math::isnan)(nan_val - 0)); + BOOST_CHECK((boost::math::isnan)(nan_val + inf_val)); + BOOST_CHECK((boost::math::isnan)(nan_val - inf_val)); + BOOST_CHECK((boost::math::isnan)(nan_val + nan_val)); + BOOST_CHECK((boost::math::isnan)(nan_val - nan_val)); + BOOST_CHECK((boost::math::isnan)(2 + nan_val)); + BOOST_CHECK((boost::math::isnan)(2 - nan_val)); + BOOST_CHECK((boost::math::isnan)(0 - nan_val)); + BOOST_CHECK((boost::math::isnan)(0 - nan_val)); + BOOST_CHECK((boost::math::isnan)(inf_val + nan_val)); + BOOST_CHECK((boost::math::isnan)(inf_val - nan_val)); + BOOST_CHECK((boost::math::isnan)(nan_val * 2)); + BOOST_CHECK((boost::math::isnan)(nan_val / 2)); + BOOST_CHECK((boost::math::isnan)(nan_val * 0)); + BOOST_CHECK((boost::math::isnan)(nan_val / 0)); + BOOST_CHECK((boost::math::isnan)(nan_val * inf_val)); + BOOST_CHECK((boost::math::isnan)(nan_val / inf_val)); + BOOST_CHECK((boost::math::isnan)(nan_val * nan_val)); + BOOST_CHECK((boost::math::isnan)(nan_val / nan_val)); + BOOST_CHECK((boost::math::isnan)(2 * nan_val)); + BOOST_CHECK((boost::math::isnan)(2 / nan_val)); + BOOST_CHECK((boost::math::isnan)(0 / nan_val)); + BOOST_CHECK((boost::math::isnan)(0 / nan_val)); + BOOST_CHECK((boost::math::isnan)(inf_val * nan_val)); + BOOST_CHECK((boost::math::isnan)(inf_val / nan_val)); + // Corner cases: + BOOST_CHECK_EQUAL((max_val * half) / half, max_val); + BOOST_CHECK_EQUAL((max_val / 2) * 2, max_val); + BOOST_CHECK_EQUAL((min_val / half) * half, min_val); + BOOST_CHECK_EQUAL((min_val * 2) / 2, min_val); + BOOST_CHECK_EQUAL(max_val + min_val, max_val); + BOOST_CHECK_EQUAL(min_val + max_val, max_val); + BOOST_CHECK_EQUAL(max_val - min_val, max_val); + BOOST_CHECK_EQUAL(min_val - max_val, -max_val); + // Signed zeros: + BOOST_CHECK(boost::math::signbit(min_val * -min_val)); + BOOST_CHECK(boost::math::signbit(min_val * min_val) == 0); + BOOST_CHECK(boost::math::signbit(-min_val * -min_val) == 0); + BOOST_CHECK(boost::math::signbit(-min_val * min_val)); + BOOST_CHECK(boost::math::signbit(min_val / max_val) == 0); + BOOST_CHECK(boost::math::signbit(min_val / -max_val)); + BOOST_CHECK(boost::math::signbit(-min_val / -max_val) == 0); + BOOST_CHECK(boost::math::signbit(-min_val / max_val)); + BOOST_CHECK(boost::math::signbit(min_val / 2) == 0); + BOOST_CHECK(boost::math::signbit(min_val / -2)); + BOOST_CHECK(boost::math::signbit(-min_val / -2) == 0); + BOOST_CHECK(boost::math::signbit(-min_val / 2)); + test_type neg_zero = min_val * -min_val; + test_type zero = 0; + // Arithmetic involving signed zero: + BOOST_CHECK_EQUAL(-neg_zero, 0); + BOOST_CHECK(!boost::math::signbit(-neg_zero)); + BOOST_CHECK_EQUAL(neg_zero + 2, 2); + BOOST_CHECK_EQUAL(neg_zero + test_type(2), 2); + BOOST_CHECK_EQUAL(2 + neg_zero, 2); + BOOST_CHECK_EQUAL(test_type(2) + neg_zero, 2); + BOOST_CHECK_EQUAL(neg_zero + -2, -2); + BOOST_CHECK_EQUAL(neg_zero + test_type(-2), -2); + BOOST_CHECK_EQUAL(-2 + neg_zero, -2); + BOOST_CHECK_EQUAL(test_type(-2) + neg_zero, -2); + BOOST_CHECK_EQUAL(neg_zero - 2, -2); + BOOST_CHECK_EQUAL(neg_zero - test_type(2), -2); + BOOST_CHECK_EQUAL(2 - neg_zero, 2); + BOOST_CHECK_EQUAL(test_type(2) - neg_zero, 2); + BOOST_CHECK_EQUAL(neg_zero - -2, 2); + BOOST_CHECK_EQUAL(neg_zero - test_type(-2), 2); + BOOST_CHECK_EQUAL(-2 - neg_zero, -2); + BOOST_CHECK_EQUAL(test_type(-2) - neg_zero, -2); + BOOST_CHECK(!boost::math::signbit(test_type(2) + test_type(-2))); + BOOST_CHECK(!boost::math::signbit(test_type(2) - test_type(2))); + BOOST_CHECK(!boost::math::signbit(test_type(-2) - test_type(-2))); + BOOST_CHECK(!boost::math::signbit(test_type(-2) + test_type(2))); + BOOST_CHECK(!boost::math::signbit(zero + zero)); + BOOST_CHECK(!boost::math::signbit(zero - zero)); + BOOST_CHECK(!boost::math::signbit(neg_zero + zero)); + BOOST_CHECK(!boost::math::signbit(zero + neg_zero)); + BOOST_CHECK(boost::math::signbit(neg_zero + neg_zero)); + BOOST_CHECK(boost::math::signbit(neg_zero - zero)); + BOOST_CHECK(!boost::math::signbit(zero - neg_zero)); + BOOST_CHECK(!boost::math::signbit(neg_zero - neg_zero)); + small = 0.25; + BOOST_CHECK(!boost::math::signbit(floor(small))); + BOOST_CHECK(!boost::math::signbit(round(small))); + BOOST_CHECK(!boost::math::signbit(trunc(small))); + small = -small; + BOOST_CHECK(boost::math::signbit(ceil(small))); + BOOST_CHECK(boost::math::signbit(round(small))); + BOOST_CHECK(boost::math::signbit(trunc(small))); + + BOOST_CHECK_EQUAL(neg_zero * 2, 0); + BOOST_CHECK_EQUAL(neg_zero * test_type(2), 0); + BOOST_CHECK_EQUAL(2 * neg_zero, 0); + BOOST_CHECK_EQUAL(test_type(2) * neg_zero, 0); + BOOST_CHECK_EQUAL(neg_zero * -2, 0); + BOOST_CHECK_EQUAL(neg_zero * test_type(-2), 0); + BOOST_CHECK_EQUAL(-2 * neg_zero, 0); + BOOST_CHECK_EQUAL(test_type(-2) * neg_zero, 0); + BOOST_CHECK(boost::math::signbit(neg_zero * 2)); + BOOST_CHECK(boost::math::signbit(neg_zero * test_type(2))); + BOOST_CHECK(boost::math::signbit(2 * neg_zero)); + BOOST_CHECK(boost::math::signbit(test_type(2) * neg_zero)); + BOOST_CHECK(!boost::math::signbit(neg_zero * -2)); + BOOST_CHECK(!boost::math::signbit(neg_zero * test_type(-2))); + BOOST_CHECK(!boost::math::signbit(-2 * neg_zero)); + BOOST_CHECK(!boost::math::signbit(test_type(-2) * neg_zero)); + + BOOST_CHECK_EQUAL(neg_zero / 2, 0); + BOOST_CHECK_EQUAL(neg_zero / test_type(2), 0); + BOOST_CHECK_EQUAL(2 / neg_zero, -inf_val); + BOOST_CHECK_EQUAL(test_type(2) / neg_zero, -inf_val); + BOOST_CHECK_EQUAL(neg_zero / -2, 0); + BOOST_CHECK_EQUAL(neg_zero / test_type(-2), 0); + BOOST_CHECK_EQUAL(-2 / neg_zero, inf_val); + BOOST_CHECK_EQUAL(test_type(-2) / neg_zero, inf_val); + BOOST_CHECK(boost::math::signbit(neg_zero / 2)); + BOOST_CHECK(boost::math::signbit(neg_zero / test_type(2))); + BOOST_CHECK(boost::math::signbit(2 / neg_zero)); + BOOST_CHECK(boost::math::signbit(test_type(2) / neg_zero)); + BOOST_CHECK(!boost::math::signbit(neg_zero / -2)); + BOOST_CHECK(!boost::math::signbit(neg_zero / test_type(-2))); + BOOST_CHECK(!boost::math::signbit(-2 / neg_zero)); + BOOST_CHECK(!boost::math::signbit(test_type(-2) / neg_zero)); + + BOOST_CHECK(boost::math::signbit(neg_zero.convert_to<double>())); + BOOST_CHECK(boost::math::signbit(neg_zero.convert_to<float>())); + BOOST_CHECK(boost::math::signbit(neg_zero.convert_to<long double>())); + BOOST_CHECK(!boost::math::signbit(zero.convert_to<double>())); + BOOST_CHECK(!boost::math::signbit(zero.convert_to<float>())); + BOOST_CHECK(!boost::math::signbit(zero.convert_to<long double>())); + + // Conversions to other types of special values: + if (std::numeric_limits<float>::has_infinity) + { + BOOST_CHECK_EQUAL(inf_val.convert_to<float>(), std::numeric_limits<float>::infinity()); + BOOST_CHECK_EQUAL((-inf_val).convert_to<float>(), -std::numeric_limits<float>::infinity()); + } + if (std::numeric_limits<float>::has_quiet_NaN) + { + BOOST_CHECK((boost::math::isnan)(nan_val.convert_to<float>())); + } + if (std::numeric_limits<double>::has_infinity) + { + BOOST_CHECK_EQUAL(inf_val.convert_to<double>(), std::numeric_limits<double>::infinity()); + BOOST_CHECK_EQUAL((-inf_val).convert_to<double>(), -std::numeric_limits<double>::infinity()); + } + if (std::numeric_limits<double>::has_quiet_NaN) + { + BOOST_CHECK((boost::math::isnan)(nan_val.convert_to<double>())); + } + if (std::numeric_limits<long double>::has_infinity) + { + BOOST_CHECK_EQUAL(inf_val.convert_to<long double>(), std::numeric_limits<long double>::infinity()); + BOOST_CHECK_EQUAL((-inf_val).convert_to<long double>(), -std::numeric_limits<long double>::infinity()); + } + if (std::numeric_limits<long double>::has_quiet_NaN) + { + BOOST_CHECK((boost::math::isnan)(nan_val.convert_to<long double>())); + } + // + // Bug https://svn.boost.org/trac/boost/attachment/ticket/12580 + // + using std::ldexp; + test_type a(1); + test_type b = ldexp(test_type(0.99), -std::numeric_limits<test_type>::digits); + good_type ga(1); + good_type gb = ldexp(good_type(0.99), -std::numeric_limits<good_type>::digits); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + b = ldexp(test_type(0.5), -std::numeric_limits<test_type>::digits); + gb = ldexp(good_type(0.5), -std::numeric_limits<good_type>::digits); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + b = ldexp(test_type(1), -std::numeric_limits<test_type>::digits); + gb = ldexp(good_type(1), -std::numeric_limits<good_type>::digits); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + b = ldexp(test_type(0.50000000001), -std::numeric_limits<test_type>::digits); + gb = ldexp(good_type(0.50000000001), -std::numeric_limits<good_type>::digits); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + a = a + ldexp(a, -20); + ga = ga + ldexp(ga, -20); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + b = ldexp(test_type(0.5), -std::numeric_limits<test_type>::digits); + gb = ldexp(good_type(0.5), -std::numeric_limits<good_type>::digits); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + b = ldexp(test_type(1), -std::numeric_limits<test_type>::digits); + gb = ldexp(good_type(1), -std::numeric_limits<good_type>::digits); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + b = ldexp(test_type(0.50000000001), -std::numeric_limits<test_type>::digits); + gb = ldexp(good_type(0.50000000001), -std::numeric_limits<good_type>::digits); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + a = 1; + a = boost::math::float_prior(a); + ga = 1; + ga = boost::math::float_prior(ga); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + b = ldexp(test_type(0.5), -std::numeric_limits<test_type>::digits); + gb = ldexp(good_type(0.5), -std::numeric_limits<good_type>::digits); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + b = ldexp(test_type(1), -std::numeric_limits<test_type>::digits); + gb = ldexp(good_type(1), -std::numeric_limits<good_type>::digits); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); + + b = ldexp(test_type(0.50000000001), -std::numeric_limits<test_type>::digits); + gb = ldexp(good_type(0.50000000001), -std::numeric_limits<good_type>::digits); + BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga)); + + BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga)); + BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb)); + BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga)); +} + +int main() +{ + test_special_cases(); + unsigned error_count = 0; + for (unsigned i = 0; i < 100000; ++i) + { + good_type a = generate_random<good_type>(); + good_type b = generate_random<good_type>(); + test_type ta(a); + test_type tb(b); + + BOOST_CHECK_EQUAL(test_type(a * b), ta * tb); + BOOST_CHECK_EQUAL(test_type(-a * b), -ta * tb); + BOOST_CHECK_EQUAL(test_type(a * -b), ta * -tb); + BOOST_CHECK_EQUAL(test_type(-a * -b), -ta * -tb); + + BOOST_CHECK_EQUAL(test_type(a + b), ta + tb); + BOOST_CHECK_EQUAL(test_type(-a + b), -ta + tb); + BOOST_CHECK_EQUAL(test_type(a + -b), ta + -tb); + BOOST_CHECK_EQUAL(test_type(-a + -b), -ta + -tb); + + BOOST_CHECK_EQUAL(test_type(a - b), ta - tb); + BOOST_CHECK_EQUAL(test_type(-a - b), -ta - tb); + BOOST_CHECK_EQUAL(test_type(a - -b), ta - -tb); + BOOST_CHECK_EQUAL(test_type(-a - -b), -ta - -tb); + + BOOST_CHECK_EQUAL(test_type(a / b), ta / tb); + BOOST_CHECK_EQUAL(test_type(-a / b), -ta / tb); + BOOST_CHECK_EQUAL(test_type(a / -b), ta / -tb); + BOOST_CHECK_EQUAL(test_type(-a / -b), -ta / -tb); + + BOOST_CHECK_EQUAL(test_type(sqrt(a)), sqrt(ta)); + BOOST_CHECK_EQUAL(test_type(floor(a)), floor(ta)); + BOOST_CHECK_EQUAL(test_type(floor(-a)), floor(-ta)); + BOOST_CHECK_EQUAL(test_type(ceil(a)), ceil(ta)); + BOOST_CHECK_EQUAL(test_type(ceil(-a)), ceil(-ta)); + +#ifdef TEST_MPFR + // + // Conversions: + // + BOOST_CHECK_EQUAL(a.convert_to<double>(), ta.convert_to<double>()); + BOOST_CHECK_EQUAL(a.convert_to<float>(), ta.convert_to<float>()); + BOOST_CHECK_EQUAL(b.convert_to<double>(), tb.convert_to<double>()); + BOOST_CHECK_EQUAL(b.convert_to<float>(), tb.convert_to<float>()); +#else + BOOST_CHECK_EQUAL(a, ta.convert_to<double>()); + BOOST_CHECK_EQUAL(static_cast<float>(a), ta.convert_to<float>()); + BOOST_CHECK_EQUAL(b, tb.convert_to<double>()); + BOOST_CHECK_EQUAL(static_cast<float>(b), tb.convert_to<float>()); +#endif + + static boost::random::mt19937 i_gen; + + int si = i_gen(); + BOOST_CHECK_EQUAL(test_type(a * si), ta * si); + BOOST_CHECK_EQUAL(test_type(-a * si), -ta * si); + BOOST_CHECK_EQUAL(test_type(-a * -si), -ta * -si); + BOOST_CHECK_EQUAL(test_type(a * -si), ta * -si); + unsigned ui = std::abs(si); + BOOST_CHECK_EQUAL(test_type(a * ui), ta * ui); + BOOST_CHECK_EQUAL(test_type(-a * ui), -ta * ui); + + // Divide: + BOOST_CHECK_EQUAL(test_type(a / si), ta / si); + BOOST_CHECK_EQUAL(test_type(-a / si), -ta / si); + BOOST_CHECK_EQUAL(test_type(-a / -si), -ta / -si); + BOOST_CHECK_EQUAL(test_type(a / -si), ta / -si); + BOOST_CHECK_EQUAL(test_type(a / ui), ta / ui); + BOOST_CHECK_EQUAL(test_type(-a / ui), -ta / ui); + // Error reporting: + if (boost::detail::test_errors() != error_count) + { + error_count = boost::detail::test_errors(); + std::cout << std::setprecision(std::numeric_limits<test_type>::max_digits10) << std::scientific; + std::cout << "a (mpfr) = " << a << std::endl; + std::cout << "a (test) = " << ta << std::endl; + std::cout << "b (mpfr) = " << b << std::endl; + std::cout << "b (test) = " << tb << std::endl; + std::cout << "si = " << si << std::endl; + std::cout << "ui = " << ui << std::endl; + } + } + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_bin_float_conv.cpp b/src/boost/libs/multiprecision/test/test_cpp_bin_float_conv.cpp new file mode 100644 index 00000000..3ffebdbc --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_bin_float_conv.cpp @@ -0,0 +1,272 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/cstdint.hpp> + +template <class T> +T generate_random() +{ + typedef int e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(-20, 20); + return ldexp(val, ui(gen)); +} + +template <class T> +void check_round(const T& val, bool check_extended = false) +{ + double d1 = val.template convert_to<double>(); + double d2 = boost::math::nextafter(d1, d1 < val ? DBL_MAX : -DBL_MAX); + T diff1 = abs(d1 - val); + T diff2 = abs(d2 - val); + if (diff2 < diff1) + { + // Some debugging code here... + std::cout << val.str() << std::endl; + std::cout << std::setprecision(18); + std::cout << d1 << std::endl; + std::cout << d2 << std::endl; + std::cout << diff1 << std::endl; + std::cout << diff2 << std::endl; + d1 = val.template convert_to<double>(); + } + BOOST_CHECK(diff2 >= diff1); + BOOST_CHECK_EQUAL(boost::math::signbit(val), boost::math::signbit(d1)); + + float f1 = val.template convert_to<float>(); + float f2 = boost::math::nextafter(f1, f1 < val ? FLT_MAX : -FLT_MAX); + BOOST_CHECK(((abs(f1 - val) <= abs(f2 - val)))); + BOOST_CHECK_EQUAL(boost::math::signbit(val), boost::math::signbit(f1)); + +#if !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS) + + if (check_extended) + { + // + // We should check long double as well: + // + long double l1 = val.template convert_to<long double>(); + long double l2 = boost::math::nextafter(d1, d1 < val ? LDBL_MAX : -LDBL_MAX); + diff1 = abs(l1 - val); + diff2 = abs(l2 - val); + if (diff2 < diff1) + { + // Some debugging code here... + std::cout << val.str() << std::endl; + std::cout << std::setprecision(18); + std::cout << l1 << std::endl; + std::cout << l2 << std::endl; + std::cout << diff1 << std::endl; + std::cout << diff2 << std::endl; + l1 = val.template convert_to<long double>(); + } + BOOST_CHECK(diff2 >= diff1); + BOOST_CHECK_EQUAL(boost::math::signbit(val), boost::math::signbit(l1)); + } + +#endif +} + +int main() +{ + using namespace boost::multiprecision; + + cpp_int i(20); + cpp_bin_float_50 f50(i); + BOOST_CHECK_EQUAL(f50, 20); + f50 = i.convert_to<cpp_bin_float_50>(); + BOOST_CHECK_EQUAL(f50, 20); + + int1024_t i1024(45); + cpp_bin_float_100 f100(i1024); + BOOST_CHECK_EQUAL(f100, 45); + f100 = i1024.convert_to<cpp_bin_float_100>(); + BOOST_CHECK_EQUAL(f100, 45); + + uint1024_t ui1024(55); + cpp_bin_float_100 f100b(ui1024); + BOOST_CHECK_EQUAL(f100b, 55); + f100b = ui1024.convert_to<cpp_bin_float_100>(); + BOOST_CHECK_EQUAL(f100b, 55); + + typedef number<cpp_int_backend<32, 32>, et_off> i32_t; + i32_t i32(67); + cpp_bin_float_100 f100c(i32); + BOOST_CHECK_EQUAL(f100c, 67); + f100c = i32.convert_to<cpp_bin_float_100>(); + BOOST_CHECK_EQUAL(f100c, 67); + + typedef number<cpp_int_backend<32, 32, unsigned_magnitude>, et_off> ui32_t; + ui32_t ui32(98); + cpp_bin_float_100 f100d(ui32); + BOOST_CHECK_EQUAL(f100d, 98); + f100d = ui32.convert_to<cpp_bin_float_100>(); + BOOST_CHECK_EQUAL(f100d, 98); + + typedef number<cpp_int_backend<64, 64>, et_off> i64_t; + i64_t i64(67); + cpp_bin_float_100 f100e(i64); + BOOST_CHECK_EQUAL(f100e, 67); + f100e = i64.convert_to<cpp_bin_float_100>(); + BOOST_CHECK_EQUAL(f100e, 67); + + typedef number<cpp_int_backend<64, 64, unsigned_magnitude>, et_off> ui64_t; + ui64_t ui64(98); + cpp_bin_float_100 f100f(ui64); + BOOST_CHECK_EQUAL(f100f, 98); + f100f = ui64.convert_to<cpp_bin_float_100>(); + BOOST_CHECK_EQUAL(f100f, 98); + + typedef number<cpp_int_backend<128, 128>, et_off> i128_t; + i128_t i128(67); + cpp_bin_float_100 f100g(i128); + BOOST_CHECK_EQUAL(f100g, 67); + f100g = i128.convert_to<cpp_bin_float_100>(); + BOOST_CHECK_EQUAL(f100g, 67); + + typedef number<cpp_int_backend<128, 128, unsigned_magnitude>, et_off> ui128_t; + ui128_t ui128(98); + cpp_bin_float_100 f100h(ui128); + BOOST_CHECK_EQUAL(f100h, 98); + f100h = ui128.convert_to<cpp_bin_float_100>(); + BOOST_CHECK_EQUAL(f100h, 98); + + cpp_bin_float_quad q = (std::numeric_limits<float>::min)(); + BOOST_CHECK_EQUAL(q.convert_to<float>(), (std::numeric_limits<float>::min)()); + q = (std::numeric_limits<float>::max)(); + BOOST_CHECK_EQUAL(q.convert_to<float>(), (std::numeric_limits<float>::max)()); + q = (std::numeric_limits<float>::denorm_min)(); + BOOST_CHECK_EQUAL(q.convert_to<float>(), (std::numeric_limits<float>::denorm_min)()); + // See https://svn.boost.org/trac/boost/ticket/12512: + boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<128, boost::multiprecision::backends::digit_base_2, void, boost::int64_t> > ext_float("1e-646456978"); + BOOST_CHECK_EQUAL(ext_float.convert_to<float>(), 0); + + q = -(std::numeric_limits<float>::min)(); + BOOST_CHECK_EQUAL(q.convert_to<float>(), -(std::numeric_limits<float>::min)()); + q = -(std::numeric_limits<float>::max)(); + BOOST_CHECK_EQUAL(q.convert_to<float>(), -(std::numeric_limits<float>::max)()); + q = -(std::numeric_limits<float>::denorm_min)(); + BOOST_CHECK_EQUAL(q.convert_to<float>(), -(std::numeric_limits<float>::denorm_min)()); + // See https://svn.boost.org/trac/boost/ticket/12512: + ext_float = boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<128, boost::multiprecision::backends::digit_base_2, void, boost::int64_t> >("-1e-646456978"); + BOOST_CHECK_EQUAL(ext_float.convert_to<float>(), 0); + ext_float = (std::numeric_limits<double>::max)(); + ext_float *= 16; + if (std::numeric_limits<double>::has_infinity) + { + BOOST_CHECK_EQUAL(ext_float.convert_to<double>(), std::numeric_limits<double>::infinity()); + } + else + { + BOOST_CHECK_EQUAL(ext_float.convert_to<double>(), (std::numeric_limits<double>::max)()); + } + ext_float = -ext_float; + if (std::numeric_limits<double>::has_infinity) + { + BOOST_CHECK_EQUAL(ext_float.convert_to<double>(), -std::numeric_limits<double>::infinity()); + } + else + { + BOOST_CHECK_EQUAL(ext_float.convert_to<double>(), -(std::numeric_limits<double>::max)()); + } + // + // Check for double rounding when the result would be a denorm. + // See https://svn.boost.org/trac/boost/ticket/12527 + // + cpp_bin_float_50 r1 = ldexp(cpp_bin_float_50(0x8000000000000bffull), -63 - 1023); + check_round(r1); + r1 = -r1; + check_round(r1); + + r1 = ldexp(cpp_bin_float_50(0x8000017f), -31 - 127); + check_round(r1); + r1 = -r1; + check_round(r1); + // + // Check convertion to signed zero works OK: + // + r1 = -ldexp(cpp_bin_float_50(1), -3000); + check_round(r1); + r1 = 0; + r1 = -r1; + BOOST_CHECK(boost::math::signbit(r1)); + check_round(r1); + // + // Check boundary as the exponent drops below what a double can cope with + // but we will be rounding up: + // + r1 = 3; + r1 = ldexp(r1, std::numeric_limits<double>::min_exponent); + do + { + check_round(r1); + check_round(boost::math::float_next(r1)); + check_round(boost::math::float_prior(r1)); + r1 = ldexp(r1, -1); + } while (ilogb(r1) > std::numeric_limits<double>::min_exponent - 5 - std::numeric_limits<double>::digits); + r1 = -3; + r1 = ldexp(r1, std::numeric_limits<double>::min_exponent); + do + { + check_round(r1); + check_round(boost::math::float_next(r1)); + check_round(boost::math::float_prior(r1)); + r1 = ldexp(r1, -1); + } while (ilogb(r1) > std::numeric_limits<double>::min_exponent - 5 - std::numeric_limits<double>::digits); + // + // Again when not rounding up: + // + r1 = 1; + r1 = ldexp(r1, std::numeric_limits<double>::min_exponent); + do + { + check_round(r1); + check_round(boost::math::float_next(r1)); + check_round(boost::math::float_prior(r1)); + r1 = ldexp(r1, -1); + } while (ilogb(r1) > std::numeric_limits<double>::min_exponent - 5 - std::numeric_limits<double>::digits); + r1 = -1; + r1 = ldexp(r1, std::numeric_limits<double>::min_exponent); + do + { + check_round(r1); + check_round(boost::math::float_next(r1)); + check_round(boost::math::float_prior(r1)); + r1 = ldexp(r1, -1); + } while (ilogb(r1) > std::numeric_limits<double>::min_exponent - 5 - std::numeric_limits<double>::digits); + // + // Test random conversions: + // + for (unsigned j = 0; j < 10000; ++j) + { + check_round(generate_random<cpp_bin_float_50>(), true); + } + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_bin_float_io.cpp b/src/boost/libs/multiprecision/test/test_cpp_bin_float_io.cpp new file mode 100644 index 00000000..73daec4b --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_bin_float_io.cpp @@ -0,0 +1,271 @@ +// Copyright John Maddock 2013. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_bin_float.hpp> + +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/chrono.hpp> +#include "test.hpp" +#include <boost/array.hpp> +#include <iostream> +#include <iomanip> + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class Clock> +struct stopwatch +{ + typedef typename Clock::duration duration; + stopwatch() + { + m_start = Clock::now(); + } + duration elapsed() + { + return Clock::now() - m_start; + } + void reset() + { + m_start = Clock::now(); + } + + private: + typename Clock::time_point m_start; +}; + +void print_flags(std::ios_base::fmtflags f) +{ + std::cout << "Formatting flags were: "; + if (f & std::ios_base::scientific) + std::cout << "scientific "; + if (f & std::ios_base::fixed) + std::cout << "fixed "; + if (f & std::ios_base::showpoint) + std::cout << "showpoint "; + if (f & std::ios_base::showpos) + std::cout << "showpos "; + std::cout << std::endl; +} + +template <class T> +void test() +{ + typedef T mp_t; + boost::array<std::ios_base::fmtflags, 9> f = + {{std::ios_base::fmtflags(0), std::ios_base::showpoint, std::ios_base::showpos, std::ios_base::scientific, std::ios_base::scientific | std::ios_base::showpos, + std::ios_base::scientific | std::ios_base::showpoint, std::ios_base::fixed, std::ios_base::fixed | std::ios_base::showpoint, + std::ios_base::fixed | std::ios_base::showpos}}; + + boost::array<boost::array<const char*, 13 * 9>, 40> string_data = {{ +#include "libs/multiprecision/test/string_data.ipp" + }}; + + double num = 123456789.0; + double denom = 1; + double val = num; + for (unsigned j = 0; j < 40; ++j) + { + unsigned col = 0; + for (unsigned prec = 1; prec < 14; ++prec) + { + for (unsigned i = 0; i < f.size(); ++i, ++col) + { + std::stringstream ss; + ss.precision(prec); + ss.flags(f[i]); + ss << mp_t(val); + const char* expect = string_data[j][col]; + if (ss.str() != expect) + { + std::cout << std::setprecision(20) << "Testing value " << val << std::endl; + print_flags(f[i]); + std::cout << "Precision is: " << prec << std::endl; + std::cout << "Got: " << ss.str() << std::endl; + std::cout << "Expected: " << expect << std::endl; + ++boost::detail::test_errors(); + mp_t(val).str(prec, f[i]); // for debugging + } + } + } + num = -num; + if (j & 1) + denom *= 8; + val = num / denom; + } + + boost::array<const char*, 13 * 9> zeros = + {{"0", "0.", "+0", "0.0e+00", "+0.0e+00", "0.0e+00", "0.0", "0.0", "+0.0", "0", "0.0", "+0", "0.00e+00", "+0.00e+00", "0.00e+00", "0.00", "0.00", "+0.00", "0", "0.00", "+0", "0.000e+00", "+0.000e+00", "0.000e+00", "0.000", "0.000", "+0.000", "0", "0.000", "+0", "0.0000e+00", "+0.0000e+00", "0.0000e+00", "0.0000", "0.0000", "+0.0000", "0", "0.0000", "+0", "0.00000e+00", "+0.00000e+00", "0.00000e+00", "0.00000", "0.00000", "+0.00000", "0", "0.00000", "+0", "0.000000e+00", "+0.000000e+00", "0.000000e+00", "0.000000", "0.000000", "+0.000000", "0", "0.000000", "+0", "0.0000000e+00", "+0.0000000e+00", "0.0000000e+00", "0.0000000", "0.0000000", "+0.0000000", "0", "0.0000000", "+0", "0.00000000e+00", "+0.00000000e+00", "0.00000000e+00", "0.00000000", "0.00000000", "+0.00000000", "0", "0.00000000", "+0", "0.000000000e+00", "+0.000000000e+00", "0.000000000e+00", "0.000000000", "0.000000000", "+0.000000000", "0", "0.000000000", "+0", "0.0000000000e+00", "+0.0000000000e+00", "0.0000000000e+00", "0.0000000000", "0.0000000000", "+0.0000000000", "0", "0.0000000000", "+0", "0.00000000000e+00", "+0.00000000000e+00", "0.00000000000e+00", "0.00000000000", "0.00000000000", "+0.00000000000", "0", "0.00000000000", "+0", "0.000000000000e+00", "+0.000000000000e+00", "0.000000000000e+00", "0.000000000000", "0.000000000000", "+0.000000000000", "0", "0.000000000000", "+0", "0.0000000000000e+00", "+0.0000000000000e+00", "0.0000000000000e+00", "0.0000000000000", "0.0000000000000", "+0.0000000000000"}}; + + unsigned col = 0; + val = 0; + for (unsigned prec = 1; prec < 14; ++prec) + { + for (unsigned i = 0; i < f.size(); ++i, ++col) + { + std::stringstream ss; + ss.precision(prec); + ss.flags(f[i]); + ss << mp_t(val); + const char* expect = zeros[col]; + if (ss.str() != expect) + { + std::cout << std::setprecision(20) << "Testing value " << val << std::endl; + print_flags(f[i]); + std::cout << "Precision is: " << prec << std::endl; + std::cout << "Got: " << ss.str() << std::endl; + std::cout << "Expected: " << expect << std::endl; + ++boost::detail::test_errors(); + mp_t(val).str(prec, f[i]); // for debugging + } + } + } + + if (std::numeric_limits<mp_t>::has_infinity) + { + T val = std::numeric_limits<T>::infinity(); + BOOST_CHECK_EQUAL(val.str(), "inf"); + BOOST_CHECK_EQUAL(val.str(0, std::ios_base::showpos), "+inf"); + val = -val; + BOOST_CHECK_EQUAL(val.str(), "-inf"); + BOOST_CHECK_EQUAL(val.str(0, std::ios_base::showpos), "-inf"); + + val = static_cast<T>("inf"); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + val = static_cast<T>("+inf"); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + val = static_cast<T>("-inf"); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<mp_t>::has_quiet_NaN) + { + T val = std::numeric_limits<T>::quiet_NaN(); + BOOST_CHECK_EQUAL(val.str(), "nan"); + val = static_cast<T>("nan"); + BOOST_CHECK((boost::math::isnan)(val)); + } + // + // Min and max values: + // + T t((std::numeric_limits<T>::max)().str(std::numeric_limits<T>::max_digits10, std::ios_base::scientific)); + BOOST_CHECK_EQUAL(t, (std::numeric_limits<T>::max)()); + t = T((std::numeric_limits<T>::min)().str(std::numeric_limits<T>::max_digits10, std::ios_base::scientific)); + BOOST_CHECK_EQUAL(t, (std::numeric_limits<T>::min)()); + t = T((std::numeric_limits<T>::lowest)().str(std::numeric_limits<T>::max_digits10, std::ios_base::scientific)); + BOOST_CHECK_EQUAL(t, (std::numeric_limits<T>::lowest)()); +} + +template <class T> +T generate_random() +{ + typedef typename T::backend_type::exponent_type e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(0, std::numeric_limits<T>::max_exponent); + return ldexp(val, ui(gen)); +} + +template <class T> +void do_round_trip(const T& val, std::ios_base::fmtflags f) +{ + std::stringstream ss; +#ifndef BOOST_NO_CXX11_NUMERIC_LIMITS + ss << std::setprecision(std::numeric_limits<T>::max_digits10); +#else + ss << std::setprecision(std::numeric_limits<T>::digits10 + 3); +#endif + ss.flags(f); + ss << val; + T new_val = static_cast<T>(ss.str()); + BOOST_CHECK_EQUAL(new_val, val); + new_val = static_cast<T>(val.str(0, f)); + BOOST_CHECK_EQUAL(new_val, val); +} + +template <class T> +void do_round_trip(const T& val) +{ + do_round_trip(val, std::ios_base::fmtflags(0)); + do_round_trip(val, std::ios_base::fmtflags(std::ios_base::scientific)); + if ((fabs(val) > 1) && (fabs(val) < 1e100)) + do_round_trip(val, std::ios_base::fmtflags(std::ios_base::fixed)); + + static int error_count = 0; + + if (error_count != boost::detail::test_errors()) + { + error_count = boost::detail::test_errors(); + std::cout << "Errors occured while testing value...."; + if (val.backend().sign()) + std::cout << "-"; + std::cout << boost::multiprecision::cpp_int(val.backend().bits()) << "e" << val.backend().exponent() << std::endl; + } +} + +template <class T> +void test_round_trip() +{ + std::cout << "Testing type " << typeid(T).name() << std::endl; + std::cout << "digits = " << std::numeric_limits<T>::digits << std::endl; + std::cout << "digits10 = " << std::numeric_limits<T>::digits10 << std::endl; + std::cout << "max_digits10 = " << std::numeric_limits<T>::max_digits10 << std::endl; + + stopwatch<boost::chrono::high_resolution_clock> w; + +#ifndef CI_SUPPRESS_KNOWN_ISSUES + while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 200) +#else + while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 50) +#endif + { + T val = generate_random<T>(); + do_round_trip(val); + do_round_trip(T(-val)); + do_round_trip(T(1 / val)); + do_round_trip(T(-1 / val)); + + if (boost::detail::test_errors() > 200) + break; // escape if there are too many errors. + } + + std::cout << "Execution time = " << boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() << "s" << std::endl; +} + +#if !defined(TEST1) && !defined(TEST2) +#define TEST1 +#define TEST2 +#endif + +int main() +{ + using namespace boost::multiprecision; +#ifdef TEST1 + test<number<cpp_bin_float<113, digit_base_2> > >(); + test_round_trip<number<cpp_bin_float<113, digit_base_2> > >(); +#endif +#ifdef TEST2 + test<number<cpp_bin_float<53, digit_base_2> > >(); + test_round_trip<number<cpp_bin_float<53, digit_base_2> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_bin_float_round.cpp b/src/boost/libs/multiprecision/test/test_cpp_bin_float_round.cpp new file mode 100644 index 00000000..aaf7971a --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_bin_float_round.cpp @@ -0,0 +1,87 @@ +// Copyright John Maddock 2016. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +// +// This file takes way too long to run to be part of the main regression test suite, +// but is useful in probing for errors in cpp_bin_float's rounding code. +// It cycles through every single value of type float, and rounds those numbers +// plus some closely related ones and compares the results to those produced by MPFR. +// +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/mpfr.hpp> +#include <boost/math/special_functions/next.hpp> +#include "test.hpp" + +using namespace boost::multiprecision; + +typedef number<mpfr_float_backend<35> > good_type; +typedef number<cpp_bin_float<std::numeric_limits<good_type>::digits, digit_base_2>, et_off> test_type; + +int main() +{ + float f = (std::numeric_limits<float>::max)(); + + do + { + float fr1, fr2; + good_type gf(f), gf2(f); + test_type tf(f), tf2(f); + fr1 = gf.convert_to<float>(); + fr2 = tf.convert_to<float>(); + BOOST_CHECK_EQUAL(fr1, fr2); + // next represenation: + gf = boost::math::float_next(gf2); + tf = boost::math::float_next(tf2); + BOOST_CHECK_NE(gf, gf2); + BOOST_CHECK_NE(tf, tf2); + fr1 = gf.convert_to<float>(); + fr2 = tf.convert_to<float>(); + BOOST_CHECK_EQUAL(fr1, fr2); + // previous representation: + gf = boost::math::float_prior(gf2); + tf = boost::math::float_prior(tf2); + BOOST_CHECK_NE(gf, gf2); + BOOST_CHECK_NE(tf, tf2); + fr1 = gf.convert_to<float>(); + fr2 = tf.convert_to<float>(); + BOOST_CHECK_EQUAL(fr1, fr2); + + // Create ands test ties: + int e; + std::frexp(f, &e); + float extra = std::ldexp(1.0f, e - std::numeric_limits<float>::digits - 1); + gf = gf2 += extra; + tf = tf2 += extra; + fr1 = gf.convert_to<float>(); + fr2 = tf.convert_to<float>(); + BOOST_CHECK_EQUAL(fr1, fr2); + // next represenation: + gf = boost::math::float_next(gf2); + tf = boost::math::float_next(tf2); + BOOST_CHECK_NE(gf, gf2); + BOOST_CHECK_NE(tf, tf2); + fr1 = gf.convert_to<float>(); + fr2 = tf.convert_to<float>(); + BOOST_CHECK_EQUAL(fr1, fr2); + // previous representation: + gf = boost::math::float_prior(gf2); + tf = boost::math::float_prior(tf2); + BOOST_CHECK_NE(gf, gf2); + BOOST_CHECK_NE(tf, tf2); + fr1 = gf.convert_to<float>(); + fr2 = tf.convert_to<float>(); + BOOST_CHECK_EQUAL(fr1, fr2); + + f = boost::math::float_prior(f); + } while (f); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_bin_float_serial.cpp b/src/boost/libs/multiprecision/test/test_cpp_bin_float_serial.cpp new file mode 100644 index 00000000..6ace1089 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_bin_float_serial.cpp @@ -0,0 +1,32 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2013 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_bin_float.hpp> +#include "test_float_serial.hpp" + +#if !defined(TEST1) && !defined(TEST2) +#define TEST1 +#define TEST2 +#endif + +int main() +{ + using namespace boost::multiprecision; +#ifdef TEST1 + test<cpp_bin_float_50>(); +#endif +#ifdef TEST2 + test<cpp_bin_float_quad>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_dec_float_conv.cpp b/src/boost/libs/multiprecision/test/test_cpp_dec_float_conv.cpp new file mode 100644 index 00000000..e562b364 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_dec_float_conv.cpp @@ -0,0 +1,38 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#include <boost/multiprecision/cpp_dec_float.hpp> + +int main() +{ + using namespace boost::multiprecision; + // + // Test interconversions between different precisions: + // + cpp_dec_float_50 f1(2); + cpp_dec_float_100 f2(3); + + cpp_dec_float_100 f3 = f1; // implicit conversion OK + BOOST_TEST(f3 == 2); + cpp_dec_float_50 f4(f2); // explicit conversion OK + BOOST_TEST(f4 == 3); + + f2 = f1; + BOOST_TEST(f2 == 2); + f2 = 4; + f1 = static_cast<cpp_dec_float_50>(f2); + BOOST_TEST(f1 == 4); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_dec_float_round.cpp b/src/boost/libs/multiprecision/test/test_cpp_dec_float_round.cpp new file mode 100644 index 00000000..15c59e79 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_dec_float_round.cpp @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2013 Christopher Kormanyos. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// + +// Test case for ticket: +// #8065: Multiprecision rounding issue + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include "test.hpp" +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/math/special_functions/round.hpp> + +template <int N> +static bool round_test_imp() +{ + typedef boost::multiprecision::cpp_dec_float<N> mp_backend_type; + typedef boost::multiprecision::number<mp_backend_type, boost::multiprecision::et_off> mp_type; + + const mp_type original_digits(1.0F); + + const mp_type scale = pow(mp_type(10), N); + + mp_type these_digits = original_digits * scale; + + these_digits = boost::math::round(these_digits); + these_digits /= scale; + + const std::string result = these_digits.str(); + + return (result == original_digits.str()); +} + +template <int N> +struct round_test +{ + static bool test() + { + return (round_test_imp<N>() && round_test<N - 1>::test()); + } +}; + +template <> +struct round_test<0> +{ + static bool test() + { + return round_test_imp<0>(); + } +}; + +int main() +{ + // + // Test cpp_dec_float rounding with boost::math::round() at various precisions: + // + const bool round_test_result = round_test<40>::test(); + + BOOST_CHECK_EQUAL(round_test_result, true); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_dec_float_serial.cpp b/src/boost/libs/multiprecision/test/test_cpp_dec_float_serial.cpp new file mode 100644 index 00000000..c023e488 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_dec_float_serial.cpp @@ -0,0 +1,32 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2013 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_dec_float.hpp> +#include "test_float_serial.hpp" + +#if !defined(TEST1) && !defined(TEST2) +#define TEST1 +#define TEST2 +#endif + +int main() +{ + using namespace boost::multiprecision; +#ifdef TEST1 + test<cpp_dec_float_50>(); +#endif +#ifdef TEST2 + test<number<cpp_dec_float<100, boost::int64_t, std::allocator<char> > > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_int.cpp b/src/boost/libs/multiprecision/test/test_cpp_int.cpp new file mode 100644 index 00000000..44adf004 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_int.cpp @@ -0,0 +1,799 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +// +// This ensures all our code gets tested, even though it may +// not be the fastest configuration in normal use: +// +#define BOOST_MP_USE_LIMB_SHIFT + +#include <boost/multiprecision/gmp.hpp> +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/timer.hpp> +#include "test.hpp" + +#ifdef _MSC_VER +#pragma warning(disable : 4127) // Conditional expression is constant +#endif + +#if !defined(TEST1) && !defined(TEST2) && !defined(TEST3) +#define TEST1 +#define TEST2 +#define TEST3 +#endif + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class T> +struct is_checked_cpp_int : public boost::mpl::false_ +{}; +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, class Allocator, boost::multiprecision::expression_template_option ET> +struct is_checked_cpp_int<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::checked, Allocator>, ET> > : public boost::mpl::true_ +{}; + +template <class Number> +struct tester +{ + typedef Number test_type; + typedef typename test_type::backend_type::checked_type checked; + + unsigned last_error_count; + boost::timer tim; + + boost::multiprecision::mpz_int a, b, c, d; + int si; + unsigned ui; + test_type a1, b1, c1, d1; + + void t1() + { + using namespace boost::multiprecision; + BOOST_CHECK_EQUAL(a.str(), a1.str()); + BOOST_CHECK_EQUAL(b.str(), b1.str()); + BOOST_CHECK_EQUAL(c.str(), c1.str()); + BOOST_CHECK_EQUAL(d.str(), d1.str()); + BOOST_CHECK_EQUAL(mpz_int(a + b).str(), test_type(a1 + b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) += b).str(), (test_type(a1) += b1).str()); + BOOST_CHECK_EQUAL((mpz_int(b) += a).str(), (test_type(b1) += a1).str()); + BOOST_CHECK_EQUAL(mpz_int(a - b).str(), test_type(a1 - b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) -= b).str(), (test_type(a1) -= b1).str()); + BOOST_CHECK_EQUAL(mpz_int(mpz_int(-a) + b).str(), test_type(test_type(-a1) + b1).str()); + BOOST_CHECK_EQUAL(mpz_int(mpz_int(-a) - b).str(), test_type(test_type(-a1) - b1).str()); + BOOST_CHECK_EQUAL(mpz_int(c * d).str(), test_type(c1 * d1).str()); + BOOST_CHECK_EQUAL((mpz_int(c) *= d).str(), (test_type(c1) *= d1).str()); + BOOST_CHECK_EQUAL((mpz_int(d) *= c).str(), (test_type(d1) *= c1).str()); + BOOST_CHECK_EQUAL(mpz_int(c * -d).str(), test_type(c1 * -d1).str()); + BOOST_CHECK_EQUAL(mpz_int(-c * d).str(), test_type(-c1 * d1).str()); + BOOST_CHECK_EQUAL((mpz_int(c) *= -d).str(), (test_type(c1) *= -d1).str()); + BOOST_CHECK_EQUAL((mpz_int(-d) *= c).str(), (test_type(-d1) *= c1).str()); + BOOST_CHECK_EQUAL(mpz_int(b * c).str(), test_type(b1 * c1).str()); + BOOST_CHECK_EQUAL(mpz_int(a / b).str(), test_type(a1 / b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) /= b).str(), (test_type(a1) /= b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a / -b).str(), test_type(a1 / -b1).str()); + BOOST_CHECK_EQUAL(mpz_int(-a / b).str(), test_type(-a1 / b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) /= -b).str(), (test_type(a1) /= -b1).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) /= b).str(), (test_type(-a1) /= b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a / d).str(), test_type(a1 / d1).str()); + BOOST_CHECK_EQUAL(mpz_int(a % b).str(), test_type(a1 % b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) %= b).str(), (test_type(a1) %= b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a % -b).str(), test_type(a1 % -b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) %= -b).str(), (test_type(a1) %= -b1).str()); + BOOST_CHECK_EQUAL(mpz_int(-a % b).str(), test_type(-a1 % b1).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) %= b).str(), (test_type(-a1) %= b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a % d).str(), test_type(a1 % d1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) %= d).str(), (test_type(a1) %= d1).str()); + + if (!std::numeric_limits<test_type>::is_bounded) + { + test_type p = a1 * b1; + test_type r; + divide_qr(p, b1, p, r); + BOOST_CHECK_EQUAL(p, a1); + BOOST_CHECK_EQUAL(r, test_type(0)); + + p = a1 * d1; + divide_qr(p, d1, p, r); + BOOST_CHECK_EQUAL(p, a1); + BOOST_CHECK_EQUAL(r, test_type(0)); + + divide_qr(p, test_type(1), p, r); + BOOST_CHECK_EQUAL(p, a1); + BOOST_CHECK_EQUAL(r, test_type(0)); + } + } + + void t2() + { + using namespace boost::multiprecision; + // bitwise ops: + BOOST_CHECK_EQUAL(mpz_int(a | b).str(), test_type(a1 | b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) |= b).str(), (test_type(a1) |= b1).str()); + if (!is_checked_cpp_int<test_type>::value) + { + BOOST_CHECK_EQUAL(mpz_int(-a | b).str(), test_type(-a1 | b1).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) |= b).str(), (test_type(-a1) |= b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a | -b).str(), test_type(a1 | -b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) |= -b).str(), (test_type(a1) |= -b1).str()); + BOOST_CHECK_EQUAL(mpz_int(-a | -b).str(), test_type(-a1 | -b1).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) |= -b).str(), (test_type(-a1) |= -b1).str()); + } + BOOST_CHECK_EQUAL(mpz_int(a & b).str(), test_type(a1 & b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) &= b).str(), (test_type(a1) &= b1).str()); + if (!is_checked_cpp_int<test_type>::value) + { + BOOST_CHECK_EQUAL(mpz_int(-a & b).str(), test_type(-a1 & b1).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) &= b).str(), (test_type(-a1) &= b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a & -b).str(), test_type(a1 & -b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) &= -b).str(), (test_type(a1) &= -b1).str()); + BOOST_CHECK_EQUAL(mpz_int(-a & -b).str(), test_type(-a1 & -b1).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) &= -b).str(), (test_type(-a1) &= -b1).str()); + } + BOOST_CHECK_EQUAL(mpz_int(a ^ b).str(), test_type(a1 ^ b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) ^= b).str(), (test_type(a1) ^= b1).str()); + if (!is_checked_cpp_int<test_type>::value) + { + BOOST_CHECK_EQUAL(mpz_int(-a ^ b).str(), test_type(-a1 ^ b1).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) ^= b).str(), (test_type(-a1) ^= b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a ^ -b).str(), test_type(a1 ^ -b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) ^= -b).str(), (test_type(a1) ^= -b1).str()); + BOOST_CHECK_EQUAL(mpz_int(-a ^ -b).str(), test_type(-a1 ^ -b1).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) ^= -b).str(), (test_type(-a1) ^= -b1).str()); + } + // Shift ops: + for (unsigned i = 0; i < 128; ++i) + { + if (!std::numeric_limits<test_type>::is_bounded) + { + BOOST_CHECK_EQUAL(mpz_int(a << i).str(), test_type(a1 << i).str()); + BOOST_CHECK_EQUAL(mpz_int(-a << i).str(), test_type(-a1 << i).str()); + } + else if (!is_checked_cpp_int<test_type>::value) + { + test_type t1(mpz_int(a << i).str()); + test_type t2 = a1 << i; + BOOST_CHECK_EQUAL(t1, t2); + t1 = test_type(mpz_int(-a << i).str()); + t2 = -a1 << i; + BOOST_CHECK_EQUAL(t1, t2); + } + BOOST_CHECK_EQUAL(mpz_int(a >> i).str(), test_type(a1 >> i).str()); + if (!is_checked_cpp_int<test_type>::value) + { + BOOST_CHECK_EQUAL(mpz_int(-a >> i).str(), test_type(-a1 >> i).str()); + } + } + // gcd/lcm + BOOST_CHECK_EQUAL(mpz_int(gcd(a, b)).str(), test_type(gcd(a1, b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(c, d)).str(), test_type(lcm(c1, d1)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(-a, b)).str(), test_type(gcd(-a1, b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(-c, d)).str(), test_type(lcm(-c1, d1)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(-a, -b)).str(), test_type(gcd(-a1, -b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(-c, -d)).str(), test_type(lcm(-c1, -d1)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(a, -b)).str(), test_type(gcd(a1, -b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(c, -d)).str(), test_type(lcm(c1, -d1)).str()); + // Integer sqrt: + mpz_int r; + test_type r1; + BOOST_CHECK_EQUAL(sqrt(a, r).str(), sqrt(a1, r1).str()); + BOOST_CHECK_EQUAL(r.str(), r1.str()); + } + + void t3() + { + using namespace boost::multiprecision; + // Now check operations involving signed integers: + BOOST_CHECK_EQUAL(mpz_int(a + si).str(), test_type(a1 + si).str()); + BOOST_CHECK_EQUAL(mpz_int(a + -si).str(), test_type(a1 + -si).str()); + BOOST_CHECK_EQUAL(mpz_int(-a + si).str(), test_type(-a1 + si).str()); + BOOST_CHECK_EQUAL(mpz_int(si + a).str(), test_type(si + a1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) += si).str(), (test_type(a1) += si).str()); + BOOST_CHECK_EQUAL((mpz_int(a) += -si).str(), (test_type(a1) += -si).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) += si).str(), (test_type(-a1) += si).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) += -si).str(), (test_type(-a1) += -si).str()); + BOOST_CHECK_EQUAL(mpz_int(a - si).str(), test_type(a1 - si).str()); + BOOST_CHECK_EQUAL(mpz_int(a - -si).str(), test_type(a1 - -si).str()); + BOOST_CHECK_EQUAL(mpz_int(-a - si).str(), test_type(-a1 - si).str()); + BOOST_CHECK_EQUAL(mpz_int(si - a).str(), test_type(si - a1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) -= si).str(), (test_type(a1) -= si).str()); + BOOST_CHECK_EQUAL((mpz_int(a) -= -si).str(), (test_type(a1) -= -si).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) -= si).str(), (test_type(-a1) -= si).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) -= -si).str(), (test_type(-a1) -= -si).str()); + BOOST_CHECK_EQUAL(mpz_int(b * si).str(), test_type(b1 * si).str()); + BOOST_CHECK_EQUAL(mpz_int(b * -si).str(), test_type(b1 * -si).str()); + BOOST_CHECK_EQUAL(mpz_int(-b * si).str(), test_type(-b1 * si).str()); + BOOST_CHECK_EQUAL(mpz_int(si * b).str(), test_type(si * b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) *= si).str(), (test_type(a1) *= si).str()); + BOOST_CHECK_EQUAL((mpz_int(a) *= -si).str(), (test_type(a1) *= -si).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) *= si).str(), (test_type(-a1) *= si).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) *= -si).str(), (test_type(-a1) *= -si).str()); + BOOST_CHECK_EQUAL(mpz_int(a / si).str(), test_type(a1 / si).str()); + BOOST_CHECK_EQUAL(mpz_int(a / -si).str(), test_type(a1 / -si).str()); + BOOST_CHECK_EQUAL(mpz_int(-a / si).str(), test_type(-a1 / si).str()); + BOOST_CHECK_EQUAL((mpz_int(a) /= si).str(), (test_type(a1) /= si).str()); + BOOST_CHECK_EQUAL((mpz_int(a) /= -si).str(), (test_type(a1) /= -si).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) /= si).str(), (test_type(-a1) /= si).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) /= -si).str(), (test_type(-a1) /= -si).str()); + BOOST_CHECK_EQUAL(mpz_int(a % si).str(), test_type(a1 % si).str()); + BOOST_CHECK_EQUAL(mpz_int(a % -si).str(), test_type(a1 % -si).str()); + BOOST_CHECK_EQUAL(mpz_int(-a % si).str(), test_type(-a1 % si).str()); + BOOST_CHECK_EQUAL((mpz_int(a) %= si).str(), (test_type(a1) %= si).str()); + BOOST_CHECK_EQUAL((mpz_int(a) %= -si).str(), (test_type(a1) %= -si).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) %= si).str(), (test_type(-a1) %= si).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) %= -si).str(), (test_type(-a1) %= -si).str()); + if ((si > 0) || !is_checked_cpp_int<test_type>::value) + { + BOOST_CHECK_EQUAL(mpz_int(a | si).str(), test_type(a1 | si).str()); + BOOST_CHECK_EQUAL((mpz_int(a) |= si).str(), (test_type(a1) |= si).str()); + BOOST_CHECK_EQUAL(mpz_int(a & si).str(), test_type(a1 & si).str()); + BOOST_CHECK_EQUAL((mpz_int(a) &= si).str(), (test_type(a1) &= si).str()); + BOOST_CHECK_EQUAL(mpz_int(a ^ si).str(), test_type(a1 ^ si).str()); + BOOST_CHECK_EQUAL((mpz_int(a) ^= si).str(), (test_type(a1) ^= si).str()); + BOOST_CHECK_EQUAL(mpz_int(si | a).str(), test_type(si | a1).str()); + BOOST_CHECK_EQUAL(mpz_int(si & a).str(), test_type(si & a1).str()); + BOOST_CHECK_EQUAL(mpz_int(si ^ a).str(), test_type(si ^ a1).str()); + } + BOOST_CHECK_EQUAL(mpz_int(gcd(a, si)).str(), test_type(gcd(a1, si)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(si, b)).str(), test_type(gcd(si, b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(c, si)).str(), test_type(lcm(c1, si)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(si, d)).str(), test_type(lcm(si, d1)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(-a, si)).str(), test_type(gcd(-a1, si)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(-si, b)).str(), test_type(gcd(-si, b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(-c, si)).str(), test_type(lcm(-c1, si)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(-si, d)).str(), test_type(lcm(-si, d1)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(-a, -si)).str(), test_type(gcd(-a1, -si)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(-si, -b)).str(), test_type(gcd(-si, -b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(-c, -si)).str(), test_type(lcm(-c1, -si)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(-si, -d)).str(), test_type(lcm(-si, -d1)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(a, -si)).str(), test_type(gcd(a1, -si)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(si, -b)).str(), test_type(gcd(si, -b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(c, -si)).str(), test_type(lcm(c1, -si)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(si, -d)).str(), test_type(lcm(si, -d1)).str()); + } + + void t4() + { + using namespace boost::multiprecision; + // Now check operations involving unsigned integers: + BOOST_CHECK_EQUAL(mpz_int(a + ui).str(), test_type(a1 + ui).str()); + BOOST_CHECK_EQUAL(mpz_int(-a + ui).str(), test_type(-a1 + ui).str()); + BOOST_CHECK_EQUAL(mpz_int(ui + a).str(), test_type(ui + a1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) += ui).str(), (test_type(a1) += ui).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) += ui).str(), (test_type(-a1) += ui).str()); + BOOST_CHECK_EQUAL(mpz_int(a - ui).str(), test_type(a1 - ui).str()); + BOOST_CHECK_EQUAL(mpz_int(-a - ui).str(), test_type(-a1 - ui).str()); + BOOST_CHECK_EQUAL(mpz_int(ui - a).str(), test_type(ui - a1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) -= ui).str(), (test_type(a1) -= ui).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) -= ui).str(), (test_type(-a1) -= ui).str()); + BOOST_CHECK_EQUAL(mpz_int(b * ui).str(), test_type(b1 * ui).str()); + BOOST_CHECK_EQUAL(mpz_int(-b * ui).str(), test_type(-b1 * ui).str()); + BOOST_CHECK_EQUAL(mpz_int(ui * b).str(), test_type(ui * b1).str()); + BOOST_CHECK_EQUAL((mpz_int(a) *= ui).str(), (test_type(a1) *= ui).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) *= ui).str(), (test_type(-a1) *= ui).str()); + BOOST_CHECK_EQUAL(mpz_int(a / ui).str(), test_type(a1 / ui).str()); + BOOST_CHECK_EQUAL(mpz_int(-a / ui).str(), test_type(-a1 / ui).str()); + BOOST_CHECK_EQUAL((mpz_int(a) /= ui).str(), (test_type(a1) /= ui).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) /= ui).str(), (test_type(-a1) /= ui).str()); + BOOST_CHECK_EQUAL(mpz_int(a % ui).str(), test_type(a1 % ui).str()); + BOOST_CHECK_EQUAL(mpz_int(-a % ui).str(), test_type(-a1 % ui).str()); + BOOST_CHECK_EQUAL((mpz_int(a) %= ui).str(), (test_type(a1) %= ui).str()); + BOOST_CHECK_EQUAL((mpz_int(-a) %= ui).str(), (test_type(-a1) %= ui).str()); + BOOST_CHECK_EQUAL(mpz_int(a | ui).str(), test_type(a1 | ui).str()); + BOOST_CHECK_EQUAL((mpz_int(a) |= ui).str(), (test_type(a1) |= ui).str()); + BOOST_CHECK_EQUAL(mpz_int(a & ui).str(), test_type(a1 & ui).str()); + BOOST_CHECK_EQUAL((mpz_int(a) &= ui).str(), (test_type(a1) &= ui).str()); + BOOST_CHECK_EQUAL(mpz_int(a ^ ui).str(), test_type(a1 ^ ui).str()); + BOOST_CHECK_EQUAL((mpz_int(a) ^= ui).str(), (test_type(a1) ^= ui).str()); + BOOST_CHECK_EQUAL(mpz_int(ui | a).str(), test_type(ui | a1).str()); + BOOST_CHECK_EQUAL(mpz_int(ui & a).str(), test_type(ui & a1).str()); + BOOST_CHECK_EQUAL(mpz_int(ui ^ a).str(), test_type(ui ^ a1).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(a, ui)).str(), test_type(gcd(a1, ui)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(ui, b)).str(), test_type(gcd(ui, b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(c, ui)).str(), test_type(lcm(c1, ui)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(ui, d)).str(), test_type(lcm(ui, d1)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(-a, ui)).str(), test_type(gcd(-a1, ui)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(-c, ui)).str(), test_type(lcm(-c1, ui)).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(ui, -b)).str(), test_type(gcd(ui, -b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(ui, -d)).str(), test_type(lcm(ui, -d1)).str()); + + if (std::numeric_limits<test_type>::is_modulo && checked::value) + { + static mpz_int m = mpz_int(1) << std::numeric_limits<test_type>::digits; + mpz_int t(a); + test_type t1(a1); + for (unsigned i = 0; i < 10; ++i) + { + t *= a; + t %= m; + t += a; + t %= m; + t1 *= a1; + t1 += a1; + } + BOOST_CHECK_EQUAL(t.str(), t1.str()); + } + } + + void t5() + { + using namespace boost::multiprecision; + // + // Now integer functions: + // + mpz_int z1, z2; + test_type t1, t2; + divide_qr(a, b, z1, z2); + divide_qr(a1, b1, t1, t2); + BOOST_CHECK_EQUAL(z1.str(), t1.str()); + BOOST_CHECK_EQUAL(z2.str(), t2.str()); + BOOST_CHECK_EQUAL(integer_modulus(a, si), integer_modulus(a1, si)); + BOOST_CHECK_EQUAL(lsb(a), lsb(a1)); + BOOST_CHECK_EQUAL(msb(a), msb(a1)); + + for (unsigned i = 0; i < 1000; i += 13) + { + BOOST_CHECK_EQUAL(bit_test(a, i), bit_test(a1, i)); + } + if (!std::numeric_limits<test_type>::is_modulo) + { + // We have to take care that our powers don't grow too large, otherwise this takes "forever", + // also don't test for modulo types, as these may give a different result from arbitrary + // precision types: + BOOST_CHECK_EQUAL(mpz_int(pow(d, ui % 19)).str(), test_type(pow(d1, ui % 19)).str()); + BOOST_CHECK_EQUAL(mpz_int(powm(a, b, c)).str(), test_type(powm(a1, b1, c1)).str()); + BOOST_CHECK_EQUAL(mpz_int(powm(a, b, ui)).str(), test_type(powm(a1, b1, ui)).str()); + BOOST_CHECK_EQUAL(mpz_int(powm(a, ui, c)).str(), test_type(powm(a1, ui, c1)).str()); + } + BOOST_CHECK_EQUAL(lsb(a), lsb(a1)); + BOOST_CHECK_EQUAL(msb(a), msb(a1)); + } + + static void test_bug_cases() + { + if (!std::numeric_limits<test_type>::is_bounded) + { + // https://svn.boost.org/trac/boost/ticket/7878 + test_type a("0x1000000000000000000000000000000000000000000000000000000000000000"); + test_type b = 0xFFFFFFFF; + test_type c = a * b + b; // quotient has 1 in the final place + test_type q, r; + divide_qr(c, b, q, r); + BOOST_CHECK_EQUAL(a + 1, q); + BOOST_CHECK_EQUAL(r, 0); + + b = static_cast<test_type>("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); + c = a * b + b; // quotient has 1 in the final place + divide_qr(c, b, q, r); + BOOST_CHECK_EQUAL(a + 1, q); + BOOST_CHECK_EQUAL(r, 0); + // + // Not a bug, but test some other special cases that don't otherwise occur through + // random testing: + // + c = a * b; // quotient has zero in the final place + divide_qr(c, b, q, r); + BOOST_CHECK_EQUAL(q, a); + BOOST_CHECK_EQUAL(r, 0); + divide_qr(c, a, q, r); + BOOST_CHECK_EQUAL(q, b); + BOOST_CHECK_EQUAL(r, 0); + ++c; + divide_qr(c, b, q, r); + BOOST_CHECK_EQUAL(q, a); + BOOST_CHECK_EQUAL(r, 1); + } + // Bug https://svn.boost.org/trac/boost/ticket/8126: + test_type a("-4294967296"); + test_type b("4294967296"); + test_type c("-1"); + a = (a / b); + BOOST_CHECK_EQUAL(a, -1); + a = -4294967296; + a = (a / b) * c; + BOOST_CHECK_EQUAL(a, 1); + a = -23; + b = 23; + a = (a / b) * c; + BOOST_CHECK_EQUAL(a, 1); + a = -23; + a = (a / b) / c; + BOOST_CHECK_EQUAL(a, 1); + a = test_type("-26607734784073568386365259775"); + b = test_type("8589934592"); + a = a / b; + BOOST_CHECK_EQUAL(a, test_type("-3097548007973652377")); + // Bug https://svn.boost.org/trac/boost/ticket/8133: + a = test_type("0x12345600012434ffffffffffffffffffffffff"); + unsigned ui = 0xffffffff; + a = a - ui; + BOOST_CHECK_EQUAL(a, test_type("0x12345600012434ffffffffffffffff00000000")); + a = test_type("0x12345600012434ffffffffffffffffffffffff"); +#ifndef BOOST_NO_LONG_LONG + unsigned long long ull = 0xffffffffffffffffuLL; + a = a - ull; + BOOST_CHECK_EQUAL(a, test_type("0x12345600012434ffffffff0000000000000000")); +#endif + // + // Now check that things which should be zero really are + // https://svn.boost.org/trac/boost/ticket/8145: + // + a = -1; + a += 1; + BOOST_CHECK_EQUAL(a, 0); + a = 1; + a += -1; + BOOST_CHECK_EQUAL(a, 0); + a = -1; + a += test_type(1); + BOOST_CHECK_EQUAL(a, 0); + a = 1; + a += test_type(-1); + BOOST_CHECK_EQUAL(a, 0); + a = test_type("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); + a -= test_type("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); + BOOST_CHECK_EQUAL(a, 0); + a = -test_type("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); + a += test_type("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); + BOOST_CHECK_EQUAL(a, 0); + a = 2; + a *= 0; + BOOST_CHECK_EQUAL(a, 0); + a = -2; + a *= 0; + BOOST_CHECK_EQUAL(a, 0); + a = 2; + a *= test_type(0); + BOOST_CHECK_EQUAL(a, 0); + a = -2; + a *= test_type(0); + BOOST_CHECK_EQUAL(a, 0); + a = -2; + a /= 50; + BOOST_CHECK_EQUAL(a, 0); + a = -test_type("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); + a /= (1 + test_type("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")); + BOOST_CHECK_EQUAL(a, 0); + // https://svn.boost.org/trac/boost/ticket/8160 + a = 1; + a = 0 / test_type(1); + BOOST_CHECK_EQUAL(a, 0); + a = 1; + a = 0 % test_type(25); + BOOST_CHECK_EQUAL(a, 0); +#ifndef TEST2 + // https://svn.boost.org/trac/boost/ticket/11364 + a = 0xfffffffeu; + b = -2; + c = a ^ b; + test_type d = ~(a ^ ~b); + BOOST_CHECK_EQUAL(c, d); +#endif +#if defined(TEST2) || defined(TEST3) + // https://svn.boost.org/trac/boost/ticket/11648 + a = (std::numeric_limits<test_type>::max)() - 69; + b = a / 139; + ++b; + c = a / b; + test_type r = a % b; + BOOST_CHECK(r < b); + BOOST_CHECK_EQUAL(a - c * b, r); +#endif + for (ui = 0; ui < 1000; ++ui) + { + boost::multiprecision::mpz_int t; + boost::multiprecision::mpz_int s1 = sqrt(boost::multiprecision::mpz_int(ui), t); + a = sqrt(test_type(ui), b); + BOOST_CHECK_EQUAL(a.str(), s1.str()); + BOOST_CHECK_EQUAL(b.str(), t.str()); + } + a = -1; + ++a; + BOOST_CHECK_EQUAL(a, 0); + ++--a; + BOOST_CHECK_EQUAL(a, 0); + --++a; + BOOST_CHECK_EQUAL(a, 0); + + { + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<> > bigint; + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > u64; + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<128, 128, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > u128; + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > u256; + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > s256; + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > u160; + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<160, 160, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > s160; + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512, 512, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > u512; + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > s512; + + { + u256 a = 14; + bigint b = bigint("115792089237316195423570985008687907853269984665640564039457584007913129639948"); + // to fix cast `a` to dev::bigint + BOOST_CHECK(a < b); + } + { + u256 a = 1; + boost::uint64_t amount = 1; + u256 b = a << amount; + BOOST_CHECK_EQUAL(b, 2); + + u256 high_bit = u256(0); + bit_set(high_bit, 255); + BOOST_CHECK_EQUAL(a << 255, high_bit); + BOOST_CHECK_EQUAL(a << boost::uint64_t(256), 0); + BOOST_CHECK_EQUAL(a << 0, a); + + u256 c = 3; + BOOST_CHECK_EQUAL(c, 3); + BOOST_CHECK_EQUAL(c << boost::uint64_t(256), 0); + BOOST_CHECK_EQUAL(c << 0, c); + + // Bug workaround: + BOOST_CHECK_EQUAL(static_cast<u256>(bigint(u256(3)) << 255), u256(1) << 255); + } + { + BOOST_CHECK_EQUAL(u256(3) << 255, u256(1) << 255); + + u256 a = 1; + boost::uint64_t amount = 1; + u256 b = a >> amount; + BOOST_CHECK_EQUAL(b, 0); + BOOST_CHECK_EQUAL(a >> 255, 0); + BOOST_CHECK_EQUAL(a >> boost::uint64_t(256), 0); + BOOST_CHECK_EQUAL(a >> boost::uint64_t(-1), 0); + + u256 h; + bit_set(h, 255); + BOOST_CHECK_EQUAL(h >> 0, u256(1) << 255); + BOOST_CHECK_EQUAL(h >> 1, u256(1) << 254); + BOOST_CHECK_EQUAL(h >> 2, u256(1) << 253); + BOOST_CHECK_EQUAL(h >> 254, u256(1) << 1); + BOOST_CHECK_EQUAL(h >> 255, u256(1) << 0); + BOOST_CHECK_EQUAL(h >> 256, 0); + BOOST_CHECK_EQUAL(h >> boost::uint64_t(-1), 0); + + u256 g; + bit_set(g, 255); + bit_set(g, 254); + BOOST_CHECK_EQUAL(g >> 255, 1); + BOOST_CHECK_EQUAL(g >> 254, 3); + BOOST_CHECK_EQUAL(g >> 253, 3 << 1); + BOOST_CHECK_EQUAL(g >> 252, 3 << 2); + BOOST_CHECK_EQUAL(g >> 251, 3 << 3); + BOOST_CHECK_EQUAL(g >> 0, u256(3) << 254); + BOOST_CHECK_EQUAL(g >> 1, u256(3) << 253); + BOOST_CHECK_EQUAL(g >> 2, u256(3) << 252); + BOOST_CHECK_EQUAL(g >> 3, u256(3) << 251); + BOOST_CHECK_EQUAL(g >> 100, u256(3) << 154); + BOOST_CHECK_EQUAL(g >> 256, 0); + BOOST_CHECK_EQUAL(g >> 257, 0); + BOOST_CHECK_EQUAL(g >> boost::uint32_t(-1), 0); + BOOST_CHECK_EQUAL(g >> boost::uint64_t(-1), 0); + BOOST_CHECK_EQUAL(g >> boost::uint16_t(-1), 0); + BOOST_CHECK_EQUAL(g >> (boost::uint16_t(-1) - 1), 0); + } + { + s256 a = 1; + uint64_t amount = 1; + s256 b = a >> amount; + BOOST_CHECK_EQUAL(b, 0); + BOOST_CHECK_EQUAL(a >> 255, 0); + BOOST_CHECK_EQUAL(a >> boost::uint64_t(256), 0); + BOOST_CHECK_EQUAL(a >> boost::uint64_t(-1), 0); + + s256 n = -1; + BOOST_CHECK_EQUAL(n >> 0, n); + BOOST_CHECK_EQUAL(n >> 1, n); + BOOST_CHECK_EQUAL(n >> 2, n); + BOOST_CHECK_EQUAL(n >> 254, n); + BOOST_CHECK_EQUAL(n >> 255, n); + BOOST_CHECK_EQUAL(n >> 256, n); + BOOST_CHECK_EQUAL(n >> 257, n); + BOOST_CHECK_EQUAL(n >> ~boost::uint64_t(0), n); + + // Test min value. This actually -(2^256-1), not -(2^255) as in C. + s256 h = (std::numeric_limits<s256>::min)(); + BOOST_CHECK_LT(h, 0); + BOOST_CHECK_EQUAL(h >> 0, h); + BOOST_CHECK_EQUAL(h >> 256, -1); + + // Test EVM min value. + s256 g = s256(-1) << 255; + BOOST_CHECK_LT(g, 0); + BOOST_CHECK_EQUAL(static_cast<u256>(g), u256(1) << 255); + BOOST_CHECK_EQUAL(g >> 0, g); + BOOST_CHECK_EQUAL(static_cast<u256>(g >> 1), u256(0b11) << 254); + BOOST_CHECK_EQUAL(static_cast<u256>(g >> 2), u256(0b111) << 253); + BOOST_CHECK_EQUAL(static_cast<u256>(g >> 3), u256(0b1111) << 252); + + BOOST_CHECK_EQUAL(static_cast<u256>(g >> 255), ~u256(0)); + BOOST_CHECK_EQUAL(static_cast<u256>(g >> 254), ~u256(0b1)); + BOOST_CHECK_EQUAL(static_cast<u256>(g >> 253), ~u256(0b11)); + + // Test shifting more that one bit. + s256 k = s256(0b111) << 252; + BOOST_CHECK_EQUAL(k, u256(0b111) << 252); + BOOST_CHECK_EQUAL(k >> 1, u256(0b111) << 251); + BOOST_CHECK_EQUAL(k >> 2, u256(0b111) << 250); + BOOST_CHECK_EQUAL(k >> 252, 0b111); + BOOST_CHECK_EQUAL(k >> 253, 0b11); + BOOST_CHECK_EQUAL(k >> 254, 0b1); + BOOST_CHECK_EQUAL(k >> 255, 0); + BOOST_CHECK_EQUAL(k >> 256, 0); + BOOST_CHECK_EQUAL(k >> ~boost::uint32_t(0), 0); + + // Division equivalence. + + // Built-in type: + if (std::numeric_limits<boost::int64_t>::is_specialized) + { + boost::int64_t d = (std::numeric_limits<boost::int64_t>::min)(); + BOOST_CHECK_EQUAL(d >> 1, d / 2); + int64_t e = d + 1; + BOOST_CHECK_EQUAL(e >> 1, e / 2 - 1); + + // Boost type: + BOOST_CHECK_EQUAL(h >> 1, h / 2 - 1); + } + } + } + } + + void test() + { + using namespace boost::multiprecision; + + test_bug_cases(); + + last_error_count = 0; + + BOOST_CHECK_EQUAL(Number(), 0); + + for (int i = 0; i < 10000; ++i) + { + a = generate_random<mpz_int>(1000); + b = generate_random<mpz_int>(512); + c = generate_random<mpz_int>(256); + d = generate_random<mpz_int>(32); + + si = d.convert_to<int>(); + ui = si; + + a1 = static_cast<test_type>(a.str()); + b1 = static_cast<test_type>(b.str()); + c1 = static_cast<test_type>(c.str()); + d1 = static_cast<test_type>(d.str()); + + t1(); + t2(); +#ifndef SLOW_COMPILER + t3(); + t4(); + t5(); +#endif + + if (last_error_count != (unsigned)boost::detail::test_errors()) + { + last_error_count = boost::detail::test_errors(); + std::cout << std::hex << std::showbase; + + std::cout << "a = " << a << std::endl; + std::cout << "a1 = " << a1 << std::endl; + std::cout << "b = " << b << std::endl; + std::cout << "b1 = " << b1 << std::endl; + std::cout << "c = " << c << std::endl; + std::cout << "c1 = " << c1 << std::endl; + std::cout << "d = " << d << std::endl; + std::cout << "d1 = " << d1 << std::endl; + std::cout << "a + b = " << a + b << std::endl; + std::cout << "a1 + b1 = " << a1 + b1 << std::endl; + std::cout << std::dec; + std::cout << "a - b = " << a - b << std::endl; + std::cout << "a1 - b1 = " << a1 - b1 << std::endl; + std::cout << "-a + b = " << mpz_int(-a) + b << std::endl; + std::cout << "-a1 + b1 = " << test_type(-a1) + b1 << std::endl; + std::cout << "-a - b = " << mpz_int(-a) - b << std::endl; + std::cout << "-a1 - b1 = " << test_type(-a1) - b1 << std::endl; + std::cout << "c*d = " << c * d << std::endl; + std::cout << "c1*d1 = " << c1 * d1 << std::endl; + std::cout << "b*c = " << b * c << std::endl; + std::cout << "b1*c1 = " << b1 * c1 << std::endl; + std::cout << "a/b = " << a / b << std::endl; + std::cout << "a1/b1 = " << a1 / b1 << std::endl; + std::cout << "a/d = " << a / d << std::endl; + std::cout << "a1/d1 = " << a1 / d1 << std::endl; + std::cout << "a%b = " << a % b << std::endl; + std::cout << "a1%b1 = " << a1 % b1 << std::endl; + std::cout << "a%d = " << a % d << std::endl; + std::cout << "a1%d1 = " << a1 % d1 << std::endl; + } + + // + // Check to see if test is taking too long. + // Tests run on the compiler farm time out after 300 seconds, + // so don't get too close to that: + // +#ifndef CI_SUPPRESS_KNOWN_ISSUES + if (tim.elapsed() > 200) +#else + if (tim.elapsed() > 25) +#endif + { + std::cout << "Timeout reached, aborting tests now....\n"; + break; + } + } + } +}; + +int main() +{ + using namespace boost::multiprecision; + +#ifdef TEST1 + tester<cpp_int> t1; + t1.test(); +#endif +#ifdef TEST2 + tester<number<cpp_int_backend<2048, 2048, signed_magnitude, checked, void> > > t2; + t2.test(); +#endif +#ifdef TEST3 + // Unchecked test verifies modulo arithmetic: + tester<number<cpp_int_backend<2048, 2048, signed_magnitude, unchecked, void> > > t3; + t3.test(); +#endif +#ifdef TEST4 + tester<number<cpp_int_backend<0, 2048, signed_magnitude, unchecked, std::allocator<char> > > > t4; + t4.test(); +#endif +#ifdef TEST5 + tester<number<cpp_int_backend<0, 2048, signed_magnitude, unchecked> > > t5; + t5.test(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_int_conv.cpp b/src/boost/libs/multiprecision/test/test_cpp_int_conv.cpp new file mode 100644 index 00000000..6dc1081b --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_int_conv.cpp @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#include <boost/multiprecision/cpp_int.hpp> + +int main() +{ + using namespace boost::multiprecision; + // + // Test interconversions between different precisions: + // + cpp_int i1(2); + int128_t i2(3); + int256_t i3(4); + number<cpp_int_backend<32, 32, signed_magnitude, checked, void> > i4(5); + + i1 = i3; + BOOST_TEST(i1 == 4); + i1 = i4; + BOOST_TEST(i1 == 5); + + i3 = -1234567; + i4 = -5677334; + i1 = i3; + BOOST_TEST(i1 == -1234567); + i1 = i4; + BOOST_TEST(i1 == -5677334); + + i3 = i2; + BOOST_TEST(i3 == 3); + + i3 = -1234567; + + uint128_t i5(i3); + BOOST_TEST(i5 == -1234567); + + int128_t i6(i4); + BOOST_TEST(i6 == -5677334); + + number<cpp_int_backend<32, 32, signed_magnitude, unchecked, void>, et_off> i7(i3); + BOOST_TEST(i7 == -1234567); + + int256_t i8(i6); + BOOST_TEST(i8 == -5677334); + + i7.assign(4.0); + BOOST_TEST(i7 == 4); + + number<cpp_int_backend<30, 30, signed_magnitude, checked, void>, et_off> i9(-5677334); + i7 = i9; + BOOST_TEST(i7 == -5677334); + i7 = number<cpp_int_backend<32, 32, signed_magnitude, checked, void>, et_off>(i9); + BOOST_TEST(i7 == -5677334); + + i9 = static_cast<number<cpp_int_backend<30, 30, signed_magnitude, checked, void>, et_off> >(i7); + BOOST_TEST(i9 == -5677334); + + ++i9; + i7 = i9; + BOOST_TEST(i7 == 1 - 5677334); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_int_deserial.cpp b/src/boost/libs/multiprecision/test/test_cpp_int_deserial.cpp new file mode 100644 index 00000000..c0a3955b --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_int_deserial.cpp @@ -0,0 +1,3214 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include "test.hpp" + +#include <iostream> +#include <iomanip> +#include <fstream> +#include <boost/archive/text_iarchive.hpp> +#include <boost/archive/text_oarchive.hpp> +#include <boost/archive/binary_iarchive.hpp> +#include <boost/archive/binary_oarchive.hpp> +#include <boost/exception/all.hpp> +#include <boost/filesystem.hpp> +#include <boost/filesystem/fstream.hpp> + +boost::filesystem::path root; + +template <class T> +void test64() +{ + using namespace boost::multiprecision; + + const char* text_array[] = { + "4991075498124186", + "-4991075498124186", + "750", + "-750", + "415210192158791091", + "-415210192158791091", + "2172493004228646", + "-2172493004228646", + "993", + "-993", + "801484291299519218", + "-801484291299519218", + "294605502329193119", + "-294605502329193119", + "52506", + "-52506", + "1509449075377", + "-1509449075377", + "2042599", + "-2042599", + "228", + "-228", + "38666759073", + "-38666759073", + "611489", + "-611489", + "5393", + "-5393", + "12930071684", + "-12930071684", + "3606852234541437552", + "-3606852234541437552", + "3764404188985662264", + "-3764404188985662264", + "13300301596736993408", + "-13300301596736993408", + "3519758520509816019", + "-3519758520509816019", + "811951798554103911", + "-811951798554103911", + "2440", + "-2440", + "175149377023342", + "-175149377023342", + "5347169560611466452", + "-5347169560611466452", + "187134495165780485", + "-187134495165780485", + "761263991097466327", + "-761263991097466327", + "205", + "-205", + "7437277938", + "-7437277938", + "2530448830165700", + "-2530448830165700", + "3771546153060183", + "-3771546153060183", + "1238034", + "-1238034", + "1470", + "-1470", + "7", + "-7", + "203065689", + "-203065689", + "130", + "-130", + "74717518653749632", + "-74717518653749632", + "3028698162338", + "-3028698162338", + "3471587482356581", + "-3471587482356581", + "34698219712863216", + "-34698219712863216", + "941191493582057728", + "-941191493582057728", + "14803251323", + "-14803251323", + "552076672455", + "-552076672455", + "410481316632532", + "-410481316632532", + "6", + "-6", + "3851011", + "-3851011", + "12895806074024545", + "-12895806074024545", + "59538", + "-59538", + "944776298737546117", + "-944776298737546117", + "25010240662345", + "-25010240662345", + "29657097213970", + "-29657097213970", + "88000252", + "-88000252", + "545263458410825", + "-545263458410825", + "216600129907865", + "-216600129907865", + "262741237793873", + "-262741237793873", + "226964744", + "-226964744", + "111776857", + "-111776857", + "346922769", + "-346922769", + "7324307011273", + "-7324307011273", + "182", + "-182", + "4204", + "-4204", + "60455", + "-60455", + "35250836865461", + "-35250836865461", + "4100298085120029", + "-4100298085120029", + "6", + "-6", + "3262369", + "-3262369", + "103928", + "-103928", + "82055266594432948", + "-82055266594432948", + "8", + "-8", + "1731", + "-1731", + "338", + "-338", + "13202690186510006305", + "-13202690186510006305", + "3916209444926814", + "-3916209444926814", + "1801701990484582", + "-1801701990484582", + "54042343363098", + "-54042343363098", + "86", + "-86", + "1346703", + "-1346703", + "34499847353417", + "-34499847353417", + "870972860051498248", + "-870972860051498248", + "2676223213", + "-2676223213", + "10", + "-10", + "2207730666882", + "-2207730666882", + "256557933", + "-256557933", + "742", + "-742", + "17809514", + "-17809514", + "41738", + "-41738", + "937490350973899", + "-937490350973899", + "10", + "-10", + "2153955175933399", + "-2153955175933399", + "21", + "-21", + "9767", + "-9767", + "160991545", + "-160991545", + "5537202949", + "-5537202949", + "1729222816", + "-1729222816", + "880543773", + "-880543773", + "4994415770", + "-4994415770", + "5667270210124", + "-5667270210124", + "1789552738407096", + "-1789552738407096", + "52084908492459", + "-52084908492459", + "419923376385918098", + "-419923376385918098", + "193184120308428", + "-193184120308428", + "3716593161704457", + "-3716593161704457", + "835313", + "-835313", + "47794728416344", + "-47794728416344", + "32162267350660", + "-32162267350660", + "1", + "-1", + "6746653265049", + "-6746653265049", + "72924075986572", + "-72924075986572", + "4061", + "-4061", + "1776612112178", + "-1776612112178", + "798", + "-798", + "266401037", + "-266401037", + "6773927626", + "-6773927626", + "935572859041371", + "-935572859041371", + "2667878767142547263", + "-2667878767142547263", + "107694081993", + "-107694081993", + "2478862", + "-2478862", + "75439252494463178", + "-75439252494463178", + "502732137506", + "-502732137506", + "1345285828338743", + "-1345285828338743", + "15181", + "-15181", + "6", + "-6", + "503497089658971", + "-503497089658971", + "3925896855680859", + "-3925896855680859", + "259231", + "-259231", + "7499637741115431", + "-7499637741115431", + "16282283214", + "-16282283214", + "1664259700668569315", + "-1664259700668569315", + "63205423227654", + "-63205423227654", + "122839112", + "-122839112", + "254133246000861645", + "-254133246000861645", + "324448699", + "-324448699", + "2634830651678498499", + "-2634830651678498499", + "65612160397", + "-65612160397", + "7064926544", + "-7064926544", + "3816", + "-3816", + "1964", + "-1964", + "208639360759781", + "-208639360759781", + "3910", + "-3910", + "95080", + "-95080", + "175945", + "-175945", + "5880392757177227", + "-5880392757177227", + "17254376508100660", + "-17254376508100660", + "16568677462108662019", + "-16568677462108662019", + "193490", + "-193490", + "6055816", + "-6055816", + "4421583059373970", + "-4421583059373970", + "34879", + "-34879", + "52778", + "-52778", + "0", + "0", + "935000170463558922", + "-935000170463558922", + "173", + "-173", + "10327678", + "-10327678", + "45810516546119519", + "-45810516546119519", + "8712", + "-8712", + "1932876094515139", + "-1932876094515139", + "84388", + "-84388", + "2050813773845403160", + "-2050813773845403160", + "1542848238524", + "-1542848238524", + "1555584758215827", + "-1555584758215827", + "3571489748", + "-3571489748", + "18291705113053112226", + "-18291705113053112226", + "5713248", + "-5713248", + "43", + "-43", + "7537188724850197", + "-7537188724850197", + "3450872745386207", + "-3450872745386207", + "335595262120", + "-335595262120", + "481778267224", + "-481778267224", + "86277827129", + "-86277827129", + "132147177032651", + "-132147177032651", + "222305704702019735", + "-222305704702019735", + "15454425372201", + "-15454425372201", + "37444", + "-37444", + "14915074751748", + "-14915074751748", + "322332143987563", + "-322332143987563", + "126997604", + "-126997604", + "484901511158709", + "-484901511158709", + "7452547923", + "-7452547923", + "43400437", + "-43400437", + "950", + "-950", + "133435748899", + "-133435748899", + "13225323986", + "-13225323986", + "113", + "-113", + "31298263", + "-31298263", + "33", + "-33", + "11093233", + "-11093233", + "13921728621", + "-13921728621", + "256811828405", + "-256811828405", + "568533463853249", + "-568533463853249", + "384553", + "-384553", + "1046793359495877872", + "-1046793359495877872", + "3513488911471240501", + "-3513488911471240501", + "999", + "-999", + "3257", + "-3257", + "141868737283", + "-141868737283", + "97723548", + "-97723548", + "380232796", + "-380232796", + "11615871", + "-11615871", + "2", + "-2", + "516935083428", + "-516935083428", + "2767393", + "-2767393", + "74918721", + "-74918721", + "7083", + "-7083", + "497484184665289623", + "-497484184665289623", + "3309660146889781", + "-3309660146889781", + "795624163", + "-795624163", + "1739075", + "-1739075", + "38737391516580422", + "-38737391516580422", + "33363484068", + "-33363484068", + "453947517553", + "-453947517553", + "7206", + "-7206", + "912", + "-912", + "1070565937975", + "-1070565937975", + "3607679046", + "-3607679046", + "503313", + "-503313", + "5384337", + "-5384337", + "7913554120377", + "-7913554120377", + "4112847188", + "-4112847188", + "8191226371802", + "-8191226371802", + "41268527630506", + "-41268527630506", + "446828884957609", + "-446828884957609", + "17378379828995102574", + "-17378379828995102574", + "802194395", + "-802194395", + "6459076776036", + "-6459076776036", + "189", + "-189", + "456272745323742742", + "-456272745323742742", + "35245", + "-35245", + "4142317167", + "-4142317167", + "240455833189507891", + "-240455833189507891", + "32426861928", + "-32426861928", + "3464", + "-3464", + "15152220677", + "-15152220677", + "8550134950160679", + "-8550134950160679", + "226598734", + "-226598734", + "35686909663", + "-35686909663", + "59277903563", + "-59277903563", + "6946537179316043375", + "-6946537179316043375", + "516198226", + "-516198226", + "54", + "-54", + "27406574726722597", + "-27406574726722597", + "717765982", + "-717765982", + "540734180837", + "-540734180837", + "381", + "-381", + "2883798342", + "-2883798342", + "2454889904722697593", + "-2454889904722697593", + "5324758776781459411", + "-5324758776781459411", + "0", + "0", + "3", + "-3", + "758016775051877", + "-758016775051877", + "6368641396491647651", + "-6368641396491647651", + "2409862725919775", + "-2409862725919775", + "19831125", + "-19831125", + "19839578195623645", + "-19839578195623645", + "19556929453271", + "-19556929453271", + "245", + "-245", + "83382", + "-83382", + "30044944", + "-30044944", + "10307835790108389", + "-10307835790108389", + "266904", + "-266904", + "29", + "-29", + "1691697088175268", + "-1691697088175268", + "6361142035143", + "-6361142035143", + "440939789", + "-440939789", + "19836890767598", + "-19836890767598", + "78676472953102968", + "-78676472953102968", + "1663", + "-1663", + "7103", + "-7103", + "2602952185917450011", + "-2602952185917450011", + "8018", + "-8018", + "244", + "-244", + "1908", + "-1908", + "394626", + "-394626", + "559", + "-559", + "2692219006891972", + "-2692219006891972", + "13265871632018922", + "-13265871632018922", + "124", + "-124", + "222927115625", + "-222927115625", + "1283014176523", + "-1283014176523", + "63800278885", + "-63800278885", + "0", + "0", + "1829", + "-1829", + "13920824467759", + "-13920824467759", + "5133342577177325", + "-5133342577177325", + "11207577826", + "-11207577826", + "1482655119893", + "-1482655119893", + "200471339", + "-200471339", + "14758141", + "-14758141", + "29794", + "-29794", + "17080244", + "-17080244", + "699", + "-699", + "33751076", + "-33751076", + "16396192", + "-16396192", + "98", + "-98", + "81983490866862", + "-81983490866862", + "102679", + "-102679", + "13", + "-13", + "300", + "-300", + "195317", + "-195317", + "8257", + "-8257", + "9944069581", + "-9944069581", + "63162", + "-63162", + "2814124367772394", + "-2814124367772394", + "136699870", + "-136699870", + "2298044154057333478", + "-2298044154057333478", + "14", + "-14", + "15514009231077760", + "-15514009231077760", + "183794877561119741", + "-183794877561119741", + "1799598", + "-1799598", + "1873291206216770568", + "-1873291206216770568", + "31", + "-31", + "5025013349", + "-5025013349", + "26376", + "-26376", + "905247925", + "-905247925", + "36545804839", + "-36545804839", + "960743", + "-960743", + "90208569247342191", + "-90208569247342191", + "148711261716954186", + "-148711261716954186", + "15491943", + "-15491943", + "15539960", + "-15539960", + "15", + "-15", + "39", + "-39", + "7901", + "-7901", + "2124324987051603", + "-2124324987051603", + "45033487059826453", + "-45033487059826453", + "87387056", + "-87387056", + "13621", + "-13621", + "36002", + "-36002", + "130430", + "-130430", + "65703401", + "-65703401", + "7703922866", + "-7703922866", + "171", + "-171", + "61731", + "-61731", + "1387", + "-1387", + "8049274895", + "-8049274895", + "1951008680589745867", + "-1951008680589745867", + "2763480591525312699", + "-2763480591525312699", + "446243894833471417", + "-446243894833471417", + "5396319104693", + "-5396319104693", + "162371331057", + "-162371331057", + "370769520766475", + "-370769520766475", + "1", + "-1", + "361477542", + "-361477542", + "999", + "-999", + "5869928506", + "-5869928506", + "10725949", + "-10725949", + "16", + "-16", + "4934609875259411", + "-4934609875259411", + "3909261", + "-3909261", + "1", + "-1", + "96362", + "-96362", + "24", + "-24", + "206089594430410490", + "-206089594430410490", + "104", + "-104", + "5836462606744621", + "-5836462606744621", + "4267837773445", + "-4267837773445", + "485898", + "-485898", + "115640927033286", + "-115640927033286", + "1554", + "-1554", + "8719162940811", + "-8719162940811", + "2870768607", + "-2870768607", + "1052349661", + "-1052349661", + "23867197", + "-23867197", + "45326966103", + "-45326966103", + "90260998217302", + "-90260998217302", + "1523891", + "-1523891", + "666993", + "-666993", + "107936212247500", + "-107936212247500", + "1559140486984", + "-1559140486984", + "5874", + "-5874", + "5388740994398251", + "-5388740994398251", + "9448163810439", + "-9448163810439", + "1654654", + "-1654654", + "10590", + "-10590", + "54734468", + "-54734468", + "30749964", + "-30749964", + "9811424", + "-9811424", + "526166608342", + "-526166608342", + "4115859427270797", + "-4115859427270797", + "596517644188027", + "-596517644188027", + "14364215824260", + "-14364215824260", + "187", + "-187", + "24260378", + "-24260378", + "55791469491162660", + "-55791469491162660", + "2106900391", + "-2106900391", + "217782523580138", + "-217782523580138", + "1216259", + "-1216259", + "3275398462", + "-3275398462", + "343016100304169644", + "-343016100304169644", + "957668440", + "-957668440", + "6471546279", + "-6471546279", + "614957732", + "-614957732", + "130810411909693", + "-130810411909693", + "792104", + "-792104", + "465", + "-465", + "7782172074", + "-7782172074", + "55034847", + "-55034847", + "6775527365", + "-6775527365", + "12803753747546578", + "-12803753747546578", + "6126135608700535", + "-6126135608700535", + "12740679", + "-12740679", + "1266634072040501", + "-1266634072040501", + "348269777058432218", + "-348269777058432218", + "2184392953733", + "-2184392953733", + "9522770891", + "-9522770891", + "37077445", + "-37077445", + "1364", + "-1364", + "375540696398769", + "-375540696398769", + "24230", + "-24230", + "43119671230", + "-43119671230", + "1029673322569841213", + "-1029673322569841213", + "14194736", + "-14194736", + "4439459006245050525", + "-4439459006245050525", + "2016679919307343642", + "-2016679919307343642", + "68490", + "-68490", + "138373187496830016", + "-138373187496830016", + "12", + "-12", + "72731399395", + "-72731399395", + "103249241", + "-103249241", + "686434193208", + "-686434193208", + "2220097226366547", + "-2220097226366547", + "389615851678", + "-389615851678", + "1188756152", + "-1188756152", + "3527", + "-3527", + "64606107042", + "-64606107042", + "1628835", + "-1628835", + "14", + "-14", + "3398525351", + "-3398525351", + "192736533293843919", + "-192736533293843919", + "62739", + "-62739", + "29797", + "-29797", + "27022533997970320", + "-27022533997970320", + "85203884819644813", + "-85203884819644813", + "16723", + "-16723", + "720455425", + "-720455425", + "21193", + "-21193", + "911", + "-911", + "7564", + "-7564", + "9937", + "-9937", + "17698", + "-17698", + "3154835669492701", + "-3154835669492701", + "714419922", + "-714419922", + "3441710384", + "-3441710384", + "2302757", + "-2302757", + "13", + "-13", + "191092534665719086", + "-191092534665719086", + "2671438117955", + "-2671438117955", + "269195401", + "-269195401", + "1257367614616", + "-1257367614616", + "15233", + "-15233", + "242652372681", + "-242652372681", + "379035516581309513", + "-379035516581309513", + "234696334636228", + "-234696334636228", + "2190428804113181503", + "-2190428804113181503", + "5182131", + "-5182131", + "35710270", + "-35710270", + "30830418043327", + "-30830418043327", + "157", + "-157", + "56976290639537", + "-56976290639537", + "429094", + "-429094", + "8166", + "-8166", + "259284720", + "-259284720", + "1974", + "-1974", + "414549061889", + "-414549061889", + "12126192", + "-12126192", + "477683", + "-477683", + "26", + "-26", + "200991115623", + "-200991115623", + "105657935189602", + "-105657935189602", + "137401581416017", + "-137401581416017", + "3133", + "-3133", + "41301", + "-41301", + "9120545960887397", + "-9120545960887397", + "615", + "-615", + "1677628", + "-1677628", + "487311", + "-487311", + "6467819698256", + "-6467819698256", + "2721454", + "-2721454", + "356423793", + "-356423793", + "525408497", + "-525408497", + "1791793366931794", + "-1791793366931794", + "16267730984", + "-16267730984", + "787", + "-787", + "82", + "-82", + "8594582631777749056", + "-8594582631777749056", + "494351", + "-494351", + "5138", + "-5138", + "404787056092544", + "-404787056092544", + "235074602368269", + "-235074602368269", + "14", + "-14", + "364870", + "-364870", + "592299531695979194", + "-592299531695979194", + "243533", + "-243533", + "228268671797977", + "-228268671797977", + "150", + "-150", + "2109092292", + "-2109092292", + "10814341", + "-10814341", + "229344736512", + "-229344736512", + "506659", + "-506659", + "15065", + "-15065", + "73012461469893725", + "-73012461469893725", + "183623698", + "-183623698", + "30820", + "-30820"}; + + boost::filesystem::ifstream is(root / "cpp_int64_serial64.txt"); + std::cout << "Testing cpp_int64_serial64.txt with T=" << typeid(T).name() << std::endl; + //is.peek(); + BOOST_CHECK(is.good()); + //char c = is.peek(); + //std::size_t s; + //is >> s; + boost::archive::text_iarchive ia(is); + for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i) + { + T val; + ia >> val; + BOOST_CHECK_EQUAL(val, T(text_array[i])); + } + + boost::filesystem::ifstream is2(root / "cpp_int64_serial32.txt"); + std::cout << "Testing cpp_int64_serial32.txt with T=" << typeid(T).name() << std::endl; + //is2.peek(); + BOOST_CHECK(is2.good()); + boost::archive::text_iarchive ia2(is2); + for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i) + { + T val; + ia2 >> val; + BOOST_CHECK_EQUAL(val, T(text_array[i])); + } +} + +template <class T> +void test128() +{ + using namespace boost::multiprecision; + + const char* text_array[] = { + "27388486965920179246162874599461", + "-27388486965920179246162874599461", + "144684", + "-144684", + "40075268927703813213972787292005375", + "-40075268927703813213972787292005375", + "185882978840350932616815972016599", + "-185882978840350932616815972016599", + "118042", + "-118042", + "18836407318976510834104635573348923563", + "-18836407318976510834104635573348923563", + "305594372610563985628870243265194313", + "-305594372610563985628870243265194313", + "992608567", + "-992608567", + "1079802217950896854831728", + "-1079802217950896854831728", + "382261429251", + "-382261429251", + "7995", + "-7995", + "1691954012304306190464", + "-1691954012304306190464", + "252558125876", + "-252558125876", + "63408135", + "-63408135", + "1923885021482774859879", + "-1923885021482774859879", + "218151618018868077912122028563473880039", + "-218151618018868077912122028563473880039", + "1830482607233486577967554117978261568", + "-1830482607233486577967554117978261568", + "232684363792492642717810801641182199046", + "-232684363792492642717810801641182199046", + "18951107105103656564987041230801322761", + "-18951107105103656564987041230801322761", + "18602001100058210837668227206289280804", + "-18602001100058210837668227206289280804", + "619312", + "-619312", + "3300635207581175104869860370", + "-3300635207581175104869860370", + "35913874076527213864347472731883210240", + "-35913874076527213864347472731883210240", + "22584003535744275158325315387889625225", + "-22584003535744275158325315387889625225", + "1087569784912004503372385117646999025", + "-1087569784912004503372385117646999025", + "53419", + "-53419", + "6365946347248672643", + "-6365946347248672643", + "923074766928095495451885549346", + "-923074766928095495451885549346", + "791386027675064089452885112122", + "-791386027675064089452885112122", + "1095850863769", + "-1095850863769", + "585462", + "-585462", + "7", + "-7", + "14396352646034696", + "-14396352646034696", + "103513", + "-103513", + "236879494739813627852695329647307484", + "-236879494739813627852695329647307484", + "833105528657041028703317", + "-833105528657041028703317", + "403987552870100762517310706932", + "-403987552870100762517310706932", + "9241069445104304081394313010837003", + "-9241069445104304081394313010837003", + "7747462702643357490732429745555870341", + "-7747462702643357490732429745555870341", + "24325940392988231200", + "-24325940392988231200", + "3169332595628505508931977", + "-3169332595628505508931977", + "2956433455556566120076606972499", + "-2956433455556566120076606972499", + "97", + "-97", + "162358208806282", + "-162358208806282", + "450940116154946927404473774882465", + "-450940116154946927404473774882465", + "451641858", + "-451641858", + "1225696755823790187144596188382442861", + "-1225696755823790187144596188382442861", + "29784146626131423063590613", + "-29784146626131423063590613", + "234254347872215512272431905", + "-234254347872215512272431905", + "1188109449997714", + "-1188109449997714", + "67931289973154010244863599404", + "-67931289973154010244863599404", + "15985550526478899202524298413", + "-15985550526478899202524298413", + "44969358144856504665069077764", + "-44969358144856504665069077764", + "2433869372731414379", + "-2433869372731414379", + "389948478409995", + "-389948478409995", + "42980455782580666", + "-42980455782580666", + "32377741714896213765436617", + "-32377741714896213765436617", + "14147536", + "-14147536", + "7281984", + "-7281984", + "1940499846845", + "-1940499846845", + "431464371512114469628917178", + "-431464371512114469628917178", + "7407337220313553496076208494128", + "-7407337220313553496076208494128", + "30", + "-30", + "1327411295501", + "-1327411295501", + "66903469770", + "-66903469770", + "1681234517540805320612830262883456", + "-1681234517540805320612830262883456", + "100", + "-100", + "1619033", + "-1619033", + "31778", + "-31778", + "157454929543174151967897543014505981946", + "-157454929543174151967897543014505981946", + "71577966086399886868276034834304", + "-71577966086399886868276034834304", + "39053861540146327519720396203958", + "-39053861540146327519720396203958", + "744644565611021440442223814", + "-744644565611021440442223814", + "141620", + "-141620", + "2207944969567", + "-2207944969567", + "203426602629118177589459157758", + "-203426602629118177589459157758", + "4687930831049614526662210561259545215", + "-4687930831049614526662210561259545215", + "13741620425001328569", + "-13741620425001328569", + "28", + "-28", + "19919840763987597711639960", + "-19919840763987597711639960", + "58845502926990870", + "-58845502926990870", + "46503", + "-46503", + "227899590091810", + "-227899590091810", + "520269641", + "-520269641", + "533635134464326491653819104191", + "-533635134464326491653819104191", + "32", + "-32", + "2311765742988497575052179436185", + "-2311765742988497575052179436185", + "104", + "-104", + "13174010", + "-13174010", + "9157004287034859", + "-9157004287034859", + "13439929054075798978", + "-13439929054075798978", + "1005710832260650449", + "-1005710832260650449", + "45810516546119519", + "-45810516546119519", + "10111031832823515595", + "-10111031832823515595", + "1556666498630726306813245", + "-1556666498630726306813245", + "3776079563026301615061583892830", + "-3776079563026301615061583892830", + "3554220000452135447940601650", + "-3554220000452135447940601650", + "342914370059615129601458555955512766", + "-342914370059615129601458555955512766", + "37211915143242116097464702285", + "-37211915143242116097464702285", + "8426589576380612848355737491164", + "-8426589576380612848355737491164", + "32989222860", + "-32989222860", + "2242563523293104833112476952", + "-2242563523293104833112476952", + "26340698264302762867393911", + "-26340698264302762867393911", + "7", + "-7", + "690707180838394286313288", + "-690707180838394286313288", + "4152835666147840816597477625", + "-4152835666147840816597477625", + "4307204", + "-4307204", + "5538028691958331075031052", + "-5538028691958331075031052", + "15605", + "-15605", + "779689768131768618", + "-779689768131768618", + "31804890425581409493", + "-31804890425581409493", + "82342246867680606750756320822", + "-82342246867680606750756320822", + "9901401020017005286056280532528545058", + "-9901401020017005286056280532528545058", + "23964619045267142735208", + "-23964619045267142735208", + "23105481037040", + "-23105481037040", + "9261441758156913859636303647639218", + "-9261441758156913859636303647639218", + "60070546007507763924924", + "-60070546007507763924924", + "12326765403330476150347768542599", + "-12326765403330476150347768542599", + "1754723286", + "-1754723286", + "28", + "-28", + "89432086134972543173032616112", + "-89432086134972543173032616112", + "57126030796671809943615335657436", + "-57126030796671809943615335657436", + "14251136561", + "-14251136561", + "34939118696445841694152507070732", + "-34939118696445841694152507070732", + "62242533492272937541", + "-62242533492272937541", + "743045397928995080970748460370011005", + "-743045397928995080970748460370011005", + "657268729381871210499613874", + "-657268729381871210499613874", + "5257773746486582", + "-5257773746486582", + "40168363520567402312420813782551098", + "-40168363520567402312420813782551098", + "61834553929623600", + "-61834553929623600", + "8827879038299859860036523950621910882", + "-8827879038299859860036523950621910882", + "18187363614017047925823", + "-18187363614017047925823", + "1117818522952984212179", + "-1117818522952984212179", + "2656685", + "-2656685", + "409037", + "-409037", + "184490923222475885977498171480", + "-184490923222475885977498171480", + "802095", + "-802095", + "1362431392", + "-1362431392", + "22261578528", + "-22261578528", + "29290981558101942713268861928118", + "-29290981558101942713268861928118", + "47302301317848473766508256110200", + "-47302301317848473766508256110200", + "148503360374909444835237781907560612329", + "-148503360374909444835237781907560612329", + "30589987607", + "-30589987607", + "9336827203045", + "-9336827203045", + "30107043678267266207220294684045", + "-30107043678267266207220294684045", + "1084118892329", + "-1084118892329", + "7041095740", + "-7041095740", + "15", + "-15", + "610704633153562426576938052064937496", + "-610704633153562426576938052064937496", + "595347631", + "-595347631", + "7667191853556", + "-7667191853556", + "44454027936868155101947565993903816", + "-44454027936868155101947565993903816", + "85883611", + "-85883611", + "360758748839243518516454792370840", + "-360758748839243518516454792370840", + "2790927324", + "-2790927324", + "3742465736365768915898498156617091585", + "-3742465736365768915898498156617091585", + "147479413949146319856130", + "-147479413949146319856130", + "1039208893123161146877445631451", + "-1039208893123161146877445631451", + "4014354216767740814", + "-4014354216767740814", + "119781181099519678732165162824065718973", + "-119781181099519678732165162824065718973", + "78562776301070", + "-78562776301070", + "559", + "-559", + "11280106118161133960100664534446", + "-11280106118161133960100664534446", + "4606016388942561437580270830022", + "-4606016388942561437580270830022", + "57670561868327441370011", + "-57670561868327441370011", + "71416894909097014471844", + "-71416894909097014471844", + "3968198792173455589573", + "-3968198792173455589573", + "13149823145733642608775252727", + "-13149823145733642608775252727", + "264546856712400799367073649733688068", + "-264546856712400799367073649733688068", + "181571595840115131057831601", + "-181571595840115131057831601", + "137320082754", + "-137320082754", + "106737570210691788059038313", + "-106737570210691788059038313", + "266197717365288449213562655531", + "-266197717365288449213562655531", + "2641672529147341", + "-2641672529147341", + "151305657535708132064629059130", + "-151305657535708132064629059130", + "8838288455460932557542", + "-8838288455460932557542", + "229580992302363", + "-229580992302363", + "381276009", + "-381276009", + "2189254995814346543537", + "-2189254995814346543537", + "241062663892019429783", + "-241062663892019429783", + "1289", + "-1289", + "3768499169854362", + "-3768499169854362", + "46", + "-46", + "113123194090149", + "-113123194090149", + "257162014338572986111", + "-257162014338572986111", + "125826984535179834218224", + "-125826984535179834218224", + "380714866068747567944322727593", + "-380714866068747567944322727593", + "104303598841139", + "-104303598841139", + "1065280345148327648773363223393307192", + "-1065280345148327648773363223393307192", + "20248493338789246233167313227932895840", + "-20248493338789246233167313227932895840", + "162538", + "-162538", + "173739", + "-173739", + "5359750034437798426950", + "-5359750034437798426950", + "665876738146930", + "-665876738146930", + "709289441745698432", + "-709289441745698432", + "202728866936448", + "-202728866936448", + "6", + "-6", + "15800583732744199482624014690", + "-15800583732744199482624014690", + "29779074291232", + "-29779074291232", + "984339779461760", + "-984339779461760", + "767398", + "-767398", + "415462781851563431292700828131108380", + "-415462781851563431292700828131108380", + "1147933945700269690596156182506", + "-1147933945700269690596156182506", + "42450738679031729", + "-42450738679031729", + "2577950950157", + "-2577950950157", + "2522521710801514347400568661434422", + "-2522521710801514347400568661434422", + "13819658998892401541", + "-13819658998892401541", + "496658145774859954943564", + "-496658145774859954943564", + "518126", + "-518126", + "1401", + "-1401", + "65673247548918355271934", + "-65673247548918355271934", + "1902619525684055188", + "-1902619525684055188", + "32325262934", + "-32325262934", + "768343207102", + "-768343207102", + "7717131697976593508998559", + "-7717131697976593508998559", + "318668224221205716681", + "-318668224221205716681", + "373695949349041942234118586", + "-373695949349041942234118586", + "2374230638947377832537387112", + "-2374230638947377832537387112", + "38727149332417950712342749093", + "-38727149332417950712342749093", + "50641097967663747879422486643603294439", + "-50641097967663747879422486643603294439", + "155679557293775199", + "-155679557293775199", + "9584524694361179551000251851", + "-9584524694361179551000251851", + "1555", + "-1555", + "153598430081275298827470966254180164", + "-153598430081275298827470966254180164", + "1792977580", + "-1792977580", + "40513995299101921791", + "-40513995299101921791", + "205149194684558953622782831493255495", + "-205149194684558953622782831493255495", + "8569592230593344920443", + "-8569592230593344920443", + "508895", + "-508895", + "19768102480409470254", + "-19768102480409470254", + "137276814223629775094893592279819", + "-137276814223629775094893592279819", + "294000609851122741", + "-294000609851122741", + "65049209437230122275", + "-65049209437230122275", + "23362940999728532813", + "-23362940999728532813", + "88836918597358775734007849873044275046", + "-88836918597358775734007849873044275046", + "434035006963316670", + "-434035006963316670", + "622", + "-622", + "581347029549389573249184843256799", + "-581347029549389573249184843256799", + "180338559687589565", + "-180338559687589565", + "561053757585637776917747", + "-561053757585637776917747", + "32239", + "-32239", + "33901075413575967103", + "-33901075413575967103", + "8932885164594123487128517542485517028", + "-8932885164594123487128517542485517028", + "83521148713289418108751633969571232369", + "-83521148713289418108751633969571232369", + "7", + "-7", + "97", + "-97", + "148574175322938930280707441746", + "-148574175322938930280707441746", + "34819851973902418549646788688822516665", + "-34819851973902418549646788688822516665", + "8315372482034321202893445528412", + "-8315372482034321202893445528412", + "78070260632520", + "-78070260632520", + "1694579890551276986736768820881486", + "-1694579890551276986736768820881486", + "148949594888574520284515061", + "-148949594888574520284515061", + "7155", + "-7155", + "54025120576002", + "-54025120576002", + "6486075462638233", + "-6486075462638233", + "381736014892858568664127676041586", + "-381736014892858568664127676041586", + "20417033368", + "-20417033368", + "129", + "-129", + "4369312912082114047863415327506", + "-4369312912082114047863415327506", + "3425863567263779336359928", + "-3425863567263779336359928", + "126664685306324611", + "-126664685306324611", + "79290635423234192686030222410", + "-79290635423234192686030222410", + "89904040753844842469288403271470296", + "-89904040753844842469288403271470296", + "303078", + "-303078", + "24403696", + "-24403696", + "71519894287768242731407528483177175738", + "-71519894287768242731407528483177175738", + "43562121429", + "-43562121429", + "27030", + "-27030", + "24600", + "-24600", + "248387716733", + "-248387716733", + "371528", + "-371528", + "4787877250361840261744279869821", + "-4787877250361840261744279869821", + "4997511746500297909058528782721320", + "-4997511746500297909058528782721320", + "1586", + "-1586", + "31554014671157226899246", + "-31554014671157226899246", + "2859985988700258455304314", + "-2859985988700258455304314", + "4509508709806307404851", + "-4509508709806307404851", + "9", + "-9", + "1637744", + "-1637744", + "12479552255352789077760938", + "-12479552255352789077760938", + "976489633596851129859012248183437", + "-976489633596851129859012248183437", + "851806998881827048562", + "-851806998881827048562", + "906771089783845862955091", + "-906771089783845862955091", + "80038352079069729", + "-80038352079069729", + "17388136706500", + "-17388136706500", + "61145989", + "-61145989", + "94774844620540266019", + "-94774844620540266019", + "408281", + "-408281", + "952903032817435", + "-952903032817435", + "1631092620569808", + "-1631092620569808", + "2138", + "-2138", + "212824926871186875960728065608", + "-212824926871186875960728065608", + "4268162925", + "-4268162925", + "36", + "-36", + "223723", + "-223723", + "16415665053", + "-16415665053", + "25788643", + "-25788643", + "70220421074486178069", + "-70220421074486178069", + "4575797377", + "-4575797377", + "76884751129407965501107148587666", + "-76884751129407965501107148587666", + "29088346935783207", + "-29088346935783207", + "45914004714587007155631909758206960989", + "-45914004714587007155631909758206960989", + "248", + "-248", + "5579572272102752655174722938686", + "-5579572272102752655174722938686", + "30175831892260274369581289965353458", + "-30175831892260274369581289965353458", + "1237805257371", + "-1237805257371", + "4843618316827222290521953980935538236", + "-4843618316827222290521953980935538236", + "240", + "-240", + "15807477184070179658", + "-15807477184070179658", + "4142567393", + "-4142567393", + "12811809209743734075", + "-12811809209743734075", + "1485630615919152225304", + "-1485630615919152225304", + "7910273036167", + "-7910273036167", + "8463758727276424785250829495444564", + "-8463758727276424785250829495444564", + "64731869997654405671780238192304416", + "-64731869997654405671780238192304416", + "23615438174870", + "-23615438174870", + "352157140910141", + "-352157140910141", + "5", + "-5", + "59221", + "-59221", + "2569479", + "-2569479", + "542857439184063766884246909368", + "-542857439184063766884246909368", + "1823313067549638501383110895210828", + "-1823313067549638501383110895210828", + "3270724720703321", + "-3270724720703321", + "301251143", + "-301251143", + "2479800639", + "-2479800639", + "91698905921", + "-91698905921", + "2871719453817880", + "-2871719453817880", + "15334399950643828095", + "-15334399950643828095", + "5526", + "-5526", + "233477156", + "-233477156", + "133654", + "-133654", + "16379095557010108528", + "-16379095557010108528", + "781428672272181160786182179076882317", + "-781428672272181160786182179076882317", + "8296349327720787412560043280221269761", + "-8296349327720787412560043280221269761", + "10281035380942381640132947771350381026", + "-10281035380942381640132947771350381026", + "21040070113550157615461288", + "-21040070113550157615461288", + "25742884982404545443527", + "-25742884982404545443527", + "32454973901024441799985592013", + "-32454973901024441799985592013", + "743", + "-743", + "48093509516189552", + "-48093509516189552", + "3310081024", + "-3310081024", + "555885664598428773514", + "-555885664598428773514", + "12816465810736", + "-12816465810736", + "318", + "-318", + "11177674634623001920713776522758", + "-11177674634623001920713776522758", + "4478260629000", + "-4478260629000", + "7", + "-7", + "16047003680147439", + "-16047003680147439", + "183", + "-183", + "59147119480091828181670682607031985", + "-59147119480091828181670682607031985", + "14760016", + "-14760016", + "6274417502047620562218369346380", + "-6274417502047620562218369346380", + "14026544807038936634796795", + "-14026544807038936634796795", + "17158839999", + "-17158839999", + "15548352769483287520249305142", + "-15548352769483287520249305142", + "362163", + "-362163", + "3476850886273368477018353", + "-3476850886273368477018353", + "12190143908040407488", + "-12190143908040407488", + "521525508150081044", + "-521525508150081044", + "433309060522200", + "-433309060522200", + "2165455650813681324517", + "-2165455650813681324517", + "6819348098387524497126647285", + "-6819348098387524497126647285", + "464251630203", + "-464251630203", + "145993167313", + "-145993167313", + "23955493117052698447116654044", + "-23955493117052698447116654044", + "1249962737542647752328381", + "-1249962737542647752328381", + "25985762", + "-25985762", + "8825811397396758414408048174991", + "-8825811397396758414408048174991", + "456322584656453621447742298", + "-456322584656453621447742298", + "3635296824314", + "-3635296824314", + "48071792", + "-48071792", + "573327609505513", + "-573327609505513", + "32947066161183", + "-32947066161183", + "3572119014464", + "-3572119014464", + "339951878200713991932774", + "-339951878200713991932774", + "9829263561931267281756747918204", + "-9829263561931267281756747918204", + "99133551353390277845579505558", + "-99133551353390277845579505558", + "87647698384969946179713959", + "-87647698384969946179713959", + "812", + "-812", + "874259982778101", + "-874259982778101", + "427106308211321596930989851275848063", + "-427106308211321596930989851275848063", + "182604408166381257", + "-182604408166381257", + "1027122202590661838104329309513", + "-1027122202590661838104329309513", + "1354315694936", + "-1354315694936", + "6079470672663034486", + "-6079470672663034486", + "141187763548195492188625309258190962", + "-141187763548195492188625309258190962", + "5948423816691427", + "-5948423816691427", + "3790826071191932816", + "-3790826071191932816", + "475187449013755049", + "-475187449013755049", + "134916830618137216019136180544", + "-134916830618137216019136180544", + "289548281081", + "-289548281081", + "56088", + "-56088", + "71309468310269123716", + "-71309468310269123716", + "4319226187100950", + "-4319226187100950", + "64155929243330777086", + "-64155929243330777086", + "1346606607492942300949980881912922", + "-1346606607492942300949980881912922", + "56691962171349121239043134503543", + "-56691962171349121239043134503543", + "179884054884043", + "-179884054884043", + "1457175629136147646463304750253", + "-1457175629136147646463304750253", + "298847019807831033427383443102915235", + "-298847019807831033427383443102915235", + "3724333984635632125440253", + "-3724333984635632125440253", + "75997801235764509433", + "-75997801235764509433", + "624924035973776", + "-624924035973776", + "663853", + "-663853", + "39794266307878236329712249281466", + "-39794266307878236329712249281466", + "68236356", + "-68236356", + "874551267305634766833", + "-874551267305634766833", + "3069873585346853407835416677633253152", + "-3069873585346853407835416677633253152", + "128022182325463", + "-128022182325463", + "102685407245351562527197662841526650696", + "-102685407245351562527197662841526650696", + "1268696403523315749290280644252872285", + "-1268696403523315749290280644252872285", + "962551179", + "-962551179", + "5397346809016967977013332103668812", + "-5397346809016967977013332103668812", + "19", + "-19", + "1383556287038543763721", + "-1383556287038543763721", + "596132342851497", + "-596132342851497", + "386032274487026935724854", + "-386032274487026935724854", + "913487342891468949707909122983", + "-913487342891468949707909122983", + "60948098701787507435146", + "-60948098701787507435146", + "2022832067596000203", + "-2022832067596000203", + "25656479", + "-25656479", + "2346119770800025007571", + "-2346119770800025007571", + "376371975341", + "-376371975341", + "9", + "-9", + "2942356530044344965", + "-2942356530044344965", + "3932381905103911287794534670998227", + "-3932381905103911287794534670998227", + "3218056320", + "-3218056320", + "102738821", + "-102738821", + "234572888397008437041293767052858", + "-234572888397008437041293767052858", + "5858001549782605027037905592031557", + "-5858001549782605027037905592031557", + "90718950", + "-90718950", + "39428225166028193", + "-39428225166028193", + "1383746282", + "-1383746282", + "915121", + "-915121", + "8970289", + "-8970289", + "4322641789", + "-4322641789", + "260209037", + "-260209037", + "6609227084602664174553003642710", + "-6609227084602664174553003642710", + "37231518369001507", + "-37231518369001507", + "4301528568595403190", + "-4301528568595403190", + "2333077100212", + "-2333077100212", + "11565", + "-11565", + "255726621336514413017008354182674709", + "-255726621336514413017008354182674709", + "17395422733913073065750181", + "-17395422733913073065750181", + "125019234224449492", + "-125019234224449492", + "4740360722276299853297125", + "-4740360722276299853297125", + "7568347", + "-7568347", + "17122026961016863428287", + "-17122026961016863428287", + "112577394987931131505768113032531171", + "-112577394987931131505768113032531171", + "7046212555452856822490707564", + "-7046212555452856822490707564", + "33256103762317100748101545285090311772", + "-33256103762317100748101545285090311772", + "104639691131091", + "-104639691131091", + "74043463548796243", + "-74043463548796243", + "49942702457067622169669481", + "-49942702457067622169669481", + "12806", + "-12806", + "4194227136755752775246633399", + "-4194227136755752775246633399", + "22363149786", + "-22363149786", + "53844", + "-53844", + "6204108132585699", + "-6204108132585699", + "133987", + "-133987", + "47357030709179941308475", + "-47357030709179941308475", + "167735124254221045", + "-167735124254221045", + "58394613871", + "-58394613871", + "214", + "-214", + "97085709128533841718123", + "-97085709128533841718123", + "9049249133086876221572990732831", + "-9049249133086876221572990732831", + "1860834869623152381150863486", + "-1860834869623152381150863486", + "3868776", + "-3868776", + "714752211", + "-714752211", + "117044601375672047600456567336894", + "-117044601375672047600456567336894", + "38202", + "-38202", + "1706135867048", + "-1706135867048", + "568201454130", + "-568201454130", + "10071543790040355676774628", + "-10071543790040355676774628", + "3955606956905", + "-3955606956905", + "1710822834542941", + "-1710822834542941", + "28185453895207483", + "-28185453895207483", + "2241403707806732425937134125743", + "-2241403707806732425937134125743", + "24424908461669836348", + "-24424908461669836348", + "39965", + "-39965", + "5776", + "-5776", + "161984235115107451958835599550261843326", + "-161984235115107451958835599550261843326", + "29821471341", + "-29821471341", + "3087720", + "-3087720", + "234408055908870511236228564329", + "-234408055908870511236228564329", + "367687929171771055426419375659", + "-367687929171771055426419375659", + "31", + "-31", + "14038375921", + "-14038375921", + "1272562766857183500104765994611086188", + "-1272562766857183500104765994611086188", + "5395131009", + "-5395131009", + "34630426722601695384252351222", + "-34630426722601695384252351222", + "16553", + "-16553", + "11084856402443484655", + "-11084856402443484655", + "4497048086787", + "-4497048086787", + "32568631422747274845485", + "-32568631422747274845485", + "262201867566", + "-262201867566", + "3603196342", + "-3603196342", + "32228667062769096924274427075075163477", + "-32228667062769096924274427075075163477", + "693196875773858622", + "-693196875773858622", + "375838207", + "-375838207", + }; + + boost::filesystem::ifstream is(root / "cpp_int128_serial64.txt"); + std::cout << "Testing cpp_int128_serial64.txt with T=" << typeid(T).name() << std::endl; + //is.peek(); + BOOST_CHECK(is.good()); + boost::archive::text_iarchive ia(is); + for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i) + { +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + T val; + ia >> val; + BOOST_CHECK_EQUAL(val, T(text_array[i])); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + } +#endif + } + + boost::filesystem::ifstream is2(root / "cpp_int128_serial32.txt"); + std::cout << "Testing cpp_int128_serial32.txt with T=" << typeid(T).name() << std::endl; + //is2.peek(); + BOOST_CHECK(is2.good()); + boost::archive::text_iarchive ia2(is2); + for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i) + { +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + T val; + ia2 >> val; + BOOST_CHECK_EQUAL(val, T(text_array[i])); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + } +#endif + } +} + +template <class T> +void test1024() +{ + using namespace boost::multiprecision; + + const char* text_array[] = { + "199116592524695642085302184291534972104821103496846288349049702743455488423756865233534697793799569802866670981662356904270988544309072648691983459024063468708849163858558300444260495432655880504371186304007206097685833870163932928823469130199562442992", + "-199116592524695642085302184291534972104821103496846288349049702743455488423756865233534697793799569802866670981662356904270988544309072648691983459024063468708849163858558300444260495432655880504371186304007206097685833870163932928823469130199562442992", + "900593985907599133309438051698408853499625", + "-900593985907599133309438051698408853499625", + "1999874529133918706984995533406759076286565612920872635155416162504047196283513226624804224664215451103787410646351770677862238993331622942206185777454355265435238628326337253875004975201674224657309748975788962678417182798452737039836018579998386385843839364431684621083773420995", + "-1999874529133918706984995533406759076286565612920872635155416162504047196283513226624804224664215451103787410646351770677862238993331622942206185777454355265435238628326337253875004975201674224657309748975788962678417182798452737039836018579998386385843839364431684621083773420995", + "3984622917724894533997006216154563211907361459910318973090457115167740283771041468834030135879776466911564784436671674308756100400008317797390250537451443539509892669634431827675333761787371583170220547281395030543315815109821053621124047969069733480692532", + "-3984622917724894533997006216154563211907361459910318973090457115167740283771041468834030135879776466911564784436671674308756100400008317797390250537451443539509892669634431827675333761787371583170220547281395030543315815109821053621124047969069733480692532", + "3232318919913083002600961037970380935109", + "-3232318919913083002600961037970380935109", + "31063287987662242043295268121189412701158946907681323476663158129071217086758046387444487305432940821201595312001091888440038537739012180871591529361766112029121819690067004102150186222757899576567650712850787690098182019345491656562683693940513570929164008316791512277994247388861874767036310283032", + "-31063287987662242043295268121189412701158946907681323476663158129071217086758046387444487305432940821201595312001091888440038537739012180871591529361766112029121819690067004102150186222757899576567650712850787690098182019345491656562683693940513570929164008316791512277994247388861874767036310283032", + "551891699448873731005410917251662274314405815829594429768196331539904618164780043996715480720882109933893638976491102937306842056459564612366897777250359518885611699552940726261111066137661097166708199216229508773692203174236076409923801944639195246263554709054412966237162836449108", + "-551891699448873731005410917251662274314405815829594429768196331539904618164780043996715480720882109933893638976491102937306842056459564612366897777250359518885611699552940726261111066137661097166708199216229508773692203174236076409923801944639195246263554709054412966237162836449108", + "335366696367917734077308183957523963605452915968160245855756922088011", + "-335366696367917734077308183957523963605452915968160245855756922088011", + "516747586835313993425742202038941743391184401954870801073750702371672555461045948927255871449025485037535181895965683819085832663856528858925035833888106053116851498798112586463619731478072279623", + "-516747586835313993425742202038941743391184401954870801073750702371672555461045948927255871449025485037535181895965683819085832663856528858925035833888106053116851498798112586463619731478072279623", + "266698476906140000185555171296233707414383217616977634049828438937252114299738535337312010987594", + "-266698476906140000185555171296233707414383217616977634049828438937252114299738535337312010987594", + "1742740128166122778815789893503", + "-1742740128166122778815789893503", + "9724178186350731882862121812371154796147496227432585250532513144071077406366937493221094046638206862261142165156227060439590867019554905722401562859987295808994814401942", + "-9724178186350731882862121812371154796147496227432585250532513144071077406366937493221094046638206862261142165156227060439590867019554905722401562859987295808994814401942", + "78669120642064259414462176059292690866387576703089703385165678245138348243792107699164", + "-78669120642064259414462176059292690866387576703089703385165678245138348243792107699164", + "20818242466417733255855534640058104588616172091806661117670", + "-20818242466417733255855534640058104588616172091806661117670", + "4285795302257142023279557595265352619153550443850366091691013701573116876759469534501053640452948548428208657312557380072256478428969426137868124810140942586250078976271", + "-4285795302257142023279557595265352619153550443850366091691013701573116876759469534501053640452948548428208657312557380072256478428969426137868124810140942586250078976271", + "582604000062572804923757892130426287093735944713405746172610139142407500801888662008036220641936720421041737454101798928020195070207248743108048751731809924563484418793905813766932871306262995484219521766924610729803972858084042961494083239630079092513694133586118612073236719306830956983397633251414977754", + "-582604000062572804923757892130426287093735944713405746172610139142407500801888662008036220641936720421041737454101798928020195070207248743108048751731809924563484418793905813766932871306262995484219521766924610729803972858084042961494083239630079092513694133586118612073236719306830956983397633251414977754", + "15244715246682897475794438496539784661328456725495852276384174914973848673559621029178770197754207946620279120766931180917955631763555863913554513123775304647102553401018292948818112379521732233018874991323186887132286586138108436833252904592044083624364585617172057137372527454560587256796482346", + "-15244715246682897475794438496539784661328456725495852276384174914973848673559621029178770197754207946620279120766931180917955631763555863913554513123775304647102553401018292948818112379521732233018874991323186887132286586138108436833252904592044083624364585617172057137372527454560587256796482346", + "2162895251469736394155373749298870491019042810468937007114239114834965434324532372477043450771464135064045267665496385710799863273304844467062688237563757141742551576106360777697871874341148850361709074093167368004234386954371485929893986000482110508651966963502456247924228172005161782355542551339301544053", + "-2162895251469736394155373749298870491019042810468937007114239114834965434324532372477043450771464135064045267665496385710799863273304844467062688237563757141742551576106360777697871874341148850361709074093167368004234386954371485929893986000482110508651966963502456247924228172005161782355542551339301544053", + "1598979420051373213779067102428825857258960753077031910510837547866117340690938015398588975672437163347616966444506118889316096334851198017036793976867532695462600493286904022181865571035930456030653116939922200581824528814030699118802949188745959300411809512397337408237271478944565611123755566305", + "-1598979420051373213779067102428825857258960753077031910510837547866117340690938015398588975672437163347616966444506118889316096334851198017036793976867532695462600493286904022181865571035930456030653116939922200581824528814030699118802949188745959300411809512397337408237271478944565611123755566305", + "16972265575362228409871949532650408574482631199000565615577589612763707133618421955651468786564593364791708076161039592041831568321621510957105628787468779948579969928175938436896904310402554255504042135507367561049409553354413837219069382497010795375231533129182910408442845936728120354915635936898", + "-16972265575362228409871949532650408574482631199000565615577589612763707133618421955651468786564593364791708076161039592041831568321621510957105628787468779948579969928175938436896904310402554255504042135507367561049409553354413837219069382497010795375231533129182910408442845936728120354915635936898", + "6578842255326490592104075020940649831283616551660", + "-6578842255326490592104075020940649831283616551660", + "21683239365736925204171059844091235529220850759783534345105279221261364632686763920546656745741380892718845596049305277834093327836699551790128153290026473154694088594033146472697265593756340629571314831536187835497879992488", + "-21683239365736925204171059844091235529220850759783534345105279221261364632686763920546656745741380892718845596049305277834093327836699551790128153290026473154694088594033146472697265593756340629571314831536187835497879992488", + "82705023096235991529043144815694768432078642064433253929157769869969882959684824083733064475507849892985247689495254462302557886989778499312762640233348268023648079139590178633699092745191633841431797230103981800388019961016410936969661694491101422518397720383375579079432440889617406834440612316345", + "-82705023096235991529043144815694768432078642064433253929157769869969882959684824083733064475507849892985247689495254462302557886989778499312762640233348268023648079139590178633699092745191633841431797230103981800388019961016410936969661694491101422518397720383375579079432440889617406834440612316345", + "182226847821689839702269917063301483274601928154240894497051272590070015871573462612330908644446070144310876769617182637134479859518870301265103824148955731473219622377635930380500965073993471768564617573332989796817488809960475386339256946590978228792909775228312826022751099327081513175259103822462404", + "-182226847821689839702269917063301483274601928154240894497051272590070015871573462612330908644446070144310876769617182637134479859518870301265103824148955731473219622377635930380500965073993471768564617573332989796817488809960475386339256946590978228792909775228312826022751099327081513175259103822462404", + "5047815496286192631875136121482961684854345143375644371655857541129061222585290469283326779682311519927896776754142231238721306654582346292285270137340078762804088754913299932236143865279819208519978638432654788640663782736369734346995034407838300134017424349501474133378173964391719130592921725", + "-5047815496286192631875136121482961684854345143375644371655857541129061222585290469283326779682311519927896776754142231238721306654582346292285270137340078762804088754913299932236143865279819208519978638432654788640663782736369734346995034407838300134017424349501474133378173964391719130592921725", + "22536736652558441743601984420319740", + "-22536736652558441743601984420319740", + "327447539579270438292704828441807528233522606163188888154105354488483374541037700785580710347093169240568594799687437260325328617564586900214241043337", + "-327447539579270438292704828441807528233522606163188888154105354488483374541037700785580710347093169240568594799687437260325328617564586900214241043337", + "576979741896869527546425470124797714231020028752356356333225775983321871157857129520067018389689110139112275805449955044770978296650876883361429976430221447982628049254445385786013507310850518003697984237866336100952912645415854388908568224414707", + "-576979741896869527546425470124797714231020028752356356333225775983321871157857129520067018389689110139112275805449955044770978296650876883361429976430221447982628049254445385786013507310850518003697984237866336100952912645415854388908568224414707", + "755708508440402225863498155833596268190934339616501653733913066972752009318647339364141109604780235018474569114884922495929398288656171192074004071372424004589137926220537255429717898046520571796147507616408370836807000016827363741604261172604190", + "-755708508440402225863498155833596268190934339616501653733913066972752009318647339364141109604780235018474569114884922495929398288656171192074004071372424004589137926220537255429717898046520571796147507616408370836807000016827363741604261172604190", + "28048724901616569597172899970128263950954786552499389660847160202213362969018987235256727605", + "-28048724901616569597172899970128263950954786552499389660847160202213362969018987235256727605", + "173167043910755577166191737374818499849624950", + "-173167043910755577166191737374818499849624950", + "48", + "-48", + "18463009925253820920449684292621801312807473363997541122773157125946854399091765241363833326106601909427978296931833223183788301543", + "-18463009925253820920449684292621801312807473363997541122773157125946854399091765241363833326106601909427978296931833223183788301543", + "31164619961775222493397145731379707", + "-31164619961775222493397145731379707", + "1816096570786800455898299961483294949815377533170208282553387279497784999672154364831631933541855425071102266426105906939977630773287626616160771806315066360322795263086589842632991562964241768039371149116395673886243340566387264938743398973079853460222114803451321466708714785006727", + "-1816096570786800455898299961483294949815377533170208282553387279497784999672154364831631933541855425071102266426105906939977630773287626616160771806315066360322795263086589842632991562964241768039371149116395673886243340566387264938743398973079853460222114803451321466708714785006727", + "286006007227658140199584887789816189451349886507993355022297173895214040208905643298365570365441499922605759964419143497079708873231260957597650186760056343574600947950687835678669676590667783184666", + "-286006007227658140199584887789816189451349886507993355022297173895214040208905643298365570365441499922605759964419143497079708873231260957597650186760056343574600947950687835678669676590667783184666", + "18358404935882372210070601728050732884947257854425817110955248936260198050228809460271322586740505320746909919918679627100695097433534409202108416481259416338560209999440019558569552164395624923489329323411399738280552853025588689733098861097523", + "-18358404935882372210070601728050732884947257854425817110955248936260198050228809460271322586740505320746909919918679627100695097433534409202108416481259416338560209999440019558569552164395624923489329323411399738280552853025588689733098861097523", + "4134722455319345214940599980631794346657332870755359010455452155626594269008814501180484509879573967565890465226873255542092192607602138135728673418643645201766135430371744351074472506612976620427027592918016747144700651239945277040717933887512645490432181939225775342965", + "-4134722455319345214940599980631794346657332870755359010455452155626594269008814501180484509879573967565890465226873255542092192607602138135728673418643645201766135430371744351074472506612976620427027592918016747144700651239945277040717933887512645490432181939225775342965", + "54920807074733793884577529077249631831162657302693894027178095216669108940322624411834499900757281913727092273510264248215928273287884179463378853565331877701638585020489866284361829333257710807106023052404897652297092714031250456279772808462426750654556160069174238558295987347555132735561420095", + "-54920807074733793884577529077249631831162657302693894027178095216669108940322624411834499900757281913727092273510264248215928273287884179463378853565331877701638585020489866284361829333257710807106023052404897652297092714031250456279772808462426750654556160069174238558295987347555132735561420095", + "399265560197794252401617167580850085282220794173216714093253564006986475971645145366672323528680289510504223856530994241334812625576574784650620927403732184", + "-399265560197794252401617167580850085282220794173216714093253564006986475971645145366672323528680289510504223856530994241334812625576574784650620927403732184", + "31621966437344909804014117858935966136505781977117316516659445266533686603282356943749115958158394083237531612132476116831423261618528802877894233115470068483988764082981116838784931515017818535550110918", + "-31621966437344909804014117858935966136505781977117316516659445266533686603282356943749115958158394083237531612132476116831423261618528802877894233115470068483988764082981116838784931515017818535550110918", + "1606985215548409716503362538444761880543201213399618535731027289265156579177336621807120077949866098802813413615868269176538634784089984273973440941833767736805385007543715097934592673987261460898859324638806817938705575451364443949120235151257544", + "-1606985215548409716503362538444761880543201213399618535731027289265156579177336621807120077949866098802813413615868269176538634784089984273973440941833767736805385007543715097934592673987261460898859324638806817938705575451364443949120235151257544", + "285683190193", + "-285683190193", + "8061697887583266465310973659826347597097558972448901485453524610917952084739066859639084715521710210973596165921", + "-8061697887583266465310973659826347597097558972448901485453524610917952084739066859639084715521710210973596165921", + "6219223289787909965098172528033914428025426344931365048240610134846930087708486382224526942350364117413020461482722657384885935391455080562169318712277658961972965925941924792948343565934378704158420349097774074011993945850670748056251470218258676908828627471885", + "-6219223289787909965098172528033914428025426344931365048240610134846930087708486382224526942350364117413020461482722657384885935391455080562169318712277658961972965925941924792948343565934378704158420349097774074011993945850670748056251470218258676908828627471885", + "697258758163542187076749918900636966609908531786609361940000240519", + "-697258758163542187076749918900636966609908531786609361940000240519", + "1046098084657831111818175325887422175023162118504873435909952452494852374571808810176243062515313047215471029884493246457829292480590847793716267629027995295229796393654811459791589585169546388254745922345946744655803804613032804268083425871981695717315478983498539611218241664930157839795", + "-1046098084657831111818175325887422175023162118504873435909952452494852374571808810176243062515313047215471029884493246457829292480590847793716267629027995295229796393654811459791589585169546388254745922345946744655803804613032804268083425871981695717315478983498539611218241664930157839795", + "2484434366380099043156299869169661345741558449531766681226478781813341982338634464499146134940119727735818398667362505498484418919464161091166892386016324225384189876252889149071097656823108497551033588357003722", + "-2484434366380099043156299869169661345741558449531766681226478781813341982338634464499146134940119727735818398667362505498484418919464161091166892386016324225384189876252889149071097656823108497551033588357003722", + "308286676308193197031410043742676292328591745213481644733897249474373496522533072738438449939815750248898922885290011346375849968712988888608255565930075126704466104946675008196710396726585487442780152614905677", + "-308286676308193197031410043742676292328591745213481644733897249474373496522533072738438449939815750248898922885290011346375849968712988888608255565930075126704466104946675008196710396726585487442780152614905677", + "1578729146192540123786163537348004400750916878495381648015362308555564957146975794392752284685500828245809393902172165166570", + "-1578729146192540123786163537348004400750916878495381648015362308555564957146975794392752284685500828245809393902172165166570", + "753635193017654981561112585877756433926946338453536513833144933556077262395793429496030381482043731560006145122148417766008778064151654898372617208349138764363280371778703526306929669285807019015087056633479893959366709941765720251266", + "-753635193017654981561112585877756433926946338453536513833144933556077262395793429496030381482043731560006145122148417766008778064151654898372617208349138764363280371778703526306929669285807019015087056633479893959366709941765720251266", + "1023056796494340203037740397557237363844811192683830278749294166121707658052654599305485368530300819052987687826810994785603794931372101763295285975973124930171986523205085256147491724466952116413750593896486505408297359237231028", + "-1023056796494340203037740397557237363844811192683830278749294166121707658052654599305485368530300819052987687826810994785603794931372101763295285975973124930171986523205085256147491724466952116413750593896486505408297359237231028", + "7279368955234841237989689629914561920962002431310686381873314222568640123479287155739276546923764190325442924090937031964044572030997024902955450149096922769606827151526955803170246823486172000556133026264782831784752812128580068", + "-7279368955234841237989689629914561920962002431310686381873314222568640123479287155739276546923764190325442924090937031964044572030997024902955450149096922769606827151526955803170246823486172000556133026264782831784752812128580068", + "424617380576309116241807458648692744450386557212868763669113075114477578778872841574527732081207492431831870311301491048670446826911900920994644694", + "-424617380576309116241807458648692744450386557212868763669113075114477578778872841574527732081207492431831870311301491048670446826911900920994644694", + "7046686003127119093099476961562427444038611347486414217752094860417190797774076723407713585872307944642824878964077822345", + "-7046686003127119093099476961562427444038611347486414217752094860417190797774076723407713585872307944642824878964077822345", + "19949119701600514825288852843654302777880460105733015351003691242645123465142555331932685718332487926262997425529449487067278953683", + "-19949119701600514825288852843654302777880460105733015351003691242645123465142555331932685718332487926262997425529449487067278953683", + "16469140092633375339743693580164888653727421730589027379476942842394844761208703483677054585417793177811566576822391363212778421263249183342676114446881502895872964885316569671443951931393367071689754985", + "-16469140092633375339743693580164888653727421730589027379476942842394844761208703483677054585417793177811566576822391363212778421263249183342676114446881502895872964885316569671443951931393367071689754985", + "1061702816480363701187846694728343109042150409401045998", + "-1061702816480363701187846694728343109042150409401045998", + "7391047600385760425390763210856013417540808412389899", + "-7391047600385760425390763210856013417540808412389899", + "3720217478561502591416009227591582869882982470098168796813426264578076670286029029195560760567", + "-3720217478561502591416009227591582869882982470098168796813426264578076670286029029195560760567", + "66106892589637039037744676327200772291368517688108041167197715930935273497569759111332854815299471155925869011997907566713674005971100914739364454164984587128896600583993354569858550495377843782520710717979164977585093", + "-66106892589637039037744676327200772291368517688108041167197715930935273497569759111332854815299471155925869011997907566713674005971100914739364454164984587128896600583993354569858550495377843782520710717979164977585093", + "655105381318829622535325161492573443039473032159228692157069475333288969363672255837498503071757247193471076794288004751047135238604867298249068617214132553959376152373616588040808707670098140225261882200984527500899566180951300745344526414599508", + "-655105381318829622535325161492573443039473032159228692157069475333288969363672255837498503071757247193471076794288004751047135238604867298249068617214132553959376152373616588040808707670098140225261882200984527500899566180951300745344526414599508", + "32279098297", + "-32279098297", + "91236285260894969491370094562444170610185292123928049180398654028165920269699400153752501142438076", + "-91236285260894969491370094562444170610185292123928049180398654028165920269699400153752501142438076", + "76148543022827828542260034575767140554118312303651220784462009876431985956698652362044", + "-76148543022827828542260034575767140554118312303651220784462009876431985956698652362044", + "83588868584829923837376678742649596503169974719002042708417338297148455364317505115231903770625036463360146776147319869172298475847924715607135999201658410499586149882123548133278995113231076277183588359228055211291455848766205373827838498451914146847385535315038611426", + "-83588868584829923837376678742649596503169974719002042708417338297148455364317505115231903770625036463360146776147319869172298475847924715607135999201658410499586149882123548133278995113231076277183588359228055211291455848766205373827838498451914146847385535315038611426", + "963957921647213", + "-963957921647213", + "13301565202923219609572812103802050473736468733", + "-13301565202923219609572812103802050473736468733", + "4746350713999103687568954691814", + "-4746350713999103687568954691814", + "2001142907044963200442678450863815898813903676660733058871895239756077633074421909013654237542517301596550011117510574893770558703407744684777702961205416292826384730912647565673208707968211244040320246494312087239093502776249390829799552970184550131203169359608726456455152480928583576591394902496106626144", + "-2001142907044963200442678450863815898813903676660733058871895239756077633074421909013654237542517301596550011117510574893770558703407744684777702961205416292826384730912647565673208707968211244040320246494312087239093502776249390829799552970184550131203169359608726456455152480928583576591394902496106626144", + "107594281614292318387817778890700162347725421105656330924973717308436245329157596183845769858366750239404646287651057292302740816759738471158092800874582432179112119211566698620828469639621669897519755264598100204713172616980523260714264267451063089420215", + "-107594281614292318387817778890700162347725421105656330924973717308436245329157596183845769858366750239404646287651057292302740816759738471158092800874582432179112119211566698620828469639621669897519755264598100204713172616980523260714264267451063089420215", + "1748285028280968559027056769483145164710362048627307365465656148480028444958644903475995728328069875726460568057080202853997524099097288749318318801615657840242878599655077486108729249226195564937733374638566648902211364103190286203200478747078106163053", + "-1748285028280968559027056769483145164710362048627307365465656148480028444958644903475995728328069875726460568057080202853997524099097288749318318801615657840242878599655077486108729249226195564937733374638566648902211364103190286203200478747078106163053", + "11460180193889065606722132385926501525431980106546682247601052575855000134486061731618687473242633808411918689848577390823351808790715520481001965421879800810352399655561482898353748786253207752078326991084961012083", + "-11460180193889065606722132385926501525431980106546682247601052575855000134486061731618687473242633808411918689848577390823351808790715520481001965421879800810352399655561482898353748786253207752078326991084961012083", + "574927035874041759213679385423821561867", + "-574927035874041759213679385423821561867", + "120643345454198941508563017089006360092589256126170227342940319190269214269775023269721267117406618", + "-120643345454198941508563017089006360092589256126170227342940319190269214269775023269721267117406618", + "43211052397169822368769320044098366176065820670381470825125490923898893035078574715878390619044493658716106759475917845349930472007385257270090791727486873231922936861573077702054193955871675235660795444516942345577520753954381850029768", + "-43211052397169822368769320044098366176065820670381470825125490923898893035078574715878390619044493658716106759475917845349930472007385257270090791727486873231922936861573077702054193955871675235660795444516942345577520753954381850029768", + "9844479373748707013063227964029459596247847016794211846228318515960354387966950301750833297921955723417061013994092483915173465284502461089399372968661262420490350455873655690633576331503541999665999411319072898423762904939498903689838493823091884957816736065194017711554932378966207638596446", + "-9844479373748707013063227964029459596247847016794211846228318515960354387966950301750833297921955723417061013994092483915173465284502461089399372968661262420490350455873655690633576331503541999665999411319072898423762904939498903689838493823091884957816736065194017711554932378966207638596446", + "1549569662025720311251404569332722105893198679127923795355656951920288528581705427103792360667449800130523485559533763978458224547356178202688985769505", + "-1549569662025720311251404569332722105893198679127923795355656951920288528581705427103792360667449800130523485559533763978458224547356178202688985769505", + "36315742657", + "-36315742657", + "8921164792041877158829344493852966827789686565858639796763485931102357440731861058782552324538917399828752311227018705861210803742330995498617328892413590387831390338234562492080836551321361310716484078814", + "-8921164792041877158829344493852966827789686565858639796763485931102357440731861058782552324538917399828752311227018705861210803742330995498617328892413590387831390338234562492080836551321361310716484078814", + "3564428449813842615037566955460603551635405941961408429533479906924825068973042239756262262787799344453371579266807953907224412476869508", + "-3564428449813842615037566955460603551635405941961408429533479906924825068973042239756262262787799344453371579266807953907224412476869508", + "803208608149818042371281509635155439483", + "-803208608149818042371281509635155439483", + "4866189324296232234061833332746205890326919472641667725283106186358795590420827732306960443344464312769726502055107509", + "-4866189324296232234061833332746205890326919472641667725283106186358795590420827732306960443344464312769726502055107509", + "207298564235033398879052037508717471071493511497187540585110196743", + "-207298564235033398879052037508717471071493511497187540585110196743", + "193717918520883498325012985935003601959305178471191450716579245791510632312265720137365047580022087853055977679260908512014775411818562756581294466392949427067700253919565514470785071872659525583000795812531290669561365815697655594188906", + "-193717918520883498325012985935003601959305178471191450716579245791510632312265720137365047580022087853055977679260908512014775411818562756581294466392949427067700253919565514470785071872659525583000795812531290669561365815697655594188906", + "2437877491739207", + "-2437877491739207", + "37013774102202564305419053038604891745828779816673570038156288209445014156533018002446399548329104265253840467051874818175306349349752734572291264362672503100264435752942371629071789078883405034467875813374259058124047248097835249024123072756933", + "-37013774102202564305419053038604891745828779816673570038156288209445014156533018002446399548329104265253840467051874818175306349349752734572291264362672503100264435752942371629071789078883405034467875813374259058124047248097835249024123072756933", + "354494755327", + "-354494755327", + "11780642893082070770985419994433169541426957824422257433844", + "-11780642893082070770985419994433169541426957824422257433844", + "485430660154648600595640793061533874664308049695155979729256186778257302321647241550949220266916178753497849914452979205318162", + "-485430660154648600595640793061533874664308049695155979729256186778257302321647241550949220266916178753497849914452979205318162", + "23858852603627264837843140314865296322097028936336850188878465502728409524610276592851077626292364546252755103916928846389671162429425418906991891502973", + "-23858852603627264837843140314865296322097028936336850188878465502728409524610276592851077626292364546252755103916928846389671162429425418906991891502973", + "2073475025890625790912875485180905813499103080617022204722722710095631077512485124044881139986135538169181486312704584071614904004373594716419", + "-2073475025890625790912875485180905813499103080617022204722722710095631077512485124044881139986135538169181486312704584071614904004373594716419", + "15280710757061816529388583850582811170979066299366854920512818520549969116440063183787310498271091672343434592650388724950511822972092076", + "-15280710757061816529388583850582811170979066299366854920512818520549969116440063183787310498271091672343434592650388724950511822972092076", + "6382485371693619169022055595031229091762638736860010414889365673981891166426242136610234221929171470107008843300114050380584829581671837693187024514818", + "-6382485371693619169022055595031229091762638736860010414889365673981891166426242136610234221929171470107008843300114050380584829581671837693187024514818", + "12185224224701673175361331319115762816895575796767843658049699617134858039026831564288739190981827007791493862865956911735574421879562096311558676154252796632277351699205162505700258194809563580445507", + "-12185224224701673175361331319115762816895575796767843658049699617134858039026831564288739190981827007791493862865956911735574421879562096311558676154252796632277351699205162505700258194809563580445507", + "34003980273948488873087243030302546934071096333462110121575903766367670827215796429777573314114296018716373089777559546454127470648315079633590832262220530391541976999162677539194732289306375110039265026554808460597438607169664283497662076280786", + "-34003980273948488873087243030302546934071096333462110121575903766367670827215796429777573314114296018716373089777559546454127470648315079633590832262220530391541976999162677539194732289306375110039265026554808460597438607169664283497662076280786", + "122848198938353223588037911092014612429998780961520627899382186456109045142826399845219049519395028055840868305519753136489752495357572137972700299899629238691174342998161949671331013802430679284465951931850871392212632", + "-122848198938353223588037911092014612429998780961520627899382186456109045142826399845219049519395028055840868305519753136489752495357572137972700299899629238691174342998161949671331013802430679284465951931850871392212632", + "43537967438743700082839955990027575248714598937547106788531846714509188167960975769453819977500278194590313507781727399526395127656584060420218121352097776308452702567298202679209230473699619650828718821287113120498048345913575657082695406163703126042367182026511481872506111256791596", + "-43537967438743700082839955990027575248714598937547106788531846714509188167960975769453819977500278194590313507781727399526395127656584060420218121352097776308452702567298202679209230473699619650828718821287113120498048345913575657082695406163703126042367182026511481872506111256791596", + "58406767675650075287505789516356411545831826432139397101494864325157903449602707567656548116973052773130530151058837990354645940288559829449340220508188691146281802100553666536211206823508084744153463134410959296949868335640749454837", + "-58406767675650075287505789516356411545831826432139397101494864325157903449602707567656548116973052773130530151058837990354645940288559829449340220508188691146281802100553666536211206823508084744153463134410959296949868335640749454837", + "845873210129906374353022076245969947869460127750482252356111232286849327159845231580563758295137285209548293776383830614553566014483472912208993044958366148170162204310293796785477227702675371216304957228188615867576567406231041038281756292397397561", + "-845873210129906374353022076245969947869460127750482252356111232286849327159845231580563758295137285209548293776383830614553566014483472912208993044958366148170162204310293796785477227702675371216304957228188615867576567406231041038281756292397397561", + "53588224463377221082233930622411910641801456988689291134720826079004949443094787414435", + "-53588224463377221082233930622411910641801456988689291134720826079004949443094787414435", + "72112722851930798700228005210608826370783262851441860040831117968729809788108346159403319971018904246301591088717098607465649205797470097967252119620134427778008686902310907006410363397508152328805949858597088819284277", + "-72112722851930798700228005210608826370783262851441860040831117968729809788108346159403319971018904246301591088717098607465649205797470097967252119620134427778008686902310907006410363397508152328805949858597088819284277", + "641918660703774309882129738043218549030513645540611429936046631082566036061356980177384685321883957675631751681520848096394297317163463488891570190724496654177980091225725954578443264041706056677969812886935701", + "-641918660703774309882129738043218549030513645540611429936046631082566036061356980177384685321883957675631751681520848096394297317163463488891570190724496654177980091225725954578443264041706056677969812886935701", + "30", + "-30", + "6394573041749544637932142063252660876011988517352129759808021807615786602503160259195561963658103141713195046053277921040817887800559226509891982140334607813922841396821838502087774297750475588617168795", + "-6394573041749544637932142063252660876011988517352129759808021807615786602503160259195561963658103141713195046053277921040817887800559226509891982140334607813922841396821838502087774297750475588617168795", + "1786466222561817425577249373742981037566301146961591730677121116610853649457567467081637483584212899635954801237845898555279493690732411882920175456222801107258417531725553455448259056866349458253419178431317512242742160", + "-1786466222561817425577249373742981037566301146961591730677121116610853649457567467081637483584212899635954801237845898555279493690732411882920175456222801107258417531725553455448259056866349458253419178431317512242742160", + "137832029750529182794342751962197941412491800492104", + "-137832029750529182794342751962197941412491800492104", + "8108038128324706368474080686463548136481517039342729533539080912561382244733668445971779623479147878923993970600643926905142316004585446689923640217524203592135814813370649929971097550423245537858260", + "-8108038128324706368474080686463548136481517039342729533539080912561382244733668445971779623479147878923993970600643926905142316004585446689923640217524203592135814813370649929971097550423245537858260", + "5002261098184392173934780113066967242", + "-5002261098184392173934780113066967242", + "690951335667913995812417540653386648776452918801140879728454196755039750563977820072442505506359908874725801630758561609054355988759175228289", + "-690951335667913995812417540653386648776452918801140879728454196755039750563977820072442505506359908874725801630758561609054355988759175228289", + "10674213497798883899476403327832261239905267095517429500221095458852845305968864392299051608409658803957443554649236067724400487971044164121242198029786220", + "-10674213497798883899476403327832261239905267095517429500221095458852845305968864392299051608409658803957443554649236067724400487971044164121242198029786220", + "17992446102498398809906415490084711513529803098403245836231064924343042871622653363618957583240979467823413823373231710836844132776133330230504849252207785917957852664671150869449421757327447929003162434828411052366071580989788644644058346", + "-17992446102498398809906415490084711513529803098403245836231064924343042871622653363618957583240979467823413823373231710836844132776133330230504849252207785917957852664671150869449421757327447929003162434828411052366071580989788644644058346", + "33842687090178160518628086932775600899160163731425276680317104716407292755478424345380082755988441733647290183079908808136196734777398636133355822624652625917768049717031860506349867723992592655421369270624555109106177714680336653018611913032875963068852500326353648887921416851020395037162987766", + "-33842687090178160518628086932775600899160163731425276680317104716407292755478424345380082755988441733647290183079908808136196734777398636133355822624652625917768049717031860506349867723992592655421369270624555109106177714680336653018611913032875963068852500326353648887921416851020395037162987766", + "1054083826397869852970042065169251590328234555837539271102624160027471295945233271106117930450857346874100524858325086710499923040919634021718345296558298025504382070214470223730", + "-1054083826397869852970042065169251590328234555837539271102624160027471295945233271106117930450857346874100524858325086710499923040919634021718345296558298025504382070214470223730", + "136407237437852413879681494779911076041207111591826209650287776324941155126675066585977968663006698647245", + "-136407237437852413879681494779911076041207111591826209650287776324941155126675066585977968663006698647245", + "2224879942826211211569920900726660211869323323310097306306571308813333981073744504097938050565302837264530253763057896699924896596092066791400879438413472679293844669326318441711505238433328261842523388469632517312478257062414756535170295711651910005290949014898120581894", + "-2224879942826211211569920900726660211869323323310097306306571308813333981073744504097938050565302837264530253763057896699924896596092066791400879438413472679293844669326318441711505238433328261842523388469632517312478257062414756535170295711651910005290949014898120581894", + "4047288308565310307500509489225346109923522467464514519968591592559230455772855713422415453581291554663695129034041054508221015627588797163542760075301595269083019308332323602089140", + "-4047288308565310307500509489225346109923522467464514519968591592559230455772855713422415453581291554663695129034041054508221015627588797163542760075301595269083019308332323602089140", + "1035816948031741587849086409216542916935656696246164119153928232713320856714123588940050533131790722677035036233284471386922732645880058503610308346951059222695446014860710224009856786160873437306753478940623814638264314179274958950671363159961289293", + "-1035816948031741587849086409216542916935656696246164119153928232713320856714123588940050533131790722677035036233284471386922732645880058503610308346951059222695446014860710224009856786160873437306753478940623814638264314179274958950671363159961289293", + "1718216153801609870534260896130470102834028900689159827595233108230047", + "-1718216153801609870534260896130470102834028900689159827595233108230047", + "157320", + "-157320", + "4922208547816973044459635133646703969879372571533096054296883386644122380530951726299847426987732042397595779976830474678726947018304354845591378517358359470056483109237714380888286233563680472388849805778688479350769638569123934902", + "-4922208547816973044459635133646703969879372571533096054296883386644122380530951726299847426987732042397595779976830474678726947018304354845591378517358359470056483109237714380888286233563680472388849805778688479350769638569123934902", + "3067476257285335874566823333688543442128450810079871657467124491543338509419265027748695014643813306181544035536165512867635982606378678645467114585754422748255288790715628747169903578478381870157776988838327310364853622786578500012302428307039672498275", + "-3067476257285335874566823333688543442128450810079871657467124491543338509419265027748695014643813306181544035536165512867635982606378678645467114585754422748255288790715628747169903578478381870157776988838327310364853622786578500012302428307039672498275", + "883397505237211649947418585007890070022882946801242047716792933816916920312758", + "-883397505237211649947418585007890070022882946801242047716792933816916920312758", + "1100016596294277930396702074837291475694950629762363744759571589030108139933298189695770187024515803626715526690351811923084433342467648792302262756272887683638924910835436501074742486120762849764143752164258427412169550392618539176353678199434066032915", + "-1100016596294277930396702074837291475694950629762363744759571589030108139933298189695770187024515803626715526690351811923084433342467648792302262756272887683638924910835436501074742486120762849764143752164258427412169550392618539176353678199434066032915", + "3318653243827753930075076609367167950215271547197165956541578677095035789105230285577300537970253024380004869448887191421072498566168883197146749684037295491", + "-3318653243827753930075076609367167950215271547197165956541578677095035789105230285577300537970253024380004869448887191421072498566168883197146749684037295491", + "18917325422442253597680054225840324956976833511185836470606776355469702018395215498115502098244359450586779118546945991879765584863693947599352077215049091215099400154668038964846442469328921458041398569034401548536622210828439622386945359553017072968575829651399459030775837160233158886103", + "-18917325422442253597680054225840324956976833511185836470606776355469702018395215498115502098244359450586779118546945991879765584863693947599352077215049091215099400154668038964846442469328921458041398569034401548536622210828439622386945359553017072968575829651399459030775837160233158886103", + "254366786216910043665990950804997231945088908428747001184159373059058493118875749329803453882635522927040165937386417763335659992218458086511885522609981363333096153519757022667758401739961262948319999739472528794701", + "-254366786216910043665990950804997231945088908428747001184159373059058493118875749329803453882635522927040165937386417763335659992218458086511885522609981363333096153519757022667758401739961262948319999739472528794701", + "37544442396527426899195446849672655465276344502770712178079384432684510232491164260359865664795991038222782506894463672347582854", + "-37544442396527426899195446849672655465276344502770712178079384432684510232491164260359865664795991038222782506894463672347582854", + "15673578372504731899692149900135775418224632075238646337867467957107034530818946478167665455128984412394389268797819166734444989508179006505772666514111230952795610254140089645092544526629237404643329919824803563866840859270664303879742294839213766102351871211663636813556965", + "-15673578372504731899692149900135775418224632075238646337867467957107034530818946478167665455128984412394389268797819166734444989508179006505772666514111230952795610254140089645092544526629237404643329919824803563866840859270664303879742294839213766102351871211663636813556965", + "27481560151479303283253590172063634693210359375791056643367262359056676411581745877899312410880682306069203702180378974272137310962", + "-27481560151479303283253590172063634693210359375791056643367262359056676411581745877899312410880682306069203702180378974272137310962", + "59764850084546321076270115679381459961266663920938595034931337715038895288728780241940147905268936247355365797839452044959717373177405268037975305459371499345817108953258614141073965011536848191412758145014880201415800076045236677519189441266640929126443802253464497061850704733496580039504966534", + "-59764850084546321076270115679381459961266663920938595034931337715038895288728780241940147905268936247355365797839452044959717373177405268037975305459371499345817108953258614141073965011536848191412758145014880201415800076045236677519189441266640929126443802253464497061850704733496580039504966534", + "236346389410506959600114343181511587020869234266420558654132661642154355113727359542557485608210379840787154866691122790684707204957449484562815548156526563035046035495563526969340", + "-236346389410506959600114343181511587020869234266420558654132661642154355113727359542557485608210379840787154866691122790684707204957449484562815548156526563035046035495563526969340", + "8815935276532889936007554615797399527468399687615548740700254897861864429815615560728972825692565852981716178182277189313249729477257089767951370396136769451014576455113", + "-8815935276532889936007554615797399527468399687615548740700254897861864429815615560728972825692565852981716178182277189313249729477257089767951370396136769451014576455113", + "15766842373922966734945972936934487778733908393732", + "-15766842373922966734945972936934487778733908393732", + "6595752830737826074851600247398704243439581", + "-6595752830737826074851600247398704243439581", + "883607119507167020680444599092885224088612050268051636998275726360170767104266391951078564780752590643878108107048593830807317310688757872408858062530074042278525133611486569437859217448040432508288719355266779546627635013182590336527", + "-883607119507167020680444599092885224088612050268051636998275726360170767104266391951078564780752590643878108107048593830807317310688757872408858062530074042278525133611486569437859217448040432508288719355266779546627635013182590336527", + "33694907409791755762655404952802940988899691249", + "-33694907409791755762655404952802940988899691249", + "323333915936767999634844119809319135460509879311229599308354939953168279", + "-323333915936767999634844119809319135460509879311229599308354939953168279", + "109533461242727456317187321637480456637352670377446387229311720642342270936669079", + "-109533461242727456317187321637480456637352670377446387229311720642342270936669079", + "1385911310557366456440256909064094890695543397784942861180089270740259394708721160036253862597269877264942393141524860354011688095362554758164667579347793400229024555480224078270156224230580104617746710199310164986752840215359839845498564497854670854", + "-1385911310557366456440256909064094890695543397784942861180089270740259394708721160036253862597269877264942393141524860354011688095362554758164667579347793400229024555480224078270156224230580104617746710199310164986752840215359839845498564497854670854", + "29774115054799535833930768716897017350284486426186383584162324318962025027678962428276603554895692141466695531519088683268104074739324371129542465293986416152097350166384444454811692728264434003142202934260616565733198831279676615440572524973775003086833767426", + "-29774115054799535833930768716897017350284486426186383584162324318962025027678962428276603554895692141466695531519088683268104074739324371129542465293986416152097350166384444454811692728264434003142202934260616565733198831279676615440572524973775003086833767426", + "74696367101640724890251441072354635571976155536130046140237438589798381789554793148406818355661257862104683281722318017709028012486180422540427675980472782459468162926394976288225872264456693023891477557259759177462765826175659413065496505969367440547828089465241517425279607801825661125137502490209352550", + "-74696367101640724890251441072354635571976155536130046140237438589798381789554793148406818355661257862104683281722318017709028012486180422540427675980472782459468162926394976288225872264456693023891477557259759177462765826175659413065496505969367440547828089465241517425279607801825661125137502490209352550", + "1204196594639385922414846449687106633371016123988162000948048507502126642148118", + "-1204196594639385922414846449687106633371016123988162000948048507502126642148118", + "846833858170919771038203149272750341572762713657689308208261686002409383861625765452744323828942233333", + "-846833858170919771038203149272750341572762713657689308208261686002409383861625765452744323828942233333", + "182161452241374047273456867899515861555380897442569148219001470598361338903885535593714631480225974535244035939079461012689178031931288032512442603044979036705163872936026346865633839654342088060028594652808131903888369770826412770233292335398149959646", + "-182161452241374047273456867899515861555380897442569148219001470598361338903885535593714631480225974535244035939079461012689178031931288032512442603044979036705163872936026346865633839654342088060028594652808131903888369770826412770233292335398149959646", + "982677520230623904675071524585093908331832014895485448777250229533226440326748097093798644810", + "-982677520230623904675071524585093908331832014895485448777250229533226440326748097093798644810", + "2470642728099219780778259687407342337194729387462688122808418202258274933287", + "-2470642728099219780778259687407342337194729387462688122808418202258274933287", + "21642", + "-21642", + "28109476527429648692470007325789564480573483619310804793750563939329019602047743826734114282192488430735600284398989680911911960943283501628534649887574302741936678165842670818369902783900366003306472118461382044113045381589251197206074842928328220219584087542112389580462137108895790086", + "-28109476527429648692470007325789564480573483619310804793750563939329019602047743826734114282192488430735600284398989680911911960943283501628534649887574302741936678165842670818369902783900366003306472118461382044113045381589251197206074842928328220219584087542112389580462137108895790086", + "24473934394139795039432356490797923225705279667816043556538102097065", + "-24473934394139795039432356490797923225705279667816043556538102097065", + "967666937415492520370655115944840613051857445576119169258498049770608556022671644163127742796054969198094856", + "-967666937415492520370655115944840613051857445576119169258498049770608556022671644163127742796054969198094856", + "8777670436928270404636672844045971126192291209566648012730356503650458463860437163044293866063131499188106079322582985846405009457295181485284286775546965040263973340573887093705724765371051485505998527923498980801571623582212444207027545811844533625560957194790459778850062900748", + "-8777670436928270404636672844045971126192291209566648012730356503650458463860437163044293866063131499188106079322582985846405009457295181485284286775546965040263973340573887093705724765371051485505998527923498980801571623582212444207027545811844533625560957194790459778850062900748", + "10519677007822794739900735125229787943972331835720269482799977", + "-10519677007822794739900735125229787943972331835720269482799977", + "1590072871278743537180333082100146324295480429097445157011611168462260468069742799519303496051313133424632939883615906533434106640128123864165917007171699524724790769928823375793283671051479570198286895253998686473352852617282646423776591164499455695311138248299", + "-1590072871278743537180333082100146324295480429097445157011611168462260468069742799519303496051313133424632939883615906533434106640128123864165917007171699524724790769928823375793283671051479570198286895253998686473352852617282646423776591164499455695311138248299", + "383577258388475022706431955525247573599499248581278423720457780337892379126935", + "-383577258388475022706431955525247573599499248581278423720457780337892379126935", + "4092674502161259843824589343985242161447501042778080381002610852870457757982768392530808942900298511043488661625193784801456963642409098266685508736530379429664593489447947572985105744943017018734265426997872693998175650632205202701888817395372790067319643794599452089403576233527127077671169622", + "-4092674502161259843824589343985242161447501042778080381002610852870457757982768392530808942900298511043488661625193784801456963642409098266685508736530379429664593489447947572985105744943017018734265426997872693998175650632205202701888817395372790067319643794599452089403576233527127077671169622", + "13404427613900927247182634952369430867149749267930075884187025351198408344520192279603454195813154024830997527858376982434391797362547445527455503408360391999256823815839930266546427915841779", + "-13404427613900927247182634952369430867149749267930075884187025351198408344520192279603454195813154024830997527858376982434391797362547445527455503408360391999256823815839930266546427915841779", + "1782731694176936358469465341561020425473553201468123279175729849215977910638614519237563454448377541145186523281923996935231617014737050458102419525422740666362815640052502503060273650753054955785368306923652680382227789211754118567371586934", + "-1782731694176936358469465341561020425473553201468123279175729849215977910638614519237563454448377541145186523281923996935231617014737050458102419525422740666362815640052502503060273650753054955785368306923652680382227789211754118567371586934", + "71445070949104597011738157784103420085714634511010244724089831548057084941763190363056184849082451693612273802898122477866754965092090652561708550", + "-71445070949104597011738157784103420085714634511010244724089831548057084941763190363056184849082451693612273802898122477866754965092090652561708550", + "29824403422520048745171796949849941396331286906646046322404644703962912292598789686250791183932008392905170486032131129329348882564734443795544653928497362304776093305233881623231624358963434097033411434801644527775046832916455013625115699965097251269229855092992005057236242615322851235046388965677957662", + "-29824403422520048745171796949849941396331286906646046322404644703962912292598789686250791183932008392905170486032131129329348882564734443795544653928497362304776093305233881623231624358963434097033411434801644527775046832916455013625115699965097251269229855092992005057236242615322851235046388965677957662", + "3305915750647269729664177438631754300633043385617699516297426765949911376314744190602062381040796872234391958", + "-3305915750647269729664177438631754300633043385617699516297426765949911376314744190602062381040796872234391958", + "3478784122562389625603", + "-3478784122562389625603", + "92086546733522598295324541515522297712847163647680019382995445215746554554174953976307228051786981849535290733112403050554954140651771516865900059530798935625857134201153825877196274813040051834092674214044263432436343855130586740109759258782054166065929", + "-92086546733522598295324541515522297712847163647680019382995445215746554554174953976307228051786981849535290733112403050554954140651771516865900059530798935625857134201153825877196274813040051834092674214044263432436343855130586740109759258782054166065929", + "65957872354116509297400621319564903702253130516097675674670945971981309842410416012915540911950348439255536201700835793048055599890677253563036692899622137331645054971331690373584438379720134181489517623643988341292887235850459604282122921452528", + "-65957872354116509297400621319564903702253130516097675674670945971981309842410416012915540911950348439255536201700835793048055599890677253563036692899622137331645054971331690373584438379720134181489517623643988341292887235850459604282122921452528", + "4165190074711498372705686642027748628010631591673700346085849569414502903758312031393196903476997644869669022781414821544378466903717692187198478658086148256293129853045819435002914", + "-4165190074711498372705686642027748628010631591673700346085849569414502903758312031393196903476997644869669022781414821544378466903717692187198478658086148256293129853045819435002914", + "502172553703744753908380772164642649304217792528090440716191580724484473328235664927817984771636372875409898830005825976063650593238541433729038373056225370315599153406133185392320847", + "-502172553703744753908380772164642649304217792528090440716191580724484473328235664927817984771636372875409898830005825976063650593238541433729038373056225370315599153406133185392320847", + "25810339190726741831136349797818105994358611764887668315197822821632935574011575463532742868091838388104842551381619490991039627647851601302773448573544037953054558472548", + "-25810339190726741831136349797818105994358611764887668315197822821632935574011575463532742868091838388104842551381619490991039627647851601302773448573544037953054558472548", + "4665422938667922731390545239525991067478667357298476881860826251089436662146540827982134227087684685030991914103761128873483160892760746361799786480055617662181625815248230938316973880302906675299954379007760370823224832674779", + "-4665422938667922731390545239525991067478667357298476881860826251089436662146540827982134227087684685030991914103761128873483160892760746361799786480055617662181625815248230938316973880302906675299954379007760370823224832674779", + "2223735597830224864049890057834039493638098960775167604145066375240100821674008194961337124741661084219067145508494176034464042665143434078149689607318313818865277681569064932224810481504434495675653041063465302100041302802648038458370477008560806359234416742985635022084248641500377", + "-2223735597830224864049890057834039493638098960775167604145066375240100821674008194961337124741661084219067145508494176034464042665143434078149689607318313818865277681569064932224810481504434495675653041063465302100041302802648038458370477008560806359234416742985635022084248641500377", + "42345447563490737654515925924136916105150662665879987625806652403110474948139404742355256883201223238547442445427767854602327889485658289780295383306283583160293766253974742903668207523228749309062814526339073599070", + "-42345447563490737654515925924136916105150662665879987625806652403110474948139404742355256883201223238547442445427767854602327889485658289780295383306283583160293766253974742903668207523228749309062814526339073599070", + "40757494492054593189505181124883370961902335356122875708839948469462201920152164929215445", + "-40757494492054593189505181124883370961902335356122875708839948469462201920152164929215445", + "489422217562968312762274110453276604934633603473056760608254327080440181671628006090249666021287247215269380617364913734802444913151007354363389984204873709403053283740243705411640696405073698784366581571968399", + "-489422217562968312762274110453276604934633603473056760608254327080440181671628006090249666021287247215269380617364913734802444913151007354363389984204873709403053283740243705411640696405073698784366581571968399", + "203828256280853345400063519072625079280180030947163985710628295241982787474897521472368518281000277120011930353824152022905149681658066777399408021281560972784695745183483128330447721487075906552349941557379095078354083487747855104922", + "-203828256280853345400063519072625079280180030947163985710628295241982787474897521472368518281000277120011930353824152022905149681658066777399408021281560972784695745183483128330447721487075906552349941557379095078354083487747855104922", + "12579256107866823853770946314828592500732374403508913980712874463292391864755987195690537357503818366347747743186695890433", + "-12579256107866823853770946314828592500732374403508913980712874463292391864755987195690537357503818366347747743186695890433", + "26755461309842501536357032592700549777692476999989333013567704060006230872678556198949194222172481328325450314710024939575841488411640806870121381285742075565712411648904027990740378131995279017965737335010708563099143288460848557783", + "-26755461309842501536357032592700549777692476999989333013567704060006230872678556198949194222172481328325450314710024939575841488411640806870121381285742075565712411648904027990740378131995279017965737335010708563099143288460848557783", + "179718434482969588987690660522936295504619795328517541448501507443327040584026830018965223706205351139318424383916072860628585971720095475736018979361135523338248920218527202", + "-179718434482969588987690660522936295504619795328517541448501507443327040584026830018965223706205351139318424383916072860628585971720095475736018979361135523338248920218527202", + "4559476727415984415667742638506394832394804942241662737080235712002719322907465863068712531182175979070036317680566622", + "-4559476727415984415667742638506394832394804942241662737080235712002719322907465863068712531182175979070036317680566622", + "18056873734891410248496182290389914805111823879862689239017282732", + "-18056873734891410248496182290389914805111823879862689239017282732", + "28355632329442976457768532159881703427555635510700435885472670967222653884076177077876502624372493819303621756857250806505170393973261606631093857830885883244831587318220509004", + "-28355632329442976457768532159881703427555635510700435885472670967222653884076177077876502624372493819303621756857250806505170393973261606631093857830885883244831587318220509004", + "1459732654931833317515433139762665712773308964783227471709926780387231673576225461320924899820938949422193790260955695331912805657904286897274122419209888368548603", + "-1459732654931833317515433139762665712773308964783227471709926780387231673576225461320924899820938949422193790260955695331912805657904286897274122419209888368548603", + "841297417411594292128977", + "-841297417411594292128977", + "4242195673983737600970155103235752981938372024288592013363272064075708471058134960551862070710453189027317281773782487650970", + "-4242195673983737600970155103235752981938372024288592013363272064075708471058134960551862070710453189027317281773782487650970", + "197127905405798244", + "-197127905405798244", + "6563407470658357675196420807382675727943443587151170499642011999875762151944659352887984041897388778521562733", + "-6563407470658357675196420807382675727943443587151170499642011999875762151944659352887984041897388778521562733", + "171120862433529862507872013528755671195868254123500416552655719933624587064946914905766882327146949422149531556848478731913777486790475986722345662117903207153341", + "-171120862433529862507872013528755671195868254123500416552655719933624587064946914905766882327146949422149531556848478731913777486790475986722345662117903207153341", + "187214460763227398586269742130045771591887383985328887736156741862960369193610822715922978601952519088940029424980096549841026833488303831185375087247455968007157419452960145311595471", + "-187214460763227398586269742130045771591887383985328887736156741862960369193610822715922978601952519088940029424980096549841026833488303831185375087247455968007157419452960145311595471", + "2673090487374081993731207525489391145288488762290600450482603424170240599600446740180718555900667741328318482506598059839151491967628487386391045037818794920023261735737921639708995039726148095626857322210114264941784225627483927045402749218", + "-2673090487374081993731207525489391145288488762290600450482603424170240599600446740180718555900667741328318482506598059839151491967628487386391045037818794920023261735737921639708995039726148095626857322210114264941784225627483927045402749218", + "299586874531112789052013025908546379682766040499696938471256503832571345345612339844529913907580250563145642647", + "-299586874531112789052013025908546379682766040499696938471256503832571345345612339844529913907580250563145642647", + "405538475580851874887939920459327617092961192248480802208813876830531489658564864824178266672271683879464330412787024584249226414349424728066961849584546083679996737251131765131648932944495100981642907933045304884221229278087094810231012513599884296417415741723145516546902774087770992604", + "-405538475580851874887939920459327617092961192248480802208813876830531489658564864824178266672271683879464330412787024584249226414349424728066961849584546083679996737251131765131648932944495100981642907933045304884221229278087094810231012513599884296417415741723145516546902774087770992604", + "4289997525579508886804910999084475469759259557183118236485054735737485047460566798688052482933027075995626140181076328124548622067825535609834113884951451721787266314523910215228638324453588589604475728750868849529649579405314779527171490876426202137784122981787297800640695809335850632264276817218", + "-4289997525579508886804910999084475469759259557183118236485054735737485047460566798688052482933027075995626140181076328124548622067825535609834113884951451721787266314523910215228638324453588589604475728750868849529649579405314779527171490876426202137784122981787297800640695809335850632264276817218", + "8307592530302620538620421474950064873013", + "-8307592530302620538620421474950064873013", + "668153113826415803744690433659063449914674108460", + "-668153113826415803744690433659063449914674108460", + "46917857009025361535384034419352878543368877134948287044907072634745489626203425426919312434872888667388137952819558853009128820322712955326948275185023832843664510785316937903", + "-46917857009025361535384034419352878543368877134948287044907072634745489626203425426919312434872888667388137952819558853009128820322712955326948275185023832843664510785316937903", + "72692276728923532198738657661593229541714898424777445103294553106601965453652630548922019551752677856073619742879036073418", + "-72692276728923532198738657661593229541714898424777445103294553106601965453652630548922019551752677856073619742879036073418", + "1365147498021014007274145395277247416653740352472059016216427940658523565320578614021663036729154339063385098348763260722534882240886880631939819", + "-1365147498021014007274145395277247416653740352472059016216427940658523565320578614021663036729154339063385098348763260722534882240886880631939819", + "114300720014386070718720229683003272046146186775381997423967458204765959963431901037954797839956346151530366909939183214", + "-114300720014386070718720229683003272046146186775381997423967458204765959963431901037954797839956346151530366909939183214", + "6762", + "-6762", + "52958329794842511544564431607079502085929565913139912125121000214082684350382689340216127453430020886928460043472604757294523852724883994706799227072659732722150629405334684502120793494615254736603105282342926917766772004919", + "-52958329794842511544564431607079502085929565913139912125121000214082684350382689340216127453430020886928460043472604757294523852724883994706799227072659732722150629405334684502120793494615254736603105282342926917766772004919", + "176688206756700071063559027466389453920766491733115376426152125336429137613213551729990793300311032785623", + "-176688206756700071063559027466389453920766491733115376426152125336429137613213551729990793300311032785623", + "1922483080110348257033411950111656752298655371856953617086529843662865561409994291993287457671153478029077149725149857725", + "-1922483080110348257033411950111656752298655371856953617086529843662865561409994291993287457671153478029077149725149857725", + "116652054071220139544336382432735630060274666911983", + "-116652054071220139544336382432735630060274666911983", + "5174104538080339543938990263794928249064915674657896129852899608936285960971761863486556625630466310050160624211680012958157394810117796321101931191821302341708281726643201876685372393200977149042032383466554582623637450297592330981838876150680862436764327264788138788126029954523641986", + "-5174104538080339543938990263794928249064915674657896129852899608936285960971761863486556625630466310050160624211680012958157394810117796321101931191821302341708281726643201876685372393200977149042032383466554582623637450297592330981838876150680862436764327264788138788126029954523641986", + "56602051214329308908684928399837460067357624824927409574521689818931407829513021195830603280968596169697964984976489620035360483629559652883726214824557656337088813049173231800245733072858891481768028465352155733037356970930661713472640527903665", + "-56602051214329308908684928399837460067357624824927409574521689818931407829513021195830603280968596169697964984976489620035360483629559652883726214824557656337088813049173231800245733072858891481768028465352155733037356970930661713472640527903665", + "50465855132621952642877529162542254312895872248149199085828932352785530557943935823716975491349313488156548806716473058702726383127266", + "-50465855132621952642877529162542254312895872248149199085828932352785530557943935823716975491349313488156548806716473058702726383127266", + "2103822150383069790413887708626272542825699206757181614299988243654634518589287733034323781018255", + "-2103822150383069790413887708626272542825699206757181614299988243654634518589287733034323781018255", + "2884145868221566190464654384898336516944031094549949335240745089189320393412625205715458573411537464678090067152741985416827426839574623518965109414118185662809105887512018969132683541056905460490486376635525002751775036410408309529607280059108670794204594780445621", + "-2884145868221566190464654384898336516944031094549949335240745089189320393412625205715458573411537464678090067152741985416827426839574623518965109414118185662809105887512018969132683541056905460490486376635525002751775036410408309529607280059108670794204594780445621", + "17151949587338385537174755341574689039375819189521363664160085642631581896638291949680521029535105884955679278095750173056302788876858996886433270550139444896998901", + "-17151949587338385537174755341574689039375819189521363664160085642631581896638291949680521029535105884955679278095750173056302788876858996886433270550139444896998901", + "480533356849702776352763749832742587425919427139102525668442168835109831060078665166920712330431373189225474215620302495581803094913110624590177406888394624128938633526464614177040468306987399", + "-480533356849702776352763749832742587425919427139102525668442168835109831060078665166920712330431373189225474215620302495581803094913110624590177406888394624128938633526464614177040468306987399", + "4048293905596052205036948911452380394795846231788449", + "-4048293905596052205036948911452380394795846231788449", + "26995137345178218227830930364666340738", + "-26995137345178218227830930364666340738", + "774397441571262230984201650112220858044164538606555323635490088358801192583611522683260312754942754317572391764052135170163899209038840031703432786259696586141227827701639190998818229513", + "-774397441571262230984201650112220858044164538606555323635490088358801192583611522683260312754942754317572391764052135170163899209038840031703432786259696586141227827701639190998818229513", + "18762561208181880394479657197069746737270753294648933008217092757003616838536799737540224936022419848244051559923181261528435902887894811151076237", + "-18762561208181880394479657197069746737270753294648933008217092757003616838536799737540224936022419848244051559923181261528435902887894811151076237", + "907239775827042770755661550314761787115062100342977397902609610238855670466824379", + "-907239775827042770755661550314761787115062100342977397902609610238855670466824379", + "752510106807455900379909618532778973994453687695730898309343615105390212836204453042377052183212876905061", + "-752510106807455900379909618532778973994453687695730898309343615105390212836204453042377052183212876905061", + "1594387591422875707361322970839625151131381378174641793551465510142159417127028702651513859466122585110982922292801583543059620610053622982905425511766811223211156471041084636387606630303692709955363035", + "-1594387591422875707361322970839625151131381378174641793551465510142159417127028702651513859466122585110982922292801583543059620610053622982905425511766811223211156471041084636387606630303692709955363035", + "23316150037708287470080374296114607254763375473373018965703611900047553929551418522455587001961482391010828529091929849671267100179126145618520750402550331537136654", + "-23316150037708287470080374296114607254763375473373018965703611900047553929551418522455587001961482391010828529091929849671267100179126145618520750402550331537136654", + "206570606519236414660405117101821960086150934143523942248291980694989781221204732295572458288359135192620910534498754440751275665591490740002481374496819362873621178489882031204314197626575326338703982006151642904", + "-206570606519236414660405117101821960086150934143523942248291980694989781221204732295572458288359135192620910534498754440751275665591490740002481374496819362873621178489882031204314197626575326338703982006151642904", + "64632739363686102310668199833121081452653123828159756435580680576799270035485260582762183515021072594277553694799435773660728228989363057503956061322371391729597055325808343868799201699918264379213943162952380242502610323", + "-64632739363686102310668199833121081452653123828159756435580680576799270035485260582762183515021072594277553694799435773660728228989363057503956061322371391729597055325808343868799201699918264379213943162952380242502610323", + "589421411734420159501267976455896411309276255208891167201590523330271039604417032437154142085688410405533459836702131617092573518938815446609802434772431958960872071215171855513041280388698254907927340515117391166070141683457342784", + "-589421411734420159501267976455896411309276255208891167201590523330271039604417032437154142085688410405533459836702131617092573518938815446609802434772431958960872071215171855513041280388698254907927340515117391166070141683457342784", + "78879805619934569024599381571707822806614963415349200270284875054237164864359624372158647647863797008340316828012300755667110314855460503179181117097385701319739187114139718329827695009617428401620773545555394848573360317456047893463046622890050301003010952433178967879125505419476694805185008787411114258", + "-78879805619934569024599381571707822806614963415349200270284875054237164864359624372158647647863797008340316828012300755667110314855460503179181117097385701319739187114139718329827695009617428401620773545555394848573360317456047893463046622890050301003010952433178967879125505419476694805185008787411114258", + "23502781763641178064404023959903165549857567200280242514656186491195674181432757323176594593508102253721487854615955222259753262265267416938", + "-23502781763641178064404023959903165549857567200280242514656186491195674181432757323176594593508102253721487854615955222259753262265267416938", + "409297139610776763506123895143481451963282099839420969098705456374184360544846067009871040867462673178544358986308342020083146065020599826820240081787171394155098100110040672410422987400472449240126519719022700797622570738", + "-409297139610776763506123895143481451963282099839420969098705456374184360544846067009871040867462673178544358986308342020083146065020599826820240081787171394155098100110040672410422987400472449240126519719022700797622570738", + "23333202714794325323697505", + "-23333202714794325323697505", + "88926553698672071141130629238070206100425021951043909308812007686747474756572535280975280230894876905612920792259781652532353624660383165526934048092970256374163978700915230573599950689593884285235239417830600259906139092309559397593337924686035082341037174504874298230037865321327", + "-88926553698672071141130629238070206100425021951043909308812007686747474756572535280975280230894876905612920792259781652532353624660383165526934048092970256374163978700915230573599950689593884285235239417830600259906139092309559397593337924686035082341037174504874298230037865321327", + "193216483164388919875865726156220378900478525465101761599275916110098513", + "-193216483164388919875865726156220378900478525465101761599275916110098513", + "445147927105811334112201187535182947887817402193430490222008844342623483790016955826328140200646698573333197769902932812101243075968229955686369555029175781", + "-445147927105811334112201187535182947887817402193430490222008844342623483790016955826328140200646698573333197769902932812101243075968229955686369555029175781", + "404724915427015100236245877077487335897861954733139220931559056131326351438847042320598819539736832267015136080413912317007525653866157576085879981310860858916082141809558153661155248226776118160741627797764071433035028151035984348656570943456141740411122305727778772350559929918941", + "-404724915427015100236245877077487335897861954733139220931559056131326351438847042320598819539736832267015136080413912317007525653866157576085879981310860858916082141809558153661155248226776118160741627797764071433035028151035984348656570943456141740411122305727778772350559929918941", + "15881033668267446564985922502808887168130126414945171534501886241573767046656582600501857191275522198094812554481448361027945717673462595782212036129626347287630493102505400", + "-15881033668267446564985922502808887168130126414945171534501886241573767046656582600501857191275522198094812554481448361027945717673462595782212036129626347287630493102505400", + "2137415689988797072560582676089346590053122445", + "-2137415689988797072560582676089346590053122445", + "323798850186148580554863589187091135845440166774430133093440314556959379021941132307127400322225854705093073925068652013957143959242670668925116774275979824", + "-323798850186148580554863589187091135845440166774430133093440314556959379021941132307127400322225854705093073925068652013957143959242670668925116774275979824", + "173508106063459544226297157276274728721118210069318517925122848577242175434996938459695476331454013223646557993405407002578179119005445994337106614223750746479653994536225606203430489837348181146905602085037927766933972128185498665420530967676198121700174", + "-173508106063459544226297157276274728721118210069318517925122848577242175434996938459695476331454013223646557993405407002578179119005445994337106614223750746479653994536225606203430489837348181146905602085037927766933972128185498665420530967676198121700174", + "78355099355274385235041105626642472390321765441120677546321753788293394435411913702107288104186287888107050196021354011143759436476044341380451", + "-78355099355274385235041105626642472390321765441120677546321753788293394435411913702107288104186287888107050196021354011143759436476044341380451", + "14082584100725485095810331470851521352703939751219746773401724408039845947212432002741091564650266209598267452042246073901010147451656273871799778680203026839107331149", + "-14082584100725485095810331470851521352703939751219746773401724408039845947212432002741091564650266209598267452042246073901010147451656273871799778680203026839107331149", + "2451726111242013614644472867015070800954350593117210091845723358334627905121894871023262409519589588967063261046514660829821816464168656627289239433694932574140916666824", + "-2451726111242013614644472867015070800954350593117210091845723358334627905121894871023262409519589588967063261046514660829821816464168656627289239433694932574140916666824", + "20065158625055757494521923831526555875918181556943569250588125153526936260221797604217490757723244157360646025073105062346371489195519447915244240862375631489025063124997553195851549786517441567063889510370756857238499576234680378947724748027600877684623953611544337343413268969959530489689129071097842283967", + "-20065158625055757494521923831526555875918181556943569250588125153526936260221797604217490757723244157360646025073105062346371489195519447915244240862375631489025063124997553195851549786517441567063889510370756857238499576234680378947724748027600877684623953611544337343413268969959530489689129071097842283967", + "2877720628966736569525036642910772915862211025917410379176852591593786965122381483084242795700755306144132542301154682139822037092615315519", + "-2877720628966736569525036642910772915862211025917410379176852591593786965122381483084242795700755306144132542301154682139822037092615315519", + "3795119948781692972575431", + "-3795119948781692972575431", + "117633423107664842386614454295318823031546808284886498133093442797780366695865088951102734835036375188027702346663647830425172733187275067584200082224814835976110754843437513016147344252016745713239843138800215136235719850541984478206795380204540097476184957279443", + "-117633423107664842386614454295318823031546808284886498133093442797780366695865088951102734835036375188027702346663647830425172733187275067584200082224814835976110754843437513016147344252016745713239843138800215136235719850541984478206795380204540097476184957279443", + "6028200577464886742220964264433220606667469744201474633845587044124944417457573648621749660231277732832613157240821087790368844691241612", + "-6028200577464886742220964264433220606667469744201474633845587044124944417457573648621749660231277732832613157240821087790368844691241612", + "1117820580139700758941594748763781946255037110167582749384133756752449839190401944216912957650664993553129645500059553210763046702311000117537213965255288711420760932554622971299296197897", + "-1117820580139700758941594748763781946255037110167582749384133756752449839190401944216912957650664993553129645500059553210763046702311000117537213965255288711420760932554622971299296197897", + "894440058986616656162159749909897", + "-894440058986616656162159749909897", + "11758059164722075820822351813564721682251718268398125058702252593271794825804844012676212580269973081943948588059900469592179919885984813401833621636489306", + "-11758059164722075820822351813564721682251718268398125058702252593271794825804844012676212580269973081943948588059900469592179919885984813401833621636489306", + "48260623373995703142149825869126942692445720237750683695954821352777035904885960923027672480964040682023869233942201916828693522743832886088998972188767776078279426029402097202986260065462533610836932273188567823090315418748142243190815560532101505961513910649086153182477090526300312187507612192", + "-48260623373995703142149825869126942692445720237750683695954821352777035904885960923027672480964040682023869233942201916828693522743832886088998972188767776078279426029402097202986260065462533610836932273188567823090315418748142243190815560532101505961513910649086153182477090526300312187507612192", + "155032044456958560653742313851007803134963800248495609164183285804227615140653638264588439258316691251377924988538500569549816017742093617863981847156274851353234781166567436349214058632603830394495548221403249818520855020397602702298881144444526972675887598504476681959777521420493375210129749627151599", + "-155032044456958560653742313851007803134963800248495609164183285804227615140653638264588439258316691251377924988538500569549816017742093617863981847156274851353234781166567436349214058632603830394495548221403249818520855020397602702298881144444526972675887598504476681959777521420493375210129749627151599", + "117", + "-117", + "31151175335", + "-31151175335", + "35374964788462894211615124919986334396217303170433399786403229831899783789349053619411986131305536842776505623498475004759495592581325624956208728845327562674600497034793430703900584828213353358028973193115581365893453195729236094397513635", + "-35374964788462894211615124919986334396217303170433399786403229831899783789349053619411986131305536842776505623498475004759495592581325624956208728845327562674600497034793430703900584828213353358028973193115581365893453195729236094397513635", + "11796859242834559349330645424007719279425086069437451547961817738176345052586077262730615110965711332407717403184353050831388270460861280643450803074302303211224953369570563468013937668078037503909168201005260137906679740236981824660385730820591421051254923150011711560287985553001992949325890751138512", + "-11796859242834559349330645424007719279425086069437451547961817738176345052586077262730615110965711332407717403184353050831388270460861280643450803074302303211224953369570563468013937668078037503909168201005260137906679740236981824660385730820591421051254923150011711560287985553001992949325890751138512", + "170647522893580509002975714845089353418304318223993041052613489603839464032767136346831417604396147862171608710351258359424720597066331032122844389758062085194297618983116731697591466836398130208912823480520907032976237477074428855652406620425725105496", + "-170647522893580509002975714845089353418304318223993041052613489603839464032767136346831417604396147862171608710351258359424720597066331032122844389758062085194297618983116731697591466836398130208912823480520907032976237477074428855652406620425725105496", + "5281478654865951520041163170269381080147277352244478257096792252048711710697114547916527006005288159091362187924", + "-5281478654865951520041163170269381080147277352244478257096792252048711710697114547916527006005288159091362187924", + "4612981530909908953399866319425198830164041651329116814589068706471983209837216442140437916749761739590696654721694691453248631167747384468652625616153898389404331335686814768720227658621123619760490072200457566243849427676890450504279708348832752925128591526859889728", + "-4612981530909908953399866319425198830164041651329116814589068706471983209837216442140437916749761739590696654721694691453248631167747384468652625616153898389404331335686814768720227658621123619760490072200457566243849427676890450504279708348832752925128591526859889728", + "230942413272730226530444519509994205060147713549648054777582719550812782352234600742222169014506643621109087605680440174002739494059492224354791764876753787909937534165450961813280650662325436679754051868455414", + "-230942413272730226530444519509994205060147713549648054777582719550812782352234600742222169014506643621109087605680440174002739494059492224354791764876753787909937534165450961813280650662325436679754051868455414", + "528690042093345595850504247", + "-528690042093345595850504247", + "31537765402865704303346035013066893813209666897703115111579537190812318360668479310525622135277986713283804", + "-31537765402865704303346035013066893813209666897703115111579537190812318360668479310525622135277986713283804", + "1599362772260782365940237955777469665833441883265981514825058091831969039328944925726126036206151420504388513842915084045761", + "-1599362772260782365940237955777469665833441883265981514825058091831969039328944925726126036206151420504388513842915084045761", + "22018294718309903690696646065850459504307668740106965970119563766751726997751841635147532383629353261767951801681466624415627829013290232821085001690020179707527003163210966668639431417007076432036482650137410011799888860384641536214437778644612376970907784011215", + "-22018294718309903690696646065850459504307668740106965970119563766751726997751841635147532383629353261767951801681466624415627829013290232821085001690020179707527003163210966668639431417007076432036482650137410011799888860384641536214437778644612376970907784011215", + "139228864110515195216553853606798559408959520596931103855825362443397424774758172", + "-139228864110515195216553853606798559408959520596931103855825362443397424774758172", + "438362563301076", + "-438362563301076", + "536477710240446158400855952047098861739032777002422842180036166459742934651199360607978321612514452622744911025658574877961214107174719449789017540265828279486524590338437269953368890994755662873267173870955360800125978287820421262971848425170065", + "-536477710240446158400855952047098861739032777002422842180036166459742934651199360607978321612514452622744911025658574877961214107174719449789017540265828279486524590338437269953368890994755662873267173870955360800125978287820421262971848425170065", + "498862087303189047484286815556440094292974761004818123941676688570935488959257235857771896260779999415327140115975996793571922312686472323161351487622438079274047587863856806852283080757914159158900221821", + "-498862087303189047484286815556440094292974761004818123941676688570935488959257235857771896260779999415327140115975996793571922312686472323161351487622438079274047587863856806852283080757914159158900221821", + "397485490350112467732556257997195088092587231213238688938663359508903507782996482344687130558398493814503644541315765003280501133111", + "-397485490350112467732556257997195088092587231213238688938663359508903507782996482344687130558398493814503644541315765003280501133111", + "849712043650971777004742171643106324862754090831744200814795006972518085972931752076874433562783731671435108431684162545599206785950669723461026526402295759448129538027792947274880743875232398841880484354651333627643180878756213653", + "-849712043650971777004742171643106324862754090831744200814795006972518085972931752076874433562783731671435108431684162545599206785950669723461026526402295759448129538027792947274880743875232398841880484354651333627643180878756213653", + "31939357424827970804026114453315327769012263471221072258182242042519626638563054352273477096407109171097657867287701617587164195568409977479696410846577473709461543239341493963739506308939662837999529461859333741861608567355869490150265338213466190360633042086859245316851129010609", + "-31939357424827970804026114453315327769012263471221072258182242042519626638563054352273477096407109171097657867287701617587164195568409977479696410846577473709461543239341493963739506308939662837999529461859333741861608567355869490150265338213466190360633042086859245316851129010609", + "59075219415446517463799317419672630289040", + "-59075219415446517463799317419672630289040", + "61544636348619846793635535253831658039274289566061329628", + "-61544636348619846793635535253831658039274289566061329628", + "470399936237982365631161793432085070263103572484796818885564848815758149943921811891860946060341559711899471195599373649384438242044515090831782134530922053677106020022279456123296157017910183495235140194390296804039743799564279602012304465862001339612585603213921336997140271860031180936085302533520084", + "-470399936237982365631161793432085070263103572484796818885564848815758149943921811891860946060341559711899471195599373649384438242044515090831782134530922053677106020022279456123296157017910183495235140194390296804039743799564279602012304465862001339612585603213921336997140271860031180936085302533520084", + "4263018257494613144043214865050835432323223259669979976818528797978364036590648420", + "-4263018257494613144043214865050835432323223259669979976818528797978364036590648420", + "1030364360168890027890816549580", + "-1030364360168890027890816549580", + "792685786141580556314148491833336274593743818", + "-792685786141580556314148491833336274593743818", + "641446086312126555467875106303989084781624843543297958597183735580271101775752996685163", + "-641446086312126555467875106303989084781624843543297958597183735580271101775752996685163", + "5495154319842093167496249323058689957423462", + "-5495154319842093167496249323058689957423462", + "11789599234651983989010071854908355935861398361186377696491616773407893531669446332781833177934487486443699554324479061335467496521890118734937498733191672611144989167953103344991959519028482263752023000602387955366518706202210024461852086754020196", + "-11789599234651983989010071854908355935861398361186377696491616773407893531669446332781833177934487486443699554324479061335467496521890118734937498733191672611144989167953103344991959519028482263752023000602387955366518706202210024461852086754020196", + "11868320247536683221143642841170454891656934116545619261841381472878070159790790558172360288429121201484338870667354265884102674537478716958516286215910855456088033052883980008436942265685062267471783017549551768359416886934474316919451518061351858590202914987178911670", + "-11868320247536683221143642841170454891656934116545619261841381472878070159790790558172360288429121201484338870667354265884102674537478716958516286215910855456088033052883980008436942265685062267471783017549551768359416886934474316919451518061351858590202914987178911670", + "1284156757531040914593221", + "-1284156757531040914593221", + "9523156885736314276851029956129745152608513178870686801769759111308470996123088771851122858908132203444859152976097503444227519069060806081448518797562327844612222984531692130770", + "-9523156885736314276851029956129745152608513178870686801769759111308470996123088771851122858908132203444859152976097503444227519069060806081448518797562327844612222984531692130770", + "31415032545650652773467205308921957370624743383488073117109921420678201637023554362493982589097031342230335705038785983149366806922747914694551472092848890719761600241693293020110370962350805350", + "-31415032545650652773467205308921957370624743383488073117109921420678201637023554362493982589097031342230335705038785983149366806922747914694551472092848890719761600241693293020110370962350805350", + "38540294830367981299370153716758943624066595675817723365819908936210186285351422767835324962411068698716556932780434832522209505361628036446058246936860795564022909013649", + "-38540294830367981299370153716758943624066595675817723365819908936210186285351422767835324962411068698716556932780434832522209505361628036446058246936860795564022909013649", + "1489", + "-1489", + "2270684970894467473228397152522666196967234885", + "-2270684970894467473228397152522666196967234885", + "623594270429426955031234189496487600662597646571928622449980935215346797035198838197888222869632091525558748378610334926140669245375114542239425712378426359715133474059991644743953906535538195465100677512751053", + "-623594270429426955031234189496487600662597646571928622449980935215346797035198838197888222869632091525558748378610334926140669245375114542239425712378426359715133474059991644743953906535538195465100677512751053", + "60223901057086672916139687208371207252559034742838976658538850201068490068101652675647609676435807962967919811849514616239086913537412970210091632651259826174103338368751134965303230126211398438698151879240977404460468186851886617548182773561840252412981638510923", + "-60223901057086672916139687208371207252559034742838976658538850201068490068101652675647609676435807962967919811849514616239086913537412970210091632651259826174103338368751134965303230126211398438698151879240977404460468186851886617548182773561840252412981638510923", + "352083164097278474078005845682075986531119761078051415723391468152762696096016941577257179144242535089572306180818322625093102190964224730315213843217203692079968682", + "-352083164097278474078005845682075986531119761078051415723391468152762696096016941577257179144242535089572306180818322625093102190964224730315213843217203692079968682", + "256914715526573594304760664453685512541013676570328830117752884150636769825195172277797835580253224279327546275273345112399482552434310216245805227544453571042746897560531287112979681556135355", + "-256914715526573594304760664453685512541013676570328830117752884150636769825195172277797835580253224279327546275273345112399482552434310216245805227544453571042746897560531287112979681556135355", + "3929812712463085187666519605941080752665430680003082969619532219612559124276337233356486033607557565841182562299051203553436156356748939", + "-3929812712463085187666519605941080752665430680003082969619532219612559124276337233356486033607557565841182562299051203553436156356748939", + "1342865274232326934240128816495975896816628726930390134403022164244814040962732527145178443776536620876592577", + "-1342865274232326934240128816495975896816628726930390134403022164244814040962732527145178443776536620876592577", + "75482499101235806844482700363651520608393572186840116071510831", + "-75482499101235806844482700363651520608393572186840116071510831", + "157079333706470320589362721287335446436100673921262275021919536009571391130921654202277262407403872423297032197476611916298599850639905615780935087993369908937", + "-157079333706470320589362721287335446436100673921262275021919536009571391130921654202277262407403872423297032197476611916298599850639905615780935087993369908937", + "21096758435207806377330934948465784354053655", + "-21096758435207806377330934948465784354053655", + "7296202760566732448484088809683111106213594240238214600327977304983210800704941723091693567279115428088283219305211898160182", + "-7296202760566732448484088809683111106213594240238214600327977304983210800704941723091693567279115428088283219305211898160182", + "9473711847689244707278408760608984165904137893454069938633516224794155238069623008814110071678551847797982066773376077", + "-9473711847689244707278408760608984165904137893454069938633516224794155238069623008814110071678551847797982066773376077", + "424157689387860814675639", + "-424157689387860814675639", + "2311915845008175998603844058297620909349923283750536586587937434312377733844702049651807722475434283757267961177665307169760829875889028168476878787006491399930630338344642910500797043234542368361571429181649829252175786093011520179318", + "-2311915845008175998603844058297620909349923283750536586587937434312377733844702049651807722475434283757267961177665307169760829875889028168476878787006491399930630338344642910500797043234542368361571429181649829252175786093011520179318", + "74548539487073557220326968093479867500276859338046876248826540472060313997", + "-74548539487073557220326968093479867500276859338046876248826540472060313997", + "11654322736763", + "-11654322736763", + "53007278098826078101002711940372616336", + "-53007278098826078101002711940372616336", + "79488890173950413261690334491844393856301694056413503617980571504653230048955", + "-79488890173950413261690334491844393856301694056413503617980571504653230048955", + "408713674815985937940894525901270256192656939969702057871", + "-408713674815985937940894525901270256192656939969702057871", + "793896474068238367668141234719022911425186020423846578406386752245064555357695445408188930726837363615519065571656957027286833070564842125230923415365473419", + "-793896474068238367668141234719022911425186020423846578406386752245064555357695445408188930726837363615519065571656957027286833070564842125230923415365473419", + "174808944301193943551146900431326706416195767876909997906726651518289372951", + "-174808944301193943551146900431326706416195767876909997906726651518289372951", + "15518425275704712437859509478557555507942868590674242179846381629609574039655947926978374551659365245896461352380663149726832850553382303285336261869176813113104452944002526144559297701143263522625331250816271032050756743914895178056748128568613436826595", + "-15518425275704712437859509478557555507942868590674242179846381629609574039655947926978374551659365245896461352380663149726832850553382303285336261869176813113104452944002526144559297701143263522625331250816271032050756743914895178056748128568613436826595", + "704584697906407199708590092378103021972791431202757824957775774072784740246334320005088181512002963310761780580704786814454975765", + "-704584697906407199708590092378103021972791431202757824957775774072784740246334320005088181512002963310761780580704786814454975765", + "657607704878895067543343694899228430336912631528241927302696775319590907402199923852512833112461947631065129028125536463067298383212071017877117414800369576545371975736320978897530313093703317591926126573581594016017999087405971954224745504107290022634832416486976440197266126685274050284770811156390509", + "-657607704878895067543343694899228430336912631528241927302696775319590907402199923852512833112461947631065129028125536463067298383212071017877117414800369576545371975736320978897530313093703317591926126573581594016017999087405971954224745504107290022634832416486976440197266126685274050284770811156390509", + "7494538701531220", + "-7494538701531220", + "7300727560805294687539012803042995909238449713032452769229667883869087209620881400305875438962218813943386360970483979638425963787311826059269116699436735359914333529525984293006337531416122388956292154685035813667508959604499191395591577891525195678171", + "-7300727560805294687539012803042995909238449713032452769229667883869087209620881400305875438962218813943386360970483979638425963787311826059269116699436735359914333529525984293006337531416122388956292154685035813667508959604499191395591577891525195678171", + "255504587698518445312717922712930691081197792561411090916056798257637114731417865482714584651043811829851492818242972929470506766333616107450122580899272969326648134119416080989201012163771767787520485155594757300555185954280304839051723173371630921394024027714555984796981691309", + "-255504587698518445312717922712930691081197792561411090916056798257637114731417865482714584651043811829851492818242972929470506766333616107450122580899272969326648134119416080989201012163771767787520485155594757300555185954280304839051723173371630921394024027714555984796981691309", + "1957270404535432491577732407654814296272924990076105665080976425316855184394075979033347631859", + "-1957270404535432491577732407654814296272924990076105665080976425316855184394075979033347631859", + "403660520770889026052145363858883993968408567876919963129339377184354008618147803968877043087318952555532301757740363864562971760902711427500126603597011858241477379568684342423222828785569617251693287873736233651273385183220731182322820758659074766543835657767799241434709242669340338048971", + "-403660520770889026052145363858883993968408567876919963129339377184354008618147803968877043087318952555532301757740363864562971760902711427500126603597011858241477379568684342423222828785569617251693287873736233651273385183220731182322820758659074766543835657767799241434709242669340338048971", + "1360462270574406", + "-1360462270574406", + "41324796834060083364741632465744604155931640433410301186397363904266930128665463361513275697352082859944863112972305377171961651196393476069297383272360", + "-41324796834060083364741632465744604155931640433410301186397363904266930128665463361513275697352082859944863112972305377171961651196393476069297383272360", + "3704475702528052685702177087226789799951985298635254026584051739803799717979", + "-3704475702528052685702177087226789799951985298635254026584051739803799717979", + "15324664249401045013727127578266722880923015582445744082290396086739217665923549238159714472241913755511109729288179218537980252473553017573593867710189", + "-15324664249401045013727127578266722880923015582445744082290396086739217665923549238159714472241913755511109729288179218537980252473553017573593867710189", + "991713895885660445361195566630120268552033337199519129194545503121325658310309321599773356998546067469176345858459212673467904704287664190684736527585420239571896710231", + "-991713895885660445361195566630120268552033337199519129194545503121325658310309321599773356998546067469176345858459212673467904704287664190684736527585420239571896710231", + "496917928889709928816019707237559067993121139550552680620307451932907944813916325593269613319259002416192", + "-496917928889709928816019707237559067993121139550552680620307451932907944813916325593269613319259002416192", + "5420780319939699155212032775979062279900280911343420051629512809105059842240345509925762577052334971725879572674586223682520124367213762780782010484201065072155930114824432335178466411605479995327050114745584339793378334895820002004268553531081904844570983717097867410603089", + "-5420780319939699155212032775979062279900280911343420051629512809105059842240345509925762577052334971725879572674586223682520124367213762780782010484201065072155930114824432335178466411605479995327050114745584339793378334895820002004268553531081904844570983717097867410603089", + "34178515956045799076849256172156569827315750483663840127186371829050429609564171778221768139311136758783705861242122641003313096493057103420927909105632095530710317446888521007163646123762242884609239534269531565599291518871943322912836596141732912619557997670259415580841015283", + "-34178515956045799076849256172156569827315750483663840127186371829050429609564171778221768139311136758783705861242122641003313096493057103420927909105632095530710317446888521007163646123762242884609239534269531565599291518871943322912836596141732912619557997670259415580841015283", + "24753103731553244306801885710094553322976800783421479907592940309642834383335499833992007826858595009726122", + "-24753103731553244306801885710094553322976800783421479907592940309642834383335499833992007826858595009726122", + "1303658351822779358400767265190404914258468501671414115714852481575404440331055726991532424857235529818287464081864", + "-1303658351822779358400767265190404914258468501671414115714852481575404440331055726991532424857235529818287464081864", + "82442525420", + "-82442525420", + "40181847350075911374014072545070982", + "-40181847350075911374014072545070982", + "6331081104259962585725418329411543440752124680199", + "-6331081104259962585725418329411543440752124680199", + "669444625991257897062056995037426293652388602030282843269573026219936289974215349592874907406715089995765108583608936617284270069188005340481379259012388729065198804182112491651898040335690016003489264765600281922569438256615076042625367641", + "-669444625991257897062056995037426293652388602030282843269573026219936289974215349592874907406715089995765108583608936617284270069188005340481379259012388729065198804182112491651898040335690016003489264765600281922569438256615076042625367641", + "1168675103592556804163240443883135991575851814861660107303310966160744170850036726911375287483597293098658196142018318809369957616827451967868069658172182991177709289250815148540710360498467949152008438530805196222119517692659923705203865993818359838900924606163081858543", + "-1168675103592556804163240443883135991575851814861660107303310966160744170850036726911375287483597293098658196142018318809369957616827451967868069658172182991177709289250815148540710360498467949152008438530805196222119517692659923705203865993818359838900924606163081858543", + "2496566005249030514809106685776267657051598627391700353125416989638685021308242404184826752692976528990582207413089494945", + "-2496566005249030514809106685776267657051598627391700353125416989638685021308242404184826752692976528990582207413089494945", + "75831002519613645538052701409851076434071446092420445852577692671", + "-75831002519613645538052701409851076434071446092420445852577692671", + "1595257514333333836407007696922732712451830781457969960247677871324618039799", + "-1595257514333333836407007696922732712451830781457969960247677871324618039799", + "2352103706291595728734823852677068972089963637096939637892631185119057636184628093243", + "-2352103706291595728734823852677068972089963637096939637892631185119057636184628093243", + "55150603036064305927003551612930888862894407146543079948823875920053285006001048840253371944560550042245523051895932284432859", + "-55150603036064305927003551612930888862894407146543079948823875920053285006001048840253371944560550042245523051895932284432859", + "183652285344198865127020235735671716726282119574663849914811753120306798386549535194663979983946501785937569600701888628541389188176220321121981286091051", + "-183652285344198865127020235735671716726282119574663849914811753120306798386549535194663979983946501785937569600701888628541389188176220321121981286091051", + "1670967627370678916184944999086", + "-1670967627370678916184944999086", + "1779553803107116970428487453385844908445190212603430402358107740295247", + "-1779553803107116970428487453385844908445190212603430402358107740295247", + "163081585689520939847508610298505981110843", + "-163081585689520939847508610298505981110843", + "24608823059620600828775541561806855624217762717902459681958610060078155650689789569089307408156194776319918700684027035605476736967141308737778808097438", + "-24608823059620600828775541561806855624217762717902459681958610060078155650689789569089307408156194776319918700684027035605476736967141308737778808097438", + "176229540909991348680999108287461921475890812511086227972678364382149132437628380310728470828832129727355735848528049467023561657293359463509078809812981500824290722272220174525789664137788219060477887820838690954729061422727025173596051655147380497411055372159528861310774057097642760262454", + "-176229540909991348680999108287461921475890812511086227972678364382149132437628380310728470828832129727355735848528049467023561657293359463509078809812981500824290722272220174525789664137788219060477887820838690954729061422727025173596051655147380497411055372159528861310774057097642760262454", + "1521679829312851456536026361859335013780557838686738466687399128709926436847394871570976840503705308125705873792672378389916115357657382793749503126640771533338992032259981620506047817865492352874670892991966609760209061301594191537869902100817987599206558753487441796712670736855202929172147294", + "-1521679829312851456536026361859335013780557838686738466687399128709926436847394871570976840503705308125705873792672378389916115357657382793749503126640771533338992032259981620506047817865492352874670892991966609760209061301594191537869902100817987599206558753487441796712670736855202929172147294", + "4157696366999482544605875019162016856282588665242578471972156413342580075270416675018859586511300869507848273592737229363773252760313860357749814761595582127449880857952033970115380383676900743584438652262171904692777471245621134891056589732734422433379524779439127971588536170244050150621694478", + "-4157696366999482544605875019162016856282588665242578471972156413342580075270416675018859586511300869507848273592737229363773252760313860357749814761595582127449880857952033970115380383676900743584438652262171904692777471245621134891056589732734422433379524779439127971588536170244050150621694478", + "1080490672913509861800536351320773525291317691569674170377657976498332490333353859955175522548201462648648619481614475899104059632553936657464424434357970937863187647621979084401315431140833788114037982", + "-1080490672913509861800536351320773525291317691569674170377657976498332490333353859955175522548201462648648619481614475899104059632553936657464424434357970937863187647621979084401315431140833788114037982", + "3194906436319924706167835645658948826079202290534790460576542221669512825113141647211107781595153842508704176837984748167835595231049849647151228364465638129922085890581512323653", + "-3194906436319924706167835645658948826079202290534790460576542221669512825113141647211107781595153842508704176837984748167835595231049849647151228364465638129922085890581512323653", + "66347107100300795802324266184385521196001191250641925506321442631467978776436571080979857829987956896197464196707824641007632965810482791998323932299431716570622215408517414037865201951734572676314196738287234254247520531646927798844", + "-66347107100300795802324266184385521196001191250641925506321442631467978776436571080979857829987956896197464196707824641007632965810482791998323932299431716570622215408517414037865201951734572676314196738287234254247520531646927798844", + "11755070349326455201", + "-11755070349326455201", + "156651043578414506824194498430628709042640792209942834690006663445469241908219457011408374641207896652700963717365255757469753081082784", + "-156651043578414506824194498430628709042640792209942834690006663445469241908219457011408374641207896652700963717365255757469753081082784", + "6564614203586776498688508944538260136293893809517937442849470545503761844", + "-6564614203586776498688508944538260136293893809517937442849470545503761844", + "598962115054858410821731842471416988283668169539322479066058751789827287104304434155465947780173527582423899421590786844022599493768874809775192652719882115272582161354987", + "-598962115054858410821731842471416988283668169539322479066058751789827287104304434155465947780173527582423899421590786844022599493768874809775192652719882115272582161354987", + "14443508661606107679701498958114275550218690763128482677663411487796540412372251008043398613017374358807500824", + "-14443508661606107679701498958114275550218690763128482677663411487796540412372251008043398613017374358807500824", + "39256841936111992", + "-39256841936111992", + "22003604980409010500616552575366573651583935479333537954768716122155414073009794841075971673796002258058407019824164705801672155808939681382770846685292342660131406075122591374505200827365481659521834044185780365112968118493953141135082476859603163146563", + "-22003604980409010500616552575366573651583935479333537954768716122155414073009794841075971673796002258058407019824164705801672155808939681382770846685292342660131406075122591374505200827365481659521834044185780365112968118493953141135082476859603163146563", + "892612825794032675237656399315067134384177542558409873295423125742291209107349193521326932311978865", + "-892612825794032675237656399315067134384177542558409873295423125742291209107349193521326932311978865", + "124621", + "-124621", + "39935862547719441432334200243323687785328282085889753818085154826607463592957499184719152632875679930608636031007549318604365", + "-39935862547719441432334200243323687785328282085889753818085154826607463592957499184719152632875679930608636031007549318604365", + "53150384435463", + "-53150384435463", + "5038617365140462881167623487900113792134127235018266576334866703847563260548724132738580936393867769669999269123356358833922994762144381270134211004782972194957315491988474542647182488355728455727224128393875804308265676177706683756178477181259888932449640561270717525443984031839", + "-5038617365140462881167623487900113792134127235018266576334866703847563260548724132738580936393867769669999269123356358833922994762144381270134211004782972194957315491988474542647182488355728455727224128393875804308265676177706683756178477181259888932449640561270717525443984031839", + "18681375094308610932506726878974665535026964461038388", + "-18681375094308610932506726878974665535026964461038388", + "1694490961016050821118863403337160606621945374045986683635096733891067660467665114977365173029439236924493435715113229950328428294138767438612886428848619529462540214870987656585503501640006260787493433146977269874730836153316545758154447988098965049", + "-1694490961016050821118863403337160606621945374045986683635096733891067660467665114977365173029439236924493435715113229950328428294138767438612886428848619529462540214870987656585503501640006260787493433146977269874730836153316545758154447988098965049", + "34981000632270288897102343437813403379909519445061202916917950066646896121823399718762441640573618996405513221104482936830650441434933771175014497076492252938974657476531072878259814088155492254761929", + "-34981000632270288897102343437813403379909519445061202916917950066646896121823399718762441640573618996405513221104482936830650441434933771175014497076492252938974657476531072878259814088155492254761929", + "68186095594637277569008966718516358384203015123161693897355580993692840848969688", + "-68186095594637277569008966718516358384203015123161693897355580993692840848969688", + "1134126702908819566229008255313053760389444389322516415435539141233919754193425951992416106929842896080872524876962976885893778825250951315557865558643443244064361902243653517585491772912650759627537475187929799073482588432081", + "-1134126702908819566229008255313053760389444389322516415435539141233919754193425951992416106929842896080872524876962976885893778825250951315557865558643443244064361902243653517585491772912650759627537475187929799073482588432081", + "1219660173804105678519644769228717229961", + "-1219660173804105678519644769228717229961", + "9337788234986472797155798668633720432652335098955723216110827539222560791046580758896359512684081023719629520191135356937552064341414985563338865755044029781700472823138498290646709782655770432472849", + "-9337788234986472797155798668633720432652335098955723216110827539222560791046580758896359512684081023719629520191135356937552064341414985563338865755044029781700472823138498290646709782655770432472849", + "150424008592708034173259810113475930440810989335879628469427925370034758050373228994166602606657381400670968588175849346743433462784970176019171026242734", + "-150424008592708034173259810113475930440810989335879628469427925370034758050373228994166602606657381400670968588175849346743433462784970176019171026242734", + "10709102135708711290774115917568703434210917471089837954174155027939142290457621570052339242896415391737492196297186964273273691467020576606", + "-10709102135708711290774115917568703434210917471089837954174155027939142290457621570052339242896415391737492196297186964273273691467020576606", + "590791035282122817187786741012881114662078084344037620155645055415644697693432897703240908766855757699902350106663298", + "-590791035282122817187786741012881114662078084344037620155645055415644697693432897703240908766855757699902350106663298", + "6644806769073273664533505828539666955754832084759883392732355768142191452695685189350231701935219212931529500767858294148963537439795792593286239876735316935797953104882", + "-6644806769073273664533505828539666955754832084759883392732355768142191452695685189350231701935219212931529500767858294148963537439795792593286239876735316935797953104882", + "176511387805688073718855394072841750443509085589889404547084544683339270522709736525152936011885659232618530216217042113370236595468110548243408426032715706575057369503893468170961068580632412998988853143083945510800966719", + "-176511387805688073718855394072841750443509085589889404547084544683339270522709736525152936011885659232618530216217042113370236595468110548243408426032715706575057369503893468170961068580632412998988853143083945510800966719", + "18197814169943971748763655537459580789924675680558018542859068281859940671016292870607058355", + "-18197814169943971748763655537459580789924675680558018542859068281859940671016292870607058355", + "53665744969332986906645019910160121106654070883148709396576439910412784742262054480460348", + "-53665744969332986906645019910160121106654070883148709396576439910412784742262054480460348", + "15114701057818447666738431676226302502804615316350076959331191793491140183426763779197478527183420304400143976231566802442732838190730866504640269901006105030291550705062305121857555495397899088813125248050183715824996357342602508", + "-15114701057818447666738431676226302502804615316350076959331191793491140183426763779197478527183420304400143976231566802442732838190730866504640269901006105030291550705062305121857555495397899088813125248050183715824996357342602508", + "4538684087847049584760102928758931951663047136365690317969652570682351595540576228149035948547456528545997589204036236408244581413584178489307193893093917026883317801237483886776457347545442242", + "-4538684087847049584760102928758931951663047136365690317969652570682351595540576228149035948547456528545997589204036236408244581413584178489307193893093917026883317801237483886776457347545442242", + "68104327977018907402564677909296985240865850899633815987571", + "-68104327977018907402564677909296985240865850899633815987571", + "21126389218307474702937983111939394337442364463717300558898463056361786715220551813192286109604739592089468027639535160949266165405455186969313451687709111127347596851523580180558147019220445717949314588542773729044755127625855190216933115799293871340", + "-21126389218307474702937983111939394337442364463717300558898463056361786715220551813192286109604739592089468027639535160949266165405455186969313451687709111127347596851523580180558147019220445717949314588542773729044755127625855190216933115799293871340", + "78222020599461507025837080263377239508386033815939450849751163859949403589369059725826445373571398499131861482443466775202688633343807807754044978711136865112845737811903231211872791854642958065042325855161499335", + "-78222020599461507025837080263377239508386033815939450849751163859949403589369059725826445373571398499131861482443466775202688633343807807754044978711136865112845737811903231211872791854642958065042325855161499335", + "4085759411276713693098232266986821269735231020974977020052575836176404619187789208196423060444205", + "-4085759411276713693098232266986821269735231020974977020052575836176404619187789208196423060444205", + "1184210350766462097978915832676647869625660103053116596342", + "-1184210350766462097978915832676647869625660103053116596342", + "194539222104802835983292205414714434524058762756885327380706701321718655745439492716048166059927935241719149428879885478", + "-194539222104802835983292205414714434524058762756885327380706701321718655745439492716048166059927935241719149428879885478", + "302225946492334746161844140625842416406247812604200025274581247745184222647724964120371508273766497009905662425211", + "-302225946492334746161844140625842416406247812604200025274581247745184222647724964120371508273766497009905662425211", + "28866482602752218187265274692665814018194886187165103251546083935605515506785082873738653268219928502362268", + "-28866482602752218187265274692665814018194886187165103251546083935605515506785082873738653268219928502362268", + "5544952079050015240077157700940320243659550435014574041421348665396935579816611507888574593385073797911479160663545693602347256422370826097076074812916781822541849687962368590784552937977886205", + "-5544952079050015240077157700940320243659550435014574041421348665396935579816611507888574593385073797911479160663545693602347256422370826097076074812916781822541849687962368590784552937977886205", + "323710452268087591982845307319501376132372316351918100708894690678941776259635618528227710164786257540427054071430282571860354523279847215012107332817795823639212909924515178824923234673149086462596636590350327539723310798213754665082582892561015344012", + "-323710452268087591982845307319501376132372316351918100708894690678941776259635618528227710164786257540427054071430282571860354523279847215012107332817795823639212909924515178824923234673149086462596636590350327539723310798213754665082582892561015344012", + "6298178214804809482382903740893261997309254126083786539013344521457218202089579665480198608566443109151164759409311083172285986019510870966646266562147239668466233708302275847273212515270194723859620577435475775917236877537636439092304144350", + "-6298178214804809482382903740893261997309254126083786539013344521457218202089579665480198608566443109151164759409311083172285986019510870966646266562147239668466233708302275847273212515270194723859620577435475775917236877537636439092304144350", + "577024710470352032965427500450059067959437337861971906117178872729996600387523062943239129117535935908310731558466601208272240830153365070900204066680943610473920336450708951789975218349225167580113063050191", + "-577024710470352032965427500450059067959437337861971906117178872729996600387523062943239129117535935908310731558466601208272240830153365070900204066680943610473920336450708951789975218349225167580113063050191", + "37972747755906620986262153", + "-37972747755906620986262153", + "183829698115229455555876942979003514516640128880295179243921716692283845612914437405435307612733660894727800824835948", + "-183829698115229455555876942979003514516640128880295179243921716692283845612914437405435307612733660894727800824835948", + "2423832959667360118257064702737609023425800632192836723430775336591100757144072935869557583342500327350488117394557246526227000890820814931134670064874494870718496008517213657614840456624436847012780602721278103167235601948187645617975091973272873241569047573971620372584048698612150640", + "-2423832959667360118257064702737609023425800632192836723430775336591100757144072935869557583342500327350488117394557246526227000890820814931134670064874494870718496008517213657614840456624436847012780602721278103167235601948187645617975091973272873241569047573971620372584048698612150640", + "3689827013849535585619411952203826247332426367647260820678883970327796902123440577075450728217270007491470250603087878349241859733492652613679", + "-3689827013849535585619411952203826247332426367647260820678883970327796902123440577075450728217270007491470250603087878349241859733492652613679", + "38998054937697595881540875647042048333681659113425435564641134367164935592905762620334835531916327661633470289669510511757807865630506235328273222918421117111281556873070254844441312814372799410820410797988722601761642743512387994633124078", + "-38998054937697595881540875647042048333681659113425435564641134367164935592905762620334835531916327661633470289669510511757807865630506235328273222918421117111281556873070254844441312814372799410820410797988722601761642743512387994633124078", + "1742133972499057105001733325633478018605566678002165515479191311988758932166961086848659714709", + "-1742133972499057105001733325633478018605566678002165515479191311988758932166961086848659714709", + "2553559760939673132290078919768155422943752579897989356503182382672252331377594911957598202962666902881961594758670198463065653145968650999812730247666", + "-2553559760939673132290078919768155422943752579897989356503182382672252331377594911957598202962666902881961594758670198463065653145968650999812730247666", + "51684745772714675394936241781816223514919452679364520537119434050698905337439734233644472369565180889405426257288782419010082579894095799847229362421193687113981266355014802762308095739808334529392234853485537967988890313769779739241401223407407962126345943032536670110549434751102", + "-51684745772714675394936241781816223514919452679364520537119434050698905337439734233644472369565180889405426257288782419010082579894095799847229362421193687113981266355014802762308095739808334529392234853485537967988890313769779739241401223407407962126345943032536670110549434751102", + "672712112462360351910518120594120040601436948606148058222300198559244738922266341042360305651450642724475561271288385956130680220169715", + "-672712112462360351910518120594120040601436948606148058222300198559244738922266341042360305651450642724475561271288385956130680220169715", + "813447070819324251037079581265526580292907576372477729204338404955584410222478934593619630935314222063003252993694281837026881675600656782635846343833", + "-813447070819324251037079581265526580292907576372477729204338404955584410222478934593619630935314222063003252993694281837026881675600656782635846343833", + "1117610225194419065337568894513493776564803226432743080986022521406296090276409739149656072953983798754546991402130235309864912523411568994", + "-1117610225194419065337568894513493776564803226432743080986022521406296090276409739149656072953983798754546991402130235309864912523411568994", + "54306983641232120685850754812687679873466315381427348676538013927626387380179070467333206768501131364932160162454016646002006230714059820560113529334910854401021111543333022008153795820172235468858146103351502311717114025204496145038", + "-54306983641232120685850754812687679873466315381427348676538013927626387380179070467333206768501131364932160162454016646002006230714059820560113529334910854401021111543333022008153795820172235468858146103351502311717114025204496145038", + "113450443712297816016750119935548807386514765087946158026225637996838314569438356054721778395168", + "-113450443712297816016750119935548807386514765087946158026225637996838314569438356054721778395168", + "7352437924947754601546368441398130", + "-7352437924947754601546368441398130", + "9846278286558101102640461230277730613939270868227307780570935600269093778822376992893008780014141741647103776048800092788896154696011762350215865588521108549", + "-9846278286558101102640461230277730613939270868227307780570935600269093778822376992893008780014141741647103776048800092788896154696011762350215865588521108549", + "73473583275712621559167315389071668112406649781987949641633299346855217310106910560443921944813054763213555679810164708505", + "-73473583275712621559167315389071668112406649781987949641633299346855217310106910560443921944813054763213555679810164708505", + "44337393529749818041445106472308772039346354808448275796454672077580119659002042203928900642842510640740800196651911559238276834896411685658708100385336014325", + "-44337393529749818041445106472308772039346354808448275796454672077580119659002042203928900642842510640740800196651911559238276834896411685658708100385336014325", + "3029057656526271554842230678161240050706458471766453329711413581607557927250588221517218424325311508555983065479955684772259815134067055583713776773155106422220131994155338255582516687249210697344355756374535219768311432253647445765860280496088041768667890441415297183", + "-3029057656526271554842230678161240050706458471766453329711413581607557927250588221517218424325311508555983065479955684772259815134067055583713776773155106422220131994155338255582516687249210697344355756374535219768311432253647445765860280496088041768667890441415297183", + "730896103566527607730753327836819245922931354292181064204035921357800084090450560460429017252539616543803713640582458341962589048267291080308369681271304618861351862971290465709198912575367354463123427808437784040240907793877567792057788579265909741136", + "-730896103566527607730753327836819245922931354292181064204035921357800084090450560460429017252539616543803713640582458341962589048267291080308369681271304618861351862971290465709198912575367354463123427808437784040240907793877567792057788579265909741136", + "875972480821342956908137350797672986141068914679963791517259506036957992167704898826150763674879737404204136150", + "-875972480821342956908137350797672986141068914679963791517259506036957992167704898826150763674879737404204136150", + "80978095866121182143792129768500985270760294511412625411940522384234727394805988434574920055266468176140927390504528795674710202014688877516082928870193399763361133821060656660414289111945500870045554749239179606901392281466574470956468260058934", + "-80978095866121182143792129768500985270760294511412625411940522384234727394805988434574920055266468176140927390504528795674710202014688877516082928870193399763361133821060656660414289111945500870045554749239179606901392281466574470956468260058934", + "5108366192611283244622529332098588886037670912044545212175942213533408183226647011059305581499429284848730575416013640342256910485443191764062474694987448384264155646101960915742145430768592056025304400156363995432483639209748602875976799644331086294285921358845745557709942066403846", + "-5108366192611283244622529332098588886037670912044545212175942213533408183226647011059305581499429284848730575416013640342256910485443191764062474694987448384264155646101960915742145430768592056025304400156363995432483639209748602875976799644331086294285921358845745557709942066403846", + "6930180124964356147220207591422279016208371685360099598238746492283122379172191493127595009844321810224523734815981086376030176488602168657385920504832784693281301596520980175713179280297526196841775", + "-6930180124964356147220207591422279016208371685360099598238746492283122379172191493127595009844321810224523734815981086376030176488602168657385920504832784693281301596520980175713179280297526196841775", + "127195984139760103169058839514903174746000769823723851981181127452175305070890259297605399965306923149188386831728624922603033165495625460062407066507409867399121450024", + "-127195984139760103169058839514903174746000769823723851981181127452175305070890259297605399965306923149188386831728624922603033165495625460062407066507409867399121450024", + "766856719860424381068595879781443086540018712198126893034614346925577170838696737465130140374926102571846639744916246", + "-766856719860424381068595879781443086540018712198126893034614346925577170838696737465130140374926102571846639744916246", + "24452524790653436824651691432192056396622748", + "-24452524790653436824651691432192056396622748", + "21600696784921267417096322615448095147085787610512586576154030214298480866233496998058741115961394009177458631301020467184235259516317585587331608708009650567889604390408691257559911506849475326601795863368339333809604283115447728657967640020590611529", + "-21600696784921267417096322615448095147085787610512586576154030214298480866233496998058741115961394009177458631301020467184235259516317585587331608708009650567889604390408691257559911506849475326601795863368339333809604283115447728657967640020590611529", + "3758893374497950117544956548495424355416942972081749559738750", + "-3758893374497950117544956548495424355416942972081749559738750", + "139402452879531227967305026093373374931960661729048047992046850704933112027363474989587334281949398194424695097699435389253833391313981068405251271500306551642365788", + "-139402452879531227967305026093373374931960661729048047992046850704933112027363474989587334281949398194424695097699435389253833391313981068405251271500306551642365788", + "25612506870374484873779089622294846964717659760278221279975070009760319283018786412097109135597197982352674303356191527475964885419517878154272980015867348900662204209918494643594136945278141027429152743583659050244679551461363259179124592558207169009059175419818764353589040423929215554316106", + "-25612506870374484873779089622294846964717659760278221279975070009760319283018786412097109135597197982352674303356191527475964885419517878154272980015867348900662204209918494643594136945278141027429152743583659050244679551461363259179124592558207169009059175419818764353589040423929215554316106", + "2947281537862409310348470927599528845929360328199550369835553099926787046871370053629653311891644595607839493", + "-2947281537862409310348470927599528845929360328199550369835553099926787046871370053629653311891644595607839493", + "5238370098473928109261593022401423141534005322972191017431019829640519389374820628584873426299810704519554264840639788753962805520465217577654353515132848032321812308255870691241084866912560646162061587045231920247690379479011365117594385434098375615768143923448693726900625714250700557084631365841487720", + "-5238370098473928109261593022401423141534005322972191017431019829640519389374820628584873426299810704519554264840639788753962805520465217577654353515132848032321812308255870691241084866912560646162061587045231920247690379479011365117594385434098375615768143923448693726900625714250700557084631365841487720", + "12442661493742591574470274906943075194519541250480406451734421223577085372382129292566795701869646895013888531785728273885219518563236237522720693500170071741905622101669444727271767185013757679737024246566421692125582577245793910930758790508707497799356723763185459314157218014300646936606", + "-12442661493742591574470274906943075194519541250480406451734421223577085372382129292566795701869646895013888531785728273885219518563236237522720693500170071741905622101669444727271767185013757679737024246566421692125582577245793910930758790508707497799356723763185459314157218014300646936606", + "196768397706108832434401218046908395079672619951322343962935515221968814879", + "-196768397706108832434401218046908395079672619951322343962935515221968814879", + "105448359738523054755775683879539460376932545724741416465977687344195271654833613392218097960778272870252224864512166575087075095234145517359783987574090392012176562600550144885565709822164722304408771214923078090216303447672907406306494260347265557611811281654313383497", + "-105448359738523054755775683879539460376932545724741416465977687344195271654833613392218097960778272870252224864512166575087075095234145517359783987574090392012176562600550144885565709822164722304408771214923078090216303447672907406306494260347265557611811281654313383497", + "427047", + "-427047", + "81856543863229949865307411717645038275510945758537814749232160844289351485471852172626662270166132792505150910334705532703104971400349296170150117058939300885252778996956", + "-81856543863229949865307411717645038275510945758537814749232160844289351485471852172626662270166132792505150910334705532703104971400349296170150117058939300885252778996956", + "1157793815124456718861516590400363995161915570086903147642852686851669744820819994596924330213342515606147016987948857909", + "-1157793815124456718861516590400363995161915570086903147642852686851669744820819994596924330213342515606147016987948857909", + "940896637988538567397975357071445094467989790092928263312671948706628805236843480432542018263224679720038185333011214261501267693681777878339707753984890375587248023646920869739576148750778030", + "-940896637988538567397975357071445094467989790092928263312671948706628805236843480432542018263224679720038185333011214261501267693681777878339707753984890375587248023646920869739576148750778030", + "1277092697774915455425325818506548913089778045288703511320462361515661192684081707471069783269077123507880082821996357021946680618631451261991566032521034200533398597806696743013088727321199529921154950435385831032453193119895011784079743410", + "-1277092697774915455425325818506548913089778045288703511320462361515661192684081707471069783269077123507880082821996357021946680618631451261991566032521034200533398597806696743013088727321199529921154950435385831032453193119895011784079743410", + "12484594365439504824667126116411560379532608011162188261784732952579595718551939216912931261112627180909253846258363935011877417495984302385508560070358584377699655038250487243650598", + "-12484594365439504824667126116411560379532608011162188261784732952579595718551939216912931261112627180909253846258363935011877417495984302385508560070358584377699655038250487243650598", + "1741383885783666349682975645698617932237500743715841391107227784204719855585223522172382200426887024717924383874873388819696857115564677905327552504", + "-1741383885783666349682975645698617932237500743715841391107227784204719855585223522172382200426887024717924383874873388819696857115564677905327552504", + "9368096919796958094889245340222417626105947858557433047800723019", + "-9368096919796958094889245340222417626105947858557433047800723019", + "76669478098694609561491577319843969528266563067895013521486786451595735010640930020326448743208375914951894083260394091483935932234283855098968632145970697415601093343", + "-76669478098694609561491577319843969528266563067895013521486786451595735010640930020326448743208375914951894083260394091483935932234283855098968632145970697415601093343", + "1876639712516985144893922794716264029310990922149953750634405350881578456885688177463809312620", + "-1876639712516985144893922794716264029310990922149953750634405350881578456885688177463809312620", + "186077", + "-186077", + "24038469015057796648084289920894727399732658423825146209930020877671076098132117966877846149087015358546337692428012385515366055633105998821389203", + "-24038469015057796648084289920894727399732658423825146209930020877671076098132117966877846149087015358546337692428012385515366055633105998821389203", + "20641259550745643346234485579665129143463532482322387615585139677830682894079763990366000612134891527828252798370386444670430513385825695220928137556290078834398139256712344468615779923734232143070994661634892049806652900001420233970754048793898042171067992448201191787158435561", + "-20641259550745643346234485579665129143463532482322387615585139677830682894079763990366000612134891527828252798370386444670430513385825695220928137556290078834398139256712344468615779923734232143070994661634892049806652900001420233970754048793898042171067992448201191787158435561", + "90558282393161622936261650596857143828421884875124973816361813844395166", + "-90558282393161622936261650596857143828421884875124973816361813844395166", + "893374152282726891992085958120127485743572202276100990922171", + "-893374152282726891992085958120127485743572202276100990922171", + "104601387324033669002784175389856736439866138446091862232274237956270168921868535320405566731385430625654533746364405250312870593863224985439702639684142355791792905233795969344981850689932028254291726954427057743196839190399880526778270712454970430735459654847", + "-104601387324033669002784175389856736439866138446091862232274237956270168921868535320405566731385430625654533746364405250312870593863224985439702639684142355791792905233795969344981850689932028254291726954427057743196839190399880526778270712454970430735459654847", + "1100640547822452822259608780637373041065326977053681954192776181527618577050122442455730624660403304296015412329954372289398853654524721225006003581004995451247487399511260858844108588935136691954558538445962684147337611140312567681054887671734241832035049841922672004195071", + "-1100640547822452822259608780637373041065326977053681954192776181527618577050122442455730624660403304296015412329954372289398853654524721225006003581004995451247487399511260858844108588935136691954558538445962684147337611140312567681054887671734241832035049841922672004195071", + "2967167885422023119778255262377939967247041745814218496240360", + "-2967167885422023119778255262377939967247041745814218496240360", + "2766027933722171046554231292404911532459570636916540872038932307272865118512724883948205112046666709093487559219830075352753072061667201", + "-2766027933722171046554231292404911532459570636916540872038932307272865118512724883948205112046666709093487559219830075352753072061667201", + "1003655344057107767912014692725976261732681876044961311820943946784371", + "-1003655344057107767912014692725976261732681876044961311820943946784371", + "21900502732037517315370094764239443613058564433", + "-21900502732037517315370094764239443613058564433", + "45583003657081227658306304711498324162428223935090104", + "-45583003657081227658306304711498324162428223935090104", + "204245432840569041148483982796093177932369679988233999329901019356075995960", + "-204245432840569041148483982796093177932369679988233999329901019356075995960", + "54884247902140437035368361407902527545416356458607442580170745253262030", + "-54884247902140437035368361407902527545416356458607442580170745253262030", + "5334518155628744158007803052398794311169463840470474113725097881874982744596886959948255678621385420985539108742608260405936297075345765000664456806209794363451383928857878909914356480954702762980348813177584480927161733854397043441077512115118243", + "-5334518155628744158007803052398794311169463840470474113725097881874982744596886959948255678621385420985539108742608260405936297075345765000664456806209794363451383928857878909914356480954702762980348813177584480927161733854397043441077512115118243", + "586483295964769639990961973863221490702912450472376751506581704396550840803536849728609056194074161983174132325139036388003751640146943", + "-586483295964769639990961973863221490702912450472376751506581704396550840803536849728609056194074161983174132325139036388003751640146943", + "5160489070412055213478248749143153314027313193274772183541029614946527505345515388990899156035333461408310459047357741425430914259324755065994103", + "-5160489070412055213478248749143153314027313193274772183541029614946527505345515388990899156035333461408310459047357741425430914259324755065994103", + "2027629455583867858236950998133711110883394281732352207813586603417947074456218393483520509566027", + "-2027629455583867858236950998133711110883394281732352207813586603417947074456218393483520509566027", + "5188557124098846103707325218", + "-5188557124098846103707325218", + "400020709349724273938863924454731823809936035083490166372176005731818513778095755824243823423942457408986667759613017098976884623086030827980554523509430858361367786615095252152639811158705182507617454882805400018345969632806081496172562211701111188286396198492796040003060705842273291", + "-400020709349724273938863924454731823809936035083490166372176005731818513778095755824243823423942457408986667759613017098976884623086030827980554523509430858361367786615095252152639811158705182507617454882805400018345969632806081496172562211701111188286396198492796040003060705842273291", + "5077741618469045793277646564358992920960476333244601450034145830501181786188670069707891777075377020328052369395749044352605314330803964782636667529924732654192256597972743806214879074858492363595605", + "-5077741618469045793277646564358992920960476333244601450034145830501181786188670069707891777075377020328052369395749044352605314330803964782636667529924732654192256597972743806214879074858492363595605", + "7696189909584112429236607890412659528293987626026266720440261172438548134466224807156242301070086176781584925647653568383958946454001", + "-7696189909584112429236607890412659528293987626026266720440261172438548134466224807156242301070086176781584925647653568383958946454001", + "417308020029030078568441933098093721107857721939799845259428192907357371830765301672126412079562811182564973992528737210195074535804805307396531464692210817793443042424312992541689337630019211372", + "-417308020029030078568441933098093721107857721939799845259428192907357371830765301672126412079562811182564973992528737210195074535804805307396531464692210817793443042424312992541689337630019211372", + "1322555438304138854190608504305314090997872332525802468309", + "-1322555438304138854190608504305314090997872332525802468309", + "2243252463390097730206022598597097545362441865345445435367208364900608574068701725911900977005694987837525981666534993121316833074810732688679185645071871012387337549509711648733018", + "-2243252463390097730206022598597097545362441865345445435367208364900608574068701725911900977005694987837525981666534993121316833074810732688679185645071871012387337549509711648733018", + "996999631246356886686476319402220462702895536107891846414650166937411337235327374798687258137003461594493394303654723633588050290355700009203863700819430055925538137094125943576776423062708423296431824562515335853105906638174471031706521164070138118239692600817313403027773040755", + "-996999631246356886686476319402220462702895536107891846414650166937411337235327374798687258137003461594493394303654723633588050290355700009203863700819430055925538137094125943576776423062708423296431824562515335853105906638174471031706521164070138118239692600817313403027773040755", + "7407232727584141857860413969133193973271286288996885370643743601041844697247425570485073230177615935516189249509933008589795827697527731537095440446937896691012576063103682886965547257404970422133160836803032660735755375228", + "-7407232727584141857860413969133193973271286288996885370643743601041844697247425570485073230177615935516189249509933008589795827697527731537095440446937896691012576063103682886965547257404970422133160836803032660735755375228", + "66507856432274251794176455954413617080912111625650403908424515766595169565610373272262880697471290673940957493067336542878127434500093321175322023848113318710961186458831481208336221616883931621941707175292010516439902743884847403671155360181449053131615233540637713255704186616742945621336873834200241", + "-66507856432274251794176455954413617080912111625650403908424515766595169565610373272262880697471290673940957493067336542878127434500093321175322023848113318710961186458831481208336221616883931621941707175292010516439902743884847403671155360181449053131615233540637713255704186616742945621336873834200241", + "31961863828553380988033812855214593359459211110640445946699728653449149746905536006308298520671497324063634041", + "-31961863828553380988033812855214593359459211110640445946699728653449149746905536006308298520671497324063634041", + "119618377523937755424839832529346904290447125277702998330825686745624714380165535983701718800753406524499580430492483313401840673306022", + "-119618377523937755424839832529346904290447125277702998330825686745624714380165535983701718800753406524499580430492483313401840673306022", + "405681915481957710524110670648088015005969944212725894176433228902381563426021784100141533714164168640878972504794623170560976727288628780986689105062652396339731589340681696758070055865849332874664598654305386", + "-405681915481957710524110670648088015005969944212725894176433228902381563426021784100141533714164168640878972504794623170560976727288628780986689105062652396339731589340681696758070055865849332874664598654305386", + "80071205989351736846133464673563483", + "-80071205989351736846133464673563483", + "9700773864531435625616214899914065324460851600463291968860331922457988802290698665249481817160070262860115617949877440060186269123630022169856579023685715276196199558700467573542360702057439871151548632003937134635666", + "-9700773864531435625616214899914065324460851600463291968860331922457988802290698665249481817160070262860115617949877440060186269123630022169856579023685715276196199558700467573542360702057439871151548632003937134635666", + "64944106993602113652248278796057650905995695388886180354923002182559697540323513", + "-64944106993602113652248278796057650905995695388886180354923002182559697540323513", + "37929576313535611121803978435959309812321783154717", + "-37929576313535611121803978435959309812321783154717", + "1201000338412478811264460901269015663629403940922465995711563366282532392888117164309460791962587700786925689531323402454933712", + "-1201000338412478811264460901269015663629403940922465995711563366282532392888117164309460791962587700786925689531323402454933712", + "470447114867440006531646544662395180489380", + "-470447114867440006531646544662395180489380", + "1886414975033222890759454788368278722523410826550821944244006726465034055937087351501071112805393425149681091697659539390880213755450593178650888546158680682861726300055346238147353584", + "-1886414975033222890759454788368278722523410826550821944244006726465034055937087351501071112805393425149681091697659539390880213755450593178650888546158680682861726300055346238147353584", + "4664892726074011412424061191534682518434402852534244066439859284421669515547644494221267860310050082413903960265959420616932209365599069348", + "-4664892726074011412424061191534682518434402852534244066439859284421669515547644494221267860310050082413903960265959420616932209365599069348", + "28780798756024002725983431800204693077146606485161761312577563898465001036018344", + "-28780798756024002725983431800204693077146606485161761312577563898465001036018344", + "32330329650876", + "-32330329650876", + "2119979291121167235646126537631495326938621591198105160016067466298282031395514388037592761773940160529230271536093864046314956321286102399202685013097514391108059946817681956440747156573", + "-2119979291121167235646126537631495326938621591198105160016067466298282031395514388037592761773940160529230271536093864046314956321286102399202685013097514391108059946817681956440747156573", + "263699852555513851494126759556555000194041870735492675256368970869569739794241286439438865360257448383332427174288750874993061959293095843277366404592822430413842608440069138162513296663098194916628650623285377787520407274835441660863529425698257", + "-263699852555513851494126759556555000194041870735492675256368970869569739794241286439438865360257448383332427174288750874993061959293095843277366404592822430413842608440069138162513296663098194916628650623285377787520407274835441660863529425698257", + "1128694221447083514833565943172494061961392351570236661606778701297263608082693757967704225149730415407045688293665284383612835316877341572601586213504558102647155013466806252198360829785603030320627697854353131933390896", + "-1128694221447083514833565943172494061961392351570236661606778701297263608082693757967704225149730415407045688293665284383612835316877341572601586213504558102647155013466806252198360829785603030320627697854353131933390896", + "6916983731776108089130775823204431120044571113273264", + "-6916983731776108089130775823204431120044571113273264", + "75914457793044064895413508037682032379902701971013411488690441608545", + "-75914457793044064895413508037682032379902701971013411488690441608545", + "8879499247714081140479921556021160510154213025912153490299817518668111141293995912780879974244590421191162074944570118497100570991099380592606670090324723096261264086252974733149488230484359814997329229447712203652808121303397231512080257394400660537777330", + "-8879499247714081140479921556021160510154213025912153490299817518668111141293995912780879974244590421191162074944570118497100570991099380592606670090324723096261264086252974733149488230484359814997329229447712203652808121303397231512080257394400660537777330", + "1724506383335075569722951957439066815", + "-1724506383335075569722951957439066815", + "1194371342067583821224146035467746385145120448082902327311395191487125759843115454058224224089457130", + "-1194371342067583821224146035467746385145120448082902327311395191487125759843115454058224224089457130", + "116571209611185337284731713897921002952811284109399364843701582086430272601727355870457693093", + "-116571209611185337284731713897921002952811284109399364843701582086430272601727355870457693093", + "26168929789567416417896877953711683735315284288420053745760833960409035809279614614583672230970848586995471196762264833662013726559369765619103011658619869727814614782931489481458661981043479676591818357", + "-26168929789567416417896877953711683735315284288420053745760833960409035809279614614583672230970848586995471196762264833662013726559369765619103011658619869727814614782931489481458661981043479676591818357", + "243012047985288247713378637185988647187985010392388570351653505841125573018162558460717652828862937", + "-243012047985288247713378637185988647187985010392388570351653505841125573018162558460717652828862937", + "10664054546419657059895154308389295209775305216580625182685797954089483388356503442301133821162999463846286618424679215827037042324", + "-10664054546419657059895154308389295209775305216580625182685797954089483388356503442301133821162999463846286618424679215827037042324", + "93382430984727342024648229617198660330774557968214720265565362040755873830899272200516094884487181897372100083086702655979998495443", + "-93382430984727342024648229617198660330774557968214720265565362040755873830899272200516094884487181897372100083086702655979998495443", + "13126062810625043063456380164790384012915764511630796458248365510538114092330596186281347044586364215270683612292866613952971844005196715563009674494624957852022027173471052976928718844001264455268592601375542242160924315548654836823549859553", + "-13126062810625043063456380164790384012915764511630796458248365510538114092330596186281347044586364215270683612292866613952971844005196715563009674494624957852022027173471052976928718844001264455268592601375542242160924315548654836823549859553", + "9368582362765814557187196024001227849888168077472266659772600971697428366492708926906258905590833059706396684592884687526358204703256054330603971127944678906", + "-9368582362765814557187196024001227849888168077472266659772600971697428366492708926906258905590833059706396684592884687526358204703256054330603971127944678906", + "278701771665221100457912961846034172", + "-278701771665221100457912961846034172", + "382464310254920012603200760", + "-382464310254920012603200760", + "1086701652931645659413181704075891369501487115000150234704055924790606399915277424771761502385407750848874457084738431566772206432850777390818546802908541311070886519070558468667864533850452989704316665227997074954119733405730362633188789872620053510199052652185571293239445061650299573526583634686290646340", + "-1086701652931645659413181704075891369501487115000150234704055924790606399915277424771761502385407750848874457084738431566772206432850777390818546802908541311070886519070558468667864533850452989704316665227997074954119733405730362633188789872620053510199052652185571293239445061650299573526583634686290646340", + "1436027919103852779047018224513001412434295916624702899496423156978055321701822379", + "-1436027919103852779047018224513001412434295916624702899496423156978055321701822379", + "358956740433261819154697401028765647885314537021358004573", + "-358956740433261819154697401028765647885314537021358004573", + "2570919810686260443090976956907911580117431201667893432876299852175711324820817103455438469322058313607578962386364736310503021461418759938196980029731001153192509640082331671491566785848363799371983266719541295357316341488191889371987260280114237", + "-2570919810686260443090976956907911580117431201667893432876299852175711324820817103455438469322058313607578962386364736310503021461418759938196980029731001153192509640082331671491566785848363799371983266719541295357316341488191889371987260280114237", + "25162923422743354542149586612896418135445747897968173426132346622460254031452425686287824478617146278670264713886155228992283141903843330748647605337845897726364270262270221388553425764365596646869122752625837519793121116201637138123589", + "-25162923422743354542149586612896418135445747897968173426132346622460254031452425686287824478617146278670264713886155228992283141903843330748647605337845897726364270262270221388553425764365596646869122752625837519793121116201637138123589", + "4278027626", + "-4278027626", + "13701895078474585475247137503379489809369496012756504256009512583880126487325483060", + "-13701895078474585475247137503379489809369496012756504256009512583880126487325483060", + "840786904525379769789300537711189060152537247097220818494507832789559514433741881148404020369408737305833463880040532404710981950433015449671738772090021173041178316879389133142755654332186395733035047829330146580877246938698632854141466195209370012956133251007728880713807067719044277", + "-840786904525379769789300537711189060152537247097220818494507832789559514433741881148404020369408737305833463880040532404710981950433015449671738772090021173041178316879389133142755654332186395733035047829330146580877246938698632854141466195209370012956133251007728880713807067719044277", + "3276292788321967735809171244238550320799741743618059640716169790896705284371", + "-3276292788321967735809171244238550320799741743618059640716169790896705284371", + "1444750318330952168038880813831551223482419869563017466378766743222046493652050967605113492030925684948366811229446235163057029451862026449099533578455062305802501669339640305034074716552601620379378463996993533643594750826540", + "-1444750318330952168038880813831551223482419869563017466378766743222046493652050967605113492030925684948366811229446235163057029451862026449099533578455062305802501669339640305034074716552601620379378463996993533643594750826540", + "24086541858702055427502392901637", + "-24086541858702055427502392901637", + "4330081338691920762224608526717824389301173480290111106078901689480766861452007892469366598230052182293662205113692558414456231710116801557663552676919", + "-4330081338691920762224608526717824389301173480290111106078901689480766861452007892469366598230052182293662205113692558414456231710116801557663552676919", + "27418448940760548112970686808757044592831257648000991603843244426565505080207854209562533723933529598541150", + "-27418448940760548112970686808757044592831257648000991603843244426565505080207854209562533723933529598541150", + "4864349348505372641735591623253935562079434294533303015906939805788562228545435455999490952132421630107381486091394263343039603335970384360527032450993718152333512135859319365168", + "-4864349348505372641735591623253935562079434294533303015906939805788562228545435455999490952132421630107381486091394263343039603335970384360527032450993718152333512135859319365168", + "1626611771502100547320818336906281142864525046004643066115702536679123387159152005305066", + "-1626611771502100547320818336906281142864525046004643066115702536679123387159152005305066", + "14293419224795219525714860242008460020503397376158988250120766700936504062", + "-14293419224795219525714860242008460020503397376158988250120766700936504062", + "8260753138917023233566421292298962764237807151943318525543970544500632597376493524337437826032865212814429643010352970402898369401423576606526232369458199913160215970566401517084565439231237176671986172844275163759328663201716196906130863901168073596480102005930047541965611641872232312988889482629", + "-8260753138917023233566421292298962764237807151943318525543970544500632597376493524337437826032865212814429643010352970402898369401423576606526232369458199913160215970566401517084565439231237176671986172844275163759328663201716196906130863901168073596480102005930047541965611641872232312988889482629", + "5277758874516137277732773354886538661032533122667342258245153872341673598212237223809452902009488931372563068631458175710208259076234089320690", + "-5277758874516137277732773354886538661032533122667342258245153872341673598212237223809452902009488931372563068631458175710208259076234089320690", + "1604105217156493424796219158328988017738562338480346273566670218046", + "-1604105217156493424796219158328988017738562338480346273566670218046", + }; + + boost::filesystem::ifstream is(root / "cpp_int1024_serial64.txt"); + std::cout << "Testing cpp_int1024_serial64.txt with T=" << typeid(T).name() << std::endl; + //is.peek(); + BOOST_CHECK(is.good()); + boost::archive::text_iarchive ia(is); + for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i) + { +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + T val; + ia >> val; + BOOST_CHECK_EQUAL(val, T(text_array[i])); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + } +#endif + } + + boost::filesystem::ifstream is2(root / "cpp_int1024_serial32.txt"); + std::cout << "Testing cpp_int1024_serial32.txt with T=" << typeid(T).name() << std::endl; + //is2.peek(); + BOOST_CHECK(is2.good()); + boost::archive::text_iarchive ia2(is2); + for (unsigned i = 0; i < sizeof(text_array) / sizeof(text_array[0]); ++i) + { +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + T val; + ia2 >> val; + BOOST_CHECK_EQUAL(val, T(text_array[i])); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + } +#endif + } +} + +int main(int argc, char const* argv[]) +{ + if (argc == 2) + { + root = argv[1]; + std::cout << "Setting root directory to " << argv[1] << std::endl; + } + using namespace boost::multiprecision; + test64<cpp_int>(); + test64<number<cpp_int_backend<64, 64> > >(); + test128<cpp_int>(); + test128<number<cpp_int_backend<128, 128> > >(); + test1024<cpp_int>(); + test1024<number<cpp_int_backend<1024, 1024> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_int_import_export.cpp b/src/boost/libs/multiprecision/test/test_cpp_int_import_export.cpp new file mode 100644 index 00000000..ca59097d --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_int_import_export.cpp @@ -0,0 +1,170 @@ +// Copyright John Maddock 2015. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> + +#include <boost/algorithm/string/case_conv.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "test.hpp" +#include <iostream> +#include <iomanip> + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif +template <class T> +struct unchecked_type +{ + typedef T type; +}; + +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct unchecked_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::unchecked, Allocator>, ExpressionTemplates> type; +}; + +template <class T> +T generate_random() +{ + typedef typename unchecked_type<T>::type unchecked_T; + + static const unsigned limbs = std::numeric_limits<T>::is_specialized && std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits / std::numeric_limits<unsigned>::digits + 3 : 20; + + static boost::random::uniform_int_distribution<unsigned> ui(0, limbs); + static boost::random::mt19937 gen; + unchecked_T val = gen(); + unsigned lim = ui(gen); + for (unsigned i = 0; i < lim; ++i) + { + val *= (gen.max)(); + val += gen(); + } + return val; +} + +template <class T> +void test_round_trip_neg(T val, const boost::mpl::true_&) +{ + // Try some negative values: + std::vector<unsigned char> cv; + T newval; + val = -val; + export_bits(val, std::back_inserter(cv), 8, false); + import_bits(newval, cv.begin(), cv.end(), 8, false); + BOOST_CHECK_EQUAL(-val, newval); +} + +template <class T> +void test_round_trip_neg(const T&, const boost::mpl::false_&) +{ +} + +template <class T> +void test_round_trip(T val) +{ + std::vector<unsigned char> cv; + export_bits(val, std::back_inserter(cv), 8); + T newval; + import_bits(newval, cv.begin(), cv.end()); + BOOST_CHECK_EQUAL(val, newval); + // Should get the same value if we reverse the bytes: + std::reverse(cv.begin(), cv.end()); + newval = 0; + import_bits(newval, cv.begin(), cv.end(), 8, false); + BOOST_CHECK_EQUAL(val, newval); + // Also try importing via pointers as these may memcpy: + newval = 0; + import_bits(newval, &cv[0], &cv[0] + cv.size(), 8, false); + BOOST_CHECK_EQUAL(val, newval); + + cv.clear(); + export_bits(val, std::back_inserter(cv), 8, false); + import_bits(newval, cv.begin(), cv.end(), 8, false); + BOOST_CHECK_EQUAL(val, newval); + std::reverse(cv.begin(), cv.end()); + newval = 0; + import_bits(newval, cv.begin(), cv.end(), 8, true); + BOOST_CHECK_EQUAL(val, newval); + + std::vector<boost::uintmax_t> bv; + export_bits(val, std::back_inserter(bv), std::numeric_limits<boost::uintmax_t>::digits); + import_bits(newval, bv.begin(), bv.end()); + BOOST_CHECK_EQUAL(val, newval); + // Should get the same value if we reverse the values: + std::reverse(bv.begin(), bv.end()); + newval = 0; + import_bits(newval, bv.begin(), bv.end(), std::numeric_limits<boost::uintmax_t>::digits, false); + BOOST_CHECK_EQUAL(val, newval); + // Also try importing via pointers as these may memcpy: + newval = 0; + import_bits(newval, &bv[0], &bv[0] + bv.size(), std::numeric_limits<boost::uintmax_t>::digits, false); + BOOST_CHECK_EQUAL(val, newval); + + bv.clear(); + export_bits(val, std::back_inserter(bv), std::numeric_limits<boost::uintmax_t>::digits, false); + import_bits(newval, bv.begin(), bv.end(), std::numeric_limits<boost::uintmax_t>::digits, false); + BOOST_CHECK_EQUAL(val, newval); + // + // Try with an unconventional number of bits, to model some machine with guard bits: + // + bv.clear(); + export_bits(val, std::back_inserter(bv), std::numeric_limits<boost::uintmax_t>::digits - 3); + import_bits(newval, bv.begin(), bv.end(), std::numeric_limits<boost::uintmax_t>::digits - 3); + BOOST_CHECK_EQUAL(val, newval); + + bv.clear(); + export_bits(val, std::back_inserter(bv), std::numeric_limits<boost::uintmax_t>::digits - 3, false); + import_bits(newval, bv.begin(), bv.end(), std::numeric_limits<boost::uintmax_t>::digits - 3, false); + BOOST_CHECK_EQUAL(val, newval); + + cv.clear(); + export_bits(val, std::back_inserter(cv), 6); + import_bits(newval, cv.begin(), cv.end(), 6); + BOOST_CHECK_EQUAL(val, newval); + + cv.clear(); + export_bits(val, std::back_inserter(cv), 6, false); + import_bits(newval, cv.begin(), cv.end(), 6, false); + BOOST_CHECK_EQUAL(val, newval); + + test_round_trip_neg(val, boost::mpl::bool_<std::numeric_limits<T>::is_signed>()); +} + +template <class T> +void test_round_trip() +{ + std::cout << std::hex; + std::cerr << std::hex; + for (unsigned i = 0; i < 1000; ++i) + { + T val = generate_random<T>(); + test_round_trip(val); + } + // + // Bug cases. + // See https://github.com/boostorg/multiprecision/issues/21 + T bug(1); + bug << std::numeric_limits<T>::digits - 1; + --bug; + test_round_trip(bug); +} + +int main() +{ + test_round_trip<boost::multiprecision::cpp_int>(); + test_round_trip<boost::multiprecision::checked_int1024_t>(); + test_round_trip<boost::multiprecision::checked_uint512_t>(); + test_round_trip<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > >(); + test_round_trip<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<23, 23, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_int_left_shift.cpp b/src/boost/libs/multiprecision/test/test_cpp_int_left_shift.cpp new file mode 100644 index 00000000..3aca2e1d --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_int_left_shift.cpp @@ -0,0 +1,98 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare results of truncated left shift to gmp, see: +// https://svn.boost.org/trac/boost/ticket/12790 +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/gmp.hpp> +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/timer.hpp> +#include "test.hpp" + +#if !defined(TEST1) && !defined(TEST2) && !defined(TEST3) +#define TEST1 +#define TEST2 +#define TEST3 +#endif + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class T> +void test_value(const T& val) +{ + boost::multiprecision::mpz_int z(val.str()), mask(1); + mask <<= std::numeric_limits<T>::digits; + --mask; + + for (unsigned i = 0; i <= std::numeric_limits<T>::digits + 2; ++i) + { + BOOST_CHECK_EQUAL((val << i).str(), boost::multiprecision::mpz_int(((z << i) & mask)).str()); + } +} + +void test(const boost::mpl::int_<200>&) {} + +template <int N> +void test(boost::mpl::int_<N> const&) +{ + test(boost::mpl::int_<N + 4>()); + + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<N, N, boost::multiprecision::unsigned_magnitude>, boost::multiprecision::et_off> mp_type; + + std::cout << "Running tests for precision: " << N << std::endl; + + mp_type mp(-1); + test_value(mp); + + for (unsigned i = 0; i < 1000; ++i) + test_value(generate_random<mp_type>(std::numeric_limits<mp_type>::digits)); +} + +int main() +{ + test(boost::mpl::int_<24>()); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_int_lit.cpp b/src/boost/libs/multiprecision/test/test_cpp_int_lit.cpp new file mode 100644 index 00000000..75d77e35 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_int_lit.cpp @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2013 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include "test.hpp" + +#if !(BOOST_WORKAROUND(BOOST_MSVC, <= 1900) && defined(CI_SUPPRESS_KNOWN_ISSUES)) && defined(BOOST_MP_USER_DEFINED_LITERALS) + +using namespace boost::multiprecision; + +template <class T> +void test_literal(T val, const char* p) +{ + BOOST_CHECK_EQUAL(val, cpp_int(p)); +} + +#define TEST_LITERAL(x) \ + { \ + constexpr auto val1 = BOOST_JOIN(x, _cppi); \ + constexpr int1024_t val2 = BOOST_JOIN(x, _cppi1024); \ + constexpr auto val3 = BOOST_JOIN(x, _cppui); \ + constexpr uint1024_t val4 = BOOST_JOIN(x, _cppui1024); \ + test_literal(val1, BOOST_STRINGIZE(x)); \ + test_literal(val2, BOOST_STRINGIZE(x)); \ + test_literal(val3, BOOST_STRINGIZE(x)); \ + test_literal(val4, BOOST_STRINGIZE(x)); \ + /* Negative values: */ \ + constexpr auto val5 = -BOOST_JOIN(x, _cppi); \ + constexpr int1024_t val6 = -BOOST_JOIN(x, _cppi1024); \ + constexpr auto val7 = -val1; \ + constexpr int1024_t val8 = -val2; \ + BOOST_CHECK_EQUAL(val5, -cpp_int(val1)); \ + BOOST_CHECK_EQUAL(val6, -cpp_int(val1)); \ + BOOST_CHECK_EQUAL(val7, -cpp_int(val1)); \ + BOOST_CHECK_EQUAL(val8, -cpp_int(val1)); \ + } + +int main() +{ + using namespace boost::multiprecision::literals; + TEST_LITERAL(0x0); + TEST_LITERAL(0x00000); + TEST_LITERAL(0x10000000); + TEST_LITERAL(0x1234500000000123450000000123345000678000000456000000567000000fefabc00000000000000); + return boost::report_errors(); +} + +#else + +int main() { return 0; } + +#endif diff --git a/src/boost/libs/multiprecision/test/test_cpp_int_serial.cpp b/src/boost/libs/multiprecision/test/test_cpp_int_serial.cpp new file mode 100644 index 00000000..f38b9f31 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_int_serial.cpp @@ -0,0 +1,203 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/timer.hpp> +#include "test.hpp" + +#include <iostream> +#include <iomanip> +#include <sstream> +#include <boost/archive/text_iarchive.hpp> +#include <boost/archive/text_oarchive.hpp> +#include <boost/archive/binary_iarchive.hpp> +#include <boost/archive/xml_iarchive.hpp> +#include <boost/archive/binary_oarchive.hpp> +#include <boost/archive/xml_oarchive.hpp> +#include <boost/exception/all.hpp> + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class T> +void test_neg(const T& x, const boost::mpl::true_&) +{ + T val = -x; +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + std::stringstream ss; + boost::archive::text_oarchive oa(ss); + oa << static_cast<const T&>(val); + boost::archive::text_iarchive ia(ss); + T val2; + ia >> val2; + BOOST_CHECK_EQUAL(val, val2); + + ss.clear(); + boost::archive::binary_oarchive ob(ss); + ob << static_cast<const T&>(val); + boost::archive::binary_iarchive ib(ss); + ib >> val2; + BOOST_CHECK_EQUAL(val, val2); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + } +#endif +} +template <class T> +void test_neg(const T&, const boost::mpl::false_&) {} + +template <class T> +void test() +{ + using namespace boost::multiprecision; + + boost::random::mt19937 gen; + boost::uniform_int<> d(3, std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits : 3000); + boost::timer tim; + + while (true) + { + T val = generate_random<T>(d(gen)); +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + T val2; + { + std::stringstream ss; + boost::archive::text_oarchive oa(ss); + oa << static_cast<const T&>(val); + boost::archive::text_iarchive ia(ss); + ia >> val2; + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss; + boost::archive::binary_oarchive ob(ss); + ob << static_cast<const T&>(val); + boost::archive::binary_iarchive ib(ss); + ib >> val2; + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss; + { + boost::archive::xml_oarchive oc(ss); + oc << boost::serialization::make_nvp("value", static_cast<const T&>(val)); + } + boost::archive::xml_iarchive ic(ss); + ic >> boost::serialization::make_nvp("value", val2); + BOOST_CHECK_EQUAL(val, val2); + } + +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + } +#endif + test_neg(val, boost::mpl::bool_<std::numeric_limits<T>::is_signed>()); + // + // Check to see if test is taking too long. + // Tests run on the compiler farm time out after 300 seconds, + // so don't get too close to that: + // +#ifndef CI_SUPPRESS_KNOWN_ISSUES + if (tim.elapsed() > 150) +#else + if (tim.elapsed() > 25) +#endif + { + std::cout << "Timeout reached, aborting tests now....\n"; + break; + } + } +} + +#if !defined(TEST1) && !defined(TEST2) && !defined(TEST3) && !defined(TEST4) +#define TEST1 +#define TEST2 +#define TEST3 +#define TEST4 +#endif + +int main() +{ + using namespace boost::multiprecision; +#ifdef TEST1 + test<cpp_int>(); +#endif +#ifdef TEST2 + test<number<cpp_int_backend<61, 61, unsigned_magnitude, unchecked, void> > >(); +#endif +#ifdef TEST3 + test<number<cpp_int_backend<120, 120, signed_magnitude, unchecked, void> > >(); +#endif +#ifdef TEST4 + test<int1024_t>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_cpp_rat_serial.cpp b/src/boost/libs/multiprecision/test/test_cpp_rat_serial.cpp new file mode 100644 index 00000000..00f4c213 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_cpp_rat_serial.cpp @@ -0,0 +1,187 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/timer.hpp> +#include "test.hpp" + +#include <iostream> +#include <iomanip> +#include <sstream> +#include <boost/archive/text_iarchive.hpp> +#include <boost/archive/text_oarchive.hpp> +#include <boost/archive/binary_iarchive.hpp> +#include <boost/archive/binary_oarchive.hpp> +#include <boost/archive/xml_iarchive.hpp> +#include <boost/archive/xml_oarchive.hpp> +#include <boost/exception/all.hpp> + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + if (!val) + val = 1; + return val; +} + +template <class T> +void test_neg(const T& x, const boost::mpl::true_&) +{ + T val = -x; +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + T val2; + { + std::stringstream ss; + boost::archive::text_oarchive oa(ss); + oa << static_cast<const T&>(val); + boost::archive::text_iarchive ia(ss); + ia >> val2; + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss; + boost::archive::binary_oarchive ob(ss); + ob << static_cast<const T&>(val); + boost::archive::binary_iarchive ib(ss); + ib >> val2; + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss; + { + boost::archive::xml_oarchive ob(ss); + ob << boost::serialization::make_nvp("value", static_cast<const T&>(val)); + } + boost::archive::xml_iarchive ib(ss); + ib >> boost::serialization::make_nvp("value", val2); + BOOST_CHECK_EQUAL(val, val2); + } +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + } +#endif +} +template <class T> +void test_neg(const T&, const boost::mpl::false_&) {} + +template <class T> +void test() +{ + using namespace boost::multiprecision; + + boost::random::mt19937 gen; + boost::uniform_int<> d(3, std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits : 3000); + boost::timer tim; + + while (true) + { + T val(generate_random<typename component_type<T>::type>(d(gen)), generate_random<typename component_type<T>::type>(d(gen))); +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + std::stringstream ss; + boost::archive::text_oarchive oa(ss); + oa << static_cast<const T&>(val); + boost::archive::text_iarchive ia(ss); + T val2; + ia >> val2; + BOOST_CHECK_EQUAL(val, val2); + + ss.clear(); + boost::archive::binary_oarchive ob(ss); + ob << static_cast<const T&>(val); + boost::archive::binary_iarchive ib(ss); + ib >> val2; + BOOST_CHECK_EQUAL(val, val2); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + } +#endif + test_neg(val, boost::mpl::bool_<std::numeric_limits<T>::is_signed>()); + + // + // Check to see if test is taking too long. + // Tests run on the compiler farm time out after 300 seconds, + // so don't get too close to that: + // +#ifndef CI_SUPPRESS_KNOWN_ISSUES + if (tim.elapsed() > 150) +#else + if (tim.elapsed() > 25) +#endif + { + std::cout << "Timeout reached, aborting tests now....\n"; + break; + } + } +} + +int main() +{ + using namespace boost::multiprecision; + test<cpp_rational>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop.cpp new file mode 100644 index 00000000..1d1f982a --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop.cpp @@ -0,0 +1,772 @@ +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <iostream> +#include <Eigen/Dense> + +#include <boost/multiprecision/mpfr.hpp> +#include <boost/multiprecision/logged_adaptor.hpp> +#include <boost/multiprecision/gmp.hpp> +#include <boost/multiprecision/mpc.hpp> + +#include "test.hpp" + +using namespace Eigen; + +namespace Eigen { +template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates> +struct NumTraits<boost::multiprecision::number<Backend, ExpressionTemplates> > +{ + typedef boost::multiprecision::number<Backend, ExpressionTemplates> self_type; + typedef typename boost::multiprecision::scalar_result_from_possible_complex<self_type>::type Real; + typedef self_type NonInteger; // Not correct but we can't do much better?? + typedef double Literal; + typedef self_type Nested; + enum + { + IsComplex = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_complex, + IsInteger = boost::multiprecision::number_category<self_type>::value == boost::multiprecision::number_kind_integer, + ReadCost = 1, + AddCost = 4, + MulCost = 8, + IsSigned = std::numeric_limits<self_type>::is_specialized ? std::numeric_limits<self_type>::is_signed : true, + RequireInitialization = 1, + }; + static Real epsilon() + { + return std::numeric_limits<Real>::epsilon(); + } + static Real dummy_precision() + { + return sqrt(epsilon()); + } + static Real highest() + { + return (std::numeric_limits<Real>::max)(); + } + static Real lowest() + { + return (std::numeric_limits<Real>::min)(); + } + static int digits10_imp(const boost::mpl::true_&) + { + return std::numeric_limits<Real>::digits10; + } + template <bool B> + static int digits10_imp(const boost::mpl::bool_<B>&) + { + return Real::default_precision(); + } + static int digits10() + { + return digits10_imp(boost::mpl::bool_ < std::numeric_limits<Real>::digits10 && (std::numeric_limits<Real>::digits10 != INT_MAX) ? true : false > ()); + } +}; + +#define BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(A) \ + template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp> \ + struct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, A, BinaryOp> \ + { \ + static_assert(boost::multiprecision::is_compatible_arithmetic_type<A, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, "Interoperability with this arithmetic type is not supported."); \ + typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType; \ + }; \ + template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp> \ + struct ScalarBinaryOpTraits<A, boost::multiprecision::number<Backend, ExpressionTemplates>, BinaryOp> \ + { \ + static_assert(boost::multiprecision::is_compatible_arithmetic_type<A, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, "Interoperability with this arithmetic type is not supported."); \ + typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType; \ + }; + +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(float) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(double) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(long double) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(char) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned char) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(signed char) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(short) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned short) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(int) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned int) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(long) +BOOST_MP_EIGEN_SCALAR_TRAITS_DECL(unsigned long) +#if 0 + template<class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, class Backend2, boost::multiprecision::expression_template_option ExpressionTemplates2, typename BinaryOp> + struct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend2, ExpressionTemplates2>, BinaryOp> + { + static_assert( + boost::multiprecision::is_compatible_arithmetic_type<boost::multiprecision::number<Backend2, ExpressionTemplates2>, boost::multiprecision::number<Backend, ExpressionTemplates> >::value + || boost::multiprecision::is_compatible_arithmetic_type<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend2, ExpressionTemplates2> >::value, "Interoperability with this arithmetic type is not supported."); + typedef typename boost::mpl::if_c<boost::is_convertible<boost::multiprecision::number<Backend2, ExpressionTemplates2>, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, + boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend2, ExpressionTemplates2> >::type ReturnType; + }; + + template<unsigned D, typename BinaryOp> + struct ScalarBinaryOpTraits<boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<D>, boost::multiprecision::et_on>, boost::multiprecision::mpfr_float, BinaryOp> + { + typedef boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<D>, boost::multiprecision::et_on> ReturnType; + }; + + template<typename BinaryOp> + struct ScalarBinaryOpTraits<boost::multiprecision::mpfr_float, boost::multiprecision::mpc_complex, BinaryOp> + { + typedef boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<0>, boost::multiprecision::et_on> ReturnType; + }; + + template<class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp> + struct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::number<Backend, ExpressionTemplates>, BinaryOp> + { + typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType; + }; +#endif +template <class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, class tag, class Arg1, class Arg2, class Arg3, class Arg4, typename BinaryOp> +struct ScalarBinaryOpTraits<boost::multiprecision::number<Backend, ExpressionTemplates>, boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, BinaryOp> +{ + static_assert(boost::is_convertible<typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, "Interoperability with this arithmetic type is not supported."); + typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType; +}; + +template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class Backend, boost::multiprecision::expression_template_option ExpressionTemplates, typename BinaryOp> +struct ScalarBinaryOpTraits<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, boost::multiprecision::number<Backend, ExpressionTemplates>, BinaryOp> +{ + static_assert(boost::is_convertible<typename boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, boost::multiprecision::number<Backend, ExpressionTemplates> >::value, "Interoperability with this arithmetic type is not supported."); + typedef boost::multiprecision::number<Backend, ExpressionTemplates> ReturnType; +}; + +} // namespace Eigen + +template <class T> +struct related_number +{ + typedef T type; +}; +/* +template <> +struct related_number<boost::multiprecision::cpp_bin_float_50> +{ + typedef boost::multiprecision::cpp_bin_float_quad type; +}; +template <> +struct related_number<boost::multiprecision::cpp_dec_float_100> +{ + typedef boost::multiprecision::cpp_dec_float_50 type; +};*/ + +template <class Num> +void example1() +{ + // expected results first: + Matrix<Num, 2, 2> r1, r2; + r1 << 3, 5, 4, 8; + r2 << -1, -1, 2, 0; + Matrix<Num, 3, 1> r3; + r3 << -1, -4, -6; + + Matrix<Num, 2, 2> a; + a << 1, 2, 3, 4; + Matrix<Num, Dynamic, Dynamic> b(2, 2); + b << 2, 3, 1, 4; + std::cout << "a + b =\n" + << a + b << std::endl; + BOOST_CHECK_EQUAL(a + b, r1); + std::cout << "a - b =\n" + << a - b << std::endl; + BOOST_CHECK_EQUAL(a - b, r2); + std::cout << "Doing a += b;" << std::endl; + a += b; + std::cout << "Now a =\n" + << a << std::endl; + Matrix<Num, 3, 1> v(1, 2, 3); + Matrix<Num, 3, 1> w(1, 0, 0); + std::cout << "-v + w - v =\n" + << -v + w - v << std::endl; + BOOST_CHECK_EQUAL(-v + w - v, r3); +} + +template <class Num> +void example2() +{ + Matrix<Num, 2, 2> a; + a << 1, 2, 3, 4; + Matrix<Num, 3, 1> v(1, 2, 3); + std::cout << "a * 2.5 =\n" + << a * 2.5 << std::endl; + std::cout << "0.1 * v =\n" + << 0.1 * v << std::endl; + std::cout << "Doing v *= 2;" << std::endl; + v *= 2; + std::cout << "Now v =\n" + << v << std::endl; + Num n(4); + std::cout << "Doing v *= Num;" << std::endl; + v *= n; + std::cout << "Now v =\n" + << v << std::endl; + typedef typename related_number<Num>::type related_type; + related_type r(6); + std::cout << "Doing v *= RelatedType;" << std::endl; + v *= r; + std::cout << "Now v =\n" + << v << std::endl; + std::cout << "RelatedType * v =\n" + << r * v << std::endl; + std::cout << "Doing v *= RelatedType^2;" << std::endl; + v *= r * r; + std::cout << "Now v =\n" + << v << std::endl; + std::cout << "RelatedType^2 * v =\n" + << r * r * v << std::endl; + + static_assert(boost::is_same<typename Eigen::ScalarBinaryOpTraits<Num, related_type, Eigen::internal::scalar_product_op<Num, related_type> >::ReturnType, Num>::value, "Incorrect type."); +} + +template <class Num> +void example3() +{ + using namespace std; + Matrix<Num, Dynamic, Dynamic> a = Matrix<Num, Dynamic, Dynamic>::Random(2, 2); + cout << "Here is the matrix a\n" + << a << endl; + cout << "Here is the matrix a^T\n" + << a.transpose() << endl; + cout << "Here is the conjugate of a\n" + << a.conjugate() << endl; + cout << "Here is the matrix a^*\n" + << a.adjoint() << endl; +} + +template <class Num> +void example4() +{ + Matrix<Num, 2, 2> mat; + mat << 1, 2, + 3, 4; + Matrix<Num, 2, 1> u(-1, 1), v(2, 0); + std::cout << "Here is mat*mat:\n" + << mat * mat << std::endl; + std::cout << "Here is mat*u:\n" + << mat * u << std::endl; + std::cout << "Here is u^T*mat:\n" + << u.transpose() * mat << std::endl; + std::cout << "Here is u^T*v:\n" + << u.transpose() * v << std::endl; + std::cout << "Here is u*v^T:\n" + << u * v.transpose() << std::endl; + std::cout << "Let's multiply mat by itself" << std::endl; + mat = mat * mat; + std::cout << "Now mat is mat:\n" + << mat << std::endl; +} + +template <class Num> +void example5() +{ + using namespace std; + Matrix<Num, 3, 1> v(1, 2, 3); + Matrix<Num, 3, 1> w(0, 1, 2); + cout << "Dot product: " << v.dot(w) << endl; + Num dp = v.adjoint() * w; // automatic conversion of the inner product to a scalar + cout << "Dot product via a matrix product: " << dp << endl; + cout << "Cross product:\n" + << v.cross(w) << endl; +} + +template <class Num> +void example6() +{ + using namespace std; + Matrix<Num, 2, 2> mat; + mat << 1, 2, + 3, 4; + cout << "Here is mat.sum(): " << mat.sum() << endl; + cout << "Here is mat.prod(): " << mat.prod() << endl; + cout << "Here is mat.mean(): " << mat.mean() << endl; + cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl; + cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl; + cout << "Here is mat.trace(): " << mat.trace() << endl; +} + +template <class Num> +void example7() +{ + using namespace std; + + Array<Num, Dynamic, Dynamic> m(2, 2); + + // assign some values coefficient by coefficient + m(0, 0) = 1.0; + m(0, 1) = 2.0; + m(1, 0) = 3.0; + m(1, 1) = m(0, 1) + m(1, 0); + + // print values to standard output + cout << m << endl + << endl; + + // using the comma-initializer is also allowed + m << 1.0, 2.0, + 3.0, 4.0; + + // print values to standard output + cout << m << endl; +} + +template <class Num> +void example8() +{ + using namespace std; + Array<Num, Dynamic, Dynamic> a(3, 3); + Array<Num, Dynamic, Dynamic> b(3, 3); + a << 1, 2, 3, + 4, 5, 6, + 7, 8, 9; + b << 1, 2, 3, + 1, 2, 3, + 1, 2, 3; + + // Adding two arrays + cout << "a + b = " << endl + << a + b << endl + << endl; + // Subtracting a scalar from an array + cout << "a - 2 = " << endl + << a - 2 << endl; +} + +template <class Num> +void example9() +{ + using namespace std; + Array<Num, Dynamic, Dynamic> a(2, 2); + Array<Num, Dynamic, Dynamic> b(2, 2); + a << 1, 2, + 3, 4; + b << 5, 6, + 7, 8; + cout << "a * b = " << endl + << a * b << endl; +} + +template <class Num> +void example10() +{ + using namespace std; + Array<Num, Dynamic, 1> a = Array<Num, Dynamic, 1>::Random(5); + a *= 2; + cout << "a =" << endl + << a << endl; + cout << "a.abs() =" << endl + << a.abs() << endl; + cout << "a.abs().sqrt() =" << endl + << a.abs().sqrt() << endl; + cout << "a.min(a.abs().sqrt()) =" << endl + << a.std::min)(a.abs().sqrt()) << endl; +} + +template <class Num> +void example11() +{ + using namespace std; + Matrix<Num, Dynamic, Dynamic> m(2, 2); + Matrix<Num, Dynamic, Dynamic> n(2, 2); + Matrix<Num, Dynamic, Dynamic> result(2, 2); + m << 1, 2, + 3, 4; + n << 5, 6, + 7, 8; + result = m * n; + cout << "-- Matrix m*n: --" << endl + << result << endl + << endl; + result = m.array() * n.array(); + cout << "-- Array m*n: --" << endl + << result << endl + << endl; + result = m.cwiseProduct(n); + cout << "-- With cwiseProduct: --" << endl + << result << endl + << endl; + result = m.array() + 4; + cout << "-- Array m + 4: --" << endl + << result << endl + << endl; +} + +template <class Num> +void example12() +{ + using namespace std; + Matrix<Num, Dynamic, Dynamic> m(2, 2); + Matrix<Num, Dynamic, Dynamic> n(2, 2); + Matrix<Num, Dynamic, Dynamic> result(2, 2); + m << 1, 2, + 3, 4; + n << 5, 6, + 7, 8; + + result = (m.array() + 4).matrix() * m; + cout << "-- Combination 1: --" << endl + << result << endl + << endl; + result = (m.array() * n.array()).matrix() * m; + cout << "-- Combination 2: --" << endl + << result << endl + << endl; +} + +template <class Num> +void example13() +{ + using namespace std; + Matrix<Num, Dynamic, Dynamic> m(4, 4); + m << 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16; + cout << "Block in the middle" << endl; + cout << m.template block<2, 2>(1, 1) << endl + << endl; + for (int i = 1; i <= 3; ++i) + { + cout << "Block of size " << i << "x" << i << endl; + cout << m.block(0, 0, i, i) << endl + << endl; + } +} + +template <class Num> +void example14() +{ + using namespace std; + Array<Num, 2, 2> m; + m << 1, 2, + 3, 4; + Array<Num, 4, 4> a = Array<Num, 4, 4>::Constant(0.6); + cout << "Here is the array a:" << endl + << a << endl + << endl; + a.template block<2, 2>(1, 1) = m; + cout << "Here is now a with m copied into its central 2x2 block:" << endl + << a << endl + << endl; + a.block(0, 0, 2, 3) = a.block(2, 1, 2, 3); + cout << "Here is now a with bottom-right 2x3 block copied into top-left 2x2 block:" << endl + << a << endl + << endl; +} + +template <class Num> +void example15() +{ + using namespace std; + Eigen::Matrix<Num, Dynamic, Dynamic> m(3, 3); + m << 1, 2, 3, + 4, 5, 6, + 7, 8, 9; + cout << "Here is the matrix m:" << endl + << m << endl; + cout << "2nd Row: " << m.row(1) << endl; + m.col(2) += 3 * m.col(0); + cout << "After adding 3 times the first column into the third column, the matrix m is:\n"; + cout << m << endl; +} + +template <class Num> +void example16() +{ + using namespace std; + Matrix<Num, 4, 4> m; + m << 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16; + cout << "m.leftCols(2) =" << endl + << m.leftCols(2) << endl + << endl; + cout << "m.bottomRows<2>() =" << endl + << m.template bottomRows<2>() << endl + << endl; + m.topLeftCorner(1, 3) = m.bottomRightCorner(3, 1).transpose(); + cout << "After assignment, m = " << endl + << m << endl; +} + +template <class Num> +void example17() +{ + using namespace std; + Array<Num, Dynamic, 1> v(6); + v << 1, 2, 3, 4, 5, 6; + cout << "v.head(3) =" << endl + << v.head(3) << endl + << endl; + cout << "v.tail<3>() = " << endl + << v.template tail<3>() << endl + << endl; + v.segment(1, 4) *= 2; + cout << "after 'v.segment(1,4) *= 2', v =" << endl + << v << endl; +} + +template <class Num> +void example18() +{ + using namespace std; + Matrix<Num, 2, 2> mat; + mat << 1, 2, + 3, 4; + cout << "Here is mat.sum(): " << mat.sum() << endl; + cout << "Here is mat.prod(): " << mat.prod() << endl; + cout << "Here is mat.mean(): " << mat.mean() << endl; + cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl; + cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl; + cout << "Here is mat.trace(): " << mat.trace() << endl; + + BOOST_CHECK_EQUAL(mat.sum(), 10); + BOOST_CHECK_EQUAL(mat.prod(), 24); + BOOST_CHECK_EQUAL(mat.mean(), Num(5) / 2); + BOOST_CHECK_EQUAL(mat.minCoeff(), 1); + BOOST_CHECK_EQUAL(mat.maxCoeff(), 4); + BOOST_CHECK_EQUAL(mat.trace(), 5); +} + +template <class Num> +void example18a() +{ + using namespace std; + Matrix<Num, 2, 2> mat; + mat << 1, 2, + 3, 4; + cout << "Here is mat.sum(): " << mat.sum() << endl; + cout << "Here is mat.prod(): " << mat.prod() << endl; + cout << "Here is mat.mean(): " << mat.mean() << endl; + //cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl; + //cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl; + cout << "Here is mat.trace(): " << mat.trace() << endl; +} + +template <class Num> +void example19() +{ + using namespace std; + Matrix<Num, Dynamic, 1> v(2); + Matrix<Num, Dynamic, Dynamic> m(2, 2), n(2, 2); + + v << -1, + 2; + + m << 1, -2, + -3, 4; + cout << "v.squaredNorm() = " << v.squaredNorm() << endl; + cout << "v.norm() = " << v.norm() << endl; + cout << "v.lpNorm<1>() = " << v.template lpNorm<1>() << endl; + cout << "v.lpNorm<Infinity>() = " << v.template lpNorm<Infinity>() << endl; + cout << endl; + cout << "m.squaredNorm() = " << m.squaredNorm() << endl; + cout << "m.norm() = " << m.norm() << endl; + cout << "m.lpNorm<1>() = " << m.template lpNorm<1>() << endl; + cout << "m.lpNorm<Infinity>() = " << m.template lpNorm<Infinity>() << endl; +} + +template <class Num> +void example20() +{ + using namespace std; + Matrix<Num, 3, 3> A; + Matrix<Num, 3, 1> b; + A << 1, 2, 3, 4, 5, 6, 7, 8, 10; + b << 3, 3, 4; + cout << "Here is the matrix A:\n" + << A << endl; + cout << "Here is the vector b:\n" + << b << endl; + Matrix<Num, 3, 1> x = A.colPivHouseholderQr().solve(b); + cout << "The solution is:\n" + << x << endl; +} + +template <class Num> +void example21() +{ + using namespace std; + Matrix<Num, 2, 2> A, b; + A << 2, -1, -1, 3; + b << 1, 2, 3, 1; + cout << "Here is the matrix A:\n" + << A << endl; + cout << "Here is the right hand side b:\n" + << b << endl; + Matrix<Num, 2, 2> x = A.ldlt().solve(b); + cout << "The solution is:\n" + << x << endl; +} + +template <class Num> +void example22() +{ + using namespace std; + Matrix<Num, Dynamic, Dynamic> A = Matrix<Num, Dynamic, Dynamic>::Random(100, 100); + Matrix<Num, Dynamic, Dynamic> b = Matrix<Num, Dynamic, Dynamic>::Random(100, 50); + Matrix<Num, Dynamic, Dynamic> x = A.fullPivLu().solve(b); + Matrix<Num, Dynamic, Dynamic> axmb = A * x - b; + double relative_error = static_cast<double>(abs(axmb.norm() / b.norm())); // norm() is L2 norm + cout << "norm1 = " << axmb.norm() << endl; + cout << "norm2 = " << b.norm() << endl; + cout << "The relative error is:\n" + << relative_error << endl; +} + +template <class Num> +void example23() +{ + using namespace std; + Matrix<Num, 2, 2> A; + A << 1, 2, 2, 3; + cout << "Here is the matrix A:\n" + << A << endl; + SelfAdjointEigenSolver<Matrix<Num, 2, 2> > eigensolver(A); + if (eigensolver.info() != Success) + { + std::cout << "Eigenvalue solver failed!" << endl; + } + else + { + cout << "The eigenvalues of A are:\n" + << eigensolver.eigenvalues() << endl; + cout << "Here's a matrix whose columns are eigenvectors of A \n" + << "corresponding to these eigenvalues:\n" + << eigensolver.eigenvectors() << endl; + } +} + +template <class Num> +void example24() +{ + using namespace std; + Matrix<Num, 3, 3> A; + A << 1, 2, 1, + 2, 1, 0, + -1, 1, 2; + cout << "Here is the matrix A:\n" + << A << endl; + cout << "The determinant of A is " << A.determinant() << endl; + cout << "The inverse of A is:\n" + << A.inverse() << endl; +} + +template <class Num> +void test_integer_type() +{ + example1<Num>(); + //example2<Num>(); + example18<Num>(); +} + +template <class Num> +void test_float_type() +{ + std::cout << "Epsilon = " << Eigen::NumTraits<Num>::epsilon() << std::endl; + std::cout << "Dummy Prec = " << Eigen::NumTraits<Num>::dummy_precision() << std::endl; + std::cout << "Highest = " << Eigen::NumTraits<Num>::highest() << std::endl; + std::cout << "Lowest = " << Eigen::NumTraits<Num>::lowest() << std::endl; + std::cout << "Digits10 = " << Eigen::NumTraits<Num>::digits10() << std::endl; + + example1<Num>(); + example2<Num>(); + example4<Num>(); + example5<Num>(); + example6<Num>(); + example7<Num>(); + example8<Num>(); + example9<Num>(); + example10<Num>(); + example11<Num>(); + example12<Num>(); + example13<Num>(); + example14<Num>(); + example15<Num>(); + example16<Num>(); + example17<Num>(); + example18<Num>(); + example19<Num>(); + example20<Num>(); + example21<Num>(); + example22<Num>(); + example23<Num>(); + example24<Num>(); +} + +template <class Num> +void test_complex_type() +{ + std::cout << "Epsilon = " << Eigen::NumTraits<Num>::epsilon() << std::endl; + std::cout << "Dummy Prec = " << Eigen::NumTraits<Num>::dummy_precision() << std::endl; + std::cout << "Highest = " << Eigen::NumTraits<Num>::highest() << std::endl; + std::cout << "Lowest = " << Eigen::NumTraits<Num>::lowest() << std::endl; + std::cout << "Digits10 = " << Eigen::NumTraits<Num>::digits10() << std::endl; + + example1<Num>(); + example2<Num>(); + example3<Num>(); + example4<Num>(); + example5<Num>(); + example7<Num>(); + example8<Num>(); + example9<Num>(); + example11<Num>(); + example12<Num>(); + example13<Num>(); + example14<Num>(); + example15<Num>(); + example16<Num>(); + example17<Num>(); + example18a<Num>(); + example19<Num>(); + example20<Num>(); + example21<Num>(); + example22<Num>(); + // example23<Num>(); //requires comparisons. + example24<Num>(); +} + +namespace boost { +namespace multiprecision { + +template <unsigned D> +inline void log_postfix_event(const mpc_complex_backend<D>& val, const char* event_description) +{ + if (mpfr_nan_p(mpc_realref(val.data()))) + { + std::cout << "Found a NaN! " << event_description << std::endl; + } +} + +} +} // namespace boost::multiprecision + +int main() +{ + using namespace boost::multiprecision; + test_complex_type<mpc_complex>(); +#if 0 + test_integer_type<int>(); + + test_float_type<double>(); + test_complex_type<std::complex<double> >(); + + test_float_type<boost::multiprecision::cpp_dec_float_100>(); + test_float_type<boost::multiprecision::cpp_bin_float_50>(); + test_float_type<boost::multiprecision::mpfr_float>(); + + test_integer_type<boost::multiprecision::int256_t>(); + test_integer_type<boost::multiprecision::cpp_int>(); + test_integer_type<boost::multiprecision::cpp_rational>(); + test_integer_type<boost::multiprecision::mpz_int>(); + test_integer_type<boost::multiprecision::mpq_rational>(); + +#endif + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_bin_float_1.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_bin_float_1.cpp new file mode 100644 index 00000000..80cedcdb --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_bin_float_1.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_bin_float.hpp> + +#include "eigen.hpp" + +int main() +{ + using namespace boost::multiprecision; + test_float_type<double>(); + test_float_type<boost::multiprecision::cpp_bin_float_50>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_bin_float_2.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_bin_float_2.cpp new file mode 100644 index 00000000..13c576af --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_bin_float_2.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_bin_float.hpp> + +#include "eigen.hpp" + +int main() +{ + using namespace boost::multiprecision; + test_float_type_2<double>(); + test_float_type_2<boost::multiprecision::cpp_bin_float_50>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_bin_float_3.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_bin_float_3.cpp new file mode 100644 index 00000000..67fce053 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_bin_float_3.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_bin_float.hpp> + +#include "eigen.hpp" + +int main() +{ + using namespace boost::multiprecision; + test_float_type_3<double>(); + test_float_type_3<boost::multiprecision::cpp_bin_float_50>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_dec_float.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_dec_float.cpp new file mode 100644 index 00000000..d8177efa --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_dec_float.cpp @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#include "eigen.hpp" + +template <> +struct related_number<boost::multiprecision::cpp_dec_float_100> +{ + typedef boost::multiprecision::cpp_dec_float_50 type; +}; + +int main() +{ + using namespace boost::multiprecision; + test_float_type<double>(); + test_float_type<boost::multiprecision::cpp_dec_float_100>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_dec_float_2.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_dec_float_2.cpp new file mode 100644 index 00000000..8e4c25f2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_dec_float_2.cpp @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#include "eigen.hpp" + +template <> +struct related_number<boost::multiprecision::cpp_dec_float_100> +{ + typedef boost::multiprecision::cpp_dec_float_50 type; +}; + +int main() +{ + using namespace boost::multiprecision; + //test_float_type_2<double>(); + test_float_type_2<boost::multiprecision::cpp_dec_float_100>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_dec_float_3.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_dec_float_3.cpp new file mode 100644 index 00000000..630878da --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_dec_float_3.cpp @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#include "eigen.hpp" + +template <> +struct related_number<boost::multiprecision::cpp_dec_float_100> +{ + typedef boost::multiprecision::cpp_dec_float_50 type; +}; + +int main() +{ + using namespace boost::multiprecision; + //test_float_type_2<double>(); + test_float_type_3<boost::multiprecision::cpp_dec_float_100>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_int.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_int.cpp new file mode 100644 index 00000000..fba52e06 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_cpp_int.cpp @@ -0,0 +1,17 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> + +#include "eigen.hpp" + +int main() +{ + using namespace boost::multiprecision; + test_integer_type<int>(); + test_integer_type<boost::multiprecision::int256_t>(); + test_integer_type<boost::multiprecision::cpp_int>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_gmp.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_gmp.cpp new file mode 100644 index 00000000..4cb2385b --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_gmp.cpp @@ -0,0 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/gmp.hpp> + +#include "eigen.hpp" + +int main() +{ + using namespace boost::multiprecision; + test_integer_type<boost::multiprecision::mpz_int>(); + test_integer_type<boost::multiprecision::mpq_rational>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_mpc.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_mpc.cpp new file mode 100644 index 00000000..6ac9966c --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_mpc.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/mpc.hpp> + +#include "eigen.hpp" + +int main() +{ + using namespace boost::multiprecision; + test_complex_type<mpc_complex>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_mpfr_1.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_mpfr_1.cpp new file mode 100644 index 00000000..7ddbbcc5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_mpfr_1.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/mpfr.hpp> + +#include "eigen.hpp" + +int main() +{ + using namespace boost::multiprecision; + test_float_type<boost::multiprecision::mpfr_float>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_mpfr_2.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_mpfr_2.cpp new file mode 100644 index 00000000..27cd9ddb --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_mpfr_2.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/mpfr.hpp> + +#include "eigen.hpp" + +int main() +{ + using namespace boost::multiprecision; + test_float_type_2<boost::multiprecision::mpfr_float>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_eigen_interop_mpfr_3.cpp b/src/boost/libs/multiprecision/test/test_eigen_interop_mpfr_3.cpp new file mode 100644 index 00000000..d4541098 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_eigen_interop_mpfr_3.cpp @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/mpfr.hpp> + +#include "eigen.hpp" + +int main() +{ + using namespace boost::multiprecision; + test_float_type_3<boost::multiprecision::mpfr_float>(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/test_exp.cpp b/src/boost/libs/multiprecision/test/test_exp.cpp new file mode 100644 index 00000000..81c28ceb --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_exp.cpp @@ -0,0 +1,252 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#pragma warning(disable : 4127) +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +//# define TEST_MPF +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFI_50 +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +void test() +{ + std::cout << "Testing type " << typeid(T).name() << std::endl; + static const boost::array<const char*, 51u> data = + {{ + "1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "9.47747587596218770242116751705184563668845029215054154915126374673142219159548534317576897266130328412495991561490384353e76", + "8.98225489794452370997623936390755615068333094834545092387689795875746440121970819499035111276893290879203289092353747850e153", + "8.51291041070124257524798251795398355552294928156627848633073113916721592074889256105483993631579761345100284245144410506e230", + "8.06809030516483860484254925989129017112482132468761563276276594763374886826841745433660192438855214332469192411759402790e307", + "7.64651312322841630493169711336894888932951818957138997327518186691187347879142222644283389432604713409023263917264358401e384", + "7.24696436606255985380192585665173794455118215150711210905481870053193336336731228464367470327868286988180495111406609690e461", + "6.86829299533155197480610865771404565313986987801060270120621935139741577246731459024227828759564450034267891072352816870e538", + "6.50940811722948585242669672360741252715012399316164518226061001845519670701239429603657927628755169479689062519606799624e615", + "6.16927583978348964454665652571294215251327375137123272041877979478545511090085756858225302357977159539777447847855503405e692", + "5.84691629437043896753869572004324228849833391140408095171257918435296982661233664069534601413835876272500275725690968474e769", + "5.54140081286660645835370762406928689330724181979654545550204201113926269281603301564114980528619942840737770415885783439e846", + "5.25184925229805200184933663459660562493261505058724212670923083643709964294855282715531768162298567379648573804433968486e923", + "4.97742745928448409225535325233998957076879979440190164347796593390995994951755710667491911026476108957070504003155645761e1000", + "4.71734486697204622371883518659702954552385115723942808636490157561056417525827884479573988899517566587636669779645610803e1077", + "4.47085221753216236037602345430121605512330975424643767098987010800161616413051148037751552110081034066081309007796182114e1154", + "4.23723940366531198300986713567588008777043812458400705569721660157434941774066620870256745107265536124077734836797938268e1231", + "4.01583342289144005397455901781647949754375366066998182220342540048111140676724909947493787596336610499122085983712119281e1308", + "3.80599643873362813900306284477369187319506389058898599816705625750135796510808933786432614186155972485637939057212164098e1385", + "3.60712394320959592074309301816510372687695286650188776957291994751966018917404878612237961367128638199290387601511358836e1462", + "3.41864301533745457066062991907289263038319874930395315315257927161138360206596116102724713069518697248463965164712972907e1539", + "3.24001067063873569456703204286462007769933831045558617578289414699244767403736057931834775727420762410328297596596814910e1616", + "3.07071229688386868087623659761166306563170839771162347830514606977592027644137144160294469813988158463967740978461420862e1693", + "2.91026017157373047094077218552378456052150304677863670611408570458991015300131731261787644801415538043027268185097710615e1770", + "2.75819205688636078700279174380111581147323147951670302427494196210176478494486073721584055059489736040565979466551070179e1847", + "2.61406986804110104534167739704643351039975992759905579635058824027507742375380077276380178376470686987855503581867681046e1924", + "2.47747841124391945459619002346303925269640785743990333362087223895627681769816204236257960940497519376881830373722711456e2001", + "2.34802418757813746316913800667907927718925648696508255347624141597281474683823345136640610924639820192825966082309575303e2078", + "2.22533425939475124828943430510333464605535146852848680647615867629953075390889821397228584866395924176189346073006180260e2155", + "2.10905517593659363154553947631071808925462553114068144748077359132255993441363479041540672158497404660986163617828972963e2232", + "1.99885195510122536266653916064141606295420554580140619900425370702471778604391774578696867899999534265169574306808906810e2309", + "1.89440711840917173277691572886942144916664047407963356271198286654087884646102070148271284410118233470318337745546895603e2386", + "1.79541977639739687088375911648976940254141946934175300605485966288703931992861387257771264702798405630917098672594899744e2463", + "1.70160476180317540861346545791118106171203487587101437710693054174454895160403997508137760007058856854991413121389834429e2540", + "1.61269180804119796097157014527479883521656118500417752963675677684343588976915851637637232001139108420659882326614772004e2617", + "1.52842477060722969066998464046690349841548269556677423378408183476489015878816585045578141383463708674469365281537792914e2694", + "1.44856088916530600122626623629347336702026699647293500058111037526381692645547938577338582002157148103479049071921438452e2771", + "1.37287008819265239873777879432333192404914357037749380145412895230166352318128978403808382142784030558123748263528360645e2848", + "1.30113431416759441771790128053911040907207490879890145597562380328956450092799014856149474809345424672958343296615764490e2925", + "1.23314690739099822369963411660419632130352733806319401863570442920347696015409870236230656305563674376063778482449716744e3002", + "1.16871200663155636468514484039368694043851858077879103221831997264419096417014996945143145495038265243932745953706526253e3079", + "1.10764398487979357804590117089134596938734185016144401218934115168561552640448889215089150481162977776214124397487013110e3156", + "1.04976691458528698318220729857405616816444374000182094405930946710168752954926612218474430081526312018810817657409158490e3233", + "9.94914060836531582868347569174220216007647278536863127198023584205669825317884219144692385409156165042162234017403353704e3309", + "9.42927401023380446961314339401657458785389811652244742482194123119943160577946366372207045050095290781679375214307398844e3386", + "8.93657169598281164656322298275337750103095739790107943666668184304335665562867744740310577868880098719252549186849812451e3463", + "8.46961426624835911826517103631490619655296714141872141145089865045804196205328364155921945616925875458926717336478525196e3540", + "8.02705648870740089929294815816002943860908317454595055392168733404583122074223427054310572378841634984243492063192095337e3617", + "7.60762342267101369970765191988545810374824800500875923752736467467657167098026707905341603949108433696304383346239333297e3694", + "7.21010674617694221027190468649359000420209460539838589305387835463807416706224777302997789297329446308541513638035437482e3771", + "6.83336127500041943234365059231968669406267422759442985746460610830503287734479988530512309065240678799786759250323660701e3848", + }}; + + T pi = static_cast<T>("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609"); + + unsigned max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + T val = exp(sqrt((pi * (100 * k)) * (100 * k))); + T e = relative_error(val, T(data[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + val = exp(-sqrt((pi * (100 * k)) * (100 * k))); + e = relative_error(val, T(1 / T(data[k]))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + } + std::cout << "Max error was: " << max_err << std::endl; +#if defined(BOOST_INTEL) && defined(TEST_FLOAT128) + BOOST_TEST(max_err < 40000); +#elif defined(TEST_CPP_BIN_FLOAT) + BOOST_TEST(max_err < 6200); +#else + BOOST_TEST(max_err < 5000); +#endif + + static const boost::array<boost::array<T, 2>, 12> exact_data = + {{ + {{std::ldexp(1.0, -50), static_cast<T>("1.00000000000000088817841970012562676935794497867573073630970950828771105957980924149923657574337470594698012676100224953")}}, + {{std::ldexp(1.0, -20), static_cast<T>("1.00000095367477115374544678824955687428365188553281789775169686343569285229334215539516690752571791280462887427635269562")}}, + {{std::ldexp(1.0, -10), static_cast<T>("1.00097703949241653524284529261160650646585162918174419940186408264916250428896869173656853690882467186075613761065459261")}}, + {{0.25, static_cast<T>("1.28402541668774148407342056806243645833628086528146308921750729687220776586723800275330641943955356890166283174967968731")}}, + {{0.5, static_cast<T>("1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700")}}, + {{0.75, static_cast<T>("2.11700001661267466854536981983709561013449158470240342177913303081098453336401282000279156026661579821888590471901551426")}}, + {{10, static_cast<T>("22026.4657948067165169579006452842443663535126185567810742354263552252028185707925751991209681645258954515555010924578367")}}, + {{10.5, static_cast<T>("36315.5026742466377389120269013166179689315579671275857607480190550842856628099187749764427758174866310742771977376827512")}}, + {{25, static_cast<T>("7.20048993373858725241613514661261579152235338133952787362213864472320593107782569745000325654258093194727871848859163684e10")}}, + {{31.25, static_cast<T>("3.72994612957188849046766396046821396700589012875701157893019118883826370993674081486706667149871508642909416337810227575e13")}}, + {{static_cast<T>("65.8489821531948043946370515385267739671725127642242491414646009018723940871209979825570160646597753164901406969542"), static_cast<T>("39614081257132168796771975168.0")}}, + {{static_cast<T>("65.15583497263485908521981941706859739909701262986399388734392089237900046515130326695115273766335662894813921593"), static_cast<T>("19807040628566084398385987584.0")}}, + }}; + + max_err = 0; + for (unsigned k = 0; k < exact_data.size(); k++) + { + T val = exp(exact_data[k][0]); + T e = relative_error(val, exact_data[k][1]); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + val = exp(-exact_data[k][0]); + e = relative_error(val, T(1 / exact_data[k][1])); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 60); + + BOOST_TEST(exp(T(0)) == 1); + + if (!boost::multiprecision::is_interval_number<T>::value) + { + T bug_case = -1.05 * log((std::numeric_limits<T>::max)()); + for (unsigned i = 0; bug_case > -20 / std::numeric_limits<T>::epsilon(); ++i, bug_case *= 1.05) + { + if (std::numeric_limits<T>::has_infinity) + { + BOOST_CHECK_EQUAL(exp(bug_case), 0); + } + else + { + BOOST_CHECK_LE(exp(bug_case), (std::numeric_limits<T>::min)()); + } + } + bug_case = log((std::numeric_limits<T>::max)()) / -1.0005; + for (unsigned i = 0; i < 20; ++i, bug_case /= 1.05) + { + BOOST_CHECK_GE(exp(bug_case), (std::numeric_limits<T>::min)()); + } + } +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPILER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); + // Check low multiprecision digit counts. + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_fixed_int.cpp b/src/boost/libs/multiprecision/test/test_fixed_int.cpp new file mode 100644 index 00000000..ea0b373d --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_fixed_int.cpp @@ -0,0 +1,163 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/gmp.hpp> +#include <boost/multiprecision/fixed_int.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "test.hpp" + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +int main() +{ + using namespace boost::multiprecision; + typedef number<fixed_int<1024, true> > packed_type; + unsigned last_error_count = 0; + for (int i = 0; i < 1000; ++i) + { + mpz_int a = generate_random<mpz_int>(1000); + mpz_int b = generate_random<mpz_int>(512); + mpz_int c = generate_random<mpz_int>(256); + mpz_int d = generate_random<mpz_int>(32); + + int si = d.convert_to<int>(); + + packed_type a1 = a.str(); + packed_type b1 = b.str(); + packed_type c1 = c.str(); + packed_type d1 = d.str(); + + BOOST_CHECK_EQUAL(a.str(), a1.str()); + BOOST_CHECK_EQUAL(b.str(), b1.str()); + BOOST_CHECK_EQUAL(c.str(), c1.str()); + BOOST_CHECK_EQUAL(d.str(), d1.str()); + BOOST_CHECK_EQUAL(mpz_int(a + b).str(), packed_type(a1 + b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a - b).str(), packed_type(a1 - b1).str()); + BOOST_CHECK_EQUAL(mpz_int(mpz_int(-a) + b).str(), packed_type(packed_type(-a1) + b1).str()); + BOOST_CHECK_EQUAL(mpz_int(mpz_int(-a) - b).str(), packed_type(packed_type(-a1) - b1).str()); + BOOST_CHECK_EQUAL(mpz_int(c * d).str(), packed_type(c1 * d1).str()); + BOOST_CHECK_EQUAL(mpz_int(c * -d).str(), packed_type(c1 * -d1).str()); + BOOST_CHECK_EQUAL(mpz_int(-c * d).str(), packed_type(-c1 * d1).str()); + BOOST_CHECK_EQUAL(mpz_int(b * c).str(), packed_type(b1 * c1).str()); + BOOST_CHECK_EQUAL(mpz_int(a / b).str(), packed_type(a1 / b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a / -b).str(), packed_type(a1 / -b1).str()); + BOOST_CHECK_EQUAL(mpz_int(-a / b).str(), packed_type(-a1 / b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a / d).str(), packed_type(a1 / d1).str()); + BOOST_CHECK_EQUAL(mpz_int(a % b).str(), packed_type(a1 % b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a % -b).str(), packed_type(a1 % -b1).str()); + BOOST_CHECK_EQUAL(mpz_int(-a % b).str(), packed_type(-a1 % b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a % d).str(), packed_type(a1 % d1).str()); + // bitwise ops: + BOOST_CHECK_EQUAL(mpz_int(a | b).str(), packed_type(a1 | b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a & b).str(), packed_type(a1 & b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a ^ b).str(), packed_type(a1 ^ b1).str()); + // Now check operations involving integers: + BOOST_CHECK_EQUAL(mpz_int(a + si).str(), packed_type(a1 + si).str()); + BOOST_CHECK_EQUAL(mpz_int(a + -si).str(), packed_type(a1 + -si).str()); + BOOST_CHECK_EQUAL(mpz_int(-a + si).str(), packed_type(-a1 + si).str()); + BOOST_CHECK_EQUAL(mpz_int(si + a).str(), packed_type(si + a1).str()); + BOOST_CHECK_EQUAL(mpz_int(a - si).str(), packed_type(a1 - si).str()); + BOOST_CHECK_EQUAL(mpz_int(a - -si).str(), packed_type(a1 - -si).str()); + BOOST_CHECK_EQUAL(mpz_int(-a - si).str(), packed_type(-a1 - si).str()); + BOOST_CHECK_EQUAL(mpz_int(si - a).str(), packed_type(si - a1).str()); + BOOST_CHECK_EQUAL(mpz_int(b * si).str(), packed_type(b1 * si).str()); + BOOST_CHECK_EQUAL(mpz_int(b * -si).str(), packed_type(b1 * -si).str()); + BOOST_CHECK_EQUAL(mpz_int(-b * si).str(), packed_type(-b1 * si).str()); + BOOST_CHECK_EQUAL(mpz_int(si * b).str(), packed_type(si * b1).str()); + BOOST_CHECK_EQUAL(mpz_int(a / si).str(), packed_type(a1 / si).str()); + BOOST_CHECK_EQUAL(mpz_int(a / -si).str(), packed_type(a1 / -si).str()); + BOOST_CHECK_EQUAL(mpz_int(-a / si).str(), packed_type(-a1 / si).str()); + BOOST_CHECK_EQUAL(mpz_int(a % si).str(), packed_type(a1 % si).str()); + BOOST_CHECK_EQUAL(mpz_int(a % -si).str(), packed_type(a1 % -si).str()); + BOOST_CHECK_EQUAL(mpz_int(-a % si).str(), packed_type(-a1 % si).str()); + BOOST_CHECK_EQUAL(mpz_int(a | si).str(), packed_type(a1 | si).str()); + BOOST_CHECK_EQUAL(mpz_int(a & si).str(), packed_type(a1 & si).str()); + BOOST_CHECK_EQUAL(mpz_int(a ^ si).str(), packed_type(a1 ^ si).str()); + BOOST_CHECK_EQUAL(mpz_int(si | a).str(), packed_type(si | a1).str()); + BOOST_CHECK_EQUAL(mpz_int(si & a).str(), packed_type(si & a1).str()); + BOOST_CHECK_EQUAL(mpz_int(si ^ a).str(), packed_type(si ^ a1).str()); + BOOST_CHECK_EQUAL(mpz_int(gcd(a, b)).str(), packed_type(gcd(a1, b1)).str()); + BOOST_CHECK_EQUAL(mpz_int(lcm(c, d)).str(), packed_type(lcm(c1, d1)).str()); + + if (last_error_count != boost::detail::test_errors()) + { + last_error_count = boost::detail::test_errors(); + std::cout << std::hex << std::showbase; + + std::cout << "a = " << a << std::endl; + std::cout << "a1 = " << a1 << std::endl; + std::cout << "b = " << b << std::endl; + std::cout << "b1 = " << b1 << std::endl; + std::cout << "c = " << c << std::endl; + std::cout << "c1 = " << c1 << std::endl; + std::cout << "d = " << d << std::endl; + std::cout << "d1 = " << d1 << std::endl; + std::cout << "a + b = " << a + b << std::endl; + std::cout << "a1 + b1 = " << a1 + b1 << std::endl; + std::cout << std::dec; + std::cout << "a - b = " << a - b << std::endl; + std::cout << "a1 - b1 = " << a1 - b1 << std::endl; + std::cout << "-a + b = " << mpz_int(-a) + b << std::endl; + std::cout << "-a1 + b1 = " << packed_type(-a1) + b1 << std::endl; + std::cout << "-a - b = " << mpz_int(-a) - b << std::endl; + std::cout << "-a1 - b1 = " << packed_type(-a1) - b1 << std::endl; + std::cout << "c*d = " << c * d << std::endl; + std::cout << "c1*d1 = " << c1 * d1 << std::endl; + std::cout << "b*c = " << b * c << std::endl; + std::cout << "b1*c1 = " << b1 * c1 << std::endl; + std::cout << "a/b = " << a / b << std::endl; + std::cout << "a1/b1 = " << a1 / b1 << std::endl; + std::cout << "a/d = " << a / d << std::endl; + std::cout << "a1/d1 = " << a1 / d1 << std::endl; + std::cout << "a%b = " << a % b << std::endl; + std::cout << "a1%b1 = " << a1 % b1 << std::endl; + std::cout << "a%d = " << a % d << std::endl; + std::cout << "a1%d1 = " << a1 % d1 << std::endl; + } + } + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_float128_serial.cpp b/src/boost/libs/multiprecision/test/test_float128_serial.cpp new file mode 100644 index 00000000..4e357ba4 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_float128_serial.cpp @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2013 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/float128.hpp> +#include "test_float_serial.hpp" + +int main() +{ + using namespace boost::multiprecision; + test<float128>(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_float_conversions.cpp b/src/boost/libs/multiprecision/test/test_float_conversions.cpp new file mode 100644 index 00000000..ff3ff19e --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_float_conversions.cpp @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/math/constants/constants.hpp> + +int main() +{ + using namespace boost::multiprecision; + + BOOST_STATIC_ASSERT((boost::is_convertible<float, cpp_bin_float_single>::value)); + BOOST_STATIC_ASSERT(!(boost::is_convertible<double, cpp_bin_float_single>::value)); + BOOST_STATIC_ASSERT(!(boost::is_convertible<long double, cpp_bin_float_single>::value)); + + cpp_bin_float_single s = boost::math::constants::pi<cpp_bin_float_single>(); + + typedef number<backends::cpp_bin_float<11, backends::digit_base_2, void, boost::int8_t, -14, 15>, et_off> cpp_bin_float_half; + + BOOST_STATIC_ASSERT(!(boost::is_convertible<float, cpp_bin_float_half>::value)); + BOOST_STATIC_ASSERT(!(boost::is_convertible<double, cpp_bin_float_half>::value)); + BOOST_STATIC_ASSERT(!(boost::is_convertible<long double, cpp_bin_float_half>::value)); +#ifdef BOOST_HAS_FLOAT128 + BOOST_STATIC_ASSERT(!(boost::is_convertible<__float128, cpp_bin_float_half>::value)); +#endif + + cpp_bin_float_half hs = boost::math::constants::pi<cpp_bin_float_half>(); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_float_io.cpp b/src/boost/libs/multiprecision/test/test_float_io.cpp new file mode 100644 index 00000000..1a015dfa --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_float_io.cpp @@ -0,0 +1,373 @@ +// Copyright John Maddock 2011. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if !defined(TEST_MPF_50) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) +#define TEST_MPF_50 +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFR_50 +#define TEST_MPFI_50 +#define TEST_FLOAT128 + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif + +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "test.hpp" +#include <boost/array.hpp> +#include <iostream> +#include <iomanip> + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +#if defined(TEST_MPF_50) +template <unsigned N, boost::multiprecision::expression_template_option ET> +bool has_bad_bankers_rounding(const boost::multiprecision::number<boost::multiprecision::gmp_float<N>, ET>&) +{ + return true; +} +#endif +#if defined(TEST_FLOAT128) && defined(BOOST_INTEL) +bool has_bad_bankers_rounding(const boost::multiprecision::float128&) +{ + return true; +} +#endif +template <class T> +bool has_bad_bankers_rounding(const T&) +{ + return false; +} + +bool is_bankers_rounding_error(const std::string& s, const char* expect) +{ + // This check isn't foolproof: that would require *much* more sophisticated code!!! + std::string::size_type l = std::strlen(expect); + if (l != s.size()) + return false; + std::string::size_type len = s.find('e'); + if (len == std::string::npos) + len = l - 1; + else + --len; + if (s.compare(0, len, expect, len)) + return false; + if (s[len] != expect[len] + 1) + return false; + return true; +} + +void print_flags(std::ios_base::fmtflags f) +{ + std::cout << "Formatting flags were: "; + if (f & std::ios_base::scientific) + std::cout << "scientific "; + if (f & std::ios_base::fixed) + std::cout << "fixed "; + if (f & std::ios_base::showpoint) + std::cout << "showpoint "; + if (f & std::ios_base::showpos) + std::cout << "showpos "; + std::cout << std::endl; +} + +template <class T> +void test() +{ + typedef T mp_t; + boost::array<std::ios_base::fmtflags, 9> f = + {{std::ios_base::fmtflags(0), std::ios_base::showpoint, std::ios_base::showpos, std::ios_base::scientific, std::ios_base::scientific | std::ios_base::showpos, + std::ios_base::scientific | std::ios_base::showpoint, std::ios_base::fixed, std::ios_base::fixed | std::ios_base::showpoint, + std::ios_base::fixed | std::ios_base::showpos}}; + + boost::array<boost::array<const char*, 13 * 9>, 40> string_data = {{ +#include "libs/multiprecision/test/string_data.ipp" + }}; + + double num = 123456789.0; + double denom = 1; + double val = num; + for (unsigned j = 0; j < 40; ++j) + { + unsigned col = 0; + for (unsigned prec = 1; prec < 14; ++prec) + { + for (unsigned i = 0; i < f.size(); ++i, ++col) + { + std::stringstream ss; + ss.precision(prec); + ss.flags(f[i]); + ss << mp_t(val); + const char* expect = string_data[j][col]; + if (ss.str() != expect) + { + if (has_bad_bankers_rounding(mp_t()) && is_bankers_rounding_error(ss.str(), expect)) + { + std::cout << "Ignoring bankers-rounding error with GMP mp_f.\n"; + } + else + { + std::cout << std::setprecision(20) << "Testing value " << val << std::endl; + print_flags(f[i]); + std::cout << "Precision is: " << prec << std::endl; + std::cout << "Got: " << ss.str() << std::endl; + std::cout << "Expected: " << expect << std::endl; + ++boost::detail::test_errors(); + mp_t(val).str(prec, f[i]); // for debugging + } + } + } + } + num = -num; + if (j & 1) + denom *= 8; + val = num / denom; + } + + boost::array<const char*, 13 * 9> zeros = + {{"0", "0.", "+0", "0.0e+00", "+0.0e+00", "0.0e+00", "0.0", "0.0", "+0.0", "0", "0.0", "+0", "0.00e+00", "+0.00e+00", "0.00e+00", "0.00", "0.00", "+0.00", "0", "0.00", "+0", "0.000e+00", "+0.000e+00", "0.000e+00", "0.000", "0.000", "+0.000", "0", "0.000", "+0", "0.0000e+00", "+0.0000e+00", "0.0000e+00", "0.0000", "0.0000", "+0.0000", "0", "0.0000", "+0", "0.00000e+00", "+0.00000e+00", "0.00000e+00", "0.00000", "0.00000", "+0.00000", "0", "0.00000", "+0", "0.000000e+00", "+0.000000e+00", "0.000000e+00", "0.000000", "0.000000", "+0.000000", "0", "0.000000", "+0", "0.0000000e+00", "+0.0000000e+00", "0.0000000e+00", "0.0000000", "0.0000000", "+0.0000000", "0", "0.0000000", "+0", "0.00000000e+00", "+0.00000000e+00", "0.00000000e+00", "0.00000000", "0.00000000", "+0.00000000", "0", "0.00000000", "+0", "0.000000000e+00", "+0.000000000e+00", "0.000000000e+00", "0.000000000", "0.000000000", "+0.000000000", "0", "0.000000000", "+0", "0.0000000000e+00", "+0.0000000000e+00", "0.0000000000e+00", "0.0000000000", "0.0000000000", "+0.0000000000", "0", "0.0000000000", "+0", "0.00000000000e+00", "+0.00000000000e+00", "0.00000000000e+00", "0.00000000000", "0.00000000000", "+0.00000000000", "0", "0.00000000000", "+0", "0.000000000000e+00", "+0.000000000000e+00", "0.000000000000e+00", "0.000000000000", "0.000000000000", "+0.000000000000", "0", "0.000000000000", "+0", "0.0000000000000e+00", "+0.0000000000000e+00", "0.0000000000000e+00", "0.0000000000000", "0.0000000000000", "+0.0000000000000"}}; + + unsigned col = 0; + val = 0; + for (unsigned prec = 1; prec < 14; ++prec) + { + for (unsigned i = 0; i < f.size(); ++i, ++col) + { + std::stringstream ss; + ss.precision(prec); + ss.flags(f[i]); + ss << mp_t(val); + const char* expect = zeros[col]; + if (ss.str() != expect) + { + std::cout << std::setprecision(20) << "Testing value " << val << std::endl; + print_flags(f[i]); + std::cout << "Precision is: " << prec << std::endl; + std::cout << "Got: " << ss.str() << std::endl; + std::cout << "Expected: " << expect << std::endl; + ++boost::detail::test_errors(); + mp_t(val).str(prec, f[i]); // for debugging + } + } + } + + if (std::numeric_limits<mp_t>::has_infinity) + { + T val = std::numeric_limits<T>::infinity(); + BOOST_CHECK_EQUAL(val.str(), "inf"); + BOOST_CHECK_EQUAL(val.str(0, std::ios_base::showpos), "+inf"); + val = -val; + BOOST_CHECK_EQUAL(val.str(), "-inf"); + BOOST_CHECK_EQUAL(val.str(0, std::ios_base::showpos), "-inf"); + + val = static_cast<T>("inf"); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + val = static_cast<T>("+inf"); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + val = static_cast<T>("-inf"); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<mp_t>::has_quiet_NaN) + { + T val = std::numeric_limits<T>::quiet_NaN(); + BOOST_CHECK_EQUAL(val.str(), "nan"); + val = static_cast<T>("nan"); + BOOST_CHECK((boost::math::isnan)(val)); + } + // + // Bug cases: + // + // https://github.com/boostorg/multiprecision/issues/113 + // + { + T val("99.9809"); + BOOST_CHECK_EQUAL(val.str(3, std::ios_base::fixed), "99.981"); + } +} + +template <class T> +T generate_random() +{ + typedef typename T::backend_type::exponent_type e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(0, std::numeric_limits<T>::max_exponent - 10); + return ldexp(val, ui(gen)); +} + +template <class T> +struct max_digits10_proxy +{ + static const unsigned value = std::numeric_limits<T>::digits10 + 5; +}; +#ifdef TEST_CPP_DEC_FLOAT +template <unsigned D, boost::multiprecision::expression_template_option ET> +struct max_digits10_proxy<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D>, ET> > +{ + static const unsigned value = std::numeric_limits<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<D>, ET> >::max_digits10; +}; +#endif +#ifdef TEST_MPF_50 +template <unsigned D, boost::multiprecision::expression_template_option ET> +struct max_digits10_proxy<boost::multiprecision::number<boost::multiprecision::gmp_float<D>, ET> > +{ + static const unsigned value = std::numeric_limits<boost::multiprecision::number<boost::multiprecision::gmp_float<D>, ET> >::max_digits10; +}; +#endif +#ifdef TEST_MPFR_50 +template <unsigned D, boost::multiprecision::expression_template_option ET> +struct max_digits10_proxy<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D>, ET> > +{ + static const unsigned value = std::numeric_limits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<D>, ET> >::max_digits10; +}; +#endif + +template <class T> +void do_round_trip(const T& val, std::ios_base::fmtflags f) +{ + std::stringstream ss; +#ifndef BOOST_NO_CXX11_NUMERIC_LIMITS + ss << std::setprecision(std::numeric_limits<T>::max_digits10); +#else + ss << std::setprecision(max_digits10_proxy<T>::value); +#endif + ss.flags(f); + ss << val; + T new_val = static_cast<T>(ss.str()); + BOOST_CHECK_EQUAL(new_val, val); + new_val = static_cast<T>(val.str(0, f)); + BOOST_CHECK_EQUAL(new_val, val); +} + +template <class T> +void do_round_trip(const T& val) +{ + do_round_trip(val, std::ios_base::fmtflags(0)); + do_round_trip(val, std::ios_base::fmtflags(std::ios_base::scientific)); + if ((fabs(val) > 1) && (fabs(val) < 1e100)) + do_round_trip(val, std::ios_base::fmtflags(std::ios_base::fixed)); +} + +template <class T> +void test_round_trip() +{ + for (unsigned i = 0; i < 1000; ++i) + { + T val = generate_random<T>(); + do_round_trip(val); + do_round_trip(T(-val)); + do_round_trip(T(1 / val)); + do_round_trip(T(-1 / val)); + } +} + +#ifdef TEST_FLOAT128 +void test_hexadecimal_floating_point() +{ + using boost::multiprecision::float128; + + float128 x = 0x1p+0Q; + + std::string s = x.str(0, std::ios_base::fmtflags(std::ios_base::fixed | std::ios_base::scientific)); + BOOST_CHECK_EQUAL(s, "0x1p+0"); + + s = x.str(0, std::ios_base::fmtflags(std::ios_base::floatfield)); + BOOST_CHECK_EQUAL(s, "0x1p+0"); + + x = -1; + s = x.str(0, std::ios_base::fmtflags(std::ios_base::floatfield)); + BOOST_CHECK_EQUAL(s, "-0x1p+0"); + + // hexadecimal representation of pi; test a round trip: + float128 pi1 = 0x1.921fb54442d18469898cc51701b8p+1Q; + s = pi1.str(0, std::ios_base::fmtflags(std::ios_base::floatfield)); + float128 pi2(s); + BOOST_CHECK_EQUAL(pi1, pi2); +} +#endif + +int main() +{ +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); + + test_round_trip<boost::multiprecision::mpfr_float_50>(); + test_round_trip<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); + + test_round_trip<boost::multiprecision::mpfr_float_50>(); + test_round_trip<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); + + // cpp_dec_float has extra guard digits that messes this up: + test_round_trip<boost::multiprecision::cpp_dec_float_50>(); + test_round_trip<boost::multiprecision::cpp_dec_float_100>(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); + /* + // I can't get this to work with mpf_t - mpf_str appears + // not to actually print enough decimal digits: + test_round_trip<boost::multiprecision::mpf_float_50>(); + test_round_trip<boost::multiprecision::mpf_float_100>(); + */ +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); + test_hexadecimal_floating_point(); +#ifndef BOOST_INTEL + test_round_trip<boost::multiprecision::float128>(); +#endif +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_float_serial.hpp b/src/boost/libs/multiprecision/test/test_float_serial.hpp new file mode 100644 index 00000000..98298e04 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_float_serial.hpp @@ -0,0 +1,169 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2013 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/timer.hpp> +#include "test.hpp" + +#include <iostream> +#include <iomanip> +#include <sstream> +#include <boost/archive/text_iarchive.hpp> +#include <boost/archive/text_oarchive.hpp> +#include <boost/archive/binary_iarchive.hpp> +#include <boost/archive/binary_oarchive.hpp> +#include <boost/archive/xml_iarchive.hpp> +#include <boost/archive/xml_oarchive.hpp> +#include <boost/exception/all.hpp> + +#ifndef BOOST_MP_TEST_FLOAT_SERIAL_HPP +#define BOOST_MP_TEST_FLOAT_SERIAL_HPP + +template <class T> +T generate_random(unsigned /*bits_wanted*/) +{ + typedef typename T::backend_type::exponent_type e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static boost::random::uniform_int_distribution<e_type> ui(std::numeric_limits<T>::min_exponent + 1, std::numeric_limits<T>::max_exponent - 1); + return ldexp(val, ui(gen)); +} + +template <class T> +void test() +{ + boost::timer tim; + + while (true) + { + T val = generate_random<T>(boost::math::tools::digits<T>()); + int test_id = 0; + std::string stream_contents; +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + test_id = 0; + { + std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + boost::archive::text_oarchive oa(ss); + oa << static_cast<const T&>(val); + stream_contents = ss.str(); + boost::archive::text_iarchive ia(ss); + T val2; + ia >> val2; + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + { + boost::archive::xml_oarchive oa(ss); + oa << boost::serialization::make_nvp("value", static_cast<const T&>(val)); + stream_contents = ss.str(); + } + boost::archive::xml_iarchive ia(ss); + T val2; + ia >> boost::serialization::make_nvp("value", val2); + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + ++test_id; + boost::archive::binary_oarchive ba(ss); + ba << static_cast<const T&>(val); + stream_contents = ss.str(); + boost::archive::binary_iarchive ib(ss); + T val2; + ib >> val2; + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + val = -val; + ++test_id; + boost::archive::text_oarchive oa2(ss); + oa2 << static_cast<const T&>(val); + stream_contents = ss.str(); + boost::archive::text_iarchive ia2(ss); + T val2; + ia2 >> val2; + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + ++test_id; + { + boost::archive::xml_oarchive oa2(ss); + oa2 << boost::serialization::make_nvp("value", static_cast<const T&>(val)); + stream_contents = ss.str(); + } + boost::archive::xml_iarchive ia2(ss); + T val2; + ia2 >> boost::serialization::make_nvp("value", val2); + BOOST_CHECK_EQUAL(val, val2); + } + { + std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + ++test_id; + boost::archive::binary_oarchive ba2(ss); + ba2 << static_cast<const T&>(val); + stream_contents = ss.str(); + boost::archive::binary_iarchive ib2(ss); + T val2; + ib2 >> val2; + BOOST_CHECK_EQUAL(val, val2); + } +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const boost::exception& e) + { + std::cout << "Caught boost::exception with:\n"; + std::cout << diagnostic_information(e); + std::cout << "Failed test ID = " << test_id << std::endl; + std::cout << "Stream contents were: \n" + << stream_contents << std::endl; + ++boost::detail::test_errors(); + break; + } + catch (const std::exception& e) + { + std::cout << "Caught std::exception with:\n"; + std::cout << e.what() << std::endl; + std::cout << "Failed test ID = " << test_id << std::endl; + std::cout << "Stream contents were: \n" + << stream_contents << std::endl; + ++boost::detail::test_errors(); + break; + } +#endif + // + // Check to see if test is taking too long. + // Tests run on the compiler farm time out after 300 seconds, + // so don't get too close to that: + // +#ifndef CI_SUPPRESS_KNOWN_ISSUES + if (tim.elapsed() > 150) +#else + if (tim.elapsed() > 25) +#endif + { + std::cout << "Timeout reached, aborting tests now....\n"; + break; + } + } +} + +#endif diff --git a/src/boost/libs/multiprecision/test/test_fpclassify.cpp b/src/boost/libs/multiprecision/test/test_fpclassify.cpp new file mode 100644 index 00000000..2549d098 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_fpclassify.cpp @@ -0,0 +1,412 @@ +// Copyright John Maddock 2006. +// Copyright Paul A. Bristow 2007 +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <cmath> +#include <math.h> +#include <boost/limits.hpp> +#include <boost/math/special_functions/fpclassify.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPQ) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_MPFR_50 +#define TEST_MPFI_50 +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_MPFR_50 +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_MPFI_50 +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +#ifdef _MSC_VER +#pragma warning(disable : 4127) // conditional expression is constant +#endif + +const char* method_name(const boost::math::detail::native_tag&) +{ + return "Native"; +} + +const char* method_name(const boost::math::detail::generic_tag<true>&) +{ + return "Generic (with numeric limits)"; +} + +const char* method_name(const boost::math::detail::generic_tag<false>&) +{ + return "Generic (without numeric limits)"; +} + +const char* method_name(const boost::math::detail::ieee_tag&) +{ + return "IEEE std"; +} + +const char* method_name(const boost::math::detail::ieee_copy_all_bits_tag&) +{ + return "IEEE std, copy all bits"; +} + +const char* method_name(const boost::math::detail::ieee_copy_leading_bits_tag&) +{ + return "IEEE std, copy leading bits"; +} + +template <class T> +void test() +{ + T t = 2; + T u = 2; + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NORMAL); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NORMAL); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0)); + if (std::numeric_limits<T>::is_specialized) + { + t = (std::numeric_limits<T>::max)(); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NORMAL); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NORMAL); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0)); + t = (std::numeric_limits<T>::min)(); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NORMAL); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NORMAL); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0)); + } + if (std::numeric_limits<T>::has_denorm) + { + t = (std::numeric_limits<T>::min)(); + t /= 2; + if (t != 0) + { + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_SUBNORMAL); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_SUBNORMAL); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0)); + } + t = std::numeric_limits<T>::denorm_min(); + if ((t != 0) && (t < (std::numeric_limits<T>::min)())) + { + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_SUBNORMAL); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_SUBNORMAL); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0)); + } + } + else + { + std::cout << "Denormalised forms not tested" << std::endl; + } + t = 0; + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_ZERO); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_ZERO); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0)); + t /= -u; // create minus zero if it exists + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_ZERO); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_ZERO); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0)); + // infinity: + if (std::numeric_limits<T>::has_infinity) + { + // At least one std::numeric_limits<T>::infinity)() returns zero + // (Compaq true64 cxx), hence the check. + t = (std::numeric_limits<T>::infinity)(); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_INFINITE); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_INFINITE); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0)); +#if !defined(__BORLANDC__) && !(defined(__DECCXX) && !defined(_IEEE_FP)) + // divide by zero on Borland triggers a C++ exception :-( + // divide by zero on Compaq CXX triggers a C style signal :-( + t = 2; + u = 0; + t /= u; + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_INFINITE); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_INFINITE); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0)); + t = -2; + t /= u; + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_INFINITE); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_INFINITE); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (::boost::math::fpclassify)(t + 0)); +#else + std::cout << "Infinities from divide by zero not tested" << std::endl; +#endif + } + else + { + std::cout << "Infinity not tested" << std::endl; + } +#ifndef __BORLANDC__ + // NaN's: + // Note that Borland throws an exception if we even try to obtain a Nan + // by calling std::numeric_limits<T>::quiet_NaN() !!!!!!! + if (std::numeric_limits<T>::has_quiet_NaN) + { + t = std::numeric_limits<T>::quiet_NaN(); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NAN); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NAN); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false); + } + else + { + std::cout << "Quiet NaN's not tested" << std::endl; + } + if (std::numeric_limits<T>::has_signaling_NaN) + { + t = std::numeric_limits<T>::signaling_NaN(); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NAN); + BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NAN); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false); + BOOST_CHECK_EQUAL((::boost::math::isnan)(t), true); + BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), true); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), false); + BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), false); + } + else + { + std::cout << "Signaling NaN's not tested" << std::endl; + } +#endif + // + // Try sign manipulation functions as well: + // + T one(1), minus_one(-1), zero(0); + BOOST_CHECK((::boost::math::sign)(one) > 0); + BOOST_CHECK((::boost::math::sign)(minus_one) < 0); + BOOST_CHECK((::boost::math::sign)(zero) == 0); + BOOST_CHECK((::boost::math::sign)(one + 2) > 0); + BOOST_CHECK((::boost::math::sign)(minus_one - 30) < 0); + BOOST_CHECK((::boost::math::sign)(-zero) == 0); + + BOOST_CHECK((::boost::math::signbit)(one) == 0); + BOOST_CHECK((::boost::math::signbit)(minus_one) > 0); + BOOST_CHECK((::boost::math::signbit)(zero) == 0); + BOOST_CHECK((::boost::math::signbit)(one + 2) == 0); + BOOST_CHECK((::boost::math::signbit)(minus_one - 30) > 0); + //BOOST_CHECK((::boost::math::signbit)(-zero) == 0); + + BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(one)) > 0); + BOOST_CHECK_EQUAL(boost::math::changesign(one), minus_one); + BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(minus_one)) == 0); + BOOST_CHECK_EQUAL(boost::math::changesign(minus_one), one); + //BOOST_CHECK((::boost::math::signbit)(zero) == 0); + BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(one + 2)) > 0); + BOOST_CHECK_EQUAL(boost::math::changesign(one + 2), -3); + BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(minus_one - 30)) == 0); + BOOST_CHECK_EQUAL(boost::math::changesign(minus_one - 30), 31); + //BOOST_CHECK((::boost::math::signbit)(-zero) == 0); + + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(one, one)) == 0); + BOOST_CHECK_EQUAL(boost::math::copysign(one, one), one); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(one, minus_one)) > 0); + BOOST_CHECK_EQUAL(boost::math::copysign(one, minus_one), minus_one); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(minus_one, one)) == 0); + BOOST_CHECK_EQUAL(boost::math::copysign(minus_one, one), one); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(minus_one, minus_one)) > 0); + BOOST_CHECK_EQUAL(boost::math::copysign(minus_one, minus_one), minus_one); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(one + 1, one + 2)) == 0); + BOOST_CHECK_EQUAL(boost::math::copysign(one + 1, one + 2), 2); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(one + 30, minus_one - 20)) > 0); + BOOST_CHECK_EQUAL(boost::math::copysign(one + 30, minus_one - 20), -31); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(minus_one + 2, one + 2)) == 0); + BOOST_CHECK_EQUAL(boost::math::copysign(minus_one - 2, one + 2), 3); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(minus_one - 20, minus_one - 30)) > 0); + BOOST_CHECK_EQUAL(boost::math::copysign(minus_one - 20, minus_one - 30), -21); + + // Things involving signed zero, need to detect it first: + T neg_zero_test = -(std::numeric_limits<T>::min)(); + neg_zero_test /= (std::numeric_limits<T>::max)(); + if (std::numeric_limits<T>::has_infinity && (one / neg_zero_test < 0)) + { +#ifndef TEST_MPFI_50 + // Note that testing this with mpfi is in the "too difficult" drawer at present. + std::cout << neg_zero_test << std::endl; + BOOST_CHECK_EQUAL(neg_zero_test, 0); + BOOST_CHECK((::boost::math::sign)(neg_zero_test) == 0); + // We got -INF, so we have a signed zero: + BOOST_CHECK((::boost::math::signbit)(neg_zero_test) > 0); + BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(zero)) > 0); + BOOST_CHECK_EQUAL(boost::math::changesign(zero), 0); + BOOST_CHECK((::boost::math::signbit)(boost::math::changesign(neg_zero_test)) == 0); + BOOST_CHECK_EQUAL(boost::math::changesign(neg_zero_test), 0); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(zero, one)) == 0); + BOOST_CHECK_EQUAL(boost::math::copysign(zero, one), 0); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(zero, minus_one)) > 0); + BOOST_CHECK_EQUAL(boost::math::copysign(zero, minus_one), 0); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(neg_zero_test, one)) == 0); + BOOST_CHECK_EQUAL(boost::math::copysign(neg_zero_test, one), 0); + BOOST_CHECK((::boost::math::signbit)(boost::math::copysign(neg_zero_test, minus_one)) > 0); + BOOST_CHECK_EQUAL(boost::math::copysign(neg_zero_test, minus_one), 0); +#endif + } +} + +int main() +{ + BOOST_MATH_CONTROL_FP; + // start by printing some information: +#ifdef isnan + std::cout << "Platform has isnan macro." << std::endl; +#endif +#ifdef fpclassify + std::cout << "Platform has fpclassify macro." << std::endl; +#endif +#ifdef BOOST_HAS_FPCLASSIFY + std::cout << "Platform has FP_NORMAL macro." << std::endl; +#endif + std::cout << "FP_ZERO: " << (int)FP_ZERO << std::endl; + std::cout << "FP_NORMAL: " << (int)FP_NORMAL << std::endl; + std::cout << "FP_INFINITE: " << (int)FP_INFINITE << std::endl; + std::cout << "FP_NAN: " << (int)FP_NAN << std::endl; + std::cout << "FP_SUBNORMAL: " << (int)FP_SUBNORMAL << std::endl; + +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#endif +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_generic_conv.cpp b/src/boost/libs/multiprecision/test/test_generic_conv.cpp new file mode 100644 index 00000000..33a09b66 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_generic_conv.cpp @@ -0,0 +1,204 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/random.hpp> + +#ifdef TEST_GMP +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef TEST_MPFR +#include <boost/multiprecision/mpfr.hpp> +#endif + +int main() +{ + using namespace boost::multiprecision; + using namespace boost::random; + + independent_bits_engine<mt11213b, 1024, cpp_int> gen; + mt11213b small_gen; + + for (unsigned i = 0; i < 100; ++i) + { + cpp_int c = gen(); + // + // Integer to integer conversions first: + // +#ifdef TEST_GMP + mpz_int z(c); + cpp_int t(z); + BOOST_CHECK_EQUAL(t, c); + z.assign(-c); + t.assign(-z); + BOOST_CHECK_EQUAL(t, c); +#endif +#ifdef TEST_TOMMATH + tom_int tom(c); + cpp_int t2(tom); + BOOST_CHECK_EQUAL(t2, c); + tom.assign(-c); + t2.assign(-tom); + BOOST_CHECK_EQUAL(t2, c); +#endif + // + // Now integer to float: + // + typedef number<cpp_dec_float<500> > dec_float_500; + dec_float_500 df(c); + dec_float_500 df2(c.str()); + BOOST_CHECK_EQUAL(df, df2); + df.assign(-c); + df2 = -df2; + BOOST_CHECK_EQUAL(df, df2); +#ifdef TEST_GMP + typedef number<gmp_float<500> > mpf_type; + mpf_type mpf(c); + mpf_type mpf2(c.str()); + BOOST_CHECK_EQUAL(mpf, mpf2); + mpf.assign(-c); + mpf2 = -mpf2; + BOOST_CHECK_EQUAL(mpf, mpf2); +#endif +#ifdef TEST_MPFR + typedef number<mpfr_float_backend<500> > mpfr_type; + mpfr_type mpfr(c); + mpfr_type mpfr2(c.str()); + BOOST_CHECK_EQUAL(mpfr, mpfr2); + mpfr.assign(-c); + mpfr2 = -mpfr2; + BOOST_CHECK_EQUAL(mpfr, mpfr2); +#endif + // + // Now float to float: + // + df.assign(c); + df /= dec_float_500(gen()); + dec_float_500 tol("1e-500"); +#ifdef TEST_GMP + mpf.assign(df); + mpf2 = static_cast<mpf_type>(df.str()); + BOOST_CHECK_EQUAL(mpf, mpf2); + df.assign(mpf); + df2 = static_cast<dec_float_500>(mpf.str()); + BOOST_CHECK(fabs((df - df2) / df) < tol); +#endif +#ifdef TEST_MPFR + mpfr.assign(df); + mpfr2 = static_cast<mpfr_type>(df.str()); + BOOST_CHECK_EQUAL(mpfr, mpfr2); + df.assign(mpfr); + df2 = static_cast<dec_float_500>(mpfr.str()); + BOOST_CHECK(fabs((df - df2) / df) < tol); +#endif + // + // Rational to rational conversions: + // + cpp_rational cppr(c, gen()), cppr2, cppr3; +#ifdef TEST_GMP + mpq_rational mpq(cppr); + cppr2.assign(mpq); + BOOST_CHECK_EQUAL(cppr, cppr2); +#endif +#ifdef TEST_TOMMATH + tom_rational tr(cppr); + cppr3.assign(tr); + BOOST_CHECK_EQUAL(cppr, cppr3); +#endif + // + // Integer to rational conversions: + // +#ifdef TEST_GMP + mpq.assign(c); + mpq_rational mpq2 = static_cast<mpq_rational>(c.str()); + BOOST_CHECK_EQUAL(mpq, mpq2); +#endif +#ifdef TEST_TOMMATH + tr.assign(c); + tom_rational tr2 = static_cast<tom_rational>(c.str()); + BOOST_CHECK_EQUAL(tr, tr2); +#endif + // + // Rational to float: + // + df.assign(cppr); + df2.assign(numerator(cppr)); + df2 /= dec_float_500(denominator(cppr)); + BOOST_CHECK(fabs(df - df2) / df2 < tol); + // + // Float to rational: + // + static const int max_range = std::numeric_limits<double>::digits >= std::numeric_limits<int>::digits ? (std::numeric_limits<int>::max)() : (1 << (std::numeric_limits<double>::digits - 1)) - 1; + static const int min_range = std::numeric_limits<double>::digits >= std::numeric_limits<int>::digits ? (std::numeric_limits<int>::min)() : -(1 << (std::numeric_limits<double>::digits - 1)) + 1; + static const boost::random::uniform_int_distribution<> i_val_dist(min_range, max_range); + static const boost::random::uniform_int_distribution<> i_exp_dist(std::numeric_limits<double>::min_exponent, std::numeric_limits<double>::max_exponent - 2 - std::numeric_limits<int>::digits); + int iv = i_val_dist(small_gen); + int eval = i_exp_dist(small_gen); + double dv = iv; + dv = ldexp(dv, eval); + cppr = dv; + cppr2 = iv; + cpp_int cppi = 1; + cppi <<= abs(eval); + if (eval < 0) + cppr2 /= cppi; + else + cppr2 *= cppi; + BOOST_CHECK_EQUAL(cppr, cppr2); + // + // Again but with bigger numbers: + // + cpp_int cppi2 = gen(); + number<cpp_bin_float<1030> > cppbf(cppi2); + cppbf = ldexp(cppbf, eval); + cppr.assign(cppbf); + cppr2 = cppi2; + if (eval < 0) + cppr2 /= cppi; + else + cppr2 *= cppi; + BOOST_CHECK_EQUAL(cppr, cppr2); + // + // MSVC will compile either the code above, or + // the code below, but not both in the same file. + // Other compilers including Intel in msvc-compatibity + // mode have no such difficulty. Indeed the fact that + // the presence of the code below causes the code above to + // fail to compile strongly suggests a compiler bug. + // +#if !defined(BOOST_MSVC) + // + // Again but with bigger base 10 numbers: + // + number<cpp_dec_float<std::numeric_limits<int1024_t>::digits10 + 3> > cppdec2(cppi2); + cppdec2 = scalbn(cppdec2, eval); + cppr.assign(cppdec2); + cppr2 = cppi2; + cppi = 10; + cppi = pow(cppi, abs(eval)); + if (eval < 0) + cppr2 /= cppi; + else + cppr2 *= cppi; + BOOST_CHECK_EQUAL(cppr, cppr2); +#endif + } + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_gmp_conversions.cpp b/src/boost/libs/multiprecision/test/test_gmp_conversions.cpp new file mode 100644 index 00000000..906f175a --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_gmp_conversions.cpp @@ -0,0 +1,155 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#include <boost/multiprecision/gmp.hpp> + +int main() +{ + using namespace boost::multiprecision; + // + // Test interconversions between GMP supported backends: + // + mpf_t mpf; + mpz_t mpz; + mpq_t mpq; + mpf_init2(mpf, 100); + mpf_set_ui(mpf, 2u); + mpz_init(mpz); + mpz_set_ui(mpz, 2u); + mpq_init(mpq); + mpq_set_ui(mpq, 2u, 1u); + + BOOST_TEST(mpf_float(mpf) == 2); + BOOST_TEST(mpf_float_50(mpf) == 2); + BOOST_TEST(mpf_float(mpz) == 2); + BOOST_TEST(mpf_float_50(mpz) == 2); + BOOST_TEST(mpf_float(mpq) == 2); + BOOST_TEST(mpf_float_50(mpq) == 2); + + mpf_float f0; + mpf_float_50 f50; + f0 = mpf; + BOOST_TEST(f0 == 2); + f0 = 0; + f0 = mpz; + BOOST_TEST(f0 == 2); + f0 = 0; + f0 = mpq; + BOOST_TEST(f0 == 2); + + f50 = mpf; + BOOST_TEST(f50 == 2); + f50 = 0; + f50 = mpz; + BOOST_TEST(f50 == 2); + f50 = 0; + f50 = mpq; + BOOST_TEST(f50 == 2); + + f50 = 4; + f0 = f50; + BOOST_TEST(f0 == 4); + f0 = 3; + f50 = f0; + BOOST_TEST(f50 == 3); + f50 = 4; + BOOST_TEST(mpf_float(f50) == 4); + BOOST_TEST(mpf_float_50(f0) == 3); + + mpz_int iz(2); + mpq_rational rat(2); + f50 = iz; + BOOST_TEST(f50 == 2); + f0 = iz; + BOOST_TEST(f0 == 2); + BOOST_TEST(mpf_float(iz) == 2); + BOOST_TEST(mpf_float_50(iz) == 2); + BOOST_TEST(mpf_float(rat) == 2); + BOOST_TEST(mpf_float_50(rat) == 2); + + BOOST_TEST(mpz_int(mpf) == 2); + BOOST_TEST(mpz_int(mpz) == 2); + BOOST_TEST(mpz_int(mpq) == 2); + iz = 3; + iz = mpz_int(mpf); // explicit conversion only + BOOST_TEST(iz == 2); + iz = 3; + iz = mpz; + BOOST_TEST(iz == 2); + iz = 4; + iz = mpz_int(mpq); // explicit conversion only + BOOST_TEST(iz == 2); + f0 = 2; + f50 = 2; + + BOOST_TEST(mpz_int(f0) == 2); + BOOST_TEST(mpz_int(f50) == 2); + rat = 2; + BOOST_TEST(mpz_int(rat) == 2); + iz = 3; + iz = static_cast<mpz_int>(f0); + BOOST_TEST(iz == 2); + iz = 3; + iz = static_cast<mpz_int>(f50); + BOOST_TEST(iz == 2); + iz = 3; + iz = static_cast<mpz_int>(rat); + BOOST_TEST(iz == 2); + + BOOST_TEST(mpq_rational(mpz) == 2); + BOOST_TEST(mpq_rational(mpq) == 2); + BOOST_TEST(mpq_rational(iz) == 2); + rat = 3; + rat = mpz; + BOOST_TEST(rat == 2); + rat = 3; + rat = mpq; + BOOST_TEST(rat == 2); + rat = 3; + rat = iz; + BOOST_TEST(rat == 2); + + iz = numerator(rat); + BOOST_TEST(iz == 2); + iz = denominator(rat); + BOOST_TEST(iz == 1); + + // + // Conversions involving precision only, + // note that mpf_t precisions are only approximate: + // + mpf_float::default_precision(30); + f50 = 2; + mpf_float_100 f100(3); + mpf_float f0a(4); + mpf_float f0b(f100); + BOOST_TEST(f0a.precision() >= 30); + BOOST_TEST(f0b.precision() >= 100); + f0a = f100; + BOOST_TEST(f0a == 3); + BOOST_TEST(f0a.precision() >= 100); + + f100 = f50; + BOOST_TEST(f100 == 2); + + mpf_clear(mpf); + mpz_clear(mpz); + mpq_clear(mpq); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_hash.cpp b/src/boost/libs/multiprecision/test/test_hash.cpp new file mode 100644 index 00000000..2572d1ba --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_hash.cpp @@ -0,0 +1,98 @@ +// Copyright John Maddock 2015. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/multiprecision/debug_adaptor.hpp> +#include <boost/multiprecision/logged_adaptor.hpp> + +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_GMP +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_MPFR +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_MPFI +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif + +#include <boost/functional/hash.hpp> + +#include "test.hpp" +#include <iostream> +#include <iomanip> + +template <class T> +void test() +{ + T val = 23; + std::size_t t1 = boost::hash<T>()(val); + BOOST_CHECK(t1); + +#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL + std::size_t t2 = std::hash<T>()(val); + BOOST_CHECK_EQUAL(t1, t2); +#endif + val = -23; + std::size_t t3 = boost::hash<T>()(val); + BOOST_CHECK_NE(t1, t3); +#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL + t2 = std::hash<T>()(val); + BOOST_CHECK_EQUAL(t3, t2); +#endif +} + +int main() +{ + test<boost::multiprecision::cpp_int>(); + test<boost::multiprecision::checked_int1024_t>(); + //test<boost::multiprecision::checked_uint512_t >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > >(); + + test<boost::multiprecision::cpp_bin_float_100>(); + test<boost::multiprecision::cpp_dec_float_100>(); + + test<boost::multiprecision::cpp_rational>(); + + test<boost::multiprecision::number<boost::multiprecision::debug_adaptor<boost::multiprecision::cpp_int::backend_type> > >(); + + test<boost::multiprecision::number<boost::multiprecision::logged_adaptor<boost::multiprecision::cpp_int::backend_type> > >(); + +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_GMP + test<boost::multiprecision::mpz_int>(); + test<boost::multiprecision::mpq_rational>(); + test<boost::multiprecision::mpf_float>(); +#endif + +#ifdef TEST_MPFR + test<boost::multiprecision::mpfr_float_50>(); +#endif +#ifdef TEST_MPFI + test<boost::multiprecision::mpfi_float_50>(); +#endif + +#ifdef TEST_TOMMATH + test<boost::multiprecision::tom_int>(); + test<boost::multiprecision::tom_rational>(); +#endif + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_int_io.cpp b/src/boost/libs/multiprecision/test/test_int_io.cpp new file mode 100644 index 00000000..1b8d73d2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_int_io.cpp @@ -0,0 +1,177 @@ +// Copyright John Maddock 2011. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if !defined(TEST_MPZ) && !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT) +#define TEST_TOMMATH +#define TEST_MPZ +#define TEST_CPP_INT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPZ) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_TOMMATH) +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef TEST_CPP_INT +#include <boost/multiprecision/cpp_int.hpp> +#endif + +#include <boost/algorithm/string/case_conv.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include "test.hpp" +#include <iostream> +#include <iomanip> + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class T> +struct unchecked_type +{ + typedef T type; +}; + +#ifdef TEST_CPP_INT +template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, boost::multiprecision::cpp_int_check_type Checked, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct unchecked_type<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates> > +{ + typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<MinBits, MaxBits, SignType, boost::multiprecision::unchecked, Allocator>, ExpressionTemplates> type; +}; +#endif + +template <class T> +T generate_random() +{ + typedef typename unchecked_type<T>::type unchecked_T; + + static const unsigned limbs = std::numeric_limits<T>::is_specialized && std::numeric_limits<T>::is_bounded ? std::numeric_limits<T>::digits / std::numeric_limits<unsigned>::digits + 3 : 20; + + static boost::random::uniform_int_distribution<unsigned> ui(0, limbs); + static boost::random::mt19937 gen; + unchecked_T val = gen(); + unsigned lim = ui(gen); + for (unsigned i = 0; i < lim; ++i) + { + val *= (gen.max)(); + val += gen(); + } + return val; +} + +template <class T> +void do_round_trip(const T& val, std::ios_base::fmtflags f) +{ + std::stringstream ss; +#ifndef BOOST_NO_CXX11_NUMERIC_LIMITS + ss << std::setprecision(std::numeric_limits<T>::max_digits10); +#else + ss << std::setprecision(std::numeric_limits<T>::digits10 + 5); +#endif + ss.flags(f); + ss << val; + T new_val = static_cast<T>(ss.str()); + BOOST_CHECK_EQUAL(new_val, val); + new_val = static_cast<T>(val.str(0, f)); + BOOST_CHECK_EQUAL(new_val, val); + ss >> new_val; + BOOST_CHECK_EQUAL(new_val, val); +} + +template <class T> +void do_round_trip(const T& val) +{ + do_round_trip(val, std::ios_base::fmtflags(0)); + if (val >= 0) + { + do_round_trip(val, std::ios_base::fmtflags(std::ios_base::showbase | std::ios_base::hex)); + do_round_trip(val, std::ios_base::fmtflags(std::ios_base::showbase | std::ios_base::oct)); + } +} + +template <class T> +void negative_round_trip(T val, const boost::mpl::true_&) +{ + do_round_trip(T(-val)); +} +template <class T> +void negative_round_trip(T, const boost::mpl::false_&) +{ +} + +template <class T> +void negative_spots(const boost::mpl::true_&) +{ + BOOST_CHECK_EQUAL(T(-1002).str(), "-1002"); + if (!std::numeric_limits<T>::is_modulo) + { +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(T(-2).str(0, std::ios_base::oct), std::runtime_error); + BOOST_CHECK_THROW(T(-2).str(0, std::ios_base::hex), std::runtime_error); +#endif + } +} +template <class T> +void negative_spots(const boost::mpl::false_&) +{ +} + +template <class T> +void test_round_trip() +{ + for (unsigned i = 0; i < 1000; ++i) + { + T val = generate_random<T>(); + do_round_trip(val); + negative_round_trip(val, boost::mpl::bool_<std::numeric_limits<T>::is_signed>()); + } + + BOOST_CHECK_EQUAL(T(1002).str(), "1002"); + BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::showpos), "+1002"); + BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::oct), "1752"); + BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::oct | std::ios_base::showbase), "01752"); + BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::hex), "3ea"); + BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::hex | std::ios_base::showbase), "0x3ea"); + BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::hex | std::ios_base::uppercase), "3EA"); + BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::hex | std::ios_base::showbase | std::ios_base::uppercase), "0X3EA"); + BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::dec), "1002"); + BOOST_CHECK_EQUAL(T(1002).str(0, std::ios_base::dec | std::ios_base::showbase), "1002"); + + negative_spots<T>(boost::mpl::bool_<std::numeric_limits<T>::is_signed>()); +} + +int main() +{ +#ifdef TEST_MPZ + test_round_trip<boost::multiprecision::mpz_int>(); +#endif +#ifdef TEST_TOMMATH + test_round_trip<boost::multiprecision::tom_int>(); +#endif +#ifdef TEST_CPP_INT + test_round_trip<boost::multiprecision::cpp_int>(); + test_round_trip<boost::multiprecision::checked_int1024_t>(); + test_round_trip<boost::multiprecision::checked_uint512_t>(); + test_round_trip<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > >(); + test_round_trip<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_log.cpp b/src/boost/libs/multiprecision/test/test_log.cpp new file mode 100644 index 00000000..8165962d --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_log.cpp @@ -0,0 +1,261 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +//# define TEST_MPF +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFR_50 +#define TEST_MPFI_50 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_MPFR_50 +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_MPFI_50 +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +void test() +{ + std::cout << "Testing type " << typeid(T).name() << std::endl; + static const boost::array<const char*, 101> data = + {{ + "-2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806", + "10.355073440919378699690477472036470469315794905372650461119520557405966250191554948388847794306923706128373152780234988638443954821327953543032075228882306893901540038156503265416950932549208174713640840670002321534598356631953006304821201484830902632165858733357596733427094375150860310219829690440417223992885533566388118595248523193740778052893647271700612136670114224280374211626787106078693643289", + "11.741365414719872359995630593475834957852130639032528348910839621576752378207582766840832626901446337859064321328454096088656817987112409176281442608184950888327275070356290649885618053367245169005379545357345645235094776018156840041023694466493107510640907700621694994008944652785168884717808235919056023540605910031676977750466679901495978099025342154131430098841939052890393197699093697421676686108", + "12.552295188839391064403078983058501313786961042419051509346988474726615643710688192053158471717695991904853941837387256340073310064341282022830248452137946273986542713154937759697687656073485311102053666502633006429446632794099471395918827441203897096147814416727830805903830888831170139661499031930347916453836121200110772307492771615813954882033814741470466415076136175748560866462690250372712624427", + "13.12765917900902322346243585913156826327069465639834188399662474212182724479008698347907678965083909936781641397385483495362268256360763444317213586059490467781653518008717313901614800566992248144716374322429987750723867821114358979404591879648104388637035609754399283274014767545593886580941165664957384975221949645055255781874944374229417864853289321901220692566918330756199433299461690335766708584", + "13.573946210017730027239177097297058651455670148127333215055495986565964988037166389618503523561570994165268599045375753512400565200059790703280760252213714757212213525833556727462647729566258301490115414864748436290794191111843775262434063842232241185107471214859854864335150887423144285468856056851239653315249148749701603523173627966758652109489308872414194066451074827802642589890222384815709071028", + "13.938589284701101831675037903832444894846690407420628610481163937380536465305805316181768586604603341197033655576371082304146219991693253987043452241307224478718013872459287813264283001906622959681872321576087143975972033651747378310838673897181549722528073649569290162541997276292708638316653324605571398691171391912961431088832002969546541039753774950645926800096854799942237644831671997679785482847", + "14.246890620897408672445451566098178524763429935510610216690355229695078778430708804421870639655370744549370273426124295240527401708361100923871708589722651960428863955835558634640426846383161118062310502176054546468600516588908689567134867002953229862887953032595529925511011383644740837050282379317993152702704798000312156694502691021267028423979454580574052732764336948692001989411724963233511159783", + "14.51395339092117324610526432755496036199337959182144260442491096061930765841595850793460014941610881052330595683873016973224744403781498772061971443926277312865243350174522677227134957935047605429941424114476598970997223505479765426888886686275495180653025817201214478249415383537946915840293549927935267010481189550187682053892807264533011114305883442850485847010726074555176479027986850883182954118", + "14.749519451795537716462643672888549370666057639128212044001868590062813335472483708120056955187220713486931180221186191741860718823347399129280491176499608998857949407351247432513825095161942372289203657231256344909997480732110798704027258108845584594081552703009126596026870753341888414903979390651641367952487019992866762344920748102417282166652161104367292712971759633790964534907923779335451109079", + "14.960240475644662390024535772058360495972689995692264619118050620984863397335883147741001175137837088856196207660064061839685086120444324885420172384357780225067863432546453923434326358834374021700709153791633034800554630092122384413882780201869241166113270104158152592921242256738530713688528178980864650875690860545577283508963373084295388766350046816560200649161822618828666606722223620871032632611", + "15.150860829728925816270269964092673433542841210964830162793225770535551518840933315190406262273098573795238063523955485390896001670839635976377071048140363687808579387495186737492639543519534774851635101169579614712607935494886581440494071142193798729857001548284675533558490478467589884332536443679208006567281631805562767928329937083844501800478013385969649342207304490375728237042482944784544838254", + "15.324883579506436493570233597448883519693351814374549397498489035148221882270042436654099306811313261346823941672888447313628931256927773946985727814886420570056552118783468127543676769633344136209500636666830026098080195180498059221494203817961212365532443050015541947762494604799890429565189588245725920948145579035449699519788465993549043152027361890729572024195346130030456992216388648768722394836", + "15.484968991583560712862164152602532972505596882865402498065644250737301955125596006515274461619204302558285733320299957799185995441209009451408808376560872924206710117585718578727591708553957297729203457443101522435265312291388453827953066056871634785359329503731609907767433693085428240202927311226115616775436485821324503901092891486358733365244513748729928672060637178808283856096451123227237766837", + "15.633184933296400322886411216914351313442169047575854720677392808712745585778888867637029115450088924031428350724038141381219620588274493330817678181565157141965018413952386880843987389414299029950277357119925470077396582940505069596480801954154029286187951921181728705116872415271634077604874063371227144842898712603028462623610688275714711124501733417572553751110494225479183571648948845731888607993", + "15.771170674177108994750017157264759379388540187789301748807798065200414118407271774235601089093934343495795521812477515931432709195503245641975701807702026215615357450518151317247119115864533992757135781852491298348627270712291588580073932563653614422839620206266586292520948221873093053975823776289996754936187304352159896156876771015468496811587576227636095095473566772184717633945339405330371627545", + "15.900247714739125237305645451417508966665591345786220672552302840334525160137723176098165167253830541655084109190400464710649206788771240950251243759258268060695212680017248831015574286848979270728739089100870231114250075432989803029255029492399141798408644860336753530942734586654467728627658977642688053752033223720047083446705808444218983029996407752310091763448795485193086044050699179075227514085", + "16.021496956952197922992283502641894579962626483154818954043789565712934054541190510263229676242727892630672492409948339732534439120465067507199758379167701667321617794907607307728874859663168072318224068053703928672394393376652024298292046951118253912008558176064907492479298408285769067404165601995001682495873893492451380569168665052480684672167775365328449822100602627386235888117607629689989295358", + "16.135813783442291449575041100809653925479234724736343542177079039059170241908162244448865517513646317913575323823536275208044355623776985732503939829900060864487127004364547143183319169525031486430688761890355067541570726092642869160866842639424318480923069734468346837396224375681293323049896437786794370196393419740684520457519876260717581058279975484300455393801884203407282602155622048760192869731", + "16.243948224975912162101874242338089698927747514172297963501304802721456885123447742525917146000081948350317670558217990170315910524955950657647628011646020228669505156094231753926456488583104510177838897523717492728937537629972877557426292386450904986250829454391823373783104867874948543639133365724217397301073161382317429508046689262594057712721480553629716238053162259132557499326959178271755311819", + "16.346534812891312020017737390565972522861639520956794183631801030677318559517349930264816297286373068267542772472219372292428845683416042271115312027071601889325060155482892443418582095080544516697369324049179348198348320350032057951783059238791085449471373733253488008998200818236407442435705194113745206455080467406424910471012832247972967952311217374959559350158619575075500673005632848486334892081", + "16.444115140490340128500589643685615592593325439192231430163649023292793816677629077048173396104592590442505550803932707806677495894373323443853064668488945973357469342360809555842080876327526869093152265593359032627507962690981132695345232937664935403696772586286371082469152648334224734697834132478315542287352614722743239776066558016553826776123247656549922477370984130115175375533899599151832866777", + "16.537155171118865136534989063582757364253199496897225305411818162632163606557745471767961160436879104964882723479325928591604518246962419687548390063992529356693298596378658322800277364077966826234091623459656551097008920549618056923279473982070326894236928331513682937597704431571923632859325944958271156630648510192786810276479282782233678225160061893949554276261365074478039201200141096034185340788", + "16.626058695701082390621404187251773798561764113151150041596109882112467488919141098521165822165293765039118029510544981683905860141438867442019067534265891760023149100317968826679154566584457042877767867250357368225093921585968539417839705388349710086788853906351301543791493808667435475597486845630653110450254081800953162013336880338884388603160347478448669890791767227275369657780841518987171046251", + "16.711177924047687436041681081297469757517395732698719962499711839818824068470368594816509809165130772248099176990649818696451892735033114399817499272685517472929769530848678764490613732856699010061350335113220658748043901782349324603111802594973838523650919828685995473213566914734286172266839140529583990377667556754261878256224596588519392559788652514828861263680954096492024398529162625680677258884", + "16.792821912654942574589969785414406627855177803111176492774370259331640542125643510644899208865670120639893723574191986313708664152776559897034386961403215067476041927571306948209653637016541256814370701598681758297129259567548154765775910932763810160923332344469835976310776610418278334876476195529920021337399751846302536974621623453741347064741080510495703994896565552519309503521053051550623483165", + "16.871263338577273117049933407315211807184894736082799946337588399915643695388836578819581481279897851015095335198849942961931601540668917787952832251688896660707943869197097893837964754891796695592066084995854170120209827918603483811654385230282025426754327077293929504883381435192439219366582495078959939830875435944938000044089717015334115741229281828493468876793032191535756728196375330663180727281", + "16.946743994200631806033476403925371852051109645526740171061759524387799979304956484613870531865187139791227191840781754383935422487885452369507952721547705027535773654885832127821314459521240798742974634464887793874048016231828535132695506414037947185201173465247385982934992490469404967587724592554548395276895353595409898385619478502390678687463962622836411208115179925881515699871702165077675857036", + "17.019479282236065828727803356580529388797042464710975507911282243104151862598751845439937481303609237769338953879291798328663979939210753132559510492288100384177867237190989151135211416672909332732482371326996189543048703303285313799031214641216166381411885795576234361808712082618702464622338883787915216150436372783047860816587095332458688921705641277515576461385290501276378977328383137813013202605", + "17.089661921583428533920885090473894674921519340994685086552627218992626938319872359613748323826158856027837200411438668460410538403836237956276065714403575420148736981655027235218177614075251822388622713232585428029969533906061654341819894513492491624632974192525592636008127939368987600981961744622054023981036109865947530952316809705151315101400446930619393266624895135955182323721805890693892489067", + "17.157465024686670167940702199808038440453826682770881229464136716214305217066325160993039686330328188786987064692354236198505670650108871009195717920051441546822338399371747349503874711833721760676087218038457960626001087951737722106836691584985009357268276351001658789309901363541541142239028890280836555429745898638761562947010206765922958485242984359891337645169887782296197402533921841201821435322", + "17.223044670108153088406971612680579462250390145455205711423224535559905829397735171751863831903325186673310251936245608147861310604382786127429364616442074955520795624793164764110780962566943990430036624945190166480864873260501647262851147587875798742974124100786387378932173276365815649310057053480347330487890156980245097594505867694166591312545929965230291418670445516669557156689966248314016354044", + "17.286542066533530981819924644041556546839394128235306235416269038138274222049809140847092268150839206354707638710275634022335650694777681817694798501418812448888688173373947001904190184008892957674606496333161081431327984331509197841574297574788702287443502123119313877415278877304866456565176360773848651195816021879148876985173267277031263646152871873014441183590471141901167533828621963866651938359", + "17.348085383681499172852340212837946913681349503319833895379599364916346996678774115472356552172467728498192423708290186696353892633802275272186862935888864564436104200250553583802585096479988444811879111645109656880728153108808638274341978968354895482288870990505393394330150686285205409461910256828313237800771316014620729111128197408712519655232673726993167731090657784157432284844410962540306871812", + "17.407791309811451413991402934776587727274692304168979758129844486195147501475844430031581045491342304862802756719012802717759227086944920237646742600183730387935914237410099970497154963215669635477250725760034883360834134873909027143784365748082991457136260982918509631214089379283854791699127985575276751950639814381413022404340898037317031344649130788109442934133748721229332612763230675387867060167", + "17.465766383402858316731575043043871754932551869660069657366289253587674381952187793692876332186097637634087898052217367730831337525450143144735163993701984235559102178727289467801811444923511321849112339058962832869205150513708620081533545907748750224381419445198858131583714181742840318906599828122743306582674187117835956409356596804579817623463035229848008072471150460106195548408352347746742847561", + "17.522108137193897711249955720342223562404817078270264273905715197834637314555104238731504974899534359198079882854402652102198388084110484760619705504323190957788898675675472299192322756141627162323541713415099172067523105704142354142286507565791349450889277448545966302507723270185283899864397011417078910276215036241179611950839739662625626455044878609357243901835302874736030320059872773022839076998", + "17.576906085439158795399613853863097303860835367703382634217979275105020336999327656009595436350031662565840865227976662242781789960872250051998481804897622287887086985238091438506085053631982050247194140738539987379268409303934286420729479452837709138518786355198810012076646196653084861659638299340083440855659993917810136693887499673110592919880225890667600561450738971059427382635508450091570097859", + "17.630242579482716539323837128846626753956194314343736063283695118187974605321998609676585457221722093540967455603842712855190915316171267768551204188316976169082878976713161041600921069589708836776259260899700342542761959107817464710887483018031112156977258240064220687983570300417350906046032596793701224117336432612122346984445322343505811317200044404325245524587348610225714892960184376194438742903", + "17.682193552177642930469311075041540632454794315173833851548924954045201903733019976720709429894183669091622069055829864963447674638381460850277690319942206492046322144914184638283615681017449686491773099947404077379395563267125512703092895031616346899622091168324459335139948282486097513426616067084251033517363717148785943762510534333490466778398817865864252996839848563898275763467374270388303474531", + "17.732829168042892302590066897013224260526349617442757064898532827287653373154374250085440081248759495538523122114463120786358068331952209807684385821625688206899889794184992102701935895298679767555036775735985597715341448247873700759325978422207409167388561946150223833135803435044691082980471455256218231653367433009869225710546713847446382266908465706428817510556416763430212167661925983678317689559", + "17.782214393127773091907390576928321922818609345162469668288248606737448584265787291899115365824350981071781548351963523796289812496283393676088371363622146243894946956855177324929267339605228930435844698103907214217720043808120931206339233299438914243909015437719067832873971853535761149326746352476616918607787268605165583917095714007024394600276277913067861955743579281638075879563801550521361400101", + "17.830409496196797333256263738087407756305793204876426547866274663003566432384680240879632999625725708300091127739268764655234592101254713785942646078437589939733647676861210608435791914827456291767449764007558390614584486670558546409061408823289149666666818024559557140308187730981247373784664587280435856629009596287509432264978977660915985852234235063815941899607957940727152099219426925372856581083", + "17.877470490934232288852811743259662703350866532641876235327240424382634438025700311951299570329496669487738366928514133455422447732866797861412283887178678146519925852345567722230587799483201967913067391020608007825990349366451164476805546339769760220805534987675878347990806759564468339408725207557557011408435539499579334714364702076041798486860978860009676392441269681660376828431489832998763783258", + "17.923449527306267869903426070004616586122783729793624019886904269965872168854615384174781325332961537402467089754136043237824345234828497017675462013908498436584882632257634259557543282397560432131425953734774375224901224027834174376390115551172850840545446370919691863863162138436779349056977625063368614038926314141157758995633570593909444840439875814859101692914284555504462737973961801589348562421", + "17.968395238938123096275003449517382823058653367901994410453731720353712579214128295617333869516953666517153266184450063833611730223713367177888956257642697863674682557764474491249664869634869467450632518845976225157445436929203774807794710993549169067538180609230496568688211520386012533845072853251411123534511690847284034061828924979836346301147669327210040586682352268581578885354613616677879192008", + "18.012353052308072938755867264876761138384940766536728123219303502872235608220456049765985905816906980541771912193578395286636524639567005562096644259687421270993689984646487799760867557580378976263785987858028882916593402367582926712749625025395229096162602944095765767003293442756802839571379406129666952518296572179431801499117577022831811590456125422748646995266409456422225586206021840322692382857", + "18.055365462686668331727160748231009519565746647193730385530909331597852334952578425145279427250887034166658709337134491235522678908221793937220809954557808901763389178392831492051282059480629151432246720826269576988663211852119754955967569929315382922357289706041278636253185833298598511399638105081736687620508948263244525471222947804257016135464845038301780535378180021273347494295813215232102999649", + "18.097472281022918092839876166164329437973263728374666387409900363304423095913608188979786368122872685324785740303523457754035383735336598870745063200445496969465305638435393742921093080855121166597064087151732410717510776813994536867846471600876935467557239720329955864393503091522335217308468551898804050931884864074974187930869095426636541733964836470414482229854405996155347764481217202728996408614", + "18.138710855372574931023279730094645378686287349356676919424498204049762635832652703081045863264164065707461503608812437952726945167389204858679677978907656542126675434222486013764292798698974541262372833651362936600851261171024940667498778746253799866490414715539561648775214507198558445051277115507846030240001071535504590488750762226492938922487331198045407471864288427126708589240674067562104543957", + "18.179116269955114571377487963612019905652085216126618591531831326851631273535837433851652060806307371522002942828348086254592323263632131183438294055667010855067061587674644272103122258118876651912890486407250279668447142712674562099014392095571206458285314302909409592642841502932705416119595372330139185232535836986175505626716905102551635720868328845059106716603941432470493828723765413424721976223", + "18.218721524498032554193215680552580137491683034589488437319060302272592206508827557611431375182704552154497537575444766904464774327453349109721410510507102426285778233008253433639863695380913463970388673098705619991229471182831382051550803100625573309055088036785775202381313835883262855970305798706681563291905495590616431781211404743717763365778127660253455212146746026811363929209719531660648504082", + "18.25755769616561915104320634671335949819923250838247367135480870103002754055972575277617781066800125225275977232426410882766773084485826986957597205108505829168630501177398318211279559799848433615486396320080576991739828304477785924273653352846964138446264644904849824507615174857436913763769835408524950658917536946876135419383532210821743200063786350760207420579200676223678007228393958258720083932", + "18.295654086063005239961930900603578763176327716162022442528659338478895027684612801134718048445578078864512023650622689532231640803798279071247213212940626166721703242773412064293396910008891332614727995930235839898502680907757808722725076622433926254807390507349193089487065273859422711581690536923283818694448490391002663699373577479984089586448960986922914070154319198856799480586814831572660049059", + "18.333038352045729366070360053860247416881993539906325936417001019639836810235521744851872438194534698737793818113182566661284551265375926400252096198917463166081789346386579278436021220544269108158036360716265068681920333271695665204550361645092770414267870574761534021576748772414710332296686656677922105572480136623006540318287771752403257225484193416375374630295739694584359181669584822144217946089", + "18.369736629342788833545154829965612197972030184654204521583836723612431388284128470120361520079152081604731214550025504583810749093225662462708297813392905679444268263153178673045591535099590243771860299493196201337328463166245762316637806913270164277457975112426005180292583426915918675383435395598215385153247994877265654873384456838948090969392401887506081626510459117637684719849016393221041720966", + "18.405773640310900146133080088261946202976690317466294344672811637024889157611521518848738302063682147953709444704912322724498748005402509152494514057803322060491136048741666988817114427555111210963923209356023892097003244960804568051496345885676927757469123572277620624446804627512970828422692616021227425852662243212443997074981005547833762050079432581680067106949297497692327125068990077901522226957", + "18.441172794474399698182030074721740031645602552534420544604120821167467838337449892992771747357276011553142091110875268371883702350672621604391781630952792517951394285585851496086739721764180588422789463043949353454011941863375479066641639870318143091000764755109263681792932398864353035859720611512874738125344871434992639512151401272538083058455878170262156351968871089395179837425273523581266914745", + "18.47595627986464597709414934346663732189241252367556916529377819718435871713823800089497791390570676646849082185155969226893554048129639509679051447135722658187695404706235925157146425104283059827944524324932672824661552843990966903508121362067629390223781365207266998003720499319458536728358620338853555386727837290179454339519141841532839938596761951045619471589862830891354308681626977577420483375", + "18.510145146551442627414905806735913567003712650812295077443330836708330498077617580007887630002806998527489958357928811323358164284670780912045286972377274734553167811143903532773133805470585887337986897779623231393980154689146471547983633489101760043708991315746940120025902341173853793429617026275691215584867628750464940410772709161351434979639911956946479201132978330304672548030931942250342827294", + "18.54375938315397840777373858913955248239941847920328667581513228848814216209238117867823746808674105485439472281080229047484288277191323337476914908731578203036561093352990739771860442165984753982600021729206737097284114048195126812337180690412756158211962923840645830361425158816448002373708570542607328640280411811505735178290827333249222248570577590327817428193141575383830773736064963674654660788", + "18.576817987027647186937851258336640937668818840595786321214115700990580993937301728456982569596955182509352640277092493549853424411966677818012248002654715239100874590037738307469713048325570874520232570867464224788639656453937494219294174471955373301736672685268384577575584576576899158917424074434177408506824723823546414342198182263466224674661649356568188397290822447447185825387180657594093708751", + "18.609339028743835443520046961477709286939310853034399826433866146117641838882532805452792636721283076369348347017617290496488517658040508081002292362699460963188796636919359563770588812590411785597112719721757265655201721601867128800954165396591923271771796713301912904158675092529178443570927414653982088273331584295588174225100793199329706639345162173054259175639620324704962515101988919574683797276", + "18.641339711410638424722499047013449967887089663871032284600678326435618587023360889502435665997102476809993062067289899429492640057255987173558009597289702007868879986681400023832856533473923548707096670227832737339287908558274044368146372966754230837592655179154123960009424338853507410779228164259856997555111697864450713171508666161000757176178710802248263025585993364498172063037657704404452535503", + "18.672836425322050368486113163967894536152542145032787472779137579977190277914128508177973702344749215422866489255932015284354044054928123475206880037062819389112504714106095639732288437854189846017324055713142277768438434138800721340366655917386856186887417022606078557020556496094324427190459240576788558291551699271849591355480496655647717244614207638067307680084952591605729876523430439516165337322", + "18.703844798370253311556748128890196309240890383998201893987314003630502067675284072677315790931434159739316058047067634433988116165753705089479010402482501330164866808933095532965233351834719435836698735379881853925522288987702030512098787246242665060494288818182785084700362957305908534097737840396555283267034806128689898134337131513408714563437722088348519474128730338455257510535561818243515295123", + "18.734379742609172948695846511449581634565683544125106511957075355113091757584835040550323433523983103087395353257534872811737536865777209110758107808331702363999663358869296693765232701087487872606287651215678117982769333263424530048349886338191672000649776344735688777038908317935895545479771750928675097454702913124841960320021274672197296187088995346243239131294305233657221950357770047779041168948", + "18.764455497316603659697964676682244441947566581055018250974850982088974686459881812049067093753928158863642280317022246479491132048354932411165733919156970301233277913734990931824860100667882748928084034147822613522025142522120240087012670818451468498896073922908905983528384054249374818979283244638542138214163225714979901542761366770616662189716515808719831023436094002277345660650710470976214503432", + "18.794085668866182740204823781307373749785233327862921970091261536522099678420128101122831261188800902247301052497120590553831148856384993334702795779266689462427228385943774192181671843132138022659399715350825905060669445319905454600530058604054055511420322690455781203696250448217551628254838303648547201462249630753150471851402187751539728462449395082445265630322991793425964521071134426892761087686", + "18.82328326768867946516209716586995768024335839807194833176766112965627616145648993732694510000805245875257813926012495009414082293067923695618654400188454857448056930551075037023425200611189368317293241290052197494133870263300149851324237139757643613913686228545143709137199633423670636305032456696459165988858650794045361585281861601603030153235699981659298052458840307661288883784791255308752353561", + "18.852060742573912900871064645288864648159675216435305629278797553184221367993840166607573470069267053513735624040087819326415506386854437946403720812228284865900153407303755694944652909440890918000505344963394853809579466102995490946923404655914747241389209313457700354163158136320973199396402856713949800424774426208733366034958384913000571799639761622099679737940788622933241370717844146251711932128", + "18.880430012539655701065719740012642650514689061888847292472446317260576484360479108374318422256748212928421929786176000015552730066213309405093412502424231235041703778572229968621812094224953783751727048234887878221529796434400738059144871066371011576734445290684672478932371976691435646196856591582073749970279840730554499319160664075936135140351358832332481792115613668240634181554442075595951874232", + "18.908402496471717232311467781165733233171140941896760455553034330908971709296619686804159498334964006649119069488646486948675866965781697617293443993292894960273992948681816600748607581132058645469709895004815813032481899164996133398853203604094641445335770040577643758444125343960451089873183667195183097301272165939070294009329717796749663916249651314647264543061678516229808974080105230884519025421", + "18.935989140719681524355183827184271883117018713616424044375161718824065979531438908152091359516789236304421957752893530968312896089478807820652680723918795442056690234785900341761515097938048245785367391810983836804772037480360220145546699221066508593371664219887047644628393373836620900288539062774663891696384999640649150431067240627749142322666676970274474792135970231868616050929898319819448939034", + "18.963200444815204167404888798469665227431788358892299847438551435971105813566329353339851076750530262901184430318825907802984559086828099838800823075902608236275943927671387049630228757166718632225359114181378374769186216486342164672374303171089906235756037703334480067642792992542669516647312965086899057259968955796081732571906843773036664256360263051447703790357359429377002031207739864979999279347", + "18.990046485464088033353325238570094871523592746407402454864447659438418650897352188003827603659585905257296788261872980663015351591030286798753545075312871886708540373690732957230479307213846083134185408782477823043603415914158563765104431367119681516469558190435321626296408405773925785846797696565762444462069369032104851518168840362055319574446706630124442642806832354006488607879109906061011225994", + "19.016536938949335590921908878972071081608578803308502271146163132935001206102423418117835863551157682291011036313549071538079474102791095379250735204641651869626255407971202952320707788423726057706822543117840676308428340234652209177652929619836857962138281947043694787969753375808877555756525156889419987622193160096718082756877689454214937644538436622120458515758071395625444960838247998451767464267", + "19.042681102069820040323211057777714109150558076228575985448688497208727928412122242888431932498284067180966108960090928128416538326586163291672353531766027111567123306015724614143020205136706498507055346813817986209642505418179828757157587146552894936306186818734849750397304488535715134906592464324381660408650130874094490704788761416060096501351661608424222204094369103147551037672603814369634649173", + "19.068487911727958175697030382906549671323284692477975980792892280404995909757933182996822232452584791269433004172376138676679805214029937405307084300414313959313789831600985178255638111559270519906326622715617717964168412002699242926437873012736620082535900009120622005729068876661407020205549742970102634687260159098231611555026386636952356914915597529253373429394903680674472796958663494038067669179", + "19.093965963269656159901801532857652686731313095114787279282350143184060615248880952958892345276101741792959203039945279273255821413683057071718873479055914318955623580559627285483449590741119271240498698177664589148961791164562328382134513604070535948997556425774535241433839196056647337630745324677877037589790564832932809741759428622931327986353687891898499439791429917840804474313864245639140963876", + "19.119123527670705331793258647026174473061813878914781070641605073424527485626683566355878191198143709838509389044950724156590593262994411423265514055870555330957166471517671117689943118929441254707396532385048466111853801352620946858612646592880180562600210076019427990165200479741063391057955342589569972650353707736819649707138135073772494722116787681314798945037658461538374603477221825614061123586", + "19.143968567655614969812922707872905228504499895574401195919290684664632292543319151929670686365568982588326143748358606442800755409560708661213139514248609009613770051771501624762852458893105259920477327438788243371302722213272226600736522283567127277667156871770413468147870394343816746792945999572244176333552811712447483231232773171106511438260175071145300046115843401710072061507331123043607901766", + "19.168508752827482780609154136923082745746771414212427034681109262302000645968087085215520638009496537393752178754873475983837687377025695010556483691979309217953419255985001727184619660158435191823702770674175581797631578786818852604111682506864006199186805540809913091091561814668081471402749434233431033452441548505582706019452955567976154397574205270457372773342241946969622998755580434262211071558", + "19.192751473880834042563713562225153433521577940186973776803866639536641104273721851582869330116346851241224039623128541122821371810756925681002641212419779923811384320279466454221232217629041792882431116499214977303106306157966687858071257893713340199820635963233697984370035461108601863346164084264967404520613456100656965925875472210769471793070984755357524002396981276686789870757739219539841324669", + "19.216703855963329593992083348877341510356872855419154524286060224198192164950344042194924570763041352943159776496534086655621090662648765929073480563926604513272233491262353914647091955902924297702861031248271549558718609763974479507490837350364617085882753391176792131259310397149374028556893735115741447201974608383790314541221313482249282941830681505989160209022143487123591182161037084387107577471", + "19.240372771246783136336288622974117018573581443774444767997147210768023102387819846722491865244820295698055584478151667485670300985795814036287612086238394489310685917822308982062485897587424683040075624404469719368214374255580054164790522993745386564072906888203344350441788631572056395846260169628655731587443716443908470481602481327796867951175756539602824534024677208143458306390998693538144276002", + "19.263764850762979509196317705761686108092922892356892210254799469999751475179529646750512177469718303426094538082717842694993912366018532429385996195100165328675330327321101942399890523238950583083919577089467043577581159099371618262297126999910295820866611740582812686480215151994304295620401944519281853807987442610790122820927006439539980791908595120476521299636624843377591628005484740938263373595", + "19.286886495555294522450851525927489255646333848651043717882790718796769943763203547772413744395083720600670009266257171342692898145198064660758379840502214228374875168690401725272168814130387964227940171355345107459707413634435078254467165459318134413588306046635342334572072865760417877208230914828250259039270224031775041480686581149991980042698893384296012208438178584526032640636530664689171174514", + "19.309743887193036513569909003754932688390195189494409126081957694707453295769725463252527373922995550848707616892717734716346726926003376949988744940329952938435722400261306789658518736487435455592323288866363564460056999876237001095092480820045715217327131479089102764865100373961878408215166685028270522348153253852064527393390794401890890932406298166622224431486187051653736399833197687524233000392", + "19.332342997691718269365647851051829244300572144237799985690236148794296859647334840581772744190077146167636205171422529047782401411481872480699008041273574144705390909628455554205882856537701103044535844002047328262877230706418721410147702147287802942241134713881576962004492246225067150128745210304021219616585555420191917418786300056829952680702638022710700076784220324428140020802898115083347702904", + "19.354689598879088211883278917315015191222443867565368209411861608347893184500809153071123456883339348988675265028178228103174790923741638364554293709103213239495123865898742141584076941660965692453426480770865774436380303703020587851939728834028918714275983773159730132531253761589283704592841895713231304417993106469276962707965968679020792759185611101812841427933459395519877074670185732532077876915", + "19.376789271243668798743209719830951710660724013826759987563467708214368337563307069810449676142525612003499201086112645501159094078378318648014400550345870757023544381773094826620272453238529286555419097429861755219673554476395943490245768513403194721941361801918811127988057063915654267554707302094460700078255016831241731287084620030531370389406858605301314913503432729894455360413554796057743624785", + "19.398647412299738536733101983020344760416543000933452586938357216391679714568872063480206587627849607725892049860100424409512218327903976557192129920072602449053963631370720893361294311430877864798057636106390383386608343478253049758287190639090148001663846660919016228401517981946486814580501445191763231914170223651871543954569563229752867364010807484149328122287932691728836607206296504503654291916", + "19.420269244500125639443026886412358511499173347101740173789245348545649777799992933455717128782979425999232096035698012165274922488616903998818326535687811364645463339885951676665882203155018792792505473796600843314336576346118972683035247786115152970665197263535031125663311669153219106967873840911780618890220192918885584791820817380351857621444438732170662912318105800373867459654881916254806601924", + "19.441659822725832764853886827062860938003360575287073851586808019473777348197590834815623551815029267586554639358825375063360984210103069003729612683914916394217674289812465439813541316938870999354861402160375582810342455043995730819816948505547453029096197833928688735935982538915244747599958654970407704104602569366784225221531104839626781845870092648147888203880688567605208831444945817857785153427", + "19.462824041379362514202453738329145059871795167945778128620896576209292571177865023083134487492542931078517939464890630420523665550799939651548618906955780515811541533057671943504991862669514142328738958049297858093270685582461594213632344682911288013670395835728596839923778216755784200501989248577166652556656745561631320914185098036550279972269808563352717494278133064808018424486494613581670904697", + "19.483766641106643718481178395114340475919752681994355643610181441860832131581914604665304968112958314746911243491535376957183544987386808635080341126118126364286470448001964590403332961518317007864293940732767763315935539659300785943459751426720740528037173390794501709108627539732588206226415399674048608843262175783293190807110169521287571898125826758063922707869247389042070537305271065057452360137", + "19.504492215170652185153425611551614568097792837031617515988255748353971463776213613651972980845739009653411602074763823583486335276886222365741099356087975815479321535979397651959714956358141934399110351847826398926624666313434326948757230737160647513320407575743953348133831681915668076630219831345596329489041495050445409516995558844346940248424949708046529076568535423815692145534030368195098701895", + "19.52500521549816144973266072401605164852396136071234571245810367391072812166019661923143396972741343266046339927362413412251126099193801965681827360699083448218860273549526903661234475357554150017778848244185893299525191263899191588797634058235164494448438674653809951435022502560679429105527325418829543863756825670476364629140951247734867887985343458291386040322597855003211338820555010939867273248", + "19.545309958419535630089123088329455125777373731767323301911891787605488456921558805681207304272616222501167615837357366396904683096528060072684210523189673108467018417135186800678628444987751206147451054525963839562634340820804697604369657105969423354842149829173951943549166420900709500398322624130365195674097282456714104812933002700523506427441210494461469512180706693823193924457440917371176532034", + "19.565410630120075532420489068555321524954362381908007338302983473268528473151341321768804731192210840056455228388636731122203200610869021021871133154865620432257415783302175345843898977949742849569372169004904667621738405749986270376895267386643049526766451459390277406632576412790748533372863644721976845168460840162066672290292749672668879524315410824251032084115058493720402881895485689493165441193", + }}; + + T pi = static_cast<T>("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609"); + T tenth = 1; + tenth /= 10; + T logten = log(T(10)); + + unsigned max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + T val = boost::multiprecision::log(tenth + pi * (100 * k) * (100 * k)); + T e = relative_error(val, T(data[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + + val = boost::multiprecision::log(1 / (tenth + pi * (100 * k) * (100 * k))); + e = relative_error(val, T(-T(data[k]))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + + val = boost::multiprecision::log10(tenth + pi * (100 * k) * (100 * k)); + e = relative_error(val, T(T(data[k]) / logten)); + err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + + val = boost::multiprecision::log10(1 / (tenth + pi * (100 * k) * (100 * k))); + e = relative_error(val, T(-T(data[k]) / logten)); + err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + std::cout << "Max error was: " << max_err << std::endl; +#if defined(BOOST_INTEL) && defined(TEST_FLOAT128) + BOOST_TEST(max_err < 20); +#else + BOOST_TEST(max_err < 10); +#endif + BOOST_TEST(log(T(1)) == 0); + // + // Some tricky special cases: + // + BOOST_CHECK((boost::math::isfinite)(log((std::numeric_limits<T>::max)()))); + BOOST_CHECK((boost::math::isfinite)(log((std::numeric_limits<T>::min)()))); + BOOST_CHECK((boost::math::isfinite)(log10((std::numeric_limits<T>::max)()))); + BOOST_CHECK((boost::math::isfinite)(log10((std::numeric_limits<T>::min)()))); +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); + // Check low multiprecision digit counts. + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_miller_rabin.cpp b/src/boost/libs/multiprecision/test/test_miller_rabin.cpp new file mode 100644 index 00000000..484b5775 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_miller_rabin.cpp @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/gmp.hpp> +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/multiprecision/miller_rabin.hpp> +#include <boost/math/special_functions/prime.hpp> +#include <iostream> +#include <iomanip> +#include "test.hpp" + +template <class I> +void test() +{ + // + // Very simple test program to verify that the GMP's Miller-Rabin + // implementation and this one agree on whether some random numbers + // are prime or not. Of course these are probabilistic tests so there's + // no reason why they should actually agree - except the probability of + // disagreement for 25 trials is almost infinitely small. + // + using namespace boost::random; + using namespace boost::multiprecision; + + typedef I test_type; + + static const unsigned test_bits = + std::numeric_limits<test_type>::digits && (std::numeric_limits<test_type>::digits <= 256) + ? std::numeric_limits<test_type>::digits + : 128; + + independent_bits_engine<mt11213b, test_bits, test_type> gen; + // + // We must use a different generator for the tests and number generation, otherwise + // we get false positives. Further we use the same random number engine for the + // Miller Rabin test as GMP uses internally: + // + mt19937 gen2; + + // + // Begin by testing the primes in our table as all these should return true: + // + for (unsigned i = 1; i < boost::math::max_prime; ++i) + { + BOOST_TEST(miller_rabin_test(test_type(boost::math::prime(i)), 25, gen)); + BOOST_TEST(mpz_probab_prime_p(mpz_int(boost::math::prime(i)).backend().data(), 25)); + } + // + // Now test some random values and compare GMP's native routine with ours. + // + for (unsigned i = 0; i < 10000; ++i) + { + test_type n = gen(); + bool is_prime_boost = miller_rabin_test(n, 25, gen2); + bool is_gmp_prime = mpz_probab_prime_p(mpz_int(n).backend().data(), 25) ? true : false; + if (is_prime_boost && is_gmp_prime) + { + std::cout << "We have a prime: " << std::hex << std::showbase << n << std::endl; + } + if (is_prime_boost != is_gmp_prime) + std::cout << std::hex << std::showbase << "n = " << n << std::endl; + BOOST_CHECK_EQUAL(is_prime_boost, is_gmp_prime); + } +} + +int main() +{ + using namespace boost::multiprecision; + + test<mpz_int>(); + test<number<gmp_int, et_off> >(); + test<boost::uint64_t>(); + test<boost::uint32_t>(); + + test<cpp_int>(); + test<number<cpp_int_backend<64, 64, unsigned_magnitude, checked, void>, et_off> >(); + test<checked_uint128_t>(); + test<checked_uint1024_t>(); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mixed.hpp b/src/boost/libs/multiprecision/test/test_mixed.hpp new file mode 100644 index 00000000..ba47ff08 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mixed.hpp @@ -0,0 +1,190 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_MATH_TEST_MIXED_HPP +#define BOOST_MATH_TEST_MIXED_HPP + +#include "test.hpp" + +template <class Big, class Small> +void test() +{ + Big big_val = 1; + big_val += std::numeric_limits<Big>::epsilon(); + Small small_val = 1; + + BOOST_CHECK_EQUAL(big_val == small_val, false); + BOOST_CHECK_EQUAL(big_val <= small_val, false); + BOOST_CHECK_EQUAL(big_val >= small_val, true); + BOOST_CHECK_EQUAL(big_val < small_val, false); + BOOST_CHECK_EQUAL(big_val > small_val, true); + BOOST_CHECK_EQUAL(big_val != small_val, true); + BOOST_CHECK_EQUAL(small_val == big_val, false); + BOOST_CHECK_EQUAL(small_val <= big_val, true); + BOOST_CHECK_EQUAL(small_val >= big_val, false); + BOOST_CHECK_EQUAL(small_val < big_val, true); + BOOST_CHECK_EQUAL(small_val > big_val, false); + BOOST_CHECK_EQUAL(small_val != big_val, true); + // Again with expression templates, on one the other, or both args: + BOOST_CHECK_EQUAL(big_val == small_val * 1, false); + BOOST_CHECK_EQUAL(big_val <= small_val * 1, false); + BOOST_CHECK_EQUAL(big_val >= small_val * 1, true); + BOOST_CHECK_EQUAL(big_val < small_val * 1, false); + BOOST_CHECK_EQUAL(big_val > small_val * 1, true); + BOOST_CHECK_EQUAL(big_val != small_val * 1, true); + BOOST_CHECK_EQUAL(small_val * 1 == big_val, false); + BOOST_CHECK_EQUAL(small_val * 1 <= big_val, true); + BOOST_CHECK_EQUAL(small_val * 1 >= big_val, false); + BOOST_CHECK_EQUAL(small_val * 1 < big_val, true); + BOOST_CHECK_EQUAL(small_val * 1 > big_val, false); + BOOST_CHECK_EQUAL(small_val * 1 != big_val, true); + BOOST_CHECK_EQUAL(big_val * 1 == small_val, false); + BOOST_CHECK_EQUAL(big_val * 1 <= small_val, false); + BOOST_CHECK_EQUAL(big_val * 1 >= small_val, true); + BOOST_CHECK_EQUAL(big_val * 1 < small_val, false); + BOOST_CHECK_EQUAL(big_val * 1 > small_val, true); + BOOST_CHECK_EQUAL(big_val * 1 != small_val, true); + BOOST_CHECK_EQUAL(small_val == big_val * 1, false); + BOOST_CHECK_EQUAL(small_val <= big_val * 1, true); + BOOST_CHECK_EQUAL(small_val >= big_val * 1, false); + BOOST_CHECK_EQUAL(small_val < big_val * 1, true); + BOOST_CHECK_EQUAL(small_val > big_val * 1, false); + BOOST_CHECK_EQUAL(small_val != big_val * 1, true); + BOOST_CHECK_EQUAL(big_val * 1 == small_val * 1, false); + BOOST_CHECK_EQUAL(big_val * 1 <= small_val * 1, false); + BOOST_CHECK_EQUAL(big_val * 1 >= small_val * 1, true); + BOOST_CHECK_EQUAL(big_val * 1 < small_val * 1, false); + BOOST_CHECK_EQUAL(big_val * 1 > small_val * 1, true); + BOOST_CHECK_EQUAL(big_val * 1 != small_val * 1, true); + BOOST_CHECK_EQUAL(small_val * 1 == big_val * 1, false); + BOOST_CHECK_EQUAL(small_val * 1 <= big_val * 1, true); + BOOST_CHECK_EQUAL(small_val * 1 >= big_val * 1, false); + BOOST_CHECK_EQUAL(small_val * 1 < big_val * 1, true); + BOOST_CHECK_EQUAL(small_val * 1 > big_val * 1, false); + BOOST_CHECK_EQUAL(small_val * 1 != big_val * 1, true); + + BOOST_CHECK_EQUAL(small_val + big_val, Big(small_val) + big_val); + BOOST_CHECK_EQUAL(small_val - big_val, Big(small_val) - big_val); + BOOST_CHECK_EQUAL(small_val * big_val, Big(small_val) * big_val); + BOOST_CHECK_EQUAL(small_val / big_val, Big(small_val) / big_val); + BOOST_CHECK_EQUAL(big_val + small_val, big_val + Big(small_val)); + BOOST_CHECK_EQUAL(big_val - small_val, big_val - Big(small_val)); + BOOST_CHECK_EQUAL(big_val * small_val, big_val * Big(small_val)); + BOOST_CHECK_EQUAL(big_val / small_val, big_val / Big(small_val)); + // Again with expression templates, on one the other, or both args: + BOOST_CHECK_EQUAL(small_val + (big_val * 1), Big(small_val) + (big_val * 1)); + BOOST_CHECK_EQUAL(small_val - (big_val * 1), Big(small_val) - (big_val * 1)); + BOOST_CHECK_EQUAL(small_val * (big_val * 1), Big(small_val) * (big_val * 1)); + BOOST_CHECK_EQUAL(small_val / (big_val * 1), Big(small_val) / (big_val * 1)); + BOOST_CHECK_EQUAL((big_val * 1) + small_val, (big_val * 1) + Big(small_val)); + BOOST_CHECK_EQUAL((big_val * 1) - small_val, (big_val * 1) - Big(small_val)); + BOOST_CHECK_EQUAL((big_val * 1) * small_val, (big_val * 1) * Big(small_val)); + BOOST_CHECK_EQUAL((big_val * 1) / small_val, (big_val * 1) / Big(small_val)); + BOOST_CHECK_EQUAL((small_val * 1) + big_val, Big((small_val * 1)) + big_val); + BOOST_CHECK_EQUAL((small_val * 1) - big_val, Big((small_val * 1)) - big_val); + BOOST_CHECK_EQUAL((small_val * 1) * big_val, Big((small_val * 1)) * big_val); + BOOST_CHECK_EQUAL((small_val * 1) / big_val, Big((small_val * 1)) / big_val); + BOOST_CHECK_EQUAL(big_val + (small_val * 1), big_val + Big((small_val * 1))); + BOOST_CHECK_EQUAL(big_val - (small_val * 1), big_val - Big((small_val * 1))); + BOOST_CHECK_EQUAL(big_val * (small_val * 1), big_val * Big((small_val * 1))); + BOOST_CHECK_EQUAL(big_val / (small_val * 1), big_val / Big((small_val * 1))); + BOOST_CHECK_EQUAL((small_val * 1) + (big_val * 1), Big((small_val * 1)) + (big_val * 1)); + BOOST_CHECK_EQUAL((small_val * 1) - (big_val * 1), Big((small_val * 1)) - (big_val * 1)); + BOOST_CHECK_EQUAL((small_val * 1) * (big_val * 1), Big((small_val * 1)) * (big_val * 1)); + BOOST_CHECK_EQUAL((small_val * 1) / (big_val * 1), Big((small_val * 1)) / (big_val * 1)); + BOOST_CHECK_EQUAL((big_val * 1) + (small_val * 1), (big_val * 1) + Big((small_val * 1))); + BOOST_CHECK_EQUAL((big_val * 1) - (small_val * 1), (big_val * 1) - Big((small_val * 1))); + BOOST_CHECK_EQUAL((big_val * 1) * (small_val * 1), (big_val * 1) * Big((small_val * 1))); + BOOST_CHECK_EQUAL((big_val * 1) / (small_val * 1), (big_val * 1) / Big((small_val * 1))); + + big_val = 1; + big_val -= std::numeric_limits<Big>::epsilon(); + + BOOST_CHECK_EQUAL(big_val == small_val, false); + BOOST_CHECK_EQUAL(big_val <= small_val, true); + BOOST_CHECK_EQUAL(big_val >= small_val, false); + BOOST_CHECK_EQUAL(big_val < small_val, true); + BOOST_CHECK_EQUAL(big_val > small_val, false); + BOOST_CHECK_EQUAL(big_val != small_val, true); + BOOST_CHECK_EQUAL(small_val == big_val, false); + BOOST_CHECK_EQUAL(small_val <= big_val, false); + BOOST_CHECK_EQUAL(small_val >= big_val, true); + BOOST_CHECK_EQUAL(small_val < big_val, false); + BOOST_CHECK_EQUAL(small_val > big_val, true); + BOOST_CHECK_EQUAL(small_val != big_val, true); + // Again with expression templates, on one the other, or both args: + BOOST_CHECK_EQUAL(big_val == small_val * 1, false); + BOOST_CHECK_EQUAL(big_val <= small_val * 1, true); + BOOST_CHECK_EQUAL(big_val >= small_val * 1, false); + BOOST_CHECK_EQUAL(big_val < small_val * 1, true); + BOOST_CHECK_EQUAL(big_val > small_val * 1, false); + BOOST_CHECK_EQUAL(big_val != small_val * 1, true); + BOOST_CHECK_EQUAL(small_val * 1 == big_val, false); + BOOST_CHECK_EQUAL(small_val * 1 <= big_val, false); + BOOST_CHECK_EQUAL(small_val * 1 >= big_val, true); + BOOST_CHECK_EQUAL(small_val * 1 < big_val, false); + BOOST_CHECK_EQUAL(small_val * 1 > big_val, true); + BOOST_CHECK_EQUAL(small_val * 1 != big_val, true); + BOOST_CHECK_EQUAL(big_val * 1 == small_val, false); + BOOST_CHECK_EQUAL(big_val * 1 <= small_val, true); + BOOST_CHECK_EQUAL(big_val * 1 >= small_val, false); + BOOST_CHECK_EQUAL(big_val * 1 < small_val, true); + BOOST_CHECK_EQUAL(big_val * 1 > small_val, false); + BOOST_CHECK_EQUAL(big_val * 1 != small_val, true); + BOOST_CHECK_EQUAL(small_val == big_val * 1, false); + BOOST_CHECK_EQUAL(small_val <= big_val * 1, false); + BOOST_CHECK_EQUAL(small_val >= big_val * 1, true); + BOOST_CHECK_EQUAL(small_val < big_val * 1, false); + BOOST_CHECK_EQUAL(small_val > big_val * 1, true); + BOOST_CHECK_EQUAL(small_val != big_val * 1, true); + BOOST_CHECK_EQUAL(big_val * 1 == small_val * 1, false); + BOOST_CHECK_EQUAL(big_val * 1 <= small_val * 1, true); + BOOST_CHECK_EQUAL(big_val * 1 >= small_val * 1, false); + BOOST_CHECK_EQUAL(big_val * 1 < small_val * 1, true); + BOOST_CHECK_EQUAL(big_val * 1 > small_val * 1, false); + BOOST_CHECK_EQUAL(big_val * 1 != small_val * 1, true); + BOOST_CHECK_EQUAL(small_val * 1 == big_val * 1, false); + BOOST_CHECK_EQUAL(small_val * 1 <= big_val * 1, false); + BOOST_CHECK_EQUAL(small_val * 1 >= big_val * 1, true); + BOOST_CHECK_EQUAL(small_val * 1 < big_val * 1, false); + BOOST_CHECK_EQUAL(small_val * 1 > big_val * 1, true); + BOOST_CHECK_EQUAL(small_val * 1 != big_val * 1, true); + + BOOST_CHECK_EQUAL(small_val + big_val, Big(small_val) + big_val); + BOOST_CHECK_EQUAL(small_val - big_val, Big(small_val) - big_val); + BOOST_CHECK_EQUAL(small_val * big_val, Big(small_val) * big_val); + BOOST_CHECK_EQUAL(small_val / big_val, Big(small_val) / big_val); + BOOST_CHECK_EQUAL(big_val + small_val, big_val + Big(small_val)); + BOOST_CHECK_EQUAL(big_val - small_val, big_val - Big(small_val)); + BOOST_CHECK_EQUAL(big_val * small_val, big_val * Big(small_val)); + BOOST_CHECK_EQUAL(big_val / small_val, big_val / Big(small_val)); + // Again with expression templates, on one the other, or both args: + BOOST_CHECK_EQUAL(small_val + (big_val * 1), Big(small_val) + (big_val * 1)); + BOOST_CHECK_EQUAL(small_val - (big_val * 1), Big(small_val) - (big_val * 1)); + BOOST_CHECK_EQUAL(small_val * (big_val * 1), Big(small_val) * (big_val * 1)); + BOOST_CHECK_EQUAL(small_val / (big_val * 1), Big(small_val) / (big_val * 1)); + BOOST_CHECK_EQUAL((big_val * 1) + small_val, (big_val * 1) + Big(small_val)); + BOOST_CHECK_EQUAL((big_val * 1) - small_val, (big_val * 1) - Big(small_val)); + BOOST_CHECK_EQUAL((big_val * 1) * small_val, (big_val * 1) * Big(small_val)); + BOOST_CHECK_EQUAL((big_val * 1) / small_val, (big_val * 1) / Big(small_val)); + BOOST_CHECK_EQUAL((small_val * 1) + big_val, Big((small_val * 1)) + big_val); + BOOST_CHECK_EQUAL((small_val * 1) - big_val, Big((small_val * 1)) - big_val); + BOOST_CHECK_EQUAL((small_val * 1) * big_val, Big((small_val * 1)) * big_val); + BOOST_CHECK_EQUAL((small_val * 1) / big_val, Big((small_val * 1)) / big_val); + BOOST_CHECK_EQUAL(big_val + (small_val * 1), big_val + Big((small_val * 1))); + BOOST_CHECK_EQUAL(big_val - (small_val * 1), big_val - Big((small_val * 1))); + BOOST_CHECK_EQUAL(big_val * (small_val * 1), big_val * Big((small_val * 1))); + BOOST_CHECK_EQUAL(big_val / (small_val * 1), big_val / Big((small_val * 1))); + BOOST_CHECK_EQUAL((small_val * 1) + (big_val * 1), Big((small_val * 1)) + (big_val * 1)); + BOOST_CHECK_EQUAL((small_val * 1) - (big_val * 1), Big((small_val * 1)) - (big_val * 1)); + BOOST_CHECK_EQUAL((small_val * 1) * (big_val * 1), Big((small_val * 1)) * (big_val * 1)); + BOOST_CHECK_EQUAL((small_val * 1) / (big_val * 1), Big((small_val * 1)) / (big_val * 1)); + BOOST_CHECK_EQUAL((big_val * 1) + (small_val * 1), (big_val * 1) + Big((small_val * 1))); + BOOST_CHECK_EQUAL((big_val * 1) - (small_val * 1), (big_val * 1) - Big((small_val * 1))); + BOOST_CHECK_EQUAL((big_val * 1) * (small_val * 1), (big_val * 1) * Big((small_val * 1))); + BOOST_CHECK_EQUAL((big_val * 1) / (small_val * 1), (big_val * 1) / Big((small_val * 1))); +} + +#endif // BOOST_MATH_TEST_MIXED_HPP diff --git a/src/boost/libs/multiprecision/test/test_mixed_cpp_bin_float.cpp b/src/boost/libs/multiprecision/test/test_mixed_cpp_bin_float.cpp new file mode 100644 index 00000000..50e1cabd --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mixed_cpp_bin_float.cpp @@ -0,0 +1,37 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_bin_float.hpp> +#include "test_mixed.hpp" + +int main() +{ +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100>, boost::multiprecision::et_on> big_type1; + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<50>, boost::multiprecision::et_on> small_type1; + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100>, boost::multiprecision::et_off> big_type2; + typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<50>, boost::multiprecision::et_off> small_type2; + + test<big_type1, small_type1>(); + test<big_type2, small_type2>(); + test<big_type1, small_type2>(); + test<big_type2, small_type1>(); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const std::exception& e) + { + std::cout << "Failed with unexpected exception: " << e.what() << std::endl; + return 1; + } +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mixed_cpp_dec_float.cpp b/src/boost/libs/multiprecision/test/test_mixed_cpp_dec_float.cpp new file mode 100644 index 00000000..87d7f131 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mixed_cpp_dec_float.cpp @@ -0,0 +1,37 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_dec_float.hpp> +#include "test_mixed.hpp" + +int main() +{ +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_on> big_type1; + typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> small_type1; + typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>, boost::multiprecision::et_off> big_type2; + typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> small_type2; + + test<big_type1, small_type1>(); + test<big_type2, small_type2>(); + test<big_type1, small_type2>(); + test<big_type2, small_type1>(); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const std::exception& e) + { + std::cout << "Failed with unexpected exception: " << e.what() << std::endl; + return 1; + } +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mixed_cpp_int.cpp b/src/boost/libs/multiprecision/test/test_mixed_cpp_int.cpp new file mode 100644 index 00000000..23542ea1 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mixed_cpp_int.cpp @@ -0,0 +1,122 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include "test.hpp" + +template <class Number, class BigNumber> +void test() +{ + using namespace boost::multiprecision; + typedef Number test_type; + + test_type h = (std::numeric_limits<test_type>::max)(); + test_type l = (std::numeric_limits<test_type>::max)(); + BigNumber r; + + add(r, h, h); + BOOST_CHECK_EQUAL(r, cpp_int(h) + cpp_int(h)); + + multiply(r, h, h); + BOOST_CHECK_EQUAL(r, cpp_int(h) * cpp_int(h)); + + if (std::numeric_limits<test_type>::is_signed) + { + subtract(r, l, h); + BOOST_CHECK_EQUAL(r, cpp_int(l) - cpp_int(h)); + subtract(r, h, l); + BOOST_CHECK_EQUAL(r, cpp_int(h) - cpp_int(l)); + multiply(r, l, l); + BOOST_CHECK_EQUAL(r, cpp_int(l) * cpp_int(l)); + } + + // + // Try again with integer types as the source: + // + enum + { + max_digits = std::numeric_limits<test_type>::is_signed ? std::numeric_limits<long long>::digits : std::numeric_limits<unsigned long long>::digits + }; + enum + { + require_digits = std::numeric_limits<test_type>::digits <= 2 * max_digits ? std::numeric_limits<test_type>::digits / 2 : max_digits + }; + typedef typename boost::uint_t<require_digits>::least uint_least; + typedef typename boost::int_t<require_digits>::least int_least; + typedef typename boost::mpl::if_c<std::numeric_limits<test_type>::is_signed, int_least, uint_least>::type i_type; + + i_type ih = (std::numeric_limits<i_type>::max)(); + i_type il = (std::numeric_limits<i_type>::max)(); + + add(r, ih, ih); + BOOST_CHECK_EQUAL(r, cpp_int(ih) + cpp_int(ih)); + + multiply(r, ih, ih); + BOOST_CHECK_EQUAL(r, cpp_int(ih) * cpp_int(ih)); + + if (std::numeric_limits<test_type>::is_signed) + { + subtract(r, il, ih); + BOOST_CHECK_EQUAL(r, cpp_int(il) - cpp_int(ih)); + subtract(r, ih, il); + BOOST_CHECK_EQUAL(r, cpp_int(ih) - cpp_int(il)); + multiply(r, il, il); + BOOST_CHECK_EQUAL(r, cpp_int(il) * cpp_int(il)); + } +} + +void test_rational_mixed() +{ + using namespace boost::multiprecision; + cpp_int a(2); + cpp_rational r(10); + + BOOST_CHECK_EQUAL(a + -r, -8); + BOOST_CHECK_EQUAL(-r + a, -8); + BOOST_CHECK_EQUAL(-a + r, 8); + BOOST_CHECK_EQUAL(r + -a, 8); + + BOOST_CHECK_EQUAL(a - -r, 12); + BOOST_CHECK_EQUAL(-r - a, -12); + BOOST_CHECK_EQUAL(-a - r, -12); + BOOST_CHECK_EQUAL(r - -a, 12); + + BOOST_CHECK_EQUAL(a * -r, -20); + BOOST_CHECK_EQUAL(-r * a, -20); + BOOST_CHECK_EQUAL(-a * r, -20); + BOOST_CHECK_EQUAL(r * -a, -20); + + BOOST_CHECK_EQUAL(a / -r, cpp_rational(-2, 10)); + BOOST_CHECK_EQUAL(-r / a, -5); + BOOST_CHECK_EQUAL(cpp_rational(-a / r), cpp_rational(-2, 10)); + BOOST_CHECK_EQUAL(r / -a, -5); +} + +int main() +{ + using namespace boost::multiprecision; + + test_rational_mixed(); + + test<checked_int512_t, checked_int1024_t>(); + test<checked_int256_t, checked_int512_t>(); + test<number<cpp_int_backend<64, 64, signed_magnitude, checked, void>, et_off>, checked_int128_t>(); + test<boost::int64_t, checked_int128_t>(); + + test<checked_uint512_t, checked_uint1024_t>(); + test<checked_uint256_t, checked_uint512_t>(); + test<number<cpp_int_backend<64, 64, unsigned_magnitude, checked, void>, et_off>, checked_uint128_t>(); + test<boost::uint64_t, checked_int128_t>(); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mixed_float.cpp b/src/boost/libs/multiprecision/test/test_mixed_float.cpp new file mode 100644 index 00000000..3f32279a --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mixed_float.cpp @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#ifdef TEST_GMP +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_MPFR +#include <boost/multiprecision/mpfr.hpp> +#endif +#include <boost/multiprecision/cpp_dec_float.hpp> +#include "test.hpp" + +template <class Number, class BigNumber> +void test() +{ + using namespace boost::multiprecision; + typedef Number test_type; + + test_type a = 1; + a /= 3; + test_type b = -a; + + BigNumber r; + BOOST_CHECK_EQUAL(add(r, a, a), BigNumber(a) + BigNumber(a)); + BOOST_CHECK_EQUAL(subtract(r, a, b), BigNumber(a) - BigNumber(b)); + BOOST_CHECK_EQUAL(subtract(r, b, a), BigNumber(b) - BigNumber(a)); + BOOST_CHECK_EQUAL(multiply(r, a, a), BigNumber(a) * BigNumber(a)); +} + +int main() +{ + using namespace boost::multiprecision; + + test<cpp_dec_float_50, cpp_dec_float_100>(); + +#ifdef TEST_GMP + test<mpf_float_50, mpf_float_100>(); +#endif +#ifdef TEST_MPFR + test<mpfr_float_50, mpfr_float_100>(); +#endif + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mixed_mpf_float.cpp b/src/boost/libs/multiprecision/test/test_mixed_mpf_float.cpp new file mode 100644 index 00000000..c8eff055 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mixed_mpf_float.cpp @@ -0,0 +1,37 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/gmp.hpp> +#include "test_mixed.hpp" + +int main() +{ +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + typedef boost::multiprecision::number<boost::multiprecision::gmp_float<100>, boost::multiprecision::et_on> big_type1; + typedef boost::multiprecision::number<boost::multiprecision::gmp_float<50>, boost::multiprecision::et_on> small_type1; + typedef boost::multiprecision::number<boost::multiprecision::gmp_float<100>, boost::multiprecision::et_off> big_type2; + typedef boost::multiprecision::number<boost::multiprecision::gmp_float<50>, boost::multiprecision::et_off> small_type2; + + test<big_type1, small_type1>(); + test<big_type2, small_type2>(); + test<big_type1, small_type2>(); + test<big_type2, small_type1>(); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const std::exception& e) + { + std::cout << "Failed with unexpected exception: " << e.what() << std::endl; + return 1; + } +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mixed_mpfr_float.cpp b/src/boost/libs/multiprecision/test/test_mixed_mpfr_float.cpp new file mode 100644 index 00000000..651e2888 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mixed_mpfr_float.cpp @@ -0,0 +1,37 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/mpfr.hpp> +#include "test_mixed.hpp" + +int main() +{ +#ifndef BOOST_NO_EXCEPTIONS + try + { +#endif + typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<100>, boost::multiprecision::et_on> big_type1; + typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<50>, boost::multiprecision::et_on> small_type1; + typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<100>, boost::multiprecision::et_off> big_type2; + typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<50>, boost::multiprecision::et_off> small_type2; + + test<big_type1, small_type1>(); + test<big_type2, small_type2>(); + test<big_type1, small_type2>(); + test<big_type2, small_type1>(); +#ifndef BOOST_NO_EXCEPTIONS + } + catch (const std::exception& e) + { + std::cout << "Failed with unexpected exception: " << e.what() << std::endl; + return 1; + } +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_move.cpp b/src/boost/libs/multiprecision/test/test_move.cpp new file mode 100644 index 00000000..fe7f8db8 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_move.cpp @@ -0,0 +1,393 @@ +// Copyright John Maddock 2012. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/config.hpp> +#include <vector> + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + +#if !defined(TEST_GMP) && !defined(TEST_MPFR) && !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT) && !defined(TEST_MPC) +#define TEST_GMP +#define TEST_MPFR +#define TEST_TOMMATH +#define TEST_CPP_INT +#define TEST_MPC + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_GMP) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR) +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef TEST_CPP_INT +#include <boost/multiprecision/cpp_int.hpp> +#endif +#ifdef TEST_MPC +#include <boost/multiprecision/mpc.hpp> +#endif + +#include "test.hpp" + +unsigned allocation_count = 0; + +void* (*alloc_func_ptr)(size_t); +void* (*realloc_func_ptr)(void*, size_t, size_t); +void (*free_func_ptr)(void*, size_t); + +void* alloc_func(size_t n) +{ + ++allocation_count; + return (*alloc_func_ptr)(n); +} + +void free_func(void* p, size_t n) +{ + (*free_func_ptr)(p, n); +} + +void* realloc_func(void* p, size_t old, size_t n) +{ + ++allocation_count; + return (*realloc_func_ptr)(p, old, n); +} + +template <class T> +void do_something(const T&) +{ +} + +template <class T> +void test_std_lib() +{ + std::vector<T> v; + for (unsigned i = 0; i < 100; ++i) + v.insert(v.begin(), i); + + T a(2), b(3); + std::swap(a, b); + BOOST_TEST(a == 3); + BOOST_TEST(b == 2); +} + +template <class T, class A> +void test_move_and_assign(T x, A val) +{ + // move away from x, then assign val to x. + T z(x); + T y(std::move(x)); + x.assign(val); + BOOST_CHECK_EQUAL(x, T(val)); + BOOST_CHECK_EQUAL(z, y); +} + +template <class T> +void test_move_and_assign() +{ + T x(23); + test_move_and_assign(x, static_cast<short>(2)); + test_move_and_assign(x, static_cast<int>(2)); + test_move_and_assign(x, static_cast<long>(2)); + test_move_and_assign(x, static_cast<long long>(2)); + test_move_and_assign(x, static_cast<unsigned short>(2)); + test_move_and_assign(x, static_cast<unsigned int>(2)); + test_move_and_assign(x, static_cast<unsigned long>(2)); + test_move_and_assign(x, static_cast<unsigned long long>(2)); + test_move_and_assign(x, static_cast<float>(2)); + test_move_and_assign(x, static_cast<double>(2)); + test_move_and_assign(x, static_cast<long double>(2)); + test_move_and_assign(x, x); + test_move_and_assign(x, "23"); +} + +int main() +{ +#if defined(TEST_MPFR) || defined(TEST_GMP) +#if defined(MPFR_VERSION) && (MPFR_VERSION_MAJOR > 3) + mpfr_mp_memory_cleanup(); +#endif + mp_get_memory_functions(&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr); + mp_set_memory_functions(&alloc_func, &realloc_func, &free_func); +#endif + + using namespace boost::multiprecision; + +#ifdef TEST_MPFR + { + test_std_lib<mpfr_float_50>(); + mpfr_float_50 a = 2; + if (allocation_count) + { + // + // We can only conduct meaningful tests if we're actually using our custom allocators, + // there are some situations where mpfr-4.x doesn't call them even though we've + // done everything requested to make them work.... + // + allocation_count = 0; + mpfr_float_50 b = std::move(a); + BOOST_TEST(allocation_count == 0); + // + // Move assign - we rely on knowledge of the internals to make this test work!! + // + mpfr_float_50 c(3); + do_something(b); + do_something(c); + const void* p = b.backend().data()[0]._mpfr_d; + BOOST_TEST(c.backend().data()[0]._mpfr_d != p); + c = std::move(b); + BOOST_TEST(c.backend().data()[0]._mpfr_d == p); + BOOST_TEST(b.backend().data()[0]._mpfr_d != p); + // + // Again with variable precision, this we can test more easily: + // + mpfr_float d, e; + d.precision(100); + e.precision(1000); + d = 2; + e = 3; + allocation_count = 0; + BOOST_TEST(d == 2); + d = std::move(e); + BOOST_TEST(allocation_count == 0); + BOOST_TEST(d == 3); + e = 2; + BOOST_TEST(e == 2); + d = std::move(e); + e = d; + BOOST_TEST(e == d); + + test_move_and_assign<mpfr_float>(); + test_move_and_assign<mpfr_float_50>(); + } + } +#endif +#ifdef TEST_MPC + { + test_std_lib<mpc_complex_50>(); + mpc_complex_50 a = 2; + if (allocation_count) + { + // + // We can only conduct meaningful tests if we're actually using our custom allocators, + // there are some situations where mpfr-4.x doesn't call them even though we've + // done everything requested to make them work.... + // + allocation_count = 0; + mpc_complex_50 b = std::move(a); + BOOST_TEST(allocation_count == 0); + // + // Move assign - we rely on knowledge of the internals to make this test work!! + // + mpc_complex_50 c(3); + do_something(b); + do_something(c); + // + // Again with variable precision, this we can test more easily: + // + mpc_complex d, e; + d.precision(100); + e.precision(1000); + d = 2; + e = 3; + allocation_count = 0; + BOOST_TEST(d == 2); + d = std::move(e); + BOOST_TEST(allocation_count == 0); + BOOST_TEST(d == 3); + e = 2; + BOOST_TEST(e == 2); + d = std::move(e); + e = d; + BOOST_TEST(e == d); + + test_move_and_assign<mpc_complex>(); + test_move_and_assign<mpc_complex_50>(); + } + } +#endif +#ifdef TEST_GMP + { + test_std_lib<mpf_float_50>(); + mpf_float_50 a = 2; + BOOST_TEST(allocation_count); // sanity check that we are tracking allocations + allocation_count = 0; + mpf_float_50 b = std::move(a); + BOOST_TEST(allocation_count == 0); + // + // Move assign: this requires knowledge of the internals to test!! + // + mpf_float_50 c(3); + do_something(b); + do_something(c); + const void* p = b.backend().data()[0]._mp_d; + BOOST_TEST(c.backend().data()[0]._mp_d != p); + c = std::move(b); + BOOST_TEST(c.backend().data()[0]._mp_d == p); + BOOST_TEST(b.backend().data()[0]._mp_d != p); + // + // Again with variable precision, this we can test more easily: + // + mpf_float d, e; + d.precision(100); + e.precision(1000); + d = 2; + e = 3; + allocation_count = 0; + BOOST_TEST(d == 2); + d = std::move(e); + BOOST_TEST(allocation_count == 0); + BOOST_TEST(d == 3); + e = 2; + BOOST_TEST(e == 2); + d = std::move(e); + e = d; + BOOST_TEST(e == d); + + test_move_and_assign<mpf_float>(); + test_move_and_assign<mpf_float_50>(); + } + { + test_std_lib<mpz_int>(); + mpz_int a = 2; + BOOST_TEST(allocation_count); // sanity check that we are tracking allocations + allocation_count = 0; + mpz_int b = std::move(a); + BOOST_TEST(allocation_count == 0); + + // + // Move assign: + // + mpz_int d, e; + d = 2; + d <<= 1000; + e = 3; + allocation_count = 0; + e = std::move(d); + BOOST_TEST(allocation_count == 0); + e = 2; + BOOST_TEST(e == 2); + d = std::move(e); + e = d; + BOOST_TEST(e == d); + + test_move_and_assign<mpz_int>(); + } + { + test_std_lib<mpq_rational>(); + mpq_rational a = 2; + BOOST_TEST(allocation_count); // sanity check that we are tracking allocations + allocation_count = 0; + mpq_rational b = std::move(a); + BOOST_TEST(allocation_count == 0); + + // + // Move assign: + // + mpq_rational d, e; + d = mpz_int(2) << 1000; + e = 3; + allocation_count = 0; + e = std::move(d); + BOOST_TEST(allocation_count == 0); + d = 2; + BOOST_TEST(d == 2); + d = std::move(e); + e = d; + BOOST_TEST(e == d); + + test_move_and_assign<mpq_rational>(); + } +#endif +#ifdef TEST_TOMMATH + { + test_std_lib<tom_int>(); + tom_int a = 2; + void const* p = a.backend().data().dp; + tom_int b = std::move(a); + BOOST_TEST(b.backend().data().dp == p); + // We can't test this, as it will assert inside data(): + //BOOST_TEST(a.backend().data().dp == 0); + + // + // Move assign: + // + tom_int d, e; + d = 2; + d <<= 1000; + e = 3; + p = d.backend().data().dp; + BOOST_TEST(p != e.backend().data().dp); + e = std::move(d); + BOOST_TEST(e.backend().data().dp == p); + d = 2; + BOOST_TEST(d == 2); + d = std::move(e); + e = d; + BOOST_TEST(e == d); + + test_move_and_assign<tom_int>(); + } +#endif +#ifdef TEST_CPP_INT + { + test_std_lib<cpp_int>(); + cpp_int a = 2; + a <<= 1000; // Force dynamic allocation. + void const* p = a.backend().limbs(); + cpp_int b = std::move(a); + BOOST_TEST(b.backend().limbs() == p); + + // + // Move assign: + // + cpp_int d, e; + d = 2; + d <<= 1000; + e = 3; + e <<= 1000; + p = d.backend().limbs(); + BOOST_TEST(p != e.backend().limbs()); + e = std::move(d); + BOOST_TEST(e.backend().limbs() == p); + d = 2; + BOOST_TEST(d == 2); + d = std::move(e); + e = d; + BOOST_TEST(e == d); + + test_move_and_assign<cpp_int>(); + test_move_and_assign<int512_t>(); + } +#endif + return boost::report_errors(); +} + +#else +// +// No rvalue refs, nothing to test: +// +int main() +{ + return 0; +} + +#endif diff --git a/src/boost/libs/multiprecision/test/test_mpc_conversions.cpp b/src/boost/libs/multiprecision/test/test_mpc_conversions.cpp new file mode 100644 index 00000000..3a880b6d --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mpc_conversions.cpp @@ -0,0 +1,128 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#include <boost/multiprecision/mpc.hpp> +#include <boost/multiprecision/gmp.hpp> + +int main() +{ + using namespace boost::multiprecision; + // + // Test interconversions between GMP supported backends: + // + mpf_t mpf; + mpz_t mpz; + mpq_t mpq; + mpfr_t mpfr; + mpf_init2(mpf, 100); + mpf_set_ui(mpf, 2u); + mpz_init(mpz); + mpz_set_ui(mpz, 2u); + mpq_init(mpq); + mpq_set_ui(mpq, 2u, 1u); + mpfr_init(mpfr); + mpfr_set_ui(mpfr, 2u, GMP_RNDN); + + BOOST_TEST(mpc_complex(mpf) == 2); + BOOST_TEST(mpc_complex_50(mpf) == 2); + BOOST_TEST(mpc_complex(mpz) == 2); + BOOST_TEST(mpc_complex_50(mpz) == 2); + BOOST_TEST(mpc_complex(mpq) == 2); + BOOST_TEST(mpc_complex_50(mpq) == 2); + BOOST_TEST(mpc_complex(mpfr) == 2); + BOOST_TEST(mpc_complex_50(mpfr) == 2); + + mpc_complex f0; + mpc_complex_50 f50; + f0 = mpf; + BOOST_TEST(f0 == 2); + f0 = 0; + f0 = mpz; + BOOST_TEST(f0 == 2); + f0 = 0; + f0 = mpq; + BOOST_TEST(f0 == 2); + f0 = mpfr; + BOOST_TEST(f0 == 2); + + f50 = mpf; + BOOST_TEST(f50 == 2); + f50 = 0; + f50 = mpz; + BOOST_TEST(f50 == 2); + f50 = 0; + f50 = mpq; + BOOST_TEST(f50 == 2); + f50 = mpfr; + BOOST_TEST(f50 == 2); + + f50 = 4; + f0 = f50; + BOOST_TEST(f0 == 4); + f0 = 3; + f50 = f0; + BOOST_TEST(f50 == 3); + f50 = 4; + BOOST_TEST(mpc_complex(f50) == 4); + BOOST_TEST(mpc_complex_50(f0) == 3); + + mpz_int iz(2); + mpq_rational rat(2); + mpf_float gf(2); + f50 = 3; + f50 = iz; + BOOST_TEST(f50 == 2); + f50 = 3; + f0 = iz; + BOOST_TEST(f0 == 2); + f50 = 3; + f0 = gf; + BOOST_TEST(f0 == 2); + BOOST_TEST(mpc_complex(iz) == 2); + BOOST_TEST(mpc_complex_50(iz) == 2); + BOOST_TEST(mpc_complex(rat) == 2); + BOOST_TEST(mpc_complex_50(rat) == 2); + BOOST_TEST(mpc_complex(gf) == 2); + BOOST_TEST(mpc_complex_50(gf) == 2); + + // + // Conversions involving precision only: + // + mpc_complex::default_precision(30); + f50 = 2; + mpc_complex_100 f100(3); + mpc_complex f0a(4); + mpc_complex f0b(f100); + BOOST_TEST(f0a.precision() == 30); + BOOST_TEST(f0b.precision() == 100); + f0a = f100; + BOOST_TEST(f0a == 3); + BOOST_TEST(f0a.precision() == 100); // precision preserved on assignment + + f100 = f50; + BOOST_TEST(f100 == 2); + + f50 = static_cast<mpc_complex_50>(f100); + + mpf_clear(mpf); + mpz_clear(mpz); + mpq_clear(mpq); + mpfr_clear(mpfr); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mpc_overloads.cpp b/src/boost/libs/multiprecision/test/test_mpc_overloads.cpp new file mode 100644 index 00000000..50920644 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mpc_overloads.cpp @@ -0,0 +1,69 @@ +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#include <type_traits> +#include "test.hpp" +#include <boost/multiprecision/mpc.hpp> +#include <boost/math/constants/constants.hpp> + +using boost::multiprecision::mpc_complex_100; + +template <class Complex> +void test_overloads() +{ + typedef typename Complex::value_type Real; + Complex ya = {5.2, 7.4}; + Complex yb = {8.2, 7.3}; + Real h = 0.0001; + auto I0 = (ya + yb) * h; + Complex I1 = I0 / 2 + yb * h; + + //I1 = I0; // not supposed to work. + + Complex z{2, 3}; + typename Complex::value_type theta = 0.2; + int n = 2; + using std::sin; + Complex arg = z * sin(theta) - n * theta; + + using std::exp; + Real v = 0.2; + Real cotv = 7.8; + Real cscv = 8.2; + Complex den = z + v * cscv * exp(-v * cotv); + + boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<100> > a = 2; + boost::multiprecision::number<boost::multiprecision::backends::mpc_complex_backend<100> > b = 3; + /* + if (a <= b) { + b = a; + }*/ +} + +template <class F, class Real> +typename std::result_of_t<F(Real)> some_functional(F f, Real a, Real b) +{ + if (a <= -boost::math::tools::max_value<Real>()) + { + return f(a); + } + + return f(b); +} + +template <class Complex> +void test_functional() +{ + typedef typename Complex::value_type Real; + auto f = [](Real x) -> Complex { Complex z(x, 3); return z; }; + Real a = 0; + Real b = 1; + Complex result = some_functional(f, a, b); +} + +int main() +{ + test_overloads<mpc_complex_100>(); + test_functional<mpc_complex_100>(); +} diff --git a/src/boost/libs/multiprecision/test/test_mpf_precisions.cpp b/src/boost/libs/multiprecision/test/test_mpf_precisions.cpp new file mode 100644 index 00000000..4148b5b3 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mpf_precisions.cpp @@ -0,0 +1,140 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include "test.hpp" + +#include <boost/multiprecision/gmp.hpp> + +template <class T> +T make_rvalue_copy(const T a) +{ + return a; +} + +int main() +{ + using namespace boost::multiprecision; + // + // Test change of default precision: + // + mpf_float::default_precision(100); + mpf_float a("0.1"); + BOOST_CHECK_GE(a.precision(), 100); + mpf_float::default_precision(20); + { + // test assignment from lvalue: + mpf_float b(2); + BOOST_CHECK_GE(b.precision(), 20); + b = a; + BOOST_CHECK_EQUAL(b.precision(), a.precision()); + } +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + { + // test assignment from rvalue: + mpf_float b(2); + BOOST_CHECK_GE(b.precision(), 20); + b = make_rvalue_copy(a); + BOOST_CHECK_EQUAL(b.precision(), a.precision()); + } +#endif + mpf_float::default_precision(20); + { + // test construct from lvalue: + mpf_float b(a); + BOOST_CHECK_EQUAL(b.precision(), a.precision()); + } +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + { + // test construct from rvalue: + mpf_float b(make_rvalue_copy(a)); + BOOST_CHECK_EQUAL(b.precision(), a.precision()); + } +#endif + { + mpf_float f150(2, 150); + BOOST_CHECK_GE(f150.precision(), 150); + } + { + mpf_float f150("1.2", 150); + BOOST_CHECK_GE(f150.precision(), 150); + } + // + // From https://github.com/boostorg/multiprecision/issues/65 + // + { + mpf_float a(2); + a.precision(100); + BOOST_CHECK_EQUAL(a, 2); + BOOST_CHECK_GE(a.precision(), 100); + } + + // + // string_view with explicit precision: + // +#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW + { + std::string s("222"); + std::string_view v(s.c_str(), 1); + mpf_float f(v, 100); + BOOST_CHECK_EQUAL(f, 2); + BOOST_CHECK_GE(f.precision(), 100); + } +#endif + // Swap: + { + mpf_float x(2, 100); // 100 digits precision. + mpf_float y(3, 50); // 50 digits precision. + swap(x, y); + BOOST_CHECK_EQUAL(x, 3); + BOOST_CHECK_EQUAL(y, 2); + BOOST_CHECK_GE(x.precision(), 50); + BOOST_CHECK_GE(y.precision(), 100); + x.swap(y); + BOOST_CHECK_EQUAL(x, 2); + BOOST_CHECK_EQUAL(y, 3); + BOOST_CHECK_GE(x.precision(), 100); + BOOST_CHECK_GE(y.precision(), 50); +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + x = std::move(mpf_float(y)); + BOOST_CHECK_EQUAL(x, y); + BOOST_CHECK_EQUAL(x.precision(), y.precision()); +#endif + } + { + mpf_float c(4), d(8), e(9), f; + f = (c + d) * d / e; + mpf_float g((c + d) * d / e); + } + { + mpf_float::default_precision(100); + mpf_float f1; + f1 = 3; + BOOST_CHECK_GE(f1.precision(), 100); + f1 = 3.5; + BOOST_CHECK_GE(f1.precision(), 100); + mpf_float f2(3.5); + BOOST_CHECK_GE(f2.precision(), 100); + mpf_float f3("5.1"); + BOOST_CHECK_GE(f3.precision(), 100); + + mpf_float::default_precision(50); + mpf_float f4(f3, 50); + BOOST_CHECK_GE(f4.precision(), 50); + f4.assign(f1, f4.precision()); + BOOST_CHECK_GE(f4.precision(), 50); + } + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mpfi.cpp b/src/boost/libs/multiprecision/test/test_mpfi.cpp new file mode 100644 index 00000000..45d44bc5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mpfi.cpp @@ -0,0 +1,281 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include "test.hpp" +#include <boost/multiprecision/mpfi.hpp> +#include <boost/multiprecision/random.hpp> + +using namespace boost::multiprecision; +using namespace boost::random; + +void test_exp() +{ + std::cout << "Testing exp\n"; + + mpfr_float_50 val = 1.25; + + for (unsigned i = 0; i < 2000; ++i) + { + mpfr_float_100 a(val); + mpfr_float_100 b = exp(a); + mpfi_float_50 in = val; + in = exp(in); + BOOST_CHECK((boost::math::isfinite)(in)); + BOOST_CHECK(lower(in) <= b); + BOOST_CHECK(upper(in) >= b); + b = log(a); + in = val; + in = log(in); + BOOST_CHECK((boost::math::isfinite)(in)); + BOOST_CHECK(lower(in) <= b); + BOOST_CHECK(upper(in) >= b); + val *= 1.01; + } + val = 1; + for (unsigned i = 0; i < 2000; ++i) + { + mpfr_float_100 a(val); + mpfr_float_100 b = exp(a); + mpfi_float_50 in = val; + in = exp(in); + BOOST_CHECK((boost::math::isfinite)(in)); + BOOST_CHECK(lower(in) <= b); + BOOST_CHECK(upper(in) >= b); + b = log(a); + in = val; + in = log(in); + BOOST_CHECK((boost::math::isfinite)(in)); + BOOST_CHECK(lower(in) <= b); + BOOST_CHECK(upper(in) >= b); + val /= 1.01; + } +} + +void test_pow() +{ + std::cout << "Testing pow function\n"; + + mt19937 gen; + uniform_real_distribution<mpfr_float_50> dist1(0, 400); + + for (unsigned i = 0; i < 5000; ++i) + { + mpfr_float_50 base, p; + base = dist1(gen); + p = dist1(gen); + mpfr_float_100 a, b, r; + a = base; + b = p; + r = pow(a, b); + mpfi_float_50 ai, bi, ri; + ai = base; + bi = p; + ri = pow(ai, bi); + BOOST_CHECK((boost::math::isfinite)(ri)); + BOOST_CHECK(lower(ri) <= r); + BOOST_CHECK(upper(ri) >= r); + } +} + +void test_trig() +{ + std::cout << "Testing trig functions\n"; + + mt19937 gen; + uniform_real_distribution<mpfr_float_50> dist1(-1.57079632679, 1.57079632679); + uniform_real_distribution<mpfr_float_50> dist2(-1, 1); + + for (unsigned i = 0; i < 5000; ++i) + { + mpfr_float_50 val; + val = dist1(gen); + mpfr_float_100 a = val; + mpfr_float_100 b = sin(a); + mpfi_float_50 a2 = val; + mpfi_float_50 b2 = sin(a2); + BOOST_CHECK((boost::math::isfinite)(b2)); + BOOST_CHECK(lower(b2) <= b); + BOOST_CHECK(upper(b2) >= b); + b = cos(a); + b2 = cos(a2); + BOOST_CHECK((boost::math::isfinite)(b2)); + BOOST_CHECK(lower(b2) <= b); + BOOST_CHECK(upper(b2) >= b); + b = tan(a); + b2 = tan(a2); + BOOST_CHECK((boost::math::isfinite)(b2)); + BOOST_CHECK(lower(b2) <= b); + BOOST_CHECK(upper(b2) >= b); + } + for (unsigned i = 0; i < 5000; ++i) + { + mpfr_float_50 val; + val = dist2(gen); + mpfr_float_100 a = val; + mpfr_float_100 b = asin(a); + mpfi_float_50 a2 = val; + mpfi_float_50 b2 = asin(a2); + BOOST_CHECK((boost::math::isfinite)(b2)); + BOOST_CHECK(lower(b2) <= b); + BOOST_CHECK(upper(b2) >= b); + b = acos(a); + b2 = acos(a2); + BOOST_CHECK((boost::math::isfinite)(b2)); + BOOST_CHECK(lower(b2) <= b); + BOOST_CHECK(upper(b2) >= b); + b = atan(a); + b2 = atan(a2); + BOOST_CHECK((boost::math::isfinite)(b2)); + BOOST_CHECK(lower(b2) <= b); + BOOST_CHECK(upper(b2) >= b); + } +} + +void test_hyp() +{ + std::cout << "Testing hyperbolic trig functions\n"; + + mt19937 gen; + uniform_real_distribution<mpfr_float_50> dist1(-10, 10); + uniform_real_distribution<mpfr_float_50> dist2(-1, 1); + + for (unsigned i = 0; i < 5000; ++i) + { + mpfr_float_50 val; + val = dist1(gen); + mpfr_float_100 a = val; + mpfr_float_100 b = sinh(a); + mpfi_float_50 a2 = val; + mpfi_float_50 b2 = sinh(a2); + BOOST_CHECK((boost::math::isfinite)(b2)); + BOOST_CHECK(lower(b2) <= b); + BOOST_CHECK(upper(b2) >= b); + b = cosh(a); + b2 = cosh(a2); + BOOST_CHECK((boost::math::isfinite)(b2)); + BOOST_CHECK(lower(b2) <= b); + BOOST_CHECK(upper(b2) >= b); + b = tanh(a); + b2 = tanh(a2); + BOOST_CHECK((boost::math::isfinite)(b2)); + BOOST_CHECK(lower(b2) <= b); + BOOST_CHECK(upper(b2) >= b); + } +} + +void test_intervals() +{ + mpfi_float_50 a(1, 2); + mpfi_float_50 b(1.5, 2.5); + BOOST_CHECK_EQUAL(lower(a), 1); + BOOST_CHECK_EQUAL(upper(a), 2); + BOOST_CHECK_EQUAL(median(a), 1.5); + BOOST_CHECK_EQUAL(width(a), 1); + mpfi_float_50 r = intersect(a, b); + BOOST_CHECK_EQUAL(lower(r), 1.5); + BOOST_CHECK_EQUAL(upper(r), 2); + r = hull(a, b); + BOOST_CHECK_EQUAL(lower(r), 1); + BOOST_CHECK_EQUAL(upper(r), 2.5); + BOOST_CHECK(overlap(a, b)); + BOOST_CHECK(in(mpfr_float_50(1.5), a)); + BOOST_CHECK(in(mpfr_float_50(1), a)); + BOOST_CHECK(in(mpfr_float_50(2), a)); + BOOST_CHECK(!zero_in(a)); + b = mpfi_float_50(1.5, 1.75); + BOOST_CHECK(subset(b, a)); + BOOST_CHECK(proper_subset(b, a)); + BOOST_CHECK(!empty(a)); + BOOST_CHECK(!singleton(a)); + b = mpfi_float_50(5, 6); + r = intersect(a, b); + BOOST_CHECK(empty(r)); +} + +#ifdef TEST_SPECIAL +#include "math/table_type.hpp" +#include <boost/math/special_functions.hpp> + +#define T mpfi_float_50 + +typedef number<mpfi_float_backend<25> > mpfi_float_25; + +void test_log1p_expm1() +{ +#include "../../math/test/log1p_expm1_data.ipp" + + std::cout << std::setprecision(std::numeric_limits<mpfi_float_25>::max_digits10); + std::cout << "Testing log1p and expm1\n"; + + for (unsigned i = 0; i < log1p_expm1_data.size(); ++i) + { + mpfi_float_25 in(log1p_expm1_data[i][0]); + mpfi_float_25 out = boost::math::log1p(in); + mpfi_float_25 expected(log1p_expm1_data[i][1]); + if (!subset(expected, out)) + { + std::cout << in << std::endl; + std::cout << out << std::endl; + std::cout << expected << std::endl; + BOOST_CHECK(lower(out) <= lower(expected)); + BOOST_CHECK(upper(out) >= upper(expected)); + } + out = boost::math::expm1(in); + expected = mpfi_float_25(log1p_expm1_data[i][2]); + if (!subset(expected, out)) + { + std::cout << in << std::endl; + std::cout << out << std::endl; + std::cout << expected << std::endl; + BOOST_CHECK(lower(out) <= lower(expected)); + BOOST_CHECK(upper(out) >= upper(expected)); + } + } +} + +void test_bessel() +{ +#include "../../math/test/bessel_i_int_data.ipp" +#include "../../math/test/bessel_i_data.ipp" + + std::cout << std::setprecision(std::numeric_limits<mpfi_float_25>::max_digits10); + std::cout << "Testing Bessel Functions\n"; + + for (unsigned i = 0; i < bessel_i_int_data.size(); ++i) + { + int v = boost::lexical_cast<int>(static_cast<const char*>(bessel_i_int_data[i][0])); + mpfi_float_25 in(bessel_i_int_data[i][1]); + mpfi_float_25 out = boost::math::cyl_bessel_i(v, in); + mpfi_float_25 expected(bessel_i_int_data[i][2]); + if (!subset(expected, out)) + { + std::cout << in << std::endl; + std::cout << out << std::endl; + std::cout << expected << std::endl; + BOOST_CHECK(lower(out) <= lower(expected)); + BOOST_CHECK(upper(out) >= upper(expected)); + } + } +} + +#endif + +int main() +{ +#ifdef TEST_SPECIAL + test_log1p_expm1(); + test_bessel(); +#endif + test_intervals(); + test_exp(); + test_pow(); + test_trig(); + test_hyp(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mpfi_precisions.cpp b/src/boost/libs/multiprecision/test/test_mpfi_precisions.cpp new file mode 100644 index 00000000..d3a8f014 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mpfi_precisions.cpp @@ -0,0 +1,164 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include "test.hpp" + +#include <boost/multiprecision/mpfi.hpp> + +template <class T> +T make_rvalue_copy(const T a) +{ + return a; +} + +int main() +{ + using namespace boost::multiprecision; + // + // Test change of default precision: + // + mpfi_float::default_precision(100); + mpfi_float a("0.1"); + BOOST_CHECK_EQUAL(a.precision(), 100); + mpfi_float::default_precision(20); + { + // test assignment from lvalue: + mpfi_float b(2); + BOOST_CHECK_EQUAL(b.precision(), 20); + b = a; + BOOST_CHECK_EQUAL(b.precision(), a.precision()); + } +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + { + // test assignment from rvalue: + mpfi_float b(2); + BOOST_CHECK_EQUAL(b.precision(), 20); + b = make_rvalue_copy(a); + BOOST_CHECK_EQUAL(b.precision(), a.precision()); + } +#endif + mpfi_float::default_precision(20); + { + // test construct from lvalue: + mpfi_float b(a); + BOOST_CHECK_EQUAL(b.precision(), 100); + } +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + { + // test construct from rvalue: + mpfi_float b(make_rvalue_copy(a)); + BOOST_CHECK_EQUAL(b.precision(), 100); + } +#endif + { + mpfi_float f150(2, 2, 150); + BOOST_CHECK_EQUAL(f150.precision(), 150); + } + { + mpfi_float f150("1.2", "1.2", 150); + BOOST_CHECK_EQUAL(f150.precision(), 150); + } + // + // From https://github.com/boostorg/multiprecision/issues/65 + // + { + mpfi_float a(2); + a.precision(100); + BOOST_CHECK_EQUAL(a, 2); + BOOST_CHECK_EQUAL(a.precision(), 100); + } + + // + // string_view with explicit precision: + // +#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW + { + std::string s("222"); + std::string_view v(s.c_str(), 1); + mpfi_float f(v, v, 100); + BOOST_CHECK_EQUAL(f, 2); + BOOST_CHECK_EQUAL(f.precision(), 100); + } +#endif + // Swap: + { + mpfi_float x(2, 2, 100); // 100 digits precision. + mpfi_float y(3, 3, 50); // 50 digits precision. + swap(x, y); + BOOST_CHECK_EQUAL(x, 3); + BOOST_CHECK_EQUAL(y, 2); + BOOST_CHECK_EQUAL(x.precision(), 50); + BOOST_CHECK_EQUAL(y.precision(), 100); + x.swap(y); + BOOST_CHECK_EQUAL(x, 2); + BOOST_CHECK_EQUAL(y, 3); + BOOST_CHECK_EQUAL(x.precision(), 100); + BOOST_CHECK_EQUAL(y.precision(), 50); +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + x = std::move(mpfi_float(y)); + BOOST_CHECK_EQUAL(x, y); + BOOST_CHECK_EQUAL(x.precision(), y.precision()); +#endif + } + { + mpfi_float c(4), d(8), e(9), f; + f = (c + d) * d / e; + mpfi_float g((c + d) * d / e); + } + { + mpfi_float::default_precision(100); + mpfi_float f1; + f1 = 3; + BOOST_CHECK_EQUAL(f1.precision(), 100); + f1 = 3.5; + BOOST_CHECK_EQUAL(f1.precision(), 100); + mpfi_float f2(3.5); + BOOST_CHECK_EQUAL(f2.precision(), 100); + mpfi_float f3("5.1"); + BOOST_CHECK_EQUAL(f3.precision(), 100); + + mpfi_float::default_precision(50); + mpfi_float f4(f3, 50); + BOOST_CHECK_EQUAL(f4.precision(), 50); + f4.assign(f1, f4.precision()); + BOOST_CHECK_EQUAL(f4.precision(), 50); + } + { + // + // Check additional non-member functions, + // see https://github.com/boostorg/multiprecision/issues/91 + // + mpfi_float::default_precision(100); + mpfi_float f1; + f1 = 3; + BOOST_CHECK_EQUAL(f1.precision(), 100); + mpfi_float::default_precision(20); + BOOST_CHECK_EQUAL(lower(f1).precision(), 100); + BOOST_CHECK_EQUAL(upper(f1).precision(), 100); + BOOST_CHECK_EQUAL(median(f1).precision(), 100); + BOOST_CHECK_EQUAL(width(f1).precision(), 100); + BOOST_CHECK_EQUAL(intersect(f1, f1).precision(), 100); + BOOST_CHECK_EQUAL(hull(f1, f1).precision(), 100); + + BOOST_CHECK_EQUAL(asinh(f1).precision(), 100); + BOOST_CHECK_EQUAL(acosh(f1).precision(), 100); + BOOST_CHECK_EQUAL(atanh(f1).precision(), 100); + BOOST_CHECK_EQUAL(log1p(f1).precision(), 100); + BOOST_CHECK_EQUAL(expm1(f1).precision(), 100); + BOOST_CHECK_EQUAL(cbrt(f1).precision(), 100); + } + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mpfr_conversions.cpp b/src/boost/libs/multiprecision/test/test_mpfr_conversions.cpp new file mode 100644 index 00000000..4e9b90b9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mpfr_conversions.cpp @@ -0,0 +1,128 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#include <boost/multiprecision/mpfr.hpp> +#include <boost/multiprecision/gmp.hpp> + +int main() +{ + using namespace boost::multiprecision; + // + // Test interconversions between GMP supported backends: + // + mpf_t mpf; + mpz_t mpz; + mpq_t mpq; + mpfr_t mpfr; + mpf_init2(mpf, 100); + mpf_set_ui(mpf, 2u); + mpz_init(mpz); + mpz_set_ui(mpz, 2u); + mpq_init(mpq); + mpq_set_ui(mpq, 2u, 1u); + mpfr_init(mpfr); + mpfr_set_ui(mpfr, 2u, GMP_RNDN); + + BOOST_TEST(mpfr_float(mpf) == 2); + BOOST_TEST(mpfr_float_50(mpf) == 2); + BOOST_TEST(mpfr_float(mpz) == 2); + BOOST_TEST(mpfr_float_50(mpz) == 2); + BOOST_TEST(mpfr_float(mpq) == 2); + BOOST_TEST(mpfr_float_50(mpq) == 2); + BOOST_TEST(mpfr_float(mpfr) == 2); + BOOST_TEST(mpfr_float_50(mpfr) == 2); + + mpfr_float f0; + mpfr_float_50 f50; + f0 = mpf; + BOOST_TEST(f0 == 2); + f0 = 0; + f0 = mpz; + BOOST_TEST(f0 == 2); + f0 = 0; + f0 = mpq; + BOOST_TEST(f0 == 2); + f0 = mpfr; + BOOST_TEST(f0 == 2); + + f50 = mpf; + BOOST_TEST(f50 == 2); + f50 = 0; + f50 = mpz; + BOOST_TEST(f50 == 2); + f50 = 0; + f50 = mpq; + BOOST_TEST(f50 == 2); + f50 = mpfr; + BOOST_TEST(f50 == 2); + + f50 = 4; + f0 = f50; + BOOST_TEST(f0 == 4); + f0 = 3; + f50 = f0; + BOOST_TEST(f50 == 3); + f50 = 4; + BOOST_TEST(mpfr_float(f50) == 4); + BOOST_TEST(mpfr_float_50(f0) == 3); + + mpz_int iz(2); + mpq_rational rat(2); + mpf_float gf(2); + f50 = 3; + f50 = iz; + BOOST_TEST(f50 == 2); + f50 = 3; + f0 = iz; + BOOST_TEST(f0 == 2); + f50 = 3; + f0 = gf; + BOOST_TEST(f0 == 2); + BOOST_TEST(mpfr_float(iz) == 2); + BOOST_TEST(mpfr_float_50(iz) == 2); + BOOST_TEST(mpfr_float(rat) == 2); + BOOST_TEST(mpfr_float_50(rat) == 2); + BOOST_TEST(mpfr_float(gf) == 2); + BOOST_TEST(mpfr_float_50(gf) == 2); + + // + // Conversions involving precision only: + // + mpfr_float::default_precision(30); + f50 = 2; + mpfr_float_100 f100(3); + mpfr_float f0a(4); + mpfr_float f0b(f100); + BOOST_TEST(f0a.precision() == 30); + BOOST_TEST(f0b.precision() == 100); + f0a = f100; + BOOST_TEST(f0a == 3); + BOOST_TEST(f0a.precision() == 100); // precision preserved on assignment + + f100 = f50; + BOOST_TEST(f100 == 2); + + f50 = static_cast<mpfr_float_50>(f100); + + mpf_clear(mpf); + mpz_clear(mpz); + mpq_clear(mpq); + mpfr_clear(mpfr); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_mpfr_mpc_precisions.cpp b/src/boost/libs/multiprecision/test/test_mpfr_mpc_precisions.cpp new file mode 100644 index 00000000..4b2dbedb --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_mpfr_mpc_precisions.cpp @@ -0,0 +1,303 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include "test.hpp" + +#include <boost/multiprecision/mpfr.hpp> +#include <boost/multiprecision/mpc.hpp> + +template <class T> +T make_rvalue_copy(const T a) +{ + return a; +} + +int main() +{ + using namespace boost::multiprecision; + // + // Test change of default precision: + // + mpfr_float::default_precision(100); + mpfr_float a("0.1"); + BOOST_CHECK_EQUAL(a.precision(), 100); + mpfr_float::default_precision(20); + { + // test assignment from lvalue: + mpfr_float b(2); + BOOST_CHECK_EQUAL(b.precision(), 20); + b = a; + BOOST_CHECK_EQUAL(b.precision(), a.precision()); + } +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + { + // test assignment from rvalue: + mpfr_float b(2); + BOOST_CHECK_EQUAL(b.precision(), 20); + b = make_rvalue_copy(a); + BOOST_CHECK_EQUAL(b.precision(), a.precision()); + } +#endif + mpfr_float::default_precision(20); + { + // test construct from lvalue: + mpfr_float b(a); + BOOST_CHECK_EQUAL(b.precision(), 100); + } +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + { + // test construct from rvalue: + mpfr_float b(make_rvalue_copy(a)); + BOOST_CHECK_EQUAL(b.precision(), 100); + } +#endif + mpc_complex::default_precision(100); + mpc_complex ca("0.1"); + BOOST_CHECK_EQUAL(ca.precision(), 100); + mpc_complex::default_precision(20); + { + // test assignment from lvalue: + mpc_complex b(2); + BOOST_CHECK_EQUAL(b.precision(), 20); + b = ca; + BOOST_CHECK_EQUAL(b.precision(), ca.precision()); + } +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + { + // test assignment from rvalue: + mpc_complex b(2); + BOOST_CHECK_EQUAL(b.precision(), 20); + b = make_rvalue_copy(ca); + BOOST_CHECK_EQUAL(b.precision(), ca.precision()); + } +#endif + { + // test construct from lvalue: + mpc_complex b(ca); + BOOST_CHECK_EQUAL(b.precision(), ca.precision()); + } +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + { + // test construct from rvalue: + mpc_complex b(make_rvalue_copy(ca)); + BOOST_CHECK_EQUAL(b.precision(), ca.precision()); + } +#endif + // real and imaginary: + BOOST_CHECK_EQUAL(ca.real().precision(), 100); + BOOST_CHECK_EQUAL(ca.imag().precision(), 100); + BOOST_CHECK_EQUAL(real(ca).precision(), 100); + BOOST_CHECK_EQUAL(imag(ca).precision(), 100); + + // + // Construction at specific precision: + // + { + mpfr_float f150(mpfr_float(), 150u); + BOOST_CHECK_EQUAL(f150.precision(), 150); + mpc_complex f150c(mpc_complex(), 150u); + BOOST_CHECK_EQUAL(f150c.precision(), 150); + mpc_complex f150cc(mpfr_float(), mpfr_float(), 150u); + BOOST_CHECK_EQUAL(f150cc.precision(), 150); + } + { + mpfr_float f150(2, 150); + BOOST_CHECK_EQUAL(f150.precision(), 150); + } + { + mpfr_float f150("1.2", 150); + BOOST_CHECK_EQUAL(f150.precision(), 150); + } + // + // Copying precision: + // + { + mpc_complex c(ca.backend().data()); + BOOST_CHECK_EQUAL(c.precision(), 100); + mpc_complex_100 c100(2); + mpc_complex d(c100); + BOOST_CHECK_EQUAL(d.precision(), 100); + mpfr_float_100 f100(2); + mpc_complex e(f100); + BOOST_CHECK_EQUAL(d.precision(), 100); + } + // + // Check that the overloads for precision don't mess up 2-arg + // construction: + // + { + mpc_complex c(2, 3u); + BOOST_CHECK_EQUAL(c.real(), 2); + BOOST_CHECK_EQUAL(c.imag(), 3); + } + // + // 3-arg complex number construction with 3rd arg a precision: + // + { + mpc_complex c(2, 3, 100); + BOOST_CHECK_EQUAL(c.precision(), 100); + mpfr_float_50 x(2), y(3); + mpc_complex z(x, y, 100); + BOOST_CHECK_EQUAL(c.precision(), 100); + } + // + // From https://github.com/boostorg/multiprecision/issues/65 + // + { + mpfr_float a(2); + a.precision(100); + BOOST_CHECK_EQUAL(a, 2); + BOOST_CHECK_EQUAL(a.precision(), 100); + } + { + mpc_complex a(2, 3); + a.precision(100); + BOOST_CHECK_EQUAL(a.real(), 2); + BOOST_CHECK_EQUAL(a.imag(), 3); + BOOST_CHECK_EQUAL(a.precision(), 100); + } + { + mpc_complex::default_precision(1000); + mpfr_float::default_precision(1000); + mpc_complex a("1.324719827394086120398419082734980126734089612309871092830981236748901273498071240986123094861246981263481263489016238947147129807419028748901273409127349087124612576129076541203975704195690418570914657910465091256016501650916509165097164509164509761409561097561097650791650971465097165097162059761209561029756019265019726509126509172650971625097162450971309756104975610274650917825018740981274098127409182375701465172340923847120836540491320467127043127893281461230951097260126309812374091265091824981231236409851274", + "-0.80743891267394610982659071452346156102764312401571972642394120395608291471029347812645125986123123904123471209381289471230512983491286102875870192091283712396550981723409812740981263471230498715096104897123094710923879065981740928740981271801391209238470129560941870129387409812883437894183883841283700483832883218128438938184289148239164079329657861209381892037483468937489237419236509823723705612893489712412306531274812364980127304981648712483248732"); + mpc_complex::default_precision(40); + mpfr_float::default_precision(40); + BOOST_CHECK_EQUAL(a, a); + } + + // + // string_view with explicit precision: + // +#ifndef BOOST_NO_CXX17_HDR_STRING_VIEW + { + std::string s("222"); + std::string_view v(s.c_str(), 1); + mpfr_float f(v, 100); + BOOST_CHECK_EQUAL(f, 2); + BOOST_CHECK_EQUAL(f.precision(), 100); + } + { + std::string x("222"), y("333"); + std::string_view vx(x.c_str(), 1), vy(y.c_str(), 1); + mpc_complex c(vx, vy, 100); + BOOST_CHECK_EQUAL(c.real(), 2); + BOOST_CHECK_EQUAL(c.imag(), 3); + BOOST_CHECK_EQUAL(c.precision(), 100); + } +#endif + { + mpc_complex::default_precision(100); + mpfr_float::default_precision(100); + mpfr_float a(1); + mpfr_float b(2); + + mpc_complex::default_precision(50); + mpfr_float::default_precision(50); + + mpc_complex z(a, b); + + BOOST_CHECK_EQUAL(z.precision(), 100); + } + // Swap: + { + mpfr_float x(2, 100); // 100 digits precision. + mpfr_float y(3, 50); // 50 digits precision. + swap(x, y); + BOOST_CHECK_EQUAL(x, 3); + BOOST_CHECK_EQUAL(y, 2); + BOOST_CHECK_EQUAL(x.precision(), 50); + BOOST_CHECK_EQUAL(y.precision(), 100); + x.swap(y); + BOOST_CHECK_EQUAL(x, 2); + BOOST_CHECK_EQUAL(y, 3); + BOOST_CHECK_EQUAL(x.precision(), 100); + BOOST_CHECK_EQUAL(y.precision(), 50); +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + x = std::move(mpfr_float(y)); + BOOST_CHECK_EQUAL(x, y); + BOOST_CHECK_EQUAL(x.precision(), y.precision()); +#endif + } + { + mpc_complex x(2, 3, 100); // 100 digits precision. + mpc_complex y(3, 4, 50); // 50 digits precision. + swap(x, y); + BOOST_CHECK_EQUAL(x.real(), 3); + BOOST_CHECK_EQUAL(x.imag(), 4); + BOOST_CHECK_EQUAL(y.real(), 2); + BOOST_CHECK_EQUAL(y.imag(), 3); + BOOST_CHECK_EQUAL(x.precision(), 50); + BOOST_CHECK_EQUAL(y.precision(), 100); + x.swap(y); + BOOST_CHECK_EQUAL(x.real(), 2); + BOOST_CHECK_EQUAL(x.imag(), 3); + BOOST_CHECK_EQUAL(y.real(), 3); + BOOST_CHECK_EQUAL(y.imag(), 4); + BOOST_CHECK_EQUAL(x.precision(), 100); + BOOST_CHECK_EQUAL(y.precision(), 50); +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + x = std::move(mpc_complex(y)); + BOOST_CHECK_EQUAL(x, y); + BOOST_CHECK_EQUAL(x.precision(), y.precision()); +#endif + } + { + mpfr_float c(4), d(8), e(9), f; + f = (c + d) * d / e; + mpfr_float g((c + d) * d / e); + } + { + mpfr_float::default_precision(100); + mpfr_float f1; + f1 = 3; + BOOST_CHECK_EQUAL(f1.precision(), 100); + f1 = 3.5; + BOOST_CHECK_EQUAL(f1.precision(), 100); + mpfr_float f2(3.5); + BOOST_CHECK_EQUAL(f2.precision(), 100); + mpfr_float f3("5.1"); + BOOST_CHECK_EQUAL(f3.precision(), 100); + + mpfr_float::default_precision(50); + mpfr_float f4(f3, 50); + BOOST_CHECK_EQUAL(f4.precision(), 50); + f4.assign(f1, f4.precision()); + BOOST_CHECK_EQUAL(f4.precision(), 50); + } + { + // + // Overloads of Math lib functions, discovered while fixing + // https://github.com/boostorg/multiprecision/issues/91 + // + mpfr_float::default_precision(100); + mpfr_float f1; + f1 = 3; + BOOST_CHECK_EQUAL(f1.precision(), 100); + mpfr_float::default_precision(20); + BOOST_CHECK_EQUAL(asinh(f1).precision(), 100); + BOOST_CHECK_EQUAL(acosh(f1).precision(), 100); + BOOST_CHECK_EQUAL(atanh(f1).precision(), 100); + BOOST_CHECK_EQUAL(cbrt(f1).precision(), 100); + BOOST_CHECK_EQUAL(erf(f1).precision(), 100); + BOOST_CHECK_EQUAL(erfc(f1).precision(), 100); + BOOST_CHECK_EQUAL(expm1(f1).precision(), 100); + BOOST_CHECK_EQUAL(lgamma(f1).precision(), 100); + BOOST_CHECK_EQUAL(tgamma(f1).precision(), 100); + BOOST_CHECK_EQUAL(log1p(f1).precision(), 100); + } + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_native_integer.cpp b/src/boost/libs/multiprecision/test/test_native_integer.cpp new file mode 100644 index 00000000..0b2fe0cf --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_native_integer.cpp @@ -0,0 +1,101 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2012 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Compare arithmetic results using fixed_int to GMP results. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/integer.hpp> +#include "test.hpp" + +#ifdef BOOST_MSVC +#pragma warning(disable : 4146) +#endif + +template <class I, class H> +void test() +{ + using namespace boost::multiprecision; + + I i(0); + +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(lsb(i), std::range_error); +#endif + BOOST_CHECK(bit_test(bit_set(i, 0), 0)); + BOOST_CHECK_EQUAL(bit_set(i, 0), 1); + BOOST_CHECK_EQUAL(bit_unset(i, 0), 0); + BOOST_CHECK_EQUAL(bit_flip(bit_set(i, 0), 0), 0); + + unsigned max_index = (std::numeric_limits<I>::digits) - 1; + BOOST_CHECK(bit_test(bit_set(i, max_index), max_index)); + BOOST_CHECK_EQUAL(bit_unset(i, max_index), 0); + BOOST_CHECK_EQUAL(bit_flip(bit_set(i, max_index), max_index), 0); + i = 0; + bit_set(i, max_index); + BOOST_CHECK_EQUAL(lsb(i), max_index); + BOOST_CHECK_EQUAL(msb(i), max_index); + bit_set(i, max_index / 2); + BOOST_CHECK_EQUAL(lsb(i), max_index / 2); + BOOST_CHECK_EQUAL(msb(i), max_index); + +#ifndef BOOST_NO_EXCEPTIONS + if (std::numeric_limits<I>::is_signed) + { + i = static_cast<I>(-1); + BOOST_CHECK_THROW(lsb(i), std::range_error); + } +#endif + H mx = (std::numeric_limits<H>::max)(); + + BOOST_CHECK_EQUAL(multiply(i, mx, mx), static_cast<I>(mx) * static_cast<I>(mx)); + BOOST_CHECK_EQUAL(add(i, mx, mx), static_cast<I>(mx) + static_cast<I>(mx)); + if (std::numeric_limits<I>::is_signed) + { + BOOST_CHECK_EQUAL(subtract(i, mx, static_cast<H>(-mx)), static_cast<I>(mx) - static_cast<I>(-mx)); + BOOST_CHECK_EQUAL(add(i, static_cast<H>(-mx), static_cast<H>(-mx)), static_cast<I>(-mx) + static_cast<I>(-mx)); + } + + i = (std::numeric_limits<I>::max)(); + I j = 12345; + I r, q; + divide_qr(i, j, q, r); + BOOST_CHECK_EQUAL(q, i / j); + BOOST_CHECK_EQUAL(r, i % j); + BOOST_CHECK_EQUAL(integer_modulus(i, j), i % j); + I p = 456; + BOOST_CHECK_EQUAL(powm(i, p, j), pow(cpp_int(i), static_cast<unsigned>(p)) % j); + + for (I i = 0; i < (2 < 8) - 1; ++i) + { + I j = i * i; + I s, r; + s = sqrt(j, r); + BOOST_CHECK_EQUAL(s, i); + BOOST_CHECK(r == 0); + j += 3; + s = sqrt(i, r); + BOOST_CHECK_EQUAL(s, i); + BOOST_CHECK(r == 3); + } +} + +int main() +{ + using namespace boost::multiprecision; + + test<boost::int16_t, boost::int8_t>(); + test<boost::int32_t, boost::int16_t>(); + test<boost::int64_t, boost::int32_t>(); + test<boost::uint16_t, boost::uint8_t>(); + test<boost::uint32_t, boost::uint16_t>(); + test<boost::uint64_t, boost::uint32_t>(); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_nothrow_cpp_bin_float.cpp b/src/boost/libs/multiprecision/test/test_nothrow_cpp_bin_float.cpp new file mode 100644 index 00000000..c534c3d1 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_nothrow_cpp_bin_float.cpp @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/type_traits/is_nothrow_move_constructible.hpp> +#include <boost/type_traits/is_nothrow_move_assignable.hpp> +#include <boost/type_traits/has_nothrow_constructor.hpp> +#include <boost/type_traits/has_nothrow_assign.hpp> +#include <boost/type_traits/has_nothrow_copy.hpp> +#include <boost/static_assert.hpp> + +#ifndef BOOST_NO_CXX11_NOEXCEPT + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_CONSTRUCT) +// +// Move construct: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::cpp_bin_float_100>::value); + +#endif + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_ASSIGN) +// +// Move assign: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::cpp_bin_float_100>::value); + +#endif + +// +// Construct: +// +#ifdef BOOST_HAS_NOTHROW_CONSTRUCTOR +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::cpp_bin_float_100>::value); +#endif +// +// Copy construct: +// +#ifdef BOOST_HAS_NOTHROW_COPY +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::cpp_bin_float_100>::value); +#endif +// +// Assign: +// +#ifdef BOOST_HAS_NOTHROW_ASSIGN +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::cpp_bin_float_100>::value); +#endif + +#endif // noexcept diff --git a/src/boost/libs/multiprecision/test/test_nothrow_cpp_dec_float.cpp b/src/boost/libs/multiprecision/test/test_nothrow_cpp_dec_float.cpp new file mode 100644 index 00000000..369d25b8 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_nothrow_cpp_dec_float.cpp @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_dec_float.hpp> +#include <boost/type_traits/is_nothrow_move_constructible.hpp> +#include <boost/type_traits/is_nothrow_move_assignable.hpp> +#include <boost/type_traits/has_nothrow_constructor.hpp> +#include <boost/type_traits/has_nothrow_assign.hpp> +#include <boost/type_traits/has_nothrow_copy.hpp> +#include <boost/static_assert.hpp> + +#ifndef BOOST_NO_CXX11_NOEXCEPT + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_CONSTRUCT) +// +// Move construct: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::cpp_dec_float_100>::value); + +#endif + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_ASSIGN) +// +// Move assign: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::cpp_dec_float_100>::value); + +#endif + +// +// Construct: +// +#ifdef BOOST_HAS_NOTHROW_CONSTRUCTOR +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::cpp_dec_float_100>::value); +#endif +// +// Copy construct: +// +#ifdef BOOST_HAS_NOTHROW_COPY +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::cpp_dec_float_100>::value); +#endif +// +// Assign: +// +#ifdef BOOST_HAS_NOTHROW_ASSIGN +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::cpp_dec_float_100>::value); +#endif + +#endif // noexcept diff --git a/src/boost/libs/multiprecision/test/test_nothrow_cpp_int.cpp b/src/boost/libs/multiprecision/test/test_nothrow_cpp_int.cpp new file mode 100644 index 00000000..983604aa --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_nothrow_cpp_int.cpp @@ -0,0 +1,249 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/type_traits/is_nothrow_move_constructible.hpp> +#include <boost/type_traits/is_nothrow_move_assignable.hpp> +#include <boost/type_traits/has_nothrow_constructor.hpp> +#include <boost/type_traits/has_nothrow_assign.hpp> +#include <boost/type_traits/has_nothrow_copy.hpp> +#include <boost/static_assert.hpp> + +#ifndef BOOST_NO_CXX11_NOEXCEPT + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_CONSTRUCT) +// +// Move construct: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::cpp_int>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::int128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::checked_int128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::uint128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::checked_uint128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::int512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::checked_int512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::uint512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::checked_uint512_t>::value); + +#endif + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_ASSIGN) +// +// Move assign: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::cpp_int>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::int128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::checked_int128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::uint128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::checked_uint128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::int512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::checked_int512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::uint512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::checked_uint512_t>::value); + +#endif + +// +// Construct: +// +#ifdef BOOST_HAS_NOTHROW_CONSTRUCTOR +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::cpp_int>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::int128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::checked_int128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::uint128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::checked_uint128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::int512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::checked_int512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::uint512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::checked_uint512_t>::value); +#endif +// +// Copy construct: +// +#ifdef BOOST_HAS_NOTHROW_COPY +BOOST_STATIC_ASSERT(!boost::has_nothrow_copy<boost::multiprecision::cpp_int>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::int128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::checked_int128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::uint128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::checked_uint128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::int512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::checked_int512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::uint512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::checked_uint512_t>::value); +#endif +// +// Assign: +// +#ifdef BOOST_HAS_NOTHROW_ASSIGN +BOOST_STATIC_ASSERT(!boost::has_nothrow_assign<boost::multiprecision::cpp_int>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::int128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::checked_int128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::uint128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::checked_uint128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::int512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::checked_int512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::uint512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::checked_uint512_t>::value); +#endif +// +// Construct from int: +// +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_int(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::int128_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::checked_int128_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::uint128_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(!noexcept(boost::multiprecision::checked_uint128_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::int512_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::checked_int512_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::uint512_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(!noexcept(boost::multiprecision::checked_uint512_t(std::declval<boost::multiprecision::signed_limb_type>()))); +// +// Construct from unsigned int: +// +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_int(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::int128_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::checked_int128_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::uint128_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::checked_uint128_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::int512_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::checked_int512_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::uint512_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::checked_uint512_t(std::declval<boost::multiprecision::limb_type>()))); +// +// Assign from int: +// +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_int>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::int128_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::checked_int128_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::uint128_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<boost::multiprecision::checked_uint128_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::int512_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::checked_int512_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::uint512_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<boost::multiprecision::checked_uint512_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +// +// Assign from unsigned int: +// +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_int>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::int128_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::checked_int128_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::uint128_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::checked_uint128_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::int512_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::checked_int512_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::uint512_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::checked_uint512_t>() = std::declval<boost::multiprecision::limb_type>())); + +#if defined(BOOST_LITTLE_ENDIAN) && !defined(BOOST_MP_TEST_NO_LE) +// +// We can also nothrow construct from a double_limb_type (or smaller obviously) as long as double_limb_type is smaller than the type +// in question (so don't test 128-bit integers in case double_limb_type is __int128). +// +// Construct from int: +// +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_int(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::int512_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::checked_int512_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::uint512_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(!noexcept(boost::multiprecision::checked_uint512_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +// +// Construct from unsigned int: +// +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_int(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::int512_t(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::checked_int512_t(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::uint512_t(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::checked_uint512_t(std::declval<boost::multiprecision::double_limb_type>()))); +// +// Assign from int: +// +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_int>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::int512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::checked_int512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::uint512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<boost::multiprecision::checked_uint512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +// +// Assign from unsigned int: +// +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_int>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::int512_t>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::checked_int512_t>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::uint512_t>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::checked_uint512_t>() = std::declval<boost::multiprecision::double_limb_type>())); + +#endif // little endian + +typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > checked_int32_t; +typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > checked_uint32_t; +typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > unchecked_int32_t; +typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<32, 32, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > unchecked_uint32_t; + +// +// Construct from int: +// +BOOST_STATIC_ASSERT(noexcept(unchecked_int32_t(std::declval<boost::int32_t>()))); +BOOST_STATIC_ASSERT(noexcept(checked_int32_t(std::declval<boost::int32_t>()))); +BOOST_STATIC_ASSERT(noexcept(unchecked_uint32_t(std::declval<boost::int32_t>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_uint32_t(std::declval<boost::int32_t>()))); +// +// Construct from unsigned int: +// +BOOST_STATIC_ASSERT(noexcept(unchecked_int32_t(std::declval<boost::uint32_t>()))); +BOOST_STATIC_ASSERT(noexcept(checked_int32_t(std::declval<boost::uint32_t>()))); +BOOST_STATIC_ASSERT(noexcept(unchecked_uint32_t(std::declval<boost::uint32_t>()))); +BOOST_STATIC_ASSERT(noexcept(checked_uint32_t(std::declval<boost::uint32_t>()))); +// +// Assign from int: +// +BOOST_STATIC_ASSERT(noexcept(std::declval<unchecked_int32_t>() = std::declval<boost::int32_t>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_int32_t>() = std::declval<boost::int32_t>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<unchecked_uint32_t>() = std::declval<boost::int32_t>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_uint32_t>() = std::declval<boost::int32_t>())); +// +// Assign from unsigned int: +// +BOOST_STATIC_ASSERT(noexcept(std::declval<unchecked_int32_t>() = std::declval<boost::uint32_t>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_int32_t>() = std::declval<boost::uint32_t>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<unchecked_uint32_t>() = std::declval<boost::uint32_t>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_uint32_t>() = std::declval<boost::uint32_t>())); + +// +// And finally some things which should *not* be noexcept: +// +typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<30, 30, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void> > checked_int30_t; +typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<30, 30, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > checked_uint30_t; +typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<30, 30, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > unchecked_int30_t; +typedef boost::multiprecision::number<boost::multiprecision::cpp_int_backend<30, 30, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> > unchecked_uint30_t; + +// +// Construct from int: +// +BOOST_STATIC_ASSERT(!noexcept(checked_int30_t(std::declval<boost::int32_t>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_uint30_t(std::declval<boost::int32_t>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_int32_t(std::declval<boost::int64_t>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_uint32_t(std::declval<boost::int64_t>()))); +// +// Construct from unsigned int: +// +BOOST_STATIC_ASSERT(!noexcept(checked_int30_t(std::declval<boost::uint32_t>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_uint30_t(std::declval<boost::uint32_t>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_int32_t(std::declval<boost::uint64_t>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_uint32_t(std::declval<boost::uint64_t>()))); +// +// Assign from int: +// +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_int30_t>() = std::declval<boost::int32_t>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_uint30_t>() = std::declval<boost::int32_t>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_int32_t>() = std::declval<boost::int64_t>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_uint32_t>() = std::declval<boost::int64_t>())); +// +// Assign from unsigned int: +// +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_int30_t>() = std::declval<boost::uint32_t>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_uint30_t>() = std::declval<boost::uint32_t>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_int32_t>() = std::declval<boost::uint64_t>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_uint32_t>() = std::declval<boost::uint64_t>())); + +#endif // noexcept diff --git a/src/boost/libs/multiprecision/test/test_nothrow_cpp_rational.cpp b/src/boost/libs/multiprecision/test/test_nothrow_cpp_rational.cpp new file mode 100644 index 00000000..c6f7fe49 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_nothrow_cpp_rational.cpp @@ -0,0 +1,207 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/type_traits/is_nothrow_move_constructible.hpp> +#include <boost/type_traits/is_nothrow_move_assignable.hpp> +#include <boost/type_traits/has_nothrow_constructor.hpp> +#include <boost/type_traits/has_nothrow_assign.hpp> +#include <boost/type_traits/has_nothrow_copy.hpp> +#include <boost/static_assert.hpp> + +typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::int128_t::backend_type> > rat128_t; +typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::uint128_t::backend_type> > urat128_t; +typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::int512_t::backend_type> > rat512_t; +typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::uint512_t::backend_type> > urat512_t; + +typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_int128_t::backend_type> > checked_rat128_t; +typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_uint128_t::backend_type> > checked_urat128_t; +typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_int512_t::backend_type> > checked_rat512_t; +typedef boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::checked_uint512_t::backend_type> > checked_urat512_t; + +#ifndef BOOST_NO_CXX11_NOEXCEPT + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_CONSTRUCT) +// +// Move construct: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::cpp_rational>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<rat128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<checked_rat128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<urat128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<checked_urat128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<rat512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<checked_rat512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<urat512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<checked_urat512_t>::value); + +#endif + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_ASSIGN) +// +// Move assign: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::cpp_rational>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<rat128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<checked_rat128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<urat128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<checked_urat128_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<rat512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<checked_rat512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<urat512_t>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<checked_urat512_t>::value); + +#endif + +#if 0 +// +// Everything below could/should be made to work, given modifications to Boost.Rational +// + + +// +// Construct: +// +#ifdef BOOST_HAS_NOTHROW_CONSTRUCTOR +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::cpp_rational>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<rat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<checked_rat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<urat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<checked_urat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<rat512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<checked_rat512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<urat512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<checked_urat512_t>::value); +#endif +// +// Copy construct: +// +#ifdef BOOST_HAS_NOTHROW_COPY +BOOST_STATIC_ASSERT(!boost::has_nothrow_copy<boost::multiprecision::cpp_rational>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<rat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<checked_rat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<urat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<checked_urat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<rat512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<checked_rat512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<urat512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<checked_urat512_t>::value); +#endif +// +// Assign: +// +#ifdef BOOST_HAS_NOTHROW_ASSIGN +BOOST_STATIC_ASSERT(!boost::has_nothrow_assign<boost::multiprecision::cpp_rational>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<rat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<checked_rat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<urat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<checked_urat128_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<rat512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<checked_rat512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<urat512_t>::value); +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<checked_urat512_t>::value); +#endif +// +// Construct from int: +// +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(rat128_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_rat128_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(urat128_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_urat128_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(rat512_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_rat512_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(urat512_t(std::declval<boost::multiprecision::signed_limb_type>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_urat512_t(std::declval<boost::multiprecision::signed_limb_type>()))); +// +// Construct from unsigned int: +// +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(rat128_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_rat128_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(urat128_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_urat128_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(rat512_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_rat512_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(urat512_t(std::declval<boost::multiprecision::limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_urat512_t(std::declval<boost::multiprecision::limb_type>()))); +// +// Assign from int: +// +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::signed_limb_type>())); +// +// Assign from unsigned int: +// +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::limb_type>())); + +#if defined(BOOST_LITTLE_ENDIAN) +// +// Construct from int: +// +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(rat128_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_rat128_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(urat128_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_urat128_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(rat512_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_rat512_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(urat512_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +BOOST_STATIC_ASSERT(!noexcept(checked_urat512_t(std::declval<boost::multiprecision::signed_double_limb_type>()))); +// +// Construct from unsigned int: +// +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::cpp_rational(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(rat128_t(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_rat128_t(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(urat128_t(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_urat128_t(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(rat512_t(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_rat512_t(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(urat512_t(std::declval<boost::multiprecision::double_limb_type>()))); +BOOST_STATIC_ASSERT(noexcept(checked_urat512_t(std::declval<boost::multiprecision::double_limb_type>()))); +// +// Assign from int: +// +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::signed_double_limb_type>())); +// +// Assign from unsigned int: +// +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::cpp_rational>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<rat128_t>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat128_t>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<urat128_t>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_urat128_t>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<rat512_t>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_rat512_t>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<urat512_t>() = std::declval<boost::multiprecision::double_limb_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<checked_urat512_t>() = std::declval<boost::multiprecision::double_limb_type>())); + +#endif +#endif // little endian +#endif // noexcept diff --git a/src/boost/libs/multiprecision/test/test_nothrow_float128.cpp b/src/boost/libs/multiprecision/test/test_nothrow_float128.cpp new file mode 100644 index 00000000..d82dbaa0 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_nothrow_float128.cpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/float128.hpp> +#include <boost/type_traits/is_nothrow_move_constructible.hpp> +#include <boost/type_traits/is_nothrow_move_assignable.hpp> +#include <boost/type_traits/has_nothrow_constructor.hpp> +#include <boost/type_traits/has_nothrow_assign.hpp> +#include <boost/type_traits/has_nothrow_copy.hpp> +#include <boost/static_assert.hpp> + +#ifndef BOOST_NO_CXX11_NOEXCEPT + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_CONSTRUCT) +// +// Move construct: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::float128>::value); + +#endif + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_ASSIGN) +// +// Move assign: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::float128>::value); + +#endif + +// +// Construct: +// +#ifdef BOOST_HAS_NOTHROW_CONSTRUCTOR +BOOST_STATIC_ASSERT(boost::has_nothrow_constructor<boost::multiprecision::float128>::value); +#endif +// +// Copy construct: +// +#ifdef BOOST_HAS_NOTHROW_COPY +BOOST_STATIC_ASSERT(boost::has_nothrow_copy<boost::multiprecision::float128>::value); +#endif +// +// Assign: +// +#ifdef BOOST_HAS_NOTHROW_ASSIGN +BOOST_STATIC_ASSERT(boost::has_nothrow_assign<boost::multiprecision::float128>::value); +#endif + +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128())); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval<const boost::multiprecision::float128&>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval<boost::multiprecision::float128>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval<const float128_type&>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval<float128_type>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval<const double&>()))); +BOOST_STATIC_ASSERT(noexcept(boost::multiprecision::float128(std::declval<double>()))); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<const boost::multiprecision::float128&>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<boost::multiprecision::float128>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<const float128_type&>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<float128_type>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<const double&>())); +BOOST_STATIC_ASSERT(noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<double>())); + +struct any_convert +{ + template <class T> + operator T() const; // Can throw! +}; + +BOOST_STATIC_ASSERT(!noexcept(boost::multiprecision::float128(std::declval<const any_convert&>()))); +BOOST_STATIC_ASSERT(!noexcept(boost::multiprecision::float128(std::declval<any_convert>()))); +BOOST_STATIC_ASSERT(!noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<const any_convert&>())); +BOOST_STATIC_ASSERT(!noexcept(std::declval<boost::multiprecision::float128&>() = std::declval<any_convert>())); + +#endif // noexcept diff --git a/src/boost/libs/multiprecision/test/test_nothrow_gmp.cpp b/src/boost/libs/multiprecision/test/test_nothrow_gmp.cpp new file mode 100644 index 00000000..6ab3c2f6 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_nothrow_gmp.cpp @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/gmp.hpp> +#include <boost/type_traits/is_nothrow_move_constructible.hpp> +#include <boost/type_traits/is_nothrow_move_assignable.hpp> +#include <boost/type_traits/has_nothrow_constructor.hpp> +#include <boost/type_traits/has_nothrow_assign.hpp> +#include <boost/type_traits/has_nothrow_copy.hpp> +#include <boost/static_assert.hpp> + +#ifndef BOOST_NO_CXX11_NOEXCEPT + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_CONSTRUCT) +// +// Move construct: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::mpz_int>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::mpq_rational>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::mpf_float>::value); + +#endif + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_ASSIGN) +// +// Move assign: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::mpz_int>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::mpq_rational>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::mpf_float>::value); + +#endif + +#endif // noexcept diff --git a/src/boost/libs/multiprecision/test/test_nothrow_mpfr.cpp b/src/boost/libs/multiprecision/test/test_nothrow_mpfr.cpp new file mode 100644 index 00000000..c574cfbb --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_nothrow_mpfr.cpp @@ -0,0 +1,34 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/multiprecision/mpfr.hpp> +#include <boost/type_traits/is_nothrow_move_constructible.hpp> +#include <boost/type_traits/is_nothrow_move_assignable.hpp> +#include <boost/type_traits/has_nothrow_constructor.hpp> +#include <boost/type_traits/has_nothrow_assign.hpp> +#include <boost/type_traits/has_nothrow_copy.hpp> +#include <boost/static_assert.hpp> + +#ifndef BOOST_NO_CXX11_NOEXCEPT + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_CONSTRUCT) +// +// Move construct: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::mpfr_float>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_constructible<boost::multiprecision::mpfr_float_100>::value); + +#endif + +#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_IS_NOTHROW_MOVE_ASSIGN) +// +// Move assign: +// +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::mpfr_float>::value); +BOOST_STATIC_ASSERT(boost::is_nothrow_move_assignable<boost::multiprecision::mpfr_float_100>::value); + +#endif + +#endif // noexcept diff --git a/src/boost/libs/multiprecision/test/test_numeric_limits.cpp b/src/boost/libs/multiprecision/test/test_numeric_limits.cpp new file mode 100644 index 00000000..8ec395d0 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_numeric_limits.cpp @@ -0,0 +1,293 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && \ + !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPQ) && \ + !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_MPF +#define TEST_BACKEND +#define TEST_MPZ +#define TEST_MPFR +#define TEST_MPFR_50 +#define TEST_CPP_DEC_FLOAT +#define TEST_MPQ +#define TEST_TOMMATH +#define TEST_CPP_INT +#define TEST_MPFI_50 +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) || defined(TEST_MPF) || defined(TEST_MPZ) || defined(TEST_MPQ) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_MPFR) || defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_TOMMATH +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef TEST_CPP_INT +#include <boost/multiprecision/cpp_int.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +#define PRINT(x) \ + std::cout << BOOST_STRINGIZE(x) << " = " << std::numeric_limits<Number>::x << std::endl; + +template <class Number> +void test_specific(const boost::mpl::int_<boost::multiprecision::number_kind_floating_point>&) +{ + Number minv, maxv; + minv = (std::numeric_limits<Number>::min)(); + maxv = (std::numeric_limits<Number>::max)(); + BOOST_CHECK((boost::math::isnormal)(minv)); + BOOST_CHECK((boost::math::isnormal)(maxv)); + BOOST_CHECK((boost::math::isnormal)(log(minv))); + BOOST_CHECK((boost::math::isnormal)(log(maxv))); + BOOST_CHECK((boost::math::isnormal)(sqrt(minv))); + BOOST_CHECK((boost::math::isnormal)(sqrt(maxv))); + + if (std::numeric_limits<Number>::is_specialized) + { + if (std::numeric_limits<Number>::has_quiet_NaN) + { + BOOST_TEST((boost::math::isnan)(std::numeric_limits<Number>::quiet_NaN())); + BOOST_TEST(FP_NAN == (boost::math::fpclassify)(std::numeric_limits<Number>::quiet_NaN())); + BOOST_TEST(!(boost::math::isfinite)(std::numeric_limits<Number>::quiet_NaN())); + BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::quiet_NaN())); + BOOST_TEST(!(boost::math::isinf)(std::numeric_limits<Number>::quiet_NaN())); + } + if (std::numeric_limits<Number>::has_signaling_NaN) + { + BOOST_TEST((boost::math::isnan)(std::numeric_limits<Number>::signaling_NaN())); + BOOST_TEST(FP_NAN == (boost::math::fpclassify)(std::numeric_limits<Number>::signaling_NaN())); + BOOST_TEST(!(boost::math::isfinite)(std::numeric_limits<Number>::signaling_NaN())); + BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::signaling_NaN())); + BOOST_TEST(!(boost::math::isinf)(std::numeric_limits<Number>::signaling_NaN())); + } + if (std::numeric_limits<Number>::has_infinity) + { + BOOST_TEST((boost::math::isinf)(std::numeric_limits<Number>::infinity())); + BOOST_TEST(FP_INFINITE == (boost::math::fpclassify)(std::numeric_limits<Number>::infinity())); + BOOST_TEST(!(boost::math::isfinite)(std::numeric_limits<Number>::infinity())); + BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::infinity())); + BOOST_TEST(!(boost::math::isnan)(std::numeric_limits<Number>::infinity())); + } + if (std::numeric_limits<Number>::has_denorm == std::denorm_present) + { + BOOST_TEST(FP_SUBNORMAL == (boost::math::fpclassify)(std::numeric_limits<Number>::denorm_min())); + BOOST_TEST(FP_SUBNORMAL == (boost::math::fpclassify)((std::numeric_limits<Number>::min)() / 2)); + BOOST_TEST((boost::math::isfinite)(std::numeric_limits<Number>::denorm_min())); + BOOST_TEST(!(boost::math::isnormal)(std::numeric_limits<Number>::denorm_min())); + BOOST_TEST(!(boost::math::isinf)(std::numeric_limits<Number>::denorm_min())); + BOOST_TEST(!(boost::math::isnan)(std::numeric_limits<Number>::denorm_min())); + BOOST_TEST(0 == std::numeric_limits<Number>::denorm_min() / 2); + BOOST_TEST(0 != (std::numeric_limits<Number>::min)() / 2); + BOOST_TEST(0 != std::numeric_limits<Number>::denorm_min()); + } + } + Number n = 0; + BOOST_TEST((boost::math::fpclassify)(n) == FP_ZERO); + BOOST_TEST((boost::math::isfinite)(n)); + BOOST_TEST(!(boost::math::isnormal)(n)); + BOOST_TEST(!(boost::math::isinf)(n)); + BOOST_TEST(!(boost::math::isnan)(n)); + n = 2; + BOOST_TEST((boost::math::fpclassify)(n) == FP_NORMAL); + BOOST_TEST((boost::math::isfinite)(n)); + BOOST_TEST((boost::math::isnormal)(n)); + BOOST_TEST(!(boost::math::isinf)(n)); + BOOST_TEST(!(boost::math::isnan)(n)); + + if (std::numeric_limits<Number>::round_style == std::round_to_nearest) + { + BOOST_CHECK_EQUAL(std::numeric_limits<Number>::round_error(), 0.5); + } + else if (std::numeric_limits<Number>::round_style != std::round_indeterminate) + { + // Round error is 1.0: + BOOST_CHECK_EQUAL(std::numeric_limits<Number>::round_error(), 1); + } + else + { + // Round error is presumably somewhere between 0.5 and 1: + BOOST_CHECK((std::numeric_limits<Number>::round_error() <= 1) && (std::numeric_limits<Number>::round_error() >= 0.5)); + } +} + +template <class Number> +void test_specific(const boost::mpl::int_<boost::multiprecision::number_kind_integer>&) +{ + if (std::numeric_limits<Number>::is_modulo) + { + if (!std::numeric_limits<Number>::is_signed) + { + BOOST_TEST(1 + (std::numeric_limits<Number>::max)() == 0); + BOOST_TEST(--Number(0) == (std::numeric_limits<Number>::max)()); + } + } +} + +template <class Number, class T> +void test_specific(const T&) +{ +} + +template <class Number> +void test() +{ + typedef typename boost::mpl::if_c< + std::numeric_limits<Number>::is_specialized, + typename boost::multiprecision::number_category<Number>::type, + boost::mpl::int_<500> // not a number type + >::type fp_test_type; + + test_specific<Number>(fp_test_type()); + + // + // Note really a test just yet, but we can at least print out all the values: + // + std::cout << "numeric_limits values for type " << typeid(Number).name() << std::endl; + + PRINT(is_specialized); + if (std::numeric_limits<Number>::is_integer) + { + std::cout << std::hex << std::showbase; + } + std::cout << "max()" + << " = " << (std::numeric_limits<Number>::max)() << std::endl; + if (std::numeric_limits<Number>::is_integer) + { + std::cout << std::dec; + } + std::cout << "max()" + << " = " << (std::numeric_limits<Number>::max)() << std::endl; + std::cout << "min()" + << " = " << (std::numeric_limits<Number>::min)() << std::endl; +#ifndef BOOST_NO_CXX11_NUMERIC_LIMITS + PRINT(lowest()); +#endif + PRINT(digits); + PRINT(digits10); +#ifndef BOOST_NO_CXX11_NUMERIC_LIMITS + PRINT(max_digits10); +#endif + PRINT(is_signed); + PRINT(is_integer); + PRINT(is_exact); + PRINT(radix); + PRINT(epsilon()); + PRINT(round_error()); + PRINT(min_exponent); + PRINT(min_exponent10); + PRINT(max_exponent); + PRINT(max_exponent10); + PRINT(has_infinity); + PRINT(has_quiet_NaN); + PRINT(has_signaling_NaN); + PRINT(has_denorm); + PRINT(has_denorm_loss); + PRINT(infinity()); + PRINT(quiet_NaN()); + PRINT(signaling_NaN()); + PRINT(denorm_min()); + PRINT(is_iec559); + PRINT(is_bounded); + PRINT(is_modulo); + PRINT(traps); + PRINT(tinyness_before); + PRINT(round_style); +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); +#endif +#ifdef TEST_MPF + boost::multiprecision::mpf_float::default_precision(1000); + /* + boost::multiprecision::mpf_float r; + r.precision(50); + BOOST_TEST(r.precision() >= 50); + */ + BOOST_TEST(boost::multiprecision::mpf_float::default_precision() == 1000); + test<boost::multiprecision::mpf_float>(); +#endif +#ifdef TEST_MPZ + test<boost::multiprecision::mpz_int>(); +#endif +#ifdef TEST_MPQ + test<boost::multiprecision::mpq_rational>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#endif +#ifdef TEST_MPFR + test<boost::multiprecision::mpfr_float>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float>(); +#endif +#ifdef TEST_TOMMATH + test<boost::multiprecision::tom_int>(); +#endif +#ifdef TEST_CPP_INT + test<boost::multiprecision::cpp_int>(); + test<boost::multiprecision::int256_t>(); + test<boost::multiprecision::uint512_t>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<200, 200, boost::multiprecision::unsigned_magnitude, boost::multiprecision::checked, void> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_int_backend<70, 70, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void> > >(); +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_optional_compat.cpp b/src/boost/libs/multiprecision/test/test_optional_compat.cpp new file mode 100644 index 00000000..4626f9cc --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_optional_compat.cpp @@ -0,0 +1,31 @@ +/* + * (c) Copyright Andrey Semashev 2018. + * + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file + * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +/* + * The test verifies that Boost.Multiprecision does not cause conflict with Boost.Optional + * because of its restricted conversion constructors and operators. See comments in: + * + * https://github.com/boostorg/integer/pull/11 + */ + +#include <boost/multiprecision/cpp_int.hpp> +#include <boost/optional/optional.hpp> +#include <boost/core/lightweight_test.hpp> + +inline boost::optional<boost::multiprecision::int128_t> foo() +{ + return boost::optional<boost::multiprecision::int128_t>(10); +} + +int main() +{ + boost::optional<boost::multiprecision::int128_t> num = foo(); + BOOST_TEST(!!num); + BOOST_TEST(*num == 10); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_pow.cpp b/src/boost/libs/multiprecision/test/test_pow.cpp new file mode 100644 index 00000000..f83a56b0 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_pow.cpp @@ -0,0 +1,870 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +//# define TEST_MPF +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFR_50 +#define TEST_MPFI_50 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +void test() +{ + std::cout << "Testing type: " << typeid(T).name() << std::endl; + static const boost::array<boost::array<const char*, 3>, 702> data = + {{ + {{"9.85291419463953934609889984130859375e4", "8.4167086266170372255146503448486328125e2", "8.66781019918879108354226292713799369912745098619466567318041467361236175866573114777000418440761829061824953361563557580935951901405814080757565313129904800947783606850513184296612628910656615168927761935861462770335134108408073175949783551491164949747086136599355880600420490275164555515512645668845e4202"}}, + {{"1.652914355109703592461301013827323913574218750e1", "4.936528947862250937816952500725165009498596191406250e-2", "1.14852190138491736562279120519668390081141778746743826681517181158751264571350304943298501284647564489716027476004029804110782430201351750715968215799574772058637701195873519618784612525011353325208230847515250406858209757415407239793739704829281917272032288615255140733409015874140869835291148547238"}}, + {{"2.95673953882856110908505797851830720901489257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "5.3091550971799097169423475861549377441406250e2", "9.16137091634529046709182958669115589757019722367818747705232600776240821857227718551873067599347313641575272826830417174591636547915061517391300131065931465784194067711359196329143298499263726513131614582697830908424187934868152998838921216586737465291051289708299364409624364999366486746226077050764e249"}}, + {{"6.085814876798215132883140832120716368081048130989074707031250e-5", "7.65778516457987279864028096199035644531250e2", "5.27056224622668410282266686919173718609676411389459024877282902746284033954589536288634973757568176464096389580016576960309487231057438455595655805167665817497028295657665023126747065443986739792258870082022889306909488139458069146748438042701949551909468708242176394539901613782225328586614222105675e-3229"}}, + {{"2.722646144868545725614694674732163548469543457031250e-1", "4.8695443455590336004346063702996616484597325325012207031250e-4", "9.99366682241962146368589809577120011723198308450433185299366732500677873637460155970547267099719914327909694930518383012498797681761846242526638144261306834523078708261122471803832490341687603813336927181436827534082878781252668704774445437548691251936499670077735883150461534069270846997649139259014e-1"}}, + {{"1.15866069758449596882599053060403093695640563964843750e-1", "4.91253262757665787319183436920866370201110839843750e-1", "3.46868982488456565751167443881314840659743514173491612010770748877346398177489343237604160804413931931718223750314831998907846386274396179552445359933868165880372381338724806279781831953896898649659594755834925976964179275873971118494605322798850925802574178528777014182338769959249415096934378557388e-1"}}, + {{"4.72825938314130529761314392089843750e5", "1.228931327397812367507867747917771339416503906250e1", "5.47245157077269889091085696140795527282280334677569169487973419233796250189843816560261965111196061138868370890204338231535198008079068304184762140493830719955323588998399173073261634891767823614143691840392792367527470000847416054709559319143615840412839768396194451923527439592939735228732869467965e69"}}, + {{"1.2955657225533417658880352973937988281250e4", "1.81521083299418428680382930906489491462707519531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.91729899451736210436889587963352494969987265352294254442114149825297350300933403119961677078224257818567229354512108221647637427508041941647518586565006416113534560289731038664091154857692367872604020422463457596747145816854139701847749519264660326361171185139298113322096978245544144264234481020815e7"}}, + {{"1.7430590914513759344117715954780578613281250e3", "1.5572745970949500304847390452778199687600135803222656250e-2", "1.12324923143821767715038683964417533829057341785931080679952341815408539775130405061465897612861320390765996927155081774925717154208894105154455487856335006846587865128269477586014136390788140643457017602926503892493119037260205017744346004538379559837051387829449807650507431889923695496342461088404"}}, + {{"5.947230963297863581829005852341651916503906250e1", "2.4796058491402149168147950319962546927854418754577636718750e-4", "1.00101355895664265703253905800820834352012946978175213925289823900262226487475877307647753894219794796436589570196875943062842928843129407133278574235943906905626144071246066853301987332156463703818534415183682692042219695734377740067313312425523058170350486981674302932951851973390826740834796342180"}}, + {{"1.6890881194976660012148708678303421493183122947812080383300781250e-6", "7.315835005101905608171364292502403259277343750e1", "5.06485337562137503941405427253471002412719863672407294570575625371322654317127374055512455786988091092329605000808871766177184698431732837248355728401235010135527651826220232715652024742668291949645619992685612328535253252695622896976648954823150769316159100729259724133493553742448044299816541989455e-423"}}, + {{"4.72470471679805708838453814912838879536138847470283508300781250e-6", "1.9315009754541449638054473325610160827636718750e1", "1.36613880262643802742756290736395850668317512466586871167321608424137867570108690626258507320043808302565319397131444616166042735793688809613906106252620462557968555895414582976985576875374557668514391264049547180886976991031038592004458693177738810104222966751846844587127740341157319952915743398285e-103"}}, + {{"5.4204233294109713248154491793684428557753562927246093750e-3", "2.5117484913880550045917061652289703488349914550781250e-2", "8.77171703127754502681310204125715941650801721154976863870699221072355335125966565182666925044598746890911836338141033359039531496488403405876863230608143768785806156629534985369811294999635059473513624761915818310578096052710097713441725036078711101258417410421951107958524860020565804089659046743943e-1"}}, + {{"1.0381492965649719018017549387877807021141052246093750e-1", "4.02775539432865528274851918411059159552678465843200683593750e-5", "9.99908769642175788386137778958539300137602918424410284952085874015336769726750047569734816766197409755257562872230833189101650544474710424482558254479079319860825174137124403380959665595507587367668848404286717760343524270837960434045414179621713212480893218438355518348995643697164109731552178914851e-1"}}, + {{"3.826356416302296565845608711242675781250e3", "3.046966451443047785296869278681697323918342590332031250e-3", "1.02545504718938094372102791727911930176506035001600018053644429991055918696319033730794852043021666923875675436795843500904336366408589219201909169612259476814126333181168932741070039124737361896932592045285182764869916877379718622220890978571031406624988992549594836404906978120992311725853941493659"}}, + {{"1.3367248690647914877160928881494328379631042480468750e-1", "1.207016212032306157198036089539527893066406250e1", "2.82608741435940656086722594561546646099634760918110959565977761208896418216166536561903222226214939613599640463597249764023513875896636280664458251642404729724932181291845871312202787897768372355186920789243514016890287945724482698867187289280837997988218972650355222505584789955736058952829050123955e-11"}}, + {{"7.8880385490801472769817337393760681152343750e2", "1.46278561425722486433187441434711217880249023437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.72840141730863663391876877521764355960382145920572562742914162972208384723706307292705275033115082012368548682595775882643927894139786449383322664316773126131611883398659050539189893838100041408464889082404113404032943316931275847874983317572290683797208861989532362102600980996636385789799495020849e4"}}, + {{"6.0290844501169942759588593617081642150878906250e1", "2.73159824509963122807221225230023264884948730468750e-1", "3.06403097260563050081855800637166449495962164712719263330810086375883439970326530663445685346228862337912240907582664457942174627433334293660419014781254710335542481599007896808711916825623070383641755045318205803207383228319360990374222920104547227487223738392731388028498147565624523546346417715655"}}, + {{"5.2188207927001606378780707018449902534484863281250e-1", "1.00797343550563134328967862529680132865905761718750e-1", "9.36552325485277806964373331313098838333278330423455390715861973295876349888773267892681165876113176797510574847645252615081953879524429911159719101193921387688552351634752458416166446355778230365755243829643708299147847893065939954861919388676503519612640610354931769525373202729617723199328630093636e-1"}}, + {{"6.21172003041995424155174987390637397766113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "8.6091943502081919400601914271753400953457457944750785827636718750e-7", "1.00000157241706535645559625081132898066253320364132991765749046567536915342813631920409642832019004224458248512335711478395060579077427182783938451114029622700384959716532968625901664719629811957905865676402174328291417935322613778738659214041802729741480722967793087943757739011593472415850478420639"}}, + {{"8.933489431168359015678070988997205859050154685974121093750e-4", "4.1532229397912578860996291041374206542968750e2", "4.91021563983953636397848520840523223624643742835964326188016961937573012460753870407293657436708430593126320103796954182972032017026192445957161066771807675200884423939605981304732630092257312925408813941089831976477439943114677798839623996214029155361569909503935179401196449493080818512569086682097e-1267"}}, + {{"5.55105519395504379644989967346191406250e4", "2.205612949903890118719118618173524737358093261718750e-1", "1.11282177288045201072507504088709286277978249266318510332909847928909226338145185595245293917086320817076726850666066198249106037631163063795831697507293260413136608221812252367908447186422344164553977681855896096040438700902356349275031836676568495994537852124264298684105398360497193752327260914137e1"}}, + {{"2.64139377644600310476863391784263512818142771720886230468750e-5", "7.78537344498752810831310178230069141136482357978820800781250e-5", "9.99179632299559171314926709030763809736309139005374052895886931807671532458904052556141342139885810036321222015645710865315806166952058325774560966552187527103940189373824279065702873017246336399071137612269219545181070886990906061668084063703411460250321467244169857420435253409159030432098292621067e-1"}}, + {{"1.04207364225271594477817416191101074218750e4", "9.490963248606765212400659947888925671577453613281250e-4", "1.00881927761618177965011845644574187803759898330801723609976606642566910129111150781463974721119043760111173993259232795682413324213317011846206782754096089290427628991647487342082014619699610677423897602146820644840945077548746946762791624180147374361784328110343084702444523109612274014821745626982"}}, + {{"3.3151932056626380942998544298916385741904377937316894531250e-4", "5.69130350190431280252290058285780105507001280784606933593750e-5", "9.99544126695324189746630737456946723361046661345027805407888971023026631339988056392642825478722792254481831582440796961181158845762815786131168245934078509438401554967954057934563178474479427510608187860234090448388699710858468168174057416883471915845617321874136073232354461932587707630236256378020e-1"}}, + {{"1.88337177923367888807137937590141518739983439445495605468750e-4", "4.32540268863411711208755150437355041503906250e2", "5.75229630554212330195665922771148699451829771147200356624805857657236782065140481467338634818457146889580617522654929450001033313425457042558128784684181381335537144806647956114444609625124141647264003246426211941949785732284342909061255617831919446477154897012961652269654460432165747451828975060062e-1612"}}, + {{"3.9545929052570905071206652792170643806457519531250e-1", "2.677916713784273921835146770042968000780092552304267883300781250e-6", "9.99997515679857005761440503886095927815406391244413835291624899797364615653895949902813000744851723242602512239539568754651988070279277456656779917196036522934849059282355864096704432345340316634144618927930200708582994637711792811242475638942101629267185320507818308058050356385241284795438747530570e-1"}}, + {{"4.18765706320910169324633898213505744934082031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.16291806714740175721090054139494895935058593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.21448401185251170746394861880464242649255630391558005989017991140563422704674077045117022763467561974222030061746655113958910240758539727055748249625892285904547489203480154655618632992990390332430221914382681227157928848406067945057161854616129785541408035327136685741399621377579757754012545382969e1"}}, + {{"1.28834086985551640736069600734481355175375938415527343750e-3", "3.5070592325596103289164773286756826564669609069824218750e-3", "9.76932835372685523370171735287063726416767225734834615849134547109660778793799398169080725972094573408844765674179657286895933198717192952354877012591779343412877647689917686841315165602494901218010719779271020694334581849406783713948998204010537229621398578990055098138781426451663477493080600789821e-1"}}, + {{"2.097206120446792887435094598913565278053283691406250e-2", "4.58040082173553630973117378744063898921012878417968750e-2", "8.37769288971832154015429547694831033608424622845142547611771987181607855769209591840464089347717993026475816138178319620101164703046235086673631394869476080594839931563796671833715053698127488579638544943331524253087769152813629459325853986427109398088052746438762088357925061124187186100435982047033e-1"}}, + {{"2.86348409095251425380765364359092473023338243365287780761718750e-6", "1.661473408152986941388462582835927605628967285156250e-1", "1.19957610695947876947018322120150143406142221469373757924519795345150006977773403730313023369079301615734601162566867121616810596830759956044509310651071485457850172811241087990683705383118703983140409701647142571470333867908682196499347683237058377349085352136214854181401946343510795949868835711429e-1"}}, + {{"1.43297873345568077638745307922363281250e5", "1.41681240009364082165985165850941029930254444479942321777343750e-5", "1.00016822776212044529668140515271000711944889104836686684000447554242511520504646895662976301872271981369559245931879055379226726537073846553544561947637792091890791964244339592472180091648456672557297620691698497967178088487062658421331764320606009571740080394934111049676474128724114098218934644280"}}, + {{"3.60098653144944158555063040694221854209899902343750e-1", "2.03376339210932499668160744477063417434692382812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.25275538744154336055615419863736730746930928726962752118772852620054361808569416481449220736645770958820155429279907622983889720952174836443567087662689941130263300184594808723215176724531461369529244321399979413684112346655770810116945662086924599874483949305102682382993398648882273436739947930631e-1"}}, + {{"5.295402011714999248107038631872001133160665631294250488281250e-5", "4.561361486960971434179157313337782397866249084472656250e-3", "9.56082033932816309081231125453071826327896674917466727856568147854623107132514590973229074834141556000908164346345063684708226886531162257152516511661460364047957606893852284251293056880030888612998267350454535860387161852393199580592248818623376237183284153405740445167284591706260229351268548628924e-1"}}, + {{"1.44301800298425852986383688403293490409851074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "7.143083929538946623763462362433074304135516285896301269531250e-6", "1.00000261963485792416853927136569198682383793838454319729684734973539039182323306199235318171814360855994012568229358281529883676852371448365509202038288834881570383584403906835594533516647281713968932211752518665238323196577224701747937440185305151190908616249351775361542696295892178890063882257116"}}, + {{"6.228038096295846273720009378394024679437279701232910156250e-4", "3.25094187232484732597015408828156068921089172363281250e-2", "7.86658469541403998034943500870243069476823132486007751990824694615782893644279173776512596334159142603325455113617967643461939139102971978114976150505918018758878971981207590718138194009315889095960072548673588879789986017926322494375432269097377546556386620403909103214427884440798206932883636297352e-1"}}, + {{"9.8555361955851549282670021057128906250e2", "2.19375835372379413001908687874674797058105468750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "3.69327012293708811121144971175263370083910101169553278058859848877086709080419562447585355719348842415619132355236627485649548952876411849102018675375354238273102815474095986357261970461229247085634624604985094330242448976955585994530902647027597520370418448678147789523361182103563378206595110636366e6"}}, + {{"3.5879392216430850207076197477817913750186562538146972656250e-4", "6.9182884453136028746200736350147053599357604980468750e-2", "5.77635990889125108309690852819112724262223736693646969131631611067612444282401471024845889526676870050656945639578159737127915466435929600368572355785708484463627825178182883323088006398240693308602881027224033181200011330121428663774743869527395379215026638702157803494202819893449358544841576526785e-1"}}, + {{"4.961468486142577603459358215332031250e3", "5.36919182658175953015700088144512847065925598144531250e-2", "1.57915370211935194723362359441601671775858730114448762856923579370262681814508708674839371719677055754578289843591415190008400693094242195743768201495967775525358591358166609121796030602701836084062498854380733868656008519376928763241674707747769169741392588580100945268376807756367217092609019332523"}}, + {{"4.24495621335822494657116776828331694559892639517784118652343750e-6", "2.412731330413380170796244783559814095497131347656250e-1", "5.05650148888948869811331120941963319541414375806822687983830138205938420862200064078576598469877831249406211581526927963122105281131255004573845222711684347603254852806653766035434125383812586900316395999300527269121533046942253679078218107723668449508163238533047093749711627477323541829484653131292e-2"}}, + {{"4.4864042703223833814263343811035156250e5", "1.57545512531989570200255390552968037809478119015693664550781250e-6", "1.00002050314697607659431018359659361183713303212753613120902527904331498111603138394334757418054814218670389608976827498549914166555768752494414195237102560486571709642923543196007200071132086884670852209514113439317507321835737223329599950365222037362534859303381396326717532288233329927808913598785"}}, + {{"6.497495709023816743865609169006347656250e3", "1.67233186866778105184039304731413722038269042968750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.37780724079840208711014533649991541109470796504084314835156759344214993302863952807171583660778803863957191115559320339273255056520571556246744533838811694006166732957726755945662570959533321672076547914911635593118101608294069731654269467619949055336628326621660012876406202543146880009002104821553e6"}}, + {{"6.0967436711242051217141124652698636054992675781250e-2", "1.5704484143598296556551541236501634557498618960380554199218750e-6", "9.99995606813099499267634389464438683850041060806908350269346321155672893761130577244819124593817984249660934044363638948086248241297434338993626965911693249278796597285537898160766381999495115463474497883772569241592760426493272254012575287314033420480717621539078495596903806489817283498263020744184e-1"}}, + {{"7.575034551306392138769751909421756863594055175781250e-2", "1.25659927896368083096931278497265793703263625502586364746093750e-5", "9.99967576340235983529748322865757677186118554170023614050204881657758768441183672920424294568610952334609747551908015545068832481235294176033402023954402315837530793201944548984799957607361928025651266738940647431602585783131780321746876553060340085541214977820888348264644079307051095179685852079945e-1"}}, + {{"7.230949225422644496830137939014093717560172080993652343750e-4", "1.59957635240683257102367598179171181982383131980895996093750e-4", "9.98843860017333489092110505899347130551976013147438321970353479326257793437223848104429707854561661175450570835038515201752789245106905767296900600611401551754756721658819816241278926439311942572630487380703760937536160330693843537976099522621025621041857521661138411993182809798954282325807746896512e-1"}}, + {{"2.22347866336470469832420349121093750e4", "2.67574314969844628819828358246013522148132324218750e-1", "1.45597650920700334896440864288586774552136744768533970151074149218272851829624764505239431335468131476208480181217427109189696065749387968903474055278714181692867425657254225967806378137696550459591101296481511902742572646395696145586249150843548288850238158312747067673295059110101209836587291678717e1"}}, + {{"1.6196975420412198717889928900603990769013762474060058593750e-5", "4.98433649539913870007978857756825163960456848144531250e-2", "5.77061455335439039778043359172467746025200146785630273407892949860314031306268447375871357416922980298986141833641561954857127992214135487677696097641048847861017455164355255934271546462888696419881919311556223441720520985938735112636787538160901409982382930452852563601752376961873325250302513132303e-1"}}, + {{"1.1078580283775937842527525845071068033576011657714843750e-2", "1.18652221207551884308087353225857896177330985665321350097656250e-5", "9.99946575396258084502018839446238846584110705812867877643924485585779113197512036317728340100285410504878437697437320927763146715271389949541429089452281046460116468251613835907291530307473134875676645637754443536935426771393775580503285493873005924313301673550096584687732186248324962291699197441007e-1"}}, + {{"4.0090085615093388029042675846369547798531129956245422363281250e-6", "1.5153243776850145379609183238223124590149382129311561584472656250e-6", "9.99981169291887424157759932262067246066753044936086128253970315838989839817149914187581608688565806547274970455207936904774502513857569845689591879527047150474914557088218340646463900082270385606124499095033110795779754466447281328092278318076549095302554108789079991538595665731579745334006426859960e-1"}}, + {{"1.19021350263737038868705475636033952469006180763244628906250e-4", "1.68290288542928294646117137745022773742675781250e1", "9.04852417540620009944566041453719467211390230149498516011819535440728246929538100576552383464173953438153608848998091884909329517100819960017904887302473398843345408874822800579053111675353115760245493436345787702548498655314405766561270926511701674435330529881522800583133171192665005622617374333010e-67"}}, + {{"3.242762654672085015491664328202148226409917697310447692871093750e-6", "4.4540895454217880808367446832107816589996218681335449218750e-4", "9.94386254687686946963322383552185492075977337531973213930838015838274376322044860137122810561067818353529641305366066211688682157075369267213623551618566522232634253178245524174116891287095569137130501326353904791232655125453161983083517758472031555434930112729665552915867163490039363051308443099856e-1"}}, + {{"6.15810616566200508259498747065663337707519531250e-1", "3.16615056291079111083774932922096922993659973144531250e-2", "9.84767212442093730437806115126470445228033445461780019945996712538430276008229376762120777978183512697217805509135802054380845495119030204478634136438561790634012659775242132306345870420149133737299397362388964674004273429551607587049902912378874846355087545159480302396357641147726629312485985544367e-1"}}, + {{"4.986398000750906066969037055969238281250e4", "1.7761072017031686345574573171468557575281010940670967102050781250e-6", "1.00001921243238237193183827489311170506446717993399056537282384027062526108337893488664380391849139457202726524784919352515463921911589077429652463880766791641171380378763553978844617450998857121720620679684506344842701809891676387117033562056914974016308650056416678855410514380179891286420315463385"}}, + {{"1.3982947813147638953523710370063781738281250e3", "3.4349953058313833706427509184777591144666075706481933593750e-5", "1.00024882796344591385461239880845260384691776851307067376321212831043330119768926261152601978474535337925904198175128520020096443925386965960197623129024285407478015708065567539370247164906581380771634920314388644089046167410745320267558557473972499677590220735439622489041126850128421653983634543138"}}, + {{"5.53823542724402595460730935883475467562675476074218750e-2", "3.895135030254805045060728652117632009321823716163635253906250e-5", "9.99887300842861835164017418113429559930804468019069798605482088141983665217815479503166341320807290829070352700865762573462007338287440579346738382811838185553843038382146930720875234411175792603385681200743384496310942148612050283753172718455515566946341846284557394785250850393323918755270713010620e-1"}}, + {{"1.4112136137383384630084037780761718750e5", "9.9875418797880222143703576875850558280944824218750e-1", "1.39052029796505087174799036572060834290339669936231503015871931355721722463161747207749930806516332386763841930651054884331973674982367750538370231486178766251016302345689298357523496706436693633349722362506875465430935461687316908940273568043577086452494403668755303085058972545116855832701160169233e5"}}, + {{"2.896681342684133284243533368318423981691012158989906311035156250e-6", "1.1586534546002158485578092950163409113883972167968750e-1", "2.28205556117411408113652874564375329933423424935399606070975188165013549346043442272013469493594176280229509402715241333520310808546934629428072668916547032154136142048364995378685732366063433675907163954131129548865718748066808278449447269502355535592014434886553141414017802588692926998785625006881e-1"}}, + {{"6.80370452266789652639999985694885253906250e3", "2.55585667546695538554502036276971921324729919433593750e-3", "1.02281231404359612151527353897929180348478744328820333025332541070807332704656155540376559985312945856024293947964716753864592850899748540597581561259020876390111605898100116321942106603048757052249826147692127068934907088939143183343054183800841834132202006495897859489577613318023621649632711626369"}}, + {{"4.625041131443131210351782378609186707763001322746276855468750e-5", "1.52163427846739888679716834474220377160236239433288574218750e-4", "9.98482342652643471998471847918276729621115291527655407478347392440646810723671728307137559792389469491363165496772939188998042052370839020230988405367662374022902953797332354477989367493245470167443057076807839721016298819277997067517609396627866901281229526562169916899579412733467953808761281274902e-1"}}, + {{"4.5082293215957577103836229071021080017089843750e1", "1.06839470475542444583005874392256373539566993713378906250e-3", "1.00407725957483558818239220892424948692876561612077691060007144800995480352451729509031292920021843587131856132257906499443064130817064638818765366250131236399994854411601609832821870319397908684888708832193783247348840517389795509100198832759307607589651546707827898198086014636944156848700425178047"}}, + {{"2.97403319008989266980513832550059305503964424133300781250e-3", "3.864747748818575523443996644346043467521667480468750e-1", "1.05563040619657475424023632617553458144221260647471757349470769600263284068856263065983919485584722356671096360406091314847188039821446085937501687228128412834520625095444394738723676139779119999762553228944695777339743845083698817002881418226410778165865331625883646946752393289471811888730325566680e-1"}}, + {{"2.383250807842116500978590920567512512207031250e2", "1.66302465811868707690202029425563523545861244201660156250e-3", "1.00914434741735633383477956146627482536171366958054332840551181784200344603582400731522959980543848217816660950109678863255860871237640121402147335369863635255623422637578873942180607947824451388135749116333642343887949089848641558138185462358132315292011403950110303162349396320495083970574820485984"}}, + {{"1.71423190201370800878066802397370338439941406250e1", "5.22776453453089651191021403064951300621032714843750e-1", "4.41715373496456388539324810858409600194977863833255435782643057881295200486872481370727134110261522844531904021514609023835218872201273620577170073750362820523072032985530745444647038907617563505404059737966630343043214665700476103118304785807103469358517871674775523305518419709923690374745267779192"}}, + {{"2.24202183750390773639082908630371093750e5", "2.8860613713892332640731375192899577086791396141052246093750e-4", "1.00356204426464651318381353366766656275190463831503522239513652128295092897680949875433153708401966246976000272332294389517143726474038495934684353460128449357504408039179941027444904612222505017810534008770086553370099204575810832664720970035523251219105643922854038752127247330051903230606763080754"}}, + {{"6.682549242769675323927458521211519837379455566406250e-2", "4.37453434835288135218434035778045654296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "7.23884289615444976971058885660437787480627352137562427420631247881049437291942148842029267007686370097695430731343288589752635360722257432905786816202418979845289181427172830309982121527477449228884669859681103900842455539708329644639171581286590973017189366587396069226010533102477610964537380565038e-6"}}, + {{"7.08735989603501259637141629355028271675109863281250e-1", "4.931705772743737270502606406807899475097656250e1", "4.22994581178880428430588361219833883540463488675474104323353907511764504539625188516288826354093370529125373667749527512470360034116957923611728143647053700596011110669882224710437210488847861184277118067955181730553186100384807049379684590737156995709498402541295775367296456895644229479101255193586e-8"}}, + {{"2.320149423239581665256991982460021972656250e3", "4.4481031013119287642609833710594102740287780761718750e-2", "1.41156739924941071144222113991630683194620198146427652318978812945951687592217439817665385168004660248141475796965481088709894832854582569992290051260681221672250427616673943995167609515610097891251991676291118804434690243303234426750763059520585143335380969303297852505455054177640936866538646738978"}}, + {{"5.53282998141260031843557953834533691406250e3", "3.8412160262591260107001289725303649902343750e2", "5.58373770974866315239700400474362989477383658235694014601763955308120813900734144800418886820772189374330395186134971653113939250757648994415649668842051891937875262317539557069792723676293862948593761228728392700591159530165592758768030540795599964339740660316188438257430600649159884119157424191581e1437"}}, + {{"1.85718777739859418943524360656738281250e5", "5.22760764621501818278162532216413183050462976098060607910156250e-7", "1.00000634214788464577855189457084479231510812185767194037441581727975561469887723538341241488476848396809344125019310357146729535769441778199276860378224675705997700022744347653159656289098028240954603207536444605258988369343538458427994444681579339406242882282677673848923548267602318784029338545299"}}, + {{"2.26509465497761368624196620658040046691894531250e1", "1.03762510179397637877229954028734937310218811035156250e-2", "1.03290580019042823129797947218377400320349309579887379648069219653044521496312022139633395975447973076157177628011296170468228189168841156259900536323684747126636993787966799478738521263932697630770091216225209592893137197359045523997671979624680066252774430678393930591603773849047796785558663064178"}}, + {{"3.00476295219746433740048985328030539676547050476074218750e-3", "8.0240930815382398577639833092689514160156250e1", "4.14136997855533491337740509094908136487500777275671775674006769752964040924959289897651192452522290539206601428332553008348132654735739834724305690164751538343877568881013821199733121651153278576916744941958595422652696891642421407236449964345890318648778746090208231400439749942969896805715062234843e-203"}}, + {{"9.7079889666732196928933262825012207031250e3", "4.44245980458260469880826804001117125153541564941406250e-3", "1.04162803810086699019811359451605453492327199203637588333443087016790236547076001612983024940969264195708947484110311219661303765376669460085704437741732903824466154100734799424439147057676949660911617676769474501254927589549167841876728171722481679869607753266592648983928705022178056753619502736504"}}, + {{"4.66389224589813756668976729713449458358809351921081542968750e-5", "8.41598683219974930125317769125103950500488281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "3.53382042139791789590459891074340066702060120383660058981707324170432197791546635984529280576877432127625617337120709804544743161881268886942872653531280982977576133511801284796672543413476367564502976743587063883733930418435751755822485352709171649159924126024328941448624940766411726855902924670549e-37"}}, + {{"3.5980841563362578328089114165777573361992835998535156250e-3", "3.89106070923696201191432919586077332496643066406250e-1", "1.11957324795765157901703029938063916662894000731995996196921601505519523032651152137148283098242267387419838627536448762986353433569901640648734154364900058234967711292575255307936095926242393050569604396410567616604312846123878721000606629431359673384574670669906697802557686478096291498804903738631e-1"}}, + {{"8.29546112810515936034083672723227209644392132759094238281250e-5", "2.58324466499312066503080131951719522476196289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.86659658288740565122000959721270284304946720479579271651550103638161205367495371607443353257219806398111103943515458202894485596325631197266478165244814107159447017816960534609382148164169335790367935277372018345236031109996214855557877416239874683021494253068006756484498147004540748744410389570461e-11"}}, + {{"8.633345938915559791837495140498504042625427246093750e-2", "1.53080323158965114771490334533154964447021484375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.35233729973545869852697007160756749812975339497681040282999017995032382608550729201580422775220111291799102420635253476809267746237352183450521514570985348430714476644398637263228584608977432119909919809882847191196859131282077491115028311403034792745466352775458252803189617423439193439791933123479e-2"}}, + {{"4.96802530016260956990947761369170621037483215332031250e-2", "7.025196835724334398776136367814615368843078613281250e-3", "9.79130174131074712614824707606461473196424333567411409743609116414751816130489331857231684597817414740294362613028844768413127008896909984819847802879905875872491406317289520166024819440680050252863090346899246519659384416734528764367429297819383807550500609868490474715994290375146313368129823880737e-1"}}, + {{"1.24702033554851823282660916447639465332031250e1", "1.710705957554977231852011421153747505741193890571594238281250e-5", "1.00004316789477874277620263489613820769653924396429221925198065527832144152145855155330213971456389989525794479500052652310504867952437063466242776820964127214900733034755428153463014611408545155223418498794841462940237893200540509678171081868776875097700422657888013910264387140255547155547751726595"}}, + {{"8.14130989781463318757936953318221640074625611305236816406250e-6", "5.476743603534721671621809946373105049133300781250e-1", "1.63199095965818056903859668356569903606584619352293451010588563431807635376986054905897873784109387681218165026966672415089273447045333707684197569751029547891913778442699838628510300753325723159251992398807517774034918042863197611983714480066975243968618918488213538490759809651966026386013669113012e-3"}}, + {{"9.4831604756264176181446146074449643492698669433593750e-2", "5.873187053422951808476226709387901792069897055625915527343750e-6", "9.99986164907695049446699147999970503354260553000953839878275159076458261755428730763560216631851642537174133195419034054495238529976374508256949441111167727864128507860277033299044051865971449902820004978297018651282279654117307535005136847959876138249613275046667240315151303933181873427450473536424e-1"}}, + {{"6.724396223986286655338595608100149547681212425231933593750e-4", "7.25371945127648842799317208118736743927001953125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "9.74287216286274945633266572714083322962101975717027023442493643122162512912802620909159732325958549010615659395950026917825109006470507725724883444926417334797999132724229966674370457592343778072797597317430071335665732334697884217471229705559230148495486170835726019893708870900510074940623722192258e-24"}}, + {{"2.30442309265876887366175651550292968750e5", "5.100776150045996035209405761179368710145354270935058593750e-6", "1.00006298512189780533426621327292231284630240394286315128868176668180396156679505765231684868863847590833570938788465357619602169740491681317033999860409913654411707265663879954547321897801703570651803262843624273611588702980486012373865440788314427239276089286730821085936329475836740228791493079509"}}, + {{"5.67608898683707252530439291149377822875976562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "6.0768302191256316291401162743568420410156250e2", "1.67068196412266823466861212116241893055807436102731155140415238019317223182255528301301262470626159261154640191153443230288813541880287940859066915763205210708548641176944414442344483827370453800486623574896474317715521007693847769491979549043149389934860292588058888100428936865217794693086764880012e458"}}, + {{"2.8133724660645658150315284729003906250e5", "6.7634484407087152105231275811547675402835011482238769531250e-5", "1.00084899099059737772913859365556118027581054407285954758329055990529529377511066455820790791091871502993434775634942750452313898053395589443975739777882392931281046995883876066279980856281434476038018812014179817821871586805042023183706725376177160577170143175806815414662475357051404586743878413781"}}, + {{"3.3498352383764867443161072912971576442942023277282714843750e-4", "3.208520821056923266745286582590779289603233337402343750e-3", "9.74653990782509243550836183201075823369159155519692846798314436930630346572690178245424014813711682670551067058906680367646181984756645025448347553573937829174199564122446362713993201587207768412845129431576839987405545810458778769778400165994012026984577717831659943902405397254874487260228557294263e-1"}}, + {{"1.173650036641017777583329007029533386230468750e2", "3.780534896009259959726023225812241435050964355468750e-1", "6.05893503437891990856263354837986270829833882333366791751057714437977103925035624856886729661425365010268503431934637684230477655839134293793513971115798026793973457123299079643692631311303731259185411381265912635677151301389868547814580071368806352687212447229499485791883769033890017890187866384697"}}, + {{"6.35473191480731591582298278808593750e5", "8.153326462586494471906917169690132141113281250e1", "1.39785593586175436998336047723152633390674636830187065022507274459265394076960202352145842758484227495355755965560336623550772098175134115092702375767668586879200691996181864401350579269221993542974245130770033239773182375358583651870979382999043883377805409110023459275245515025837447884289450716490e473"}}, + {{"1.20953010742292040959000587463378906250e5", "1.81528620999166889760090271010994911193847656250e-1", "8.36836082188852137389175804388074236213762814888145199618983165421342520318145120542719392963440700570926350816427711317556249274733873103430368341047528787950522843632555485443202700694068291761260828423023146529348899979040923182831897371799138328552240635790031739904574931369069808189107688786563"}}, + {{"5.028268644236564069438522039945382857695221900939941406250e-4", "1.49148497614115050149963259684682270744815468788146972656250e-5", "9.99886724184991506266822294352662914256716265702852450641368490227402118731911016182228523518485801671330942930187800995820804252420406598640376923122551567922827288661396415930336442260706727249870079649992447995120206397679683465259479974096061438201134430443691684817587750638183840953282722156209e-1"}}, + {{"1.7762360570648558178927234330046758259413763880729675292968750e-5", "7.16881559843790408872998831668610364431515336036682128906250e-5", "9.99216151571584206550599285631558723279674057106881165894202136106399680298454020164284514110193651012658901118782805914666290560642145072003861919887611842296547047036059520963486973019219177746829500434614825844519776793639037139709040279058532565912742721673028532604681375807832044191447365386410e-1"}}, + {{"5.4447075299350728982972213998436927795410156250e1", "7.8942499435862384474802203038201753315661335363984107971191406250e-7", "1.00000315551756552929413349733123431754994533967419962917545562731445729245526256276165331606875912022797791137395975129631042701829381104269734643785979371368397149024305719491289967486350643357572991392648348784068298353851347894101762457227438358667841811859357203913787202416700523836489423208926"}}, + {{"3.479528655391823122045025229454040527343750e2", "1.706470553795544006780993129268608754500746726989746093750e-3", "1.01003641035516199003729871729172100472722683758579980406598003587323081240911466133797745466321375213116846128724578817241014105529656120259049841543565831847323023771528373536119517374544673647922841984354734790648175557634969225996223997613913923117328699599574593399806697328078695200917124733876"}}, + {{"4.8968324713172875495281743951636599376797676086425781250e-3", "1.965286254903626561628751656662927871366264298558235168457031250e-6", "9.99989546369402488423594127072150976413227845609208465040224219805251052465526350038203035493184013561718362361567469358800995276604754108514280603768744650567983276404672018483263585666869718723877857972643772304671740644914409892158811218430582592069739462405196179208350796857344173822141379782399e-1"}}, + {{"1.46846575134083542901741736841358942911028861999511718750e-6", "1.13961295777929194628086406737565994262695312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.25155431004176641664360564432608271749851863826540763464893400702786658931519008803678187122457752047812131114041410952546777155616546380522319343918668230249104290662019435519965989945104554644065424460926764956490748710036580200886547368376656130754697653950693222962392418484839778727280176131769e-7"}}, + {{"4.922583286355184384319727541878819465637207031250e-1", "2.167012857499329633870210898294317303225398063659667968750e-4", "9.99846424401823072211356827414998110501335375349159811161820098061831954942111055007312660415928636319873898347702590642507419097876493991759663677610295879480797600223758201686500279349159643821096880668703139199785910150322740521690695804135686666464835791331742866153491003010427701847514162106732e-1"}}, + {{"2.088918420244419849041150882840156555175781250e1", "1.3745112355220467925676075537921860814094543457031250e-1", "1.51853459491101499462028153198307960464036529321862426769066486207166171296494170498179583135034855145454026518293079000045567402865046530341818676848400774327944796661350087157800975247279219703171839848135584471839442165788564723636737356977396947188532339857132058951624239309379955278406455872013"}}, + {{"6.59693951898326247373915975913405418395996093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "8.5839050428511724441515973182958987308666110038757324218750e-5", "1.00016195756688330761491474273615136423552556614577036197755742996689336001512360595235890000441982158893267294826116899101351409093661584157256387065246323209052057870928088601548025462625595893993027794606583868972654751596093207938303600634384394989635869479864226583469214082919105133232859648980"}}, + {{"4.721903022822039201855659484863281250e4", "1.3687261479564427624211475631454959511756896972656250e-1", "4.36273289377674003549552956596428296006868194528902491172931330043916572933784595495824585583342079403134944318241053700848989680616524963231553615168899405338957973320487490472555612135391925458093520067531657179731576065041675903036737870428047782297012296101361469066116145701281560378942697624754"}}, + {{"4.820349777574789310388703178489322453970089554786682128906250e-5", "1.201141639511502318474200912135074759135022759437561035156250e-4", "9.98806768192609411674337267672424056960083232464271360229113542018960233572696008296128150338304172594110837781004501757127999427554595909914289685513812993265024374119615672800606621652602006481141937435665444874495693840170640030665928027259502446424921700891997624978473239252852217099622859393453e-1"}}, + {{"9.54197957425642506734675407642498612403869628906250e-1", "3.34304142023469919031697372702183201909065246582031250e-4", "9.99984326565139803772938990236401058117431661922045573846220380640349699832779123098058540753008622857674232899802697126593866411818203678224123515319186907350469596960547397261912465753250671926347546302198056587430826863955515669743258039245240360599418185587449465990312391796474083173534248199413e-1"}}, + {{"6.409606992637384337285766378045082092285156250e1", "1.0081673204983155756053747609257698059082031250e2", "1.44157504422123306075307680246115279780269010737951173392922320903011026254261224810748434749033392788723902179648854339741924679540874536758451693815806813776859218948113244848659597589114467756894234559650445795659560796369660440795499707193716216403592941616722628011042403021580672267269382135734e182"}}, + {{"1.22311589009840382402671821182593703269958496093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.1046934915771231197623158948317723115906119346618652343750e-4", "1.00004238976442526402787977257335501538186147626008780569692886964327726967250839556988250363044075945205489441982444641281650300897861533023502296756146804366735904879346020295258735438264424281840920414740589412010520817925020516062766522452589181209496869654998063536725728358771467633669371863258"}}, + {{"6.3929111843020800733938813209533691406250e3", "1.28391975830675164615968242287635803222656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "7.69505481296349945509651870173004703548467117826619443587513918127052944692060859604078331125022112009253571107992368448403956917792261351644585277417570509975725723863004283151424512684410008159602519982839123505049564570077423370661622862250195728714873045142974264003278199036815752137105673556433e4"}}, + {{"9.8319065323364611685974523425102233886718750e1", "4.16849063361153184814611449837684631347656250e2", "4.25770980590636267172342833096299211879468172398651157530921609762966193936659345808702337762714296668889853763786019297633422123145533613492472992798929637639386760407400078511978818609469799050619387136981965857651597610392961103496543359101531210986834447630570812748220097342632073167798940478519e830"}}, + {{"5.473175005590576347458409145474433898925781250e1", "1.2556940190600926476882648330501979216933250427246093750e-2", "1.05154283217149739996322394073132732110285973177101672144476243536792403202554641841303821681674178605013975392578098758039213562899690576014988268448654777051869934823936115258309781471880324840875908371004233345043851515355481534420805940488435409518654838065662552503310797307929345306698760361427"}}, + {{"6.4912383638254911311094019765732809901237487792968750e-2", "1.850202617176646691099506369937444105744361877441406250e-2", "9.50660946670306311914365279482095005173354041210571854577128244379583503141132158648667793122314902465794942399303782457347308120094047863238127874892080844189140303644281120192942849585627941033052970332875969503978268193734299765207776684899260119431935484734340685682552324678913617232469193989216e-1"}}, + {{"2.2469270547648281062189101753290287888376042246818542480468750e-5", "3.52982695718321792810456827282905578613281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "3.90763013958916250310703922628537395346144248614383500040096138375431039104002049367585390738671354254176978486242291556216285278163895739264649656370403930009408842065500683071987767757954595210907449882232438368368764844630512751091553559176805208777768953085505825846870225770460080538105432353809e-17"}}, + {{"1.03776311938838771311566233634948730468750e4", "3.67758461032731062689826728728803573176264762878417968750e-3", "1.03459301282359622046275858130909175858605738103500377882461906122638713902728757596922241637837677972497613038491667511030599129584893938038824302224512570610802632172627579650514542361582967805126424931338365938119495726516045340017819117717607391845493489250022446019685368890472485823905828290701"}}, + {{"5.444635317520329920171207049861550331115722656250e-2", "2.08467925444702359527582302689552307128906250e2", "3.09056011709343327076534816446309237286970058275834540830372719698670511928227959632093780315386474610345825780828956917908117330975173563693122316666283875774232598613235043753932040992980072681882395580571647274880789017536786697004043527146342091119566202577901703268215449281872604307112909919335e-264"}}, + {{"4.321410913909301143576158210635185241699218750e1", "1.79962553627032728620349644188536331057548522949218750e-2", "1.07012654071632775332556853428357456635166481137753650401618414453228087751942869456669180112375507267782856652222749904765639096915852769878278766680206962666525967341796532563009425557062229126958039051450556007688280632610398536337196273409572525834486954342631282999563123455233960154445776600968"}}, + {{"8.8519539520932943865716424625134095549583435058593750e-2", "2.3201497260401708899735240265727043151855468750e1", "3.71305713463862717236321613646893663926389070764619904563621824742856237889605485601780242185666715109642520925666586793175066523791156636682971412268154170045092095602942426637119803498838588967096817482914325839210531169438704998222940708453881877588305201012231120626503012557840854056737490425114e-25"}}, + {{"5.118003582399178455139554522190792340552434325218200683593750e-5", "2.53194625802088957300384208792820572853088378906250e-2", "7.78675898815841251401603750577856756795950441245444722873452268896478608982683458941926503132911522781757532432483294128491039729829837206496101278313685758061174666050134299787052246310316361371623036791254936884792176693736621135978412809784428098496835040268753660201880757384305210529998116341854e-1"}}, + {{"2.3274146614903198568291564640730939572677016258239746093750e-4", "5.386407398328963954184378515321895974921062588691711425781250e-5", "9.99549497162550438458304414161333920701781715268855145062033883882900750111819551249273252859663946257284929221986573479403421187776431235203160677411657816941834327558315579342010850796902138914924928940560282841455433144115320935123004884062392612303227832917659972351800421646517607120651251528968e-1"}}, + {{"2.888209173418870195746421813964843750e5", "3.7267907937487687597410968010080978274345397949218750e-3", "1.04797427152199505899776613380207153019163891696040089708565511495563600355422445163531206665239877024907641710076156338867860992891601417074486301976244681251883409289427117509266966735400170413169626794460003914944960446253186507533452481416547111722260834345331494363350198444447590272333886931493"}}, + {{"9.1176907448884685436496511101722717285156250e2", "6.3428728361785488232271745800971984863281250e2", "2.61412399451200792430940441597911814328017657658519351363425803166936981320098511499093754150499459010245435176020174953699548406222107608392288974835149178057255386825625780361600243592099112823611022187187648569904297395013151014275208089987059198137284635106672418842688183845527005332642735224166e1877"}}, + {{"2.99902079785064756833889987319707870483398437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "9.684975926456249788534802469541773461969569325447082519531250e-6", "1.00001063692844088210456002419855074011148005470079145471634788112628295771788190807123424233524759763995207569368229563514564551401717941193555837507092120724642714186373549513618453183103215293207086254916107790393722326161402579919794484826396299503609272588338890824693538523484869461094064640920"}}, + {{"7.728544599046511575579643249511718750e5", "4.4897834852120803786346137087548413546755909919738769531250e-4", "1.00610574384563796400321310101756992783528974702739913146260646865660943239706104030906315422031586966995536370399679280585793557349882649609015460449277306668457058524687099432479479161198093426061867258598346229732606275929747805949435342506588647203249401335413541148238532118555631296171613732580"}}, + {{"9.2977037287730581738287582993507385253906250e1", "8.3526187246175812375903468876003898913040757179260253906250e-5", "1.00037864179461996490975401602514900577512361928909810135170262283211442500106334885446423595314421485481346967556782507370070595069946883492382064486384013379235733594798086474310298773717536986583185147038897974675666723220012717870637206407697176312759927758943687773764377471241445265488722941855"}}, + {{"1.0859392704197159673640271648764610290527343750e2", "2.5420532850914867237235306163256609579548239707946777343750e-4", "1.00119232709184950657347355900529943667776581936561333029642844322931651851922987396688070423513516427393233449332830940932893802869470044377136541346608056612546712420915411514501773616973022311857494372432610405714927103499401270099666054931681878021711299630772502630342850129330691538468637467235"}}, + {{"6.089552101270304992794990539550781250e5", "3.93997641600216752522101160138845443725585937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "6.18201219777662049133348544929685038145294798461233898669466368271726917449741209374562376908881805268589020897308399041338055306698995074087125055703556791502100679603522120055594862139867723186128435543540272128120797808148788656196331354569711892744404054200303870971480027638854018077003767037387e22"}}, + {{"4.17002058199641822966441395692527294158935546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.276387753247702787221320996913220824353629723191261291503906250e-6", "1.00000325050709508111108865304342178215954684414490544574201155545551225580135488259163273316494247157849444894518301320733204512003009459708444645141220074915996395890189435364804366091830247042355490183040883445209891891864651638351487974364904897430627412415757188029347485931227191708441175016047"}}, + {{"7.67550081598081896869234519442670716671273112297058105468750e-5", "3.093588605415642511786700197262689471244812011718750e-1", "5.33361058888703312937877266409714100834748582910004102998779521040115944440359724219966898465717158230452195981198500825979353396690326287544928081118745655488492150353523103453131904616559184005975246310430624687681784477200062656846973772093687820868635241069192671298954998139357716654945366635020e-2"}}, + {{"9.119288514356249943375587463378906250e5", "7.77150273145831363419411275117454351857304573059082031250e-4", "1.01072215443565297495212875757828431150173416786594077990011283253611684077171961857977658555772993227256701225998130851047810587496804030395055038866276482446366864045774522304245866613460132889356389785400787106849829332460233953000396006079677394660376277801825929937944079178448460996666434091599"}}, + {{"5.4142012264591812709113582968711853027343750e1", "1.8952259288250325680938446204493175173411145806312561035156250e-5", "1.00007565289778675652984140979321399062757791371437603651125252179594586538728496280877795475718254343845999376499222253067347916841829323365254311918387151598991472092918535912843066893311920458448486904240767256448921472261918689220109607027673999114234655407258002618927723100761498362332050377153"}}, + {{"8.0087992188598966514234689384466037154197692871093750e-2", "9.651251454841747090540593490004539489746093750e1", "1.51542106881981491731489464208722559455080283729538316329978070693260585378415308395373558536702307332302792317627310748549719761801156867236663991267318247059438589418271824484275577584765219427298744283723772247523591169183694405713456066811755471408195734266771535080425449850856084868376311119689e-106"}}, + {{"1.09156997362350409730424871668219566345214843750e1", "8.10878062686337663933500152779743075370788574218750e-3", "1.01957066747628902940966302510092960488528925253540221172663471275503400990771789589916604068584334436432589666410671717466013196522730609847023637947764642131621149159485396625786863911618319465245064605684158683676154002669412578226202367577007287146331656090836085181386754790207143710478024828107"}}, + {{"5.27981737437816178726279758848249912261962890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "7.41970852096179633861083857482299208641052246093750e-1", "3.43686253241293502543031164235680564280493113934425702290586259672655229919415634458697404687915141160074152506872313697917935113169212018685900336128740210227144508079482606408290248099236632255964024354639101204012497824568760884660053718968331056137812934970479251589590682389747704367113989950745"}}, + {{"2.9763242468503051441075513139367103576660156250e1", "9.124583619162003742530941963195800781250e2", "4.69742603562041824153926447786929280716116286355510132564473072728789802885515779796188477871744149730979853211785348379587523589298115735526488355106077778856284664084128422453984824424076757383964141778964343798745285559893404942252682634909106936299245602255752362338032501973165524906979409622054e1344"}}, + {{"8.1227700762963667511940002441406250e5", "4.92673741168140821855558897368609905242919921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.30484996489149406381687564563779425178418692009670007244171321324888859123491778857160269626310259110411696125879945417306210294026918965107428093516365217530286177050990880067424193779915234192484015646474192080157981645949288654940510168136275269591421630149209078542082633232345605476593203338075e29"}}, + {{"6.75063843580995381898901541717350482940673828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.02748489106749621435632491284195566549897193908691406250e-3", "1.00196404947416174365030420006016203648060565955934806957206111637856432455172895201651727892958586584412299635092294986305134023877029915464080887124975616815060819276759381700802994334432976763795102196206567937500407359464356440088544622676160266170981561234435498384331071158546292310523236254753"}}, + {{"3.5017444416405400261282920837402343750e4", "7.802827554512200072811545226159068988636136054992675781250e-4", "1.00819798888901128629632317940565742032581044787310510298394051237610722547925779466083057852335930819436022531750188258730486171674268778076637531078630844955462136795806889121317307097195981029957098770479755079052235805500969330960373439119072852284817639069793570751583988153638659438922106591664"}}, + {{"1.2656495085348353768495144322514533996582031250e1", "1.553526777035119332782617251886847498099086806178092956542968750e-6", "1.00000394312365539989563625486331626137964273811834798695005780013495760538177217100805072673596190622159320905648378255454000218262505715454699578920413495174693604468418384665870032433868756106543653906692751058614669494849726609491390952522788637204327400613561970408136313418894648226391505731573"}}, + {{"2.15745882397261681817646206127392360940575599670410156250e-3", "2.37905683348865193416088459343882277607917785644531250e-2", "8.64117851649613850769514625497977880278916078343037571542452910699608639199334716242087257033679813405503457913766626678856765747940796988239184619492044398845847330875248279377691256718144764352787323595310916665202454075432835782224634142882556904024349917556799442289975480861859420905292552431968e-1"}}, + {{"1.041453721678808896911050396738573908805847167968750e-1", "8.37802182325172850596572970971465110778808593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "5.88526852493738132239113873166539203263138672058127955706951262195153797473038707601101237196070886256644090185553908945280688151557324839521372121066434881841798255953853902832020964805296391060444306684398308798244411237112095640393380398474592654522034844007881900667824504043884214270458892007901e-9"}}, + {{"3.07012551115110277066833077697083353996276855468750e-1", "2.688791941473964719477862672647461295127868652343750e-1", "7.27959056811329343392664000245431816256252125501370190635108304735068414726869009253945094404747463601079257760616120868020903017002340732110943618640264478113302579667971697324950504699622151612181100300886867598913337113652973737056690812163582367071363756081204514554722838161602803979904270771466e-1"}}, + {{"3.8785555274741909670410677790641784667968750e1", "3.6812395300311884227539849234744906425476074218750e-2", "1.14414942990692656452341784125767590353064260907248467847740571016135049928321189261126610028098851785915087403250818786340815261171401002033061136458109120291157079359913768807250954139969052510045722307049663169894534742927788300920701107994896596920105547258658675585904959114220585301112702429345"}}, + {{"7.2600458186699787233031599953392287716269493103027343750e-3", "3.0641341074503714025922818109393119812011718750e-1", "2.21086963011262781557962916039162488992600789192717542131434452153601149170623279185807445011140592247466432290015786700658875253434281122713288249913633617033214856219833669907164464033302015146556043425711342744639683355773156696931162767677537366527811567871143970446954952970890842842464186617910e-1"}}, + {{"4.11288422352877880427968193544074892997741699218750e-2", "2.51736412939929010690320865251123905181884765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "3.24565288563751822331299972603179488550349468370067144446751898852644002616709216207408151506565589257442807820798232055968358812640290558093447292295273379034573533601586226697268290915360691120466719143962043078879323957769794563236709847407432551615445562560818926972156677354022231138620495943375e-4"}}, + {{"3.834137867264226078987121582031250e5", "5.00384576840691153165607829578220844268798828125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "8.70586881100241909365086281828106615321437784717557599878404325717613404517722842063862151116432421295729131945352592123500947115034261116251456345076603582494211858526398683989440066160175940760838173788310914276938532934671434380694237696835717084352874743706871899256563045584501545107582617433574e27"}}, + {{"1.45287638810286156079709662947152537526562809944152832031250e-5", "2.12685751933480298196330049442792642366839572787284851074218750e-6", "9.99976308406201382296511195677454028213966050559386949061001176100458674306535766658075727649858861936143578824990999294178518894376297296437371242014351633015801209221765213206140971726863151455918302666401442029878834264175629251102478211077868646609228275473662440136138981614575523961652841689231e-1"}}, + {{"1.060607787842173799219835927942767739295959472656250e-1", "3.6653855504344872232036500747653917642310261726379394531250e-6", "9.99991775850777769594805464682102392095766388724998006545282885743063065509840288039071353911521871815954556155694843177720505424196812072094678443706799908575637539974472545844157811962504294140635183658965312242832638263593804028788156476482121148602286677141129409544764834011834242854688050032534e-1"}}, + {{"5.8808637709003045920819197078799334121868014335632324218750e-5", "2.2895041482392727849592972688697045668959617614746093750e-4", "9.97772228399557115917897595553123200059617745525398631036747902716221825268917059130877148214691312502174434355597848183024102187672671321353149180399633699090375168044589993636218162674313714376215322688591337150653523844732601246528148296899452660176207080310884559549441104143585753370139662688312e-1"}}, + {{"1.82088437442942030486392468446865677833557128906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.18170819309718790101129681779923430440248921513557434082031250e-6", "1.00000130754723378331003328108523077660890480086159377400421770916129060299296337133805493313328717117334983973342138421022906982702012383037259191961910456959250943670084798790257349266900179703918444391347033677458675178576414635996649806132816647233201959427396166295868642002149628537093670669003"}}, + {{"1.81790864213692415773948596324771642684936523437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "4.11112317505943991591266239993274211883544921875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.16716616089260899158634927691311476940264689424270830038830803482761816779192664467113169986590716888439242048069862364270415910055880132349242712046577768880635878273030333655678293456983297487516817843334720432032181949191565525929129951842591644277698817197191950932369312197425519306770280944742e1"}}, + {{"3.1168221364156203344464302062988281250e5", "2.94098588905476396315741283160605235025286674499511718750e-3", "1.03790338780611240821364394096187689009151442337723127625883997000112224823851501188946812750320424873330954741819494803462494193607811995436113951374495986635400485180461374008937550605117989616259238001766980179462154007176099462553721961527948038831707776585902099492828100272597482214965326918683"}}, + {{"1.390878641265953438721503232500253943726420402526855468750e-3", "3.3010272380812644144043588312342762947082519531250e-1", "1.14022877396721831842223346046335424470246823884137406233750859143164782910052273120452909159294424816461360814736670369100321052363875210113861850087708357854957657313512898387152990311841659387594066789695419982631901574195401313785030478101180804642923588217360853722001240454059693137169086797197e-1"}}, + {{"2.70245297975474845853308125676051076879957690834999084472656250e-6", "2.27192418381639527069637551903724670410156250e2", "8.66297652134236153231549630311782646457435806521553869102045806271290140313907532572617601088189845177879703715370369231877915346831429034626669722739550299919960838955152823532091259662956246982857242736145549200749997723311019597549168518852317671248226020048798842889139150504890040937192852486477e-1266"}}, + {{"1.249171446812304111517732962965965270996093750e2", "1.151409165552330193804664304479956626892089843750e1", "1.38260599513773427745927397841453042338248242456988517458147773019568704658853879515960004076402277283883489795069346406439823839016514254977654510204974986928186171239215823810556312920621087546486393810430469767985081698483192169492133075210737954383435371131440185644678524564816434215238704654516e24"}}, + {{"3.118362310192143922904506325721740722656250e3", "2.07745884054014173791813391289906576275825500488281250e-2", "1.18191130436089764539875276066824383600066278177797976268794231640866698789531115667856789828761726794355968881132857750694814866048339710833375629295256557712732385065863487440162509225900966765667937759713986800012768351783498265785505802770202831716066805035224331887004845557896771449008224340669"}}, + {{"1.490792061643138310955691849812865257263183593750e1", "9.4237360550309404061408713459968566894531250e2", "6.27012834121533023666785182346229437241289754499051958039863912420351581912036946871768101343922573098899177777951053704877386501476998681242293961635818871027535060307630949907397555951449420495765047830618356183657814571149049220337636474144629773918060565875711712572574729922979876342390263324772e1105"}}, + {{"6.6662061859632616494727996858671303925802931189537048339843750e-7", "9.21273515382789454086776004260173067450523376464843750e-3", "8.7720486288821936974478857366077028717039276900173868840215586570851328800318849625174063894064299296365776744832842535347287057849725364966061157585147600109227112263672943360146015080190661943495120908398140804149413536576847081616293061568452054226035633596561472067627264621732339446631526745150e-1"}}, + {{"1.380789864323115345712267298949882388114929199218750e-1", "5.93562727297856326913461089134216308593750e2", "4.09060418138444387424424059062331178711979043905828333720448765913252697584689444873629369083510366476460104106313375773568706388071930121668811178870306890980290075045537520987441428335324653171796426529164093528427568372203611999068229147036397950044150945977202609787933363721956655499688121770967e-511"}}, + {{"2.1677105043294141069054603576660156250e3", "1.114162712132173898085807373092848138185217976570129394531250e-4", "1.00085620226622470905732844417905757963463091991631468675045664887604696934739150514381777470211904644648980514762573227291787791600677422794047913591269830095072415283470532919592193733010388187339828883232881043401853930198928232094973120867346831075681954343729371567448461485192448773328157967492"}}, + {{"8.66129276411148731409928025470890133874490857124328613281250e-5", "2.63230476162026535980054120500426506623625755310058593750e-3", "9.75677926316087201992937434104172212635183402081845367050961907386982900528845357336855433020027701890844425355924313158894887243517734179729721860852203216211626732274220956786288208809210677612308603888585509873354794360927290410971415768734554863757722931375046183502833124862440220040682623894401e-1"}}, + {{"3.350575803404289660855641663772530591813847422599792480468750e-5", "3.16747650803829827736990409903228282928466796875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "6.69762726818915994102636669640248641695258916516178220951615332541358403169898089796085534108216181605452622185779736827460245748311614902401628390881069582094010945399117381574868399439034359201699565625835678615787458358138834274021214751543009200113868243044350923559610553355961511493945076046223e-15"}}, + {{"6.533819307718820648678281770571629749611020088195800781250e-5", "5.88128239916411388321648701094090938568115234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.44239576906295172295161064728901353975092629051590219076800377900713837403284136783431262977433666893756151770251819781412876948522321366628456614260642901179077056688683539196520237460889892611407142177331136348438247424975172992629120895139251739138531630904163246094893508737465346231066931419052e-25"}}, + {{"9.58824111169796669855713844299316406250e4", "4.767758882233408712636446580290794372558593750e1", "3.29079715270199960942963556473318847100392035825806894633874834481890517355918139252275167622132083673533042352315135079499274198112245747602316235108479674713674202663546893395644195003527204518806401402778881498713093151993690595544754136969841959488665417573929913679381495568123074940059218587082e237"}}, + {{"9.8046254480724974803007576440450066002085804939270019531250e-5", "1.9238006181862110643976393475895747542381286621093750e-1", "1.69367957215417366534795032414092044927898150798664469523819577887485052498975506353682229088031835479896261249192998498541269057857290594440231095317424708287026045610877468508170913712129807960043309223866462243177903185979844369471346406937023243553333556543631914530281862882346915332974736594434e-1"}}, + {{"4.22715824828159014714401564560830593109130859375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.73237473383745509636355563998222351074218750e2", "2.85142181625610748727512967615608623642319089823180852116567338775155480625397140714648406228861247464456116191851444571000366236244452154069748412545940070600491678946250810802096421175871317523376451483012224450957973158915531091130907648484702974041033736125577265886371493322366154555363836169078e108"}}, + {{"6.9664712703758069345383319159736856818199157714843750e-2", "3.57526947921747250802582129836082458496093750e2", "2.21776552625627356590336877317582904052748969026951170943346144361121751863809186842688158978930311760773848599440472082708351294025960471667864592532594991999006914698692274398613842119283225752843571850040859177332114176284555447226936581391382855150937157990431287391269415649433263516860035782138e-414"}}, + {{"8.870316572117269515729276463389396667480468750e1", "1.340709584692019973317655967548489570617675781250e1", "1.30679204065692425620221532321916410120280977665891018935099692677903142836365793713310074103183167526509810778546217793360039724544105606790669360053805611269103519872268834740224972933178750433774433912507891375768945267742879488012985036171398185645729556921004734943776799979369402749984084043452e26"}}, + {{"1.38894800193875870772397540520159964216873049736022949218750e-4", "8.2883437025022566047027794411405920982360839843750e-1", "6.35222056499059860815119534190744388049132560559707635179974362835024292102863415735162094842301916959003527949486946878329851243593307281685479130665725517616797588026104563060365221513904192277451172225341242860418605162130720263571624685346061029050164764398879401328940031001593736913742594656342e-4"}}, + {{"1.09816947397275884975090254336294037784682586789131164550781250e-5", "5.58183945899629990446480509724835883389459922909736633300781250e-6", "9.99936261439304212269593793274631621066678586897953594510473482514688267255174393243589871913940083113695300948318689338051222055912287552167309726448706279958229666015743107592418824002439360290161725288760084420735569321637244499982204153705684126108823317986930400592132185032791247608619277879575e-1"}}, + {{"2.3109699651686566035380110406549647450447082519531250e-1", "8.05549814372709782617221208056434988975524902343750e-1", "3.07259003265165794231974650932471010325197411080114721904301457157547097334313567798534807882346741414784333355642286915364891740931795753032224983168581398136163731017251242792429565442336378918505638415347606482959367519064678452374991852143987534832456623394400259546622175052847902597251732867983e-1"}}, + {{"8.496704164419041638289797901961719617247581481933593750e-3", "5.06998079666728116224327926886417117202654480934143066406250e-5", "9.99758288631873273226282145885741739757443924805027385096536700548341955223394388330738555808413815209906793614975662061712919602993250011794563507497959691981853673962928960543216580974445772540799559436678586781978389593065105455927885069982188267742598791601651598840088278986439446428992363728811e-1"}}, + {{"1.5731138538713305024430155754089355468750e4", "3.280717754969959891160960485656516993913101032376289367675781250e-6", "1.00003170338187821543987107336746662729109295981087069294808638827112958850528655867141095917778641007871411889107729782401763128246612168904257048743190385169980528080025389670873111442583914650963121405799362630066123464254273948242629742051351814124726982856264616340030151043214382406894418159834"}}, + {{"2.39202138047558889866195386275649070739746093750e1", "5.4911818191854854376288130879402160644531250e2", "1.27339014094927962826314328575939814304054781018385168289190485168514741352754753149678911930165646861374735328175462043586928267957865268734389479790773849220996848074070389175534751472812216991107745875007249116250242613067032470443930894251972922681126465003519414999032823440924453088711434009253e757"}}, + {{"1.64634850170019781216979026794433593750e4", "1.580523129961241765584212259909691056236624717712402343750e-3", "1.01546348252503362826107105198333600916123885616351929759095090370675683807853397698537671019348523544289454424258903395372242729481623263158900841743559291226322042608326721672299094222138476822715326186152957264351608036142453170432188932360709929281850323115131827188070509946087921486355921396837"}}, + {{"1.29984771123733180422585298252613483782624825835227966308593750e-5", "5.486733068536071497578454625454469351097941398620605468750e-5", "9.99382895797564405052408771210317692764125583490813721738650031785719409851796983570805688722349822979681595897622086712994137349075757656980372150545265412692073900115244181782170626388308672797472118433651575906690160786295103594530704832482562910548180219532761382129979082146445301288761331520852e-1"}}, + {{"3.344994107622141221725087234517559409141540527343750e-1", "5.7036284170717499364400282502174377441406250e2", "5.40485852822901975442109716898610918193900542520961776863305069906497895793489542547982159745108266280524490077140951661552295048439266934614559790866489193897427949324691009938697269495988925070011169411841665487299534902136008055662912091113639828368592572760704050198717640286295766255031666140310e-272"}}, + {{"4.5876926668516091467608930543065071105957031250e1", "6.940088848410982599879126553332753246650099754333496093750e-4", "1.00265878013514519296809865295705868217393246867225559245606227172893223522667583594724300322356488286875380629025637162385262938162022625886814529504008804417980773476428819488610083450291142913844379562656183905757559036430981251862699509205398028210683848825112302095809741897956564300820095580866"}}, + {{"1.83659034529005538161072763614356517791748046875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "4.28717719818835121259326115250587463378906250e2", "1.53726930767980134628351414040002163694004937538301878071492381306637265403593248974390687238745936146996356402451151949754817939176416474547668969917407094657482938942615901000965138448816198787619804034435155352704149778316444976717855180409986287616695020212770570197624985971189801426264668362739e113"}}, + {{"8.6965619711067474297341850508757943316595628857612609863281250e-6", "1.5347053247153283339621054892631946131587028503417968750e-2", "8.36245700894899388555856775460955394048641742342223378203581109445790321544636857502869379407622931929904915591813410010543421311751441003345169506628319334514393326009523930245673734273160199057057608984977895920935149203153332718973184503752228376603699406900321208889195409621350940486281346111426e-1"}}, + {{"4.77866412699338716230101908877259120345115661621093750e-2", "1.16847487332184418740155251725809648633003234863281250e-1", "7.00939095440309291336847802488312895385004430053772751642212203497067924870860269568166321148643247526572505972984054880543549485653717067216843154655077419087852705718322510631592242331848706588637404925586365121042986696317386544833327481602868949385627978856713298735650783856235081147982296346628e-1"}}, + {{"1.5496379919649280054727569222450256347656250e3", "2.11204960957075971172969275357900187373161315917968750e-2", "1.16782897318171377990330689886402903355059628193684114132825684051875757607797689933491076299185969963004000061078683006351157287011440524301691431503915118755080894616168235485089522630543579349054155603272650786560006738889360398191602249883148592535791585897969899944427735543027279681332101510149"}}, + {{"2.4700067947116121649742126464843750e5", "1.524990827307894439290869570413633482530713081359863281250e-3", "1.01911645804528060285295007365522901933244353571254108413776362642912835636609229733378877024828901273387523484327765744744502840827542422973162779826478327376782490303695679704814420712110588844007646988152318154340574171527693080085147287526207828218450010980129801914952299876654249129807403026665"}}, + {{"3.037235491867054356165955830704206164227798581123352050781250e-5", "4.511103232652476435760036110877990722656250e1", "1.62158625261315621796784260963880908165199570383258880752909601743905724906716730454255511124675934144867399204404978430279501754463613692043192608111413253272638040513583589571469911855611383025946828382761211165356334768347578605666178294674917101334371471550226399719868797818976469869780054171828e-204"}}, + {{"1.79856395286417303225334762828424572944641113281250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.3205911557676336696770177936421930553478887304663658142089843750e-6", "1.00000077517217823836935248077849892691299847903424265238524662417641027601052147271170002075034613200815926835872160958521395863660559755851166354980024967551112970300127247095245969854003499125350435566412954660499861774431261483707515396163088724936940160199016889915664585852452649068941190636190"}}, + {{"4.4135593735414602178934728726744651794433593750e-1", "3.4264101814415937496960395947098731994628906250e1", "6.74548555036519520791276201322845305843766995125882533366758793048355043544777974793130718057932582612619627280143295972890756755586060864163343519807569602024123450673829021330095007485505005460893008699595178496760510808546265795771516348135206769564722897763853591915237047669941031110007831969575e-13"}}, + {{"5.6917199182992317219031974673271179199218750e2", "4.980431025421458990365408681100234389305114746093750e-1", "2.35629700595091638395832213480888201727086153567756638562745744247364577078732772888391063571800696941049290536498639573875131887930844892410621248852158649248884548273739508794634953342193256645662324249539648039244590505104994015484168576899587920875428234320711411322714373060714140422162212909132e1"}}, + {{"5.76954356011381364402468285845770878950133919715881347656250e-5", "5.2511187291456451475823996588587760925292968750e-1", "5.94463304445870155806025859667737584217029774659090091223865132706141204011793568374081383686497430278169952431756767677964164234313821914580067310902314296078439102264644178954457549643252195734243656729528702645014237867821529512634908260975861471735012585206572278726071364924835281322609605715766e-3"}}, + {{"1.0512376808920871428367285749239101733110146597027778625488281250e-6", "1.803264129332194443122716620564460754394531250e2", "9.01096635654174895730364890004274506998670967372315294988820585742497849923309225303695080415166238118944235696360277258545630995713146996451284285658251097270549397299546887024456736142173128664145649440632706184379221313274424739352233838868194748496986549948050292922466160812395403732938083994855e-1079"}}, + {{"1.281632386074353924243496294366195797920227050781250e-1", "1.1652410215525389958202140405774116516113281250e2", "1.07879719574926016494490747415323778012199705593394831943581938296777477488312425323506097154699459156568032482136467971947677672762383992541647262353219851774496336332221673599562229050781431336707003943210680119687255794953033119424826346843688505841414943672869216307940977860809662475253945553141e-104"}}, + {{"7.872022514530490298056975007057189941406250e2", "6.397605722050214716034588491311296820640563964843750e-2", "1.53207555977032989055018208938771579303277505887799197079806149426805566503858217166434829573392590992745607709024458374528640995879305116834709101892580164791296787623750765678369128997876794757719509455355831607218534572758406336319858307548393197701741434159035106328532033366541994641153056109739"}}, + {{"1.854131908725732955645071342587471008300781250e2", "5.69406846692120716113549860892817378044128417968750e-1", "1.95656735368615067592522859512955039643574891198504549379998394284320814651945584264960315505975008311532240586619468218955713277820799989277348072854744621874725681637220043518336051308494199906438625737004480910828551371454866506648373987268921256736551339157313351536645840751017335445520822528269e1"}}, + {{"3.99959450842199415454558675264706835150718688964843750e-3", "2.8670957835011812164793809643015265464782714843750e-1", "2.05340685717906270754605609530501932449443307474519553599524954021671059012176997891604734383935653924096296837478833892286774229478680952581431502458132810484806788952807655375243507984165689501659897282979828575230799553474262829100370309746639962529485962944150334131789310986002849666502428526895e-1"}}, + {{"1.84674139572777286713578526189394324319437146186828613281250e-4", "2.255716592993170510617062518576858565211296081542968750e-2", "8.23722070622293990830799081708429380180065314114356604329745073190591014971022286949735867992102290979570786194665670044964971913376468986554402193499702945966888241927569660743521069322430532256408138686743620372490125687831732257527068587575688326301178711197108267406944507908002982504230542257301e-1"}}, + {{"3.584739111909031635150313377380371093750e4", "7.602453022229758516914444044232368469238281250e1", "1.78031144785764416938612223102409855040299356306284612439958299013225825622202999580381834230141933121841779061836895061770649393695477680433223418771879979265527918578121214616513115300315506936777567650603403724811526574832706041635294702581230395655527148395841553708668562384577527922279281988840e346"}}, + {{"3.71269374692093090395417220861418172717094421386718750e-2", "5.327041985305960299741309671439637440926162526011466979980468750e-7", "9.99998245586875139489901271639028340713779059130027015276766418411283294006537627833255021572845938748168207820412482122290518617722205438714506223415635135045747382101925106285222804464701875561904552995223695133038388901912278020591663993121292169965721308487953050363811103359158918910384771899011e-1"}}, + {{"1.70108553436059684038639261416392400860786437988281250e-2", "5.1660750468378145586548222389922102593118324875831604003906250e-6", "9.99978954129792622644650032269094574319631975777438486754903659150962464082118122945419410503323172656817200054190506282421527117453082829189458035945776425795407971906137471812197621061779135748565507246203908206485915975691199432826508885650310574999400116127525787480206412253878273855862615753183e-1"}}, + {{"2.09225836667166789993643760681152343750e5", "6.8566937448334350224676825291680870577692985534667968750e-4", "1.00843563284699754528712961596450017035453860350588570410059871012011253379813933654529429045301434484839481489237559065322374683637748571974104032389976926103159187339564349254244671809494052575105796625285810628759847430784136996879048594191371809811836063684074535025913318716848524590469577859424"}}, + {{"1.21714727542868383913798879802925512194633483886718750e-1", "7.04024274981674075615800667549137870082631707191467285156250e-5", "9.99851738180285989619013743122680620229360476738383672375457223596142024538032582334141363701685216531955627726353087504478019029760906182307020379318817894422274668875967247480704625723584657033632048027924110460864147683431850155444025526123837240535234902995892523890236573378473187948012001689440e-1"}}, + {{"5.077368207710659725115376339488193480065092444419860839843750e-5", "3.97089812664133678943301219987915828824043273925781250e-3", "9.61496103531524292145269969904333508188364139708137329208759077302004651060803860997069231846146525416244529356233531058823752839075298907756560474430217361656059248345442657322781131236619023757967452575027788503647455091630937116588678330308533380860226144011143233073363114955647590755520397783133e-1"}}, + {{"1.05107095024027863416904438054189085960388183593750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.03411347779367872590228216722607612609863281250e1", "2.75435618440696236423847758785039217191601787351549036022831398969378880644344551767328463505949691251600586393797511528994909897140379260738080763330267660481025359227717949542759648019166102411005065795694130304853332521480946507674204615568889856249883941530835820527992056685661760535222848429821"}}, + {{"6.049918012597592072501773152737314376281574368476867675781250e-5", "8.188377133726698957616463303565979003906250e2", "8.65759593884760895858132938458504295554865358684199156580525629386190771627069601339728387260476959873950047671147626130674714736942807728977752816985626622779230687686049014608462755984076183185977629942323400832151270339085974963175219245006492664764899739861651980200882059489983917901390447959952e-3455"}}, + {{"6.5174474814096265617990866303443908691406250e2", "5.077102163366880004926814939913981561403488740324974060058593750e-7", "1.00000328979143507415685697811442096253363291297955720636385496027164054688294193762566482130745852122932064218776073663482596744861678935376393042841878114830402198126626873661961854660156517253426476105318520395463096676472118157780746408448524800033381676594338617857965937768629354079942055143731"}}, + {{"4.6388449163862754964782197930617257952690124511718750e-3", "1.588924357889719374270498519763350486755371093750e1", "8.33715260820791317269987064747412391800309849955602033217225409481400578667858265909262657939940738177907804353137088637745857746470695800199690029742037073210058760217313184489359114691758908649867287570270285365266943814797806817843515342646282514312200010453327035336204860831498248439822619093280e-38"}}, + {{"1.4905828579579060615481478357935429812641814351081848144531250e-5", "1.7031751825887083903743324242441303795203566551208496093750e-4", "9.98108922622050827087546461298822670842973092479525322691759952475540660272868395330655428828449033553950251437644999243615808527145214868010990354809843842150796169597464947831412602935689456012651060606674408759590837715937317107067113406559618224088301687347090716482594166112826991011166298362788e-1"}}, + {{"7.50315265219419380571252986555919051170349121093750e-1", "6.0622251774968738402549206512048840522766113281250e-1", "8.40175419689520964937445314051307565108961445693694723005043311860973648366068520257018285775532813235354539177271941463790001972938524250513944002301467776271129144936307452041012641877576914077850978415809262774052418002232753061586235460151777159128199018488311311211799819289180487350061980646390e-1"}}, + {{"4.268470367888721342733426844517907738918438553810119628906250e-5", "3.258430440221719658457424917408218334458069875836372375488281250e-6", "9.99967215285852515192073395540137950482554540502668958238310575910483321879481952698928091493628164541705483350832773369892703138436296385686888980010809861693571807457349075609182274750398269557656870778473684116326560067055000556274923680535552295628380182973673412404308833575096574012516864815095e-1"}}, + {{"2.62667296496937296979012899100780487060546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "6.98943432793326180699211569447015790501609444618225097656250e-7", "1.00000067498249093796554190906335150484537007905333805853084798522029363004660855846859261868482180160316566139837296027351379815963628562093199672797915615284584800543052123602981811247334355647141931097257473080865200634384690696676990980451941954802180365065774462909125574737179287520936788897430"}}, + {{"6.70966669446914210084287333302199840545654296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "9.1631038456329054128768341058730584336444735527038574218750e-6", "1.00001744257181843369125556914164986065767377720999640888705793438430385027106235014113094055738186706162642114104415940235112867181288621050157885040444050793876376258047873939583048138039901310315757778797936384132441774545886210926930901727852204521859059543099653693673834002390277355781829097039"}}, + {{"7.41203371899830177426338195800781250e5", "1.080452434978750069676303735555222829134436324238777160644531250e-6", "1.00001460353450390109753320201848917579634289514937879484407258848004890744776169944597998175250117503923620359242409184317540187082543653993640048666001395047165769964336795615132413269257911431079896523695358479509374941248440346987424514128254145411471716437568325046246372300034330801593929796699"}}, + {{"1.6915925563799362407735316082835197448730468750e1", "6.180263869277183297334943290479714050889015197753906250e-3", "1.01763302348245649415440222014057755125288511751974439494118531238495212343084716356590900135150471489029857630623786718849006602487868725615880115082270216521029606377055101314827010471252021762724425333126829904634616800319752383603387644619737656819562990847546393907303039685961266007323499371276"}}, + {{"4.71460529249768889314964326331391930580139160156250e-1", "3.65188827816496541345259174704551696777343750e2", "5.57039862156640741370099717884062397571736028728524050580037613318788846117662035095375103738860527021001943141141148597120492387251375648252287053831107964249223144395667696166786054472499439767489130687268705183565392558321079668035341534647161063188715235627145576677691259556611945549071489064974e-120"}}, + {{"6.649823635178329084283177508041262626647949218750e-1", "2.0412485989929366955730749566555459750816226005554199218750e-4", "9.99916721594674747376600569188805403610749202879145587384797447934876298553391460440217614450811626491475153827239769211949770987067539929764774811195211928780393852025574440532735397207179531706592529705918782911567387089221968997852275611755107175151890770337885129722749288992344581262036121822096e-1"}}, + {{"1.1689344174400408519431948661804199218750e4", "8.15678606859390242789231706410646438598632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.51388885705521092082676462955313303770964042418254877907252507964234420916080103781270109330079123766686738994000772870583969928581773756873588657991143050640555136731739608625215812170605441235916882843841833089297543893622016574335981753027769495373907938555110085958780955474425308783814139862813e33"}}, + {{"9.764006258263712920153487573315942427143454551696777343750e-4", "1.864429866329895268961536203278228640556335449218750e-1", "2.74623224798347601232565592691979711045580692330641567994756260200814740060669606546590062265074708542429821154943403107394779336685935160305728814542562226163058396994725320974264154815235226634053969860486205541938719842224052325659161610602552591765080618174794519808159266445853952938084827117419e-1"}}, + {{"1.87868482843651634084380930289626121520996093750e1", "7.1692987273281232774024829268455505371093750e1", "2.12028119371494031430335044645564708556145176065304647173808454044697019950167941050283479818252925468559303066000892193796628006878431527857608384081735638513924751307741786259324802053021768713537078672257166368405154064404708746524318561350343547073960189134086007775921344634528456932868446419630e91"}}, + {{"6.1095693489192053675651550292968750e4", "8.61245994668030334651120938360691070556640625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.657007928541288294811583817545569607832014464676038743964777536498999871997260503817641545878415793384542051422692777345680017433348671458013853303440317187339805594208064853234977344701458031672246519856148886015816160733326713509830759728307312465258659896898040851868954253501173778760212364320e41"}}, + {{"5.12940713132187653400251292623579502105712890625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.285644350198942550142847118799238614883506670594215393066406250e-6", "1.00000373701282973747520930655159796229096921541589463952802693848825441766023480118817224366828254246104620872707491850843628745742807472462411859435943238658855518813616022964453910564185237673973654468864102738810104394810487407665604967406614750596030541491730666890517480494969397423025082726828"}}, + {{"5.9691952797515383295377452976815391139098210260272026062011718750e-7", "1.5718058210615070579467891787039945938886376097798347473144531250e-6", "9.99977473944483761872828387581066184030968843746303338716635967128051482967926885604187120298468309076374477372898167140591203610593108721399453839682426096478159671434202750765691646383078954275710747248498138805135910075991839124150638583040898450493059066421550145802666193053679045930003027645237e-1"}}, + {{"3.686062142486083992309886525617912411689758300781250e-1", "1.49260037966346908013329231046384393266635015606880187988281250e-5", "9.9998510356549311348447592218399988108920778960674235069856751667182339392598123994325942355644458229974167672565122670312318271933327236417417637712072186685889850127900657063502042279027378895935315299539289874632736786085798675859434221092674392826093829832333880551302119483318252762377651960870e-1"}}, + {{"2.75108139709647048221086151897907257080078125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "4.503704308271892386983381584286689758300781250e1", "6.22207684654158090072166193557643641149481975652647701708530399277363664695064351610680468504557225898194931419933867113331640493326162327026706800979963281990313857552256767561246682453632232432467037080629483164984556210425989798928121976072588554960434306958147259366170108308967342505596481568498e19"}}, + {{"1.811624556732920154900057241320610046386718750e1", "2.552600004410090513530875999670399778551654890179634094238281250e-6", "1.00000739442221122260724005033635770725844741914207974197964181739354726511926916714698090584379202017604302885037125163720681613028683344989131816590462063741786918631523895090976438946284620031268598318287495015673164204411596879025777677083658398098322196424671094954029116891354161564494388093193"}}, + {{"8.96493500879970817152297968277707695960998535156250e-1", "8.5687515754119067423744127154350280761718750e2", "2.18186472758714615747935532618938695169587522725634994323764763361322541875338494379271005378981383706775962465651100098009942121578720737172235160080858098630748438403135919432305006360154000115695658966205609995229485314131439314904570801339124033312271333615588491334684665719513845178970476180503e-41"}}, + {{"1.2661287980897948171610245537976879859343171119689941406250e-4", "4.90879340262861951771355961682274937629699707031250e-3", "9.56902896481771879143877379682638527882901861190229819789042792546979238367054331337767498254741605069110970147845996240165269976456347023401814558426675219095881612725781553874494895757386564444732770552998856125193687086542254594118439921159929235553297916239134941949770234940282427408194492643353e-1"}}, + {{"1.051797461093969659464905652690447368513559922575950622558593750e-6", "6.5937410071820754323135282959356118226423859596252441406250e-5", "9.99092782662380324729163640655313848714756101648128347661760755472309885143398472302956067855710190800993042892779094559399021527010697359107101541167758299014549008387517426503427862359734988159027154498990787998696863714462719474369182220777439814743092111459144669908819231194636468040015004769487e-1"}}, + {{"2.26677931802150922635519236791878938674926757812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "5.01284500605095928449372877366840839385986328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "6.04799524981909743425238268974274974124170089470250115095198088233403741098790024678291238778471336000887693628348108623078030852501843027636021269414992355439834109447548416843301419510567977485938290387496561912410461657784176868621026947292962832450377901755820567805673466030070278228671530695195e1"}}, + {{"1.47645383833588006439185846829786896705627441406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "8.3477044596248651942005380988121032714843750e2", "1.81864953170833366001029957686457080479745389229343183507996187270256012032168347753440691289295163599099444007484206082939466510290612710007371495952373847856242772883552123786185299979765598455416935895627334117098932505280856391911876837712397381549095944110724452719067485663398985307194410072346e141"}}, + {{"6.8369046056257509746956202434375882148742675781250e-1", "3.83530767198103986204138493576465407386422157287597656250e-3", "9.98542687144721504190991783229244229904437024428948393594123834827455412276977464755147963505927618995184986289919531376928027005710396398910486083058794955925781790662773364003988254537015097017811287414007455159323257827799204950099119284414629154584347927772687791013118617040392415483793228615528e-1"}}, + {{"1.002053539055872133367586229724111035466194152832031250e-3", "4.21472319667746432969579473137855529785156250e2", "9.08953646324319429602818744612054042909432561532126770140572825180403651664408870454180981154606920328617475099247353850589948028434533205453640961164641456021776839621300753911422835934782850338468313312210488559936609343534193099022841479411388023651172446221865345603921529386692401675022261632417e-1265"}}, + {{"5.1523280283123824574431637302041053771972656250e1", "3.605102571810556155718074933247407898306846618652343750e-3", "1.01431289853951002532506377614168990948051280337886607436878494527645645147723859636940385995419356184615086203041458176935646525562258868511947236909026624331932959131571326296466151873473074426347666272446566573176007728397599624815497760954111152173140369195400219514948443921717606923360226206339"}}, + {{"1.50327863210486480966210365295410156250e5", "3.2592870520402448164531961083412170410156250e2", "2.21705224525603686559675227491858310594380597690754424568785114801297385692314088399732454361300955075549296567427255869777962816305497530312793581969492733775461667703068826501146498955373099052386164214730524062952781381010426318671419140310052915928431939434595652675036589780009141539593357125642e1687"}}, + {{"2.5210395048109605952227352254624292982043698430061340332031250e-5", "3.0457256960016615724914923468702454556478187441825866699218750e-5", "9.99677562816744661723525153627124442052964231793875730324917063167910023632186323828596851920875156111103787347156093646859907405739307639598484356543171131155872282222202848608366838457688692164646235280817749009555765844448651859985081286265963272205351701235959915053427147246220456364075290757788e-1"}}, + {{"6.69572868673203203115917858667671680450439453125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "6.1676327121801987523122545731268928648205474019050598144531250e-6", "1.00001172763619213033390863469162514923787137097731257478379858496528955583730797624990721270466292542630978166836841730894536953419182253636303821927335171827673847960943549331513055995583023583227615832251837950408037083523512010882821232754743304332778547391577736073428707081283889265580574098969"}}, + {{"3.90611154895943855080986395478248596191406250e2", "2.09392819734250876240189143118186620995402336120605468750e-3", "1.01257436238989364436740053785780748984877719711041249303794530677616720891994615335093220833940115128861191606642103642393403535957041953141054150817528925853538686389534782202437853737346681413564667163289005149907512827692491679645604032151505662903966426036149340526908388743360309704155643902314"}}, + {{"1.857389689084788551554083824157714843750e4", "7.3490044908232137962911245665509341051802039146423339843750e-6", "1.00007223974053029723271350039259412141636069806425386754509098025549121050837680692710943206684686658573776447604596802766176331791002163659401284496154417281082333498905606330772551902793976098371405853098920109852460783688567109865594724989116482969799710457089092798143235841330467446343910216945"}}, + {{"1.7607061517663445556536316871643066406250e4", "4.74889370868937987779645482078194618225097656250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.45316765019878240189602403680427223818770335223288608146347951094991305163036799974448576646914163732716464031107846083674367407256925355345653200850687798959392811940414372053909694215614805160729642095127896071955737496902022738055554549005006428357198315347861922794020063710653902271293794797134e20"}}, + {{"8.59257176966675461152189718916361016454175114631652832031250e-5", "9.236406780605612709678098326548933982849121093750e-1", "1.75626791055079856222412335079669380796397627500002019826921615591957724636638189051537678939438100683331885757581588353701345439775420172078880839292692181866988352748585676000159933320197094086021294353349620582341779917757035411891306338495037492064154895428084541796948375617939605049956389592963e-4"}}, + {{"1.1837336674405312878085791417070993247762089595198631286621093750e-6", "1.6732627760162928912601384978664498248690506443381309509277343750e-6", "9.99977165516365318634154013098062676051482936340600676508115018286371174310194281664961388300484701624347701999911368618575116158865905431420415090042447533719781066713262060337264603666364847020671540664275635449461141562032657119830142469510330575908700332922190579477083626027776803818572001718803e-1"}}, + {{"2.7929704683754344451962481343798572197556495666503906250e-3", "2.9713508936206637842114552938710403395816683769226074218750e-4", "9.98254178388410952430693242810343707992963411946313883778028696826023938537768767830025754426281554000607392763511414140886618834915773502093937010404359418681811029932841236322654028803608283276794373781000755359892344545988755782370138251235941283542297935477464591913844965660089628462450619495872e-1"}}, + {{"3.38113855762533148663351312279701232910156250e1", "3.093016660149662663478742352651806868379935622215270996093750e-5", "1.00010890478594524709067739908022368917088132812449962876399165997211946438304504899291487317819472340328330375585022333633583894340550549675803507677712058170618442005704437605073252304959372965881786681685588681179433355904579852317919540925268445449423495866437480095339165546614783853750408452453"}}, + {{"2.06425930083115716229258396197110414505004882812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "6.22320068732874709382940636714920401573181152343750e-1", "1.56994381329744106645164401249639056164129850194015191524774235721349310749300345652229762055800940290782810800288250321003967654939060262541583665184611869025848444849240326580936044484294913651408991979990620894378054306407392449503735235963890733618686812461995281192108663576402590588669671991241"}}, + {{"1.340876954053071834493948699673637747764587402343750e-1", "1.4827341861663803634918679108523065224289894104003906250e-3", "9.97025233069613645577452155667707700431529405119046003459330154763708616924139333978711947517286910376855122315920165412886432318792826535847675162918439845483335638190760733366507881163660357422897573743052858674336878106847554903297760383077263299654131223242076136517464708165444087161451001347315e-1"}}, + {{"1.1379582983750003677414497360587120056152343750e2", "2.035002012363793124196179040730214637733297422528266906738281250e-6", "1.00000963457189792748049744783509653303667431326364869818483704842948351380610875652979437988682746278703117572921123081696661945181740330111308085604188704279357002138744426600265673193487995475006875655840336689027158444662492494587307695412667171074545903613666004574014189607190377465209019809696"}}, + {{"1.4373394351522417568614575777985464810626581311225891113281250e-5", "2.32214836393443135875713778659701347351074218750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "5.69028929542482647910462333162857910188985784876407542387662931701295222184216133407420608557785163630976401541135533394749225188544894532723554319205860877128881077879568220494222775086397987960274421371074192662130785663013334009285908262792624635778476059436229937151198221859566242280319019160525e-12"}}, + {{"1.4004427278933599154697731137275695800781250e2", "3.53744104780148727051880541694117709994316101074218750e-3", "1.01763558978681810389405573088195138451898513946030420888756116873548356901540068272802595421797514887115185086583712361722645481445016465906573909064890341678510048829617311165144452645678278211232399208153808746476971992206798944801345917584439323122735213774632862994806449009371980892407850308879"}}, + {{"3.3377061563606758021194309549173340201377868652343750e-2", "5.1634069105928119824966415762901306152343750e1", "5.74932879103617263287699269441230578657539752277509100498121992886363492927534654879230172186557771810338441534937330485904491247273189306610489852019997049552119104082607943340924820476508529648819831797793990936006114678588935819382061714015089476930073162215255275726210879447826384500950556498380e-77"}}, + {{"4.28996264268685627030208706855773925781250e3", "5.5584348273515146732215441716107307001948356628417968750e-3", "1.04758858160148749573207693865097611258682532053580644741708378607626299571741454781489071163331961478583318303704887429698138745438016282037356465726871543404600493318018423949357845164509841052287336032095968547544265578409278441961772371247405527391823186341452132702680834735192488255543508774968"}}, + {{"1.2811034459606310265122885994060197845101356506347656250e-2", "3.43418931353877687762121695413952693343162536621093750e-2", "8.61015280162581259611603041281312219714750672075712379519625520748837900282815093599469657102449329452585522609992906027038154076071639645146113938200595344162570525215006263974571317023675884323716943933613404725430584249433688012398115002318410911938391274174242791011414117839535968615208469771466e-1"}}, + {{"5.1667251794698457190158080720721045508980751037597656250e-3", "1.8038118503281862947023109211563962617219658568501472473144531250e-6", "9.99990502044552423124036840709042864832582112050272720529614683113869481837430803897286965523406403026476324601866776220157395635334324411401951420003880457537783083750584239021034205680737146324172685990190142433894632845319189846259349630351570776916287281796804645673831673367339618359511691534945e-1"}}, + {{"1.27899907316783210262656211853027343750e5", "5.2253602409032748332684548131510382518172264099121093750e-4", "1.00616341899333551359328361392752162344577264467244472586370749414301840554961173829121346442368844768868155278219296270614015234651325697529392935793355916715136924941286676982861345063267744784667777743656327428634674404454023683239192093835032100591051537658643852513812450455406749057692109035777"}}, + {{"7.11730850188353797420859336853027343750e4", "9.60788079495505627572460305430013249861076474189758300781250e-5", "1.00107405241322382059953913596876333435454811871669131165966566428674069591664017854016649566117750922070455790150785398980453750449040916943909541516125417685189264145037334413362116738563574347465747605135946915752491452923545893529316360034715492483804067411471432361687478500733144787639791290510"}}, + {{"7.253438265676650189561769366264343261718750e2", "3.29954091776851328177144750952720642089843750e2", "7.04970290589109038711395049954355776776342381310886782453562200726034000844667284742622588171082170563883520775218082400856123793786048177341878726458251943347876583569178437736653743701492064380769184875657546923031668880530296652280260428229230807500261114316496980898463695380987245993698126306466e943"}}, + {{"1.05425305597257192857796326279640197753906250e1", "9.4121156168923067464326948083908064290881156921386718750e-4", "1.00221940552517387456904940935153668768677803438018028587024892341085297549561710698873774378670329922261139925263482590967131460066291169951663366614190003024630959832086281000186573153943388176622129526851339850140935108594752581778544126368342198113455082270613501744317697800189856112116044092035"}}, + {{"2.06616686835977376654471804329205042449757456779479980468750e-4", "1.69516133890853029630996218202199088409543037414550781250e-3", "9.85720096393058346372084885893839606320554663169456270644249004310463500725457211657627998908535169742871675934174757999843761965159654941281377745862394591058408452525449223020548106433276286869407305925521861569746775217097838170535894284575048909646530082294345563168457886536304399266956794807072e-1"}}, + {{"3.64402451110348510332492821817140793427824974060058593750e-4", "3.20455824353290882888778412507235771045088768005371093750e-3", "9.74947852438644348963594070779458486239729374924703758041706549021145269914102751629698949629550481353884433142728878758835488685283460683679637491539837448325034596988851330419929610091798061933767303224300754233414005420110971299300889653323675957445130038468323617573447274322484402694978713617040e-1"}}, + {{"9.2924091843635910401401692415568334126874106004834175109863281250e-7", "1.10041539819032330171921785222366452217102050781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.30375096076042540689175588676000039497925847630595558133397707131285132566953633275113891277016515974090275087097707081223643727147456085023753621384884096242056199349318008502416132788061805089253485591443085259511013177192516510953942353610198267062490629651968866334656113567343023162640866499116e-7"}}, + {{"4.70374294317859518955657338601383798959432169795036315917968750e-6", "1.29316103610866321105277165770530700683593750e2", "1.15122965827666394521150958097124834553922749706241413675626621322918765539817839286128014659593143570942315119838489669350005299860384297452971974330427527438060831168176929743817135707477251203472467806027668891154074309800997369457141925072379579611854152032663703570089179850821080592817602489379e-689"}}, + {{"7.90111168678090834346927628928369813365861773490905761718750e-6", "2.50142935632569063386654306668788194656372070312500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.72554973148662694166759157160166169303284736393781157514352684466477860400705537599392645875431865905681445772161441577785663278326674184262006684080907675404076284363331862467589217294540329968481020258307213288969704999028809892457240851077890832023610976308448700744934847296072460694151132193050e-13"}}, + {{"2.1947022453851494638854546792572364211082458496093750e-3", "4.5540294660816549310311529552564024925231933593750e-1", "6.15537644035230762511257501642891052274838428807882763659106583075479589103986905326616108567723817554261320425463998387402938492727716723367633134645452074625478383896044161060182209094299460842378984988424538062120485203568234956869861031978112571715328186447068917826940102237728367749115256994036e-2"}}, + {{"9.5937575276791223601383085117788596107857301831245422363281250e-7", "4.7060044781868145946646109223365783691406250e2", "8.34074971005352694977724271428304704379730503069979006543824421982543154474277701862893673330086806692863058917258547615336829675716810145864841475235135109391399496144355613620559781473891279309689200469472005874869702401500915898827498117462493418903426151104912981808366378491461635507492430973906e-2833"}}, + {{"2.2073016502121220128174172714352607727050781250e1", "1.0681513883705921275427130900936845137039199471473693847656250e-5", "1.00003305295163452281794976529673484400203041012190269638476184821369788032078572490628055955783906515975070132315405678121749687518303529356301281556543290455691541229667405975677836660331331546866945589821129205572181796808319706436826468956587053252695087454167269382499127173288396374118362076812"}}, + {{"1.857807898420785932103171944618225097656250e3", "1.30823413709633314283564686775207519531250e2", "4.59033859659617126254628613087390514142443448071790104857905386498498208916927300817260750485505223182216712213534955208892328370772179606978553650153083374335774046910050899642665243305280141884413167811281876091816572586748238812963621916941228650345907682195313189327181720960131248296641667634950e427"}}, + {{"1.28002693604745983830747735332522552198497578501701354980468750e-5", "8.28203848010336862728308915393427014350891113281250e-1", "8.86706798756547273034023259748332998697114154360428093064398895642136945343512222443801509462788398508116083101485126653725181025691107909977090006260480711914768000641955268595050193784354949171562687163857371073429271907026305099383798868693635018067191669439164014101281294813574568021616736489720e-5"}}, + {{"2.0022337970233214377024921759584685787558555603027343750e-3", "3.62365481395694466471013583941385149955749511718750e-1", "1.0523546079739996170682601256693200584550474946824826454017096763153491367530797919426756788342306442393933513442225888083878538329106122737524305933086973617593454993892855732284108545200057872375959005456512921309099752780291866382542273850296660218802026761451051971279229272132557960744013745380e-1"}}, + {{"1.469752780871477591687415675814065707527333870530128479003906250e-6", "5.86458989513311337860024252677249023690819740295410156250e-4", "9.92154549068701501199366439766982295808371482320630816324433379463381296202639580495789257638722760912167367897485745357403740992265341544963450873213458100774396760614353635868165234585261876587876465994053070011062897736386668244554072898747895651881702386350638799402464850863950102149208151366166e-1"}}, + {{"1.69869769328567166155607992550358176231384277343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.0945166435334793483824533666393108433112502098083496093750e-4", "1.00005799594795372584357977768556944656253178249587480331145989344864034282666379944361611058467140259982713730781408566683105999320504528967383185252941819780496432948156779669264240460517640856647134097150209519411486934323027426354907715934579141058953345456267906766103552413735697517517849566921"}}, + {{"3.151839759293328825151547789573669433593750e3", "1.023840290841496539209209970522351795807480812072753906250e-3", "1.00828189958217090945616829239889322422890752450091752768664294850744665096849748731214361917701488824218313674215416049035608435896320044761285630475680013499593324921963112908846599652343142683769107300940314664453753090942709855630290654440762603604322610449245678270429752911593206005276375357381"}}, + {{"3.55087476619042874403930909465998411178588867187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "7.9895693178775673004565760493278503417968750e1", "9.32018908151418417859876732852718049962350652342105850490583184901223805273843023839695354873994074279947349253543933474250055215956442663452932535132575000870445343325403706967004656960749057879238157659107219147411710899538754744145348815414311088777452109665676822468399972746650501593917415911950e43"}}, + {{"1.267754887968159891897812485694885253906250e3", "1.00502285798295979898919760842090909136459231376647949218750e-4", "1.00071834700218288240776940900136375146363527699090847426981092022769405513480212911323057036382071349683106853880233005923304991341200308955960878969600681793506999384869035120625501911973134511693383019876699301926591009688967553141397068289179934328294897849913598948019612426308123680588484240861"}}, + {{"8.1522004810576163436053320765495300292968750e2", "5.7502531130550421992198018017461436102166771888732910156250e-5", "1.00038554010810039170759525901230037332621377704113376782308969416671995519944631372963790226541075839243378526551356024850278824940678165140037685990966568856425831851096416371162933528342527414028064433797747326021549595783932074419350022816349807211737168691836224208314746714465025589975731455428"}}, + {{"2.65027968976974648285249713808298110961914062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.003165491246268459235579939559102058410644531250e1", "1.76325996094662828651112161237788953415887952374670102134300653855113287125254830377423982732034899162480399742930099350206403828614662703257591959653574878666923823464038672614887656376458325931158457664475267311806542914278433869759036943522883194636568041344283954333960707999807543121267715345128e4"}}, + {{"3.651827512952488177688792347908020019531250e3", "1.675564512656399074330693110823631286621093750e1", "4.92218138915478317609234268428449378609898504811886050861657038624663939529613919692032879990877291035109701590929770282532279774612429349026418707716959296859399988519535881353467118924067126621065164445440389423581971051504964356883522778929468170495170856030672143818408689238481847643503940756672e59"}}, + {{"3.0606423484740545451834869972174146823817864060401916503906250e-6", "2.20328027949478477687250688177300617098808288574218750e-2", "7.55974238261708442675674596584944622380379860666888634356645875331625278958028151760326676909826129760886331850336797218123658397234427228603106790759796963957806080469839015421053939928057033567772138680185158581228274260396763090865346625773393191666291620910582819221973998350912562080963747333068e-1"}}, + {{"2.04040793254407122731208801269531250e5", "2.86284726793166655056666058953851461410522460937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.58821325525680163465105847555152044190569200388116750112228338962598195492329497459385020613020256287552717930952139248724578086838832538138376726496296560875204247514233017557960719338882649967806582509446295835645176351140001109236587197833843059204085625918013701386357232953416141714287393580849e15"}}, + {{"3.02716069476693064643768593668937683105468750e2", "6.040399597266724041055852012505056336522102355957031250e-3", "1.03510986044313446578771317219744132510998690381352607017246273580247626695630046904160285453167383058665284858123740052884532347981837364373948718495188424769656549948930405672217230120189497151355681193015659186537151773454794215525893522934864014682466868462268390720016762737891468184834184088104"}}, + {{"4.4755257017978976818994851782917976379394531250e1", "4.42494522046174552087904885411262512207031250e1", "1.11929646387532568976168597828914488086907276576025509760458985730962224619833220482536328707584889009590311478709195034015122056954215000823555978179815671349373291996702460104546989380293121918158085134301955237814810326108959984625471199876172816491246653847194071812034535823558646590118729075911e73"}}, + {{"7.8992094491693660529563203454017639160156250e2", "1.043723953933383654657518491148948669433593750e2", "2.67759107384668464385278885844815795751161179367906982405379998416580527424480738041217566954239691080320039512890036456504748798096287871747642118148076943027438116523332662829876900574449886819108021138850402281937549768122792675121441618853423616832699349260369305453263152392638804725787763327554e302"}}, + {{"2.548011737897549686127085522002744255587458610534667968750e-4", "5.159276612773364134589826335286488756537437438964843750e-3", "9.58205367007949169809279999461100360912902896399937272021332641770690450812544971532999275755132753113048328902348279538087441845456071781043743985319802898282971020600433571724744632298362925010469603804610543751544460798372376992115798540860563907814359172789945116001784572399034814979737998689779e-1"}}, + {{"1.899287505000893725082278251647949218750e4", "5.41078495521190028227920265635475516319274902343750e-1", "2.06563424507714690167714042623337538555278963530996591844954713364193688715643758076458567982650781640747670966188519005031306885869355129425908043628325745338231076914378682618756362764508582923824741998110533664940173863055464267380496758389944654061554957122449256611900453680459384297799878623896e2"}}, + {{"2.910204774159799723243224889301927760243415832519531250e-2", "3.10728022839575198851824744394889421528205275535583496093750e-5", "9.99890103192413085441074667861315652249320196657611339570482857071941674209639709864703891665811884603908304481549592842627180817065779143546842079140388383757073035382383336415119892457712538117493661547669850819233137331852231641783994865993482070326235283184181541427573679758103030801595943776744e-1"}}, + {{"3.148720015370035980595275759696960449218750e3", "3.43125111933481261039524667921796208247542381286621093750e-3", "1.02802334347014804115203210525086340106221839607209085819487247743041255274944512485633547164774253058201682853956553615818500164452268935135547407521495805328007119673698391733155607980906430692803512122247717040507439060960157575458288088753689807084410223837216910150868125550872659514690258206478"}}, + {{"7.5756156366840954807448382801737807312747463583946228027343750e-6", "5.5077687409354258996074804599629715085029602050781250e-2", "5.22360322691615293009344442522576915365414410103567546362459956848539698481031529793394942148327475172323264893580159766513287240943753652400314434832413344966940876720610075372213401767379175382193046077868122711719538872402153088637192089166340900530573304907112834730373371836607562222448960151481e-1"}}, + {{"2.627455089699745616194093145168153569102287292480468750e-2", "1.541165243980346986063523218035697937011718750e2", "2.65627927121210139869453772647172972010233396005753285235163657937204725700240182301143436917519389589272478600896823141333467649759723515447005854045233682059842082604402664004516169590843725236432591088329366055949159027684989904142732333954835416376354569871287255391194720780011944013876616447352e-244"}}, + {{"4.808176103728658290492603555321693420410156250e1", "3.8367829196169225269841263070702552795410156250e1", "3.41928564331678515981471338829811408659000181192686008443981749115702769340722053174798292070290561882896008338642826088125297911559295342634515669888076588557229523820060662923011009955171952757056636448724507715649589034168433634032429475749149003931613573665241664071010924406015748971161354696738e64"}}, + {{"3.205378732913250132696703076362609863281250e3", "9.12063633247133534681996835935535727912792935967445373535156250e-7", "1.00000736273879463173771441699203291296246037525214803383466819484064993717806192280443913585501602480713195981402804796752564583674811227808842648414027111557663920686825861938638104671353044668858964832448138218436863850713355695690765716750462185486284733337309942715764828383697583139810455212638"}}, + {{"3.6191217634682889062180954908853891538456082344055175781250e-4", "4.522771028821393922078608618164707877440378069877624511718750e-5", "9.99641674908429772727741716066692522684337586976236285526703123104244360091941899419901468194625324926731894302874406101537005325420303987745335631550541398216024526757166654981325659490102941309976706722307972204026369136295841549401634445497494285259254938938876164197916350437289297642860805084296e-1"}}, + {{"5.477271508647585385176626004977151751518249511718750e-2", "3.5462262102851867034622457275361284700920805335044860839843750e-6", "9.99989699815221047195237797415460745692681672883768835967449812852073485700626675461871958759788593113792388910307095890907937872017129700062714402629139690850899327106043179965950904385626167111246937006767223675683130961170323257583625795510235931710927527056466356951973276658601609644129515473818e-1"}}, + {{"3.15637438341709639644250273704528808593750e3", "4.72407848923734441370925196679309010505676269531250e-1", "4.49825547286670319702380922050187415294618434375837006137892453203122331928047047306492172079078511814726958266726273319242885369558258257128888847286538356045014816657847217085941522774109065130033471139571270092091883178037417387674630454737070888538218688730956097543661382768897165490297639608102e1"}}, + {{"3.4350329493606416508555412292480468750e5", "1.27250150145350989297488020213222625898197293281555175781250e-4", "1.00162336779090582285668555617540990956375149416793870895822616882369079038963730293631724525621870732184904017056404166569755879690536542415147024291651047693012257723344966042105272046767388935297934745863474716190137901174215179659999117641456704254362366255369408392878120515423933846401645588741"}}, + {{"1.0507424512953348312294110655784606933593750e3", "1.445127440723827295281436744467384869494708254933357238769531250e-6", "1.00001005416673874970641874885661095503816717227379033676876612730865335989893449582345456543451081149107465171659175604293715962189257810117721711365871006508720993220186972724366817623975260748578680835030711473739357905906032894783455531711583331359705157662673931729626022752940417931688341732378"}}, + {{"8.1865791008610611827547853813769052067073062062263488769531250e-6", "5.695354392083072300745349991757393581792712211608886718750e-4", "9.93351224746448996937113594504910401882994345207771800323049779691276470148213924723483955246436042747455629177564845224233210837232201105509371449087604601761437328836060853287056217115691403748052298316839138971392756481564106383080155540424716692745736592178985310629391299501759133150627938918074e-1"}}, + {{"6.947962131099967922343019210984493838623166084289550781250e-4", "4.0103218964951963698695180937647819519042968750e1", "2.23006490342279217571806140077665886981099414044595093418295957860943720284086984665743578056568297229139299500245761284073691802977046208070538242215508979634862568996291341587581554469156573033924350089621252836592701785348565193758908337598409016657851371246098654329684058361927838809573986193758e-127"}}, + {{"1.10592794589664117665961384773254394531250e3", "3.2526082185098381671650713542476296424865722656250e-1", "9.77248676688621920044634297401786442645385941311525110002800741928600473067163385046961591455772161080604895545524410628330763921136911631698147157554500689676133210576592147935248743333122279013651774018515939625427205237675732186795164784795174668611013924030393724917154265078516887725307445272803"}}, + {{"1.253916421410064036988038504993880906113190576434135437011718750e-6", "7.335796045204858728538965806365013122558593750e-1", "4.68392795308248572652843135364969720382138943730339914636303299072150410868121378543408470390954010868594468316840003936924097765196715356527524435528061810352989069642830612407823386666008449194429503821925534277567874494596141278120854458833913072506701454712189004957264318701887957792196559450829e-5"}}, + {{"1.4312473954279103516284976649330928921699523925781250e-1", "6.20942048850905869983307638904079794883728027343750e-1", "2.99052723424150661886931649071103918452644460542298398165637531920915224385808227208964029010419121462212498905692527594903577506198009266794868206489817939747878141799591393368960481067737790483228614343187263432824490432996787531286395390254093241449602142598445964130129975312810018929887788198701e-1"}}, + {{"3.43751575420593244447609038161317585036158561706542968750e-3", "1.512066870517058703171642264351248741149902343750e1", "5.57663597564430277353448388417312985615626273703902768815220625590828356254147933705830400685411299593103143556639123246778758775852967467852603984265071153374722320323459885871194691907711626373620710017973655475923376123554952810313797438555025227910644691182176423627488188876492434022067149277036e-38"}}, + {{"2.1747239559097812774610125607921418122714385390281677246093750e-5", "2.91971825175046888034557923674583435058593750e2", "4.50169709235325052632986882192448754882997090613648358141414144591089112598426944965520244801106015239482741658118850562377407270011579313225688643981938806077750575133252661340927273680933994486522267294226372481412223764992202845720067257372057887189374997685336348698935086839444322249450808054944e-1362"}}, + {{"5.6185681578075793003940532899243009978818008676171302795410156250e-7", "1.298760937531341988493416295114002423360943794250488281250e-3", "9.81481816351315594384727007893186507859436644672331091167617928065788693663352781510746621160037607384076966766971591864898782687655354341611390803359295084395315487119152362491516158659729010541073082819881189326119491997777097209681555255784910126963441436697354364542857530552913114970532656768045e-1"}}, + {{"2.69252008622562698292313143610954284667968750e2", "1.153305143347518879615165587892988696694374084472656250e-2", "1.06666279730568497198113724274678005155752498157046477782004178363192374164474721840040331312046115275560496984877594971350062701246211629447728806246316863840490103633689163217579393790965785864180257773316151663393300617519826348688668218517932804149442470238145344903593621930871763066878050548745"}}, + {{"3.16092590727489834989683004096150398254394531250e1", "3.48064997212848559193787423282628878951072692871093750e-2", "1.12772520348616005115304677929962056919100702599904589876944000234727659228749834981600423100421009690523247572724398560756474248595294433046382239886297029833469577515642633205214954504439619606667497183510745512915018311469959758235733226013623764492488909973197069967553629996698907871574676780407"}}, + {{"1.1141752247844277428842629795724405994405969977378845214843750e-5", "2.0751562277949120449704878410557284951210021972656250e-1", "9.37919294955190238371406645550683331410621638917073656116684574199081255090910984115004225393137968138900076398279876623105976571541314203892497339063273916638860131717065142379547629145053297558185567155580289078804833133323155623898592227362901992618266649001082738287327625009340169715002810953003e-2"}}, + {{"1.548186783606525160350564362943259766325354576110839843750e-4", "5.6206047199489783281964316863366093457443639636039733886718750e-6", "9.99950690212005897959136097299917160482075781519044088208212676575453006587694459400083447882136665068803314657182010357110987268971672741796887858729353234727108572424227132082469362733286450718291677866426969142840900462763239110268260519434037322501413834614893396154343681850902784948541773957467e-1"}}, + {{"2.28067710108071286176367742370985070010647177696228027343750e-4", "4.22516467629786623624865704584863124182447791099548339843750e-5", "9.99645746030268443121474912265456530387059240825775542503945117534294341852612112033263023994402497137577664903179947031417093395690539107266054577344864123860512144985801819409282408928976825661093887120497669159146596001826170808186934642139325551337232119779982282458342982953928951761806573163414e-1"}}, + {{"2.207390838128851555666187778115272521972656250e2", "1.6363542834888315915869635985835373048757901415228843688964843750e-6", "1.00000883141260854728883702175584015782702915499431300231183450474406119123947650012070542489465023521252692179702983050986429423066780728766911719282820886407479657520041375764406817735028802434658714254220988205387649994799335160542734586791578044041036401530550092162441750788372567864862832251789"}}, + {{"2.11115639194152252336444952618421666556969285011291503906250e-4", "4.9161117879115010964596876874566078186035156250e1", "2.03851749220927707096105838017357917405034340382528308320810037826391303266735158295669708446462859180309945589089175400795292926848603356140832744578280150360981737396616217244331933441226205091493168502347016694353942358220609837333188158011389094568440922575728826317171755408132992139505746448351e-181"}}, + {{"2.38633916347037029481725767254829406738281250e2", "2.4735015620527917690196773037314414978027343750e1", "6.50492562190358454748346649100342667975057580840217621906828483604765156733043048058740688210262627421835218492853562454601684989325985386603026971417507963657922417960947826930994787046883004260577743222590669257927836671693436821127356903028204248621426323317746936948905014560414890048500518981483e58"}}, + {{"4.1649649013569605901508019485390832414850592613220214843750e-5", "3.075261121906532935099676251411437988281250e1", "1.95708970459274514353705613356165057031575229424640773311770967490560575262481854947938662630918869775857057855329254545872812061129308665775656748897011265399787487814796202063476887242748791769330372489092700441649278984973352735989854637536188114328280137258357850310518955976767163293227505459553e-135"}}, + {{"5.60807874972006062050389196826927218353375792503356933593750e-5", "2.702445063506279812962085351557561807567253708839416503906250e-5", "9.99735500279497094553640363695299701240525058593455541261394700469821111611056791299453732067954961427582921898800842237144105286658409494042658058247679724238096009700396852983653186891371272750369926281385138909360300419604531575348226930671075101518323161673992501032516753200240811209353821343888e-1"}}, + {{"5.00853676861336616008002486921668605646118521690368652343750e-6", "4.006455503457152644841698929667472839355468750e1", "4.42868005311869594653291738037482789532744928595938052618021862026535850449639612018073258671047578104461913132613998217526422325806836712765473733283115693708797988431341752008408657974271055896785613419004497755473106128411938210880970972796033569804407750025332012993610194266901383355037197031359e-213"}}, + {{"5.353231678137881681323051452636718750e5", "3.62778514750403147104407253209501504898071289062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "6.05603230256580909333512613256181086069213372778044080861620436376260245170503316441303581724403388552683668422287401763124771418367914789920284987220255387646685601968642931765033670724000770308127910918065433865509022691461489073952236533017504964013454255542118759406756885123664390687006240095440e20"}}, + {{"3.229767642669518004638895547486754367128014564514160156250e-5", "1.890503050233357953402446582913398742675781250e2", "1.01732691727954660011725367716319147371899471036670702622303272300897410300692262400537048572027256759129565470020582895602617924506137374758437886475976576037363655165839084170315722377939735400391371695808916328159137254265306017499308291350722410467152148965233006027461767679652965168830636324127e-849"}}, + {{"1.090489414238134486367926001548767089843750e3", "4.65254774353689448673776496434584259986877441406250e-1", "2.58980988503590960516637371738014660727349100194484396379725478994088734700803526572947540745308063381145664972855458934861597057007568531182327714420486870282357356343021375166932444789575430439279485545025094851301007569967666444995213425647227644871269194317170084391746473828083433195180432304317e1"}}, + {{"2.447434794350212996505433693528175354003906250e2", "4.8299511254984222805020088742367079248651862144470214843750e-4", "1.00266010667859458204491495940561046268243246346579041029260554228176172232635197593622622290922199036969298596977304010218474771392718302157017833152484401953670784025973565870850532277945591072432075029519001358625355897190571211275599240174542923282378185576537237233948130696870807231732661924935"}}, + {{"1.51488749663457274436950683593750e4", "1.02354275702668705760531309145733303012093529105186462402343750e-6", "1.00000985234516448019885473896561732145157443536520866911511897918118736186775473199587722487758817093449012349451559620294147840372481518705271731392645893056248771116553702829600792931868987911801336627246125357506584399976395776801325943965572049289654345210028541577738692060413098304903948601150"}}, + {{"2.67331385687573711007480881107767345383763313293457031250e-3", "4.37764930215238656785459170350804924964904785156250e-1", "7.47571438862309533743624874136133366541454712127562663177399504286662183346894197246880043192629661657584457838166576178504996182224295507635623850476949534360416194135273172780271343507597813231256012656614579448387095352094197763495149376101171772035626900389244626161777607049448871411562278802652e-2"}}, + {{"1.018085344443409034909109323052689433097839355468750e-2", "2.7221184783694063469283719314262270927429199218750e-2", "8.82611384964605354323505795669056920339301763307089989948479130915805719954810517867370884785746904749334148062069679398152101779177523464996450923425943206891878509254410570738031307822715129842441609577961369156460374327926946469260053825787159767563643637983753386908235973617270978178126680100594e-1"}}, + {{"1.00731276656660706514401226741028949618339538574218750e-1", "5.18228984435489814508457584452116861939430236816406250e-3", "9.88175560346904726742930639398687086396036352224271818500936901685374885901648764892385495076288151387225190990418969616688304224966648010000551417499596854632379457426863173605879611399961688292945890600044144991480340984880181190619092493192482621545694847376381337620163394916517599662918605010835e-1"}}, + {{"9.8780468779964552975339509011121208459371700882911682128906250e-7", "8.4829576004481441486859694123268127441406250e2", "5.06922896545426989764243576324057040501874322165012440675766666713649225255160119756183042369835830558457195704471707778294936068250116736974227601059618844500705991834404101497665868066256287785153513125539305523985206318973305432078184236844170690028706643163133079135912179653756316354134757605909e-5095"}}, + {{"4.41825747491548099787905812263488769531250e1", "7.7982746222263199520341458992334082722663879394531250e-2", "1.34369652134197483793288072833308732535658609465509415675669768410932243039179437886058214288267645007975345260332874670014492568423533076540783205684921434471069515293441857790677592200203989418352589897685209311617733829289352336172155226574531882652742067029068005584363117523423189997997484568014"}}, + {{"1.5296844845662072032155265333130955696105957031250e-1", "1.634608212615425469138932812462883248372236266732215881347656250e-6", "9.99996930989216600191785450269008898634303181250066938686025190496179003638914112281154344493820093586185759774048968741774280050131382009162499732926045936023057461223555387483027406180587409400576483490119308402153097647327397891029914779646839934539999749442740222968027612552511977099477561837845e-1"}}, + {{"1.5459068196982534573180601000785827636718750e3", "5.8071194443214402269859419902786612510681152343750e-2", "1.53179160234960851931903141810390484338949709737193408192930930410912781308171727424842710235568081208824229115859793069399719735722193263870374052840504012604354910230724690998586625239385836126384899034476217672957422789468436133936022499041037971795682906772214055897416212584774512114169944288303"}}, + {{"1.06149875426708788185223286681946319731650874018669128417968750e-5", "7.825390041638166649384800166444620117545127868652343750e-3", "9.14272969225465289903926091127128136862591595250320697667906487225773277795209213908946435749298160698748843670986774816760975159538180372090105486573778335998950914987159909756145213525174507361115992516851061441846585401483368166991251261491681595295047033029078105940961946982855869715287402727788e-1"}}, + {{"1.7094285962280424476245066500723623903468251228332519531250e-4", "1.450141513690568874708763935643673903541639447212219238281250e-5", "9.99874220008245006855542326558513156408919554643242887993818629193137080289456989925446796371679686209603602304321606023129900225876158421172053263787015124593801332165057745276555467837973732533352070833078756655605565367486807321355073518225701436176826535604183999704696382097767183866284922545237e-1"}}, + {{"6.8916512912179988745164926911002112319692969322204589843750e-5", "5.0330071326271585974154731957241892814636230468750e-1", "8.0431310666453857009883974778955214813162656180917019674667856365061641342629676408687942955216557038170696029057610396511938999928187929291101943535550497469155161289193841088940635225677546354860358907449034170591377521605530181623881365718072538006198487060738937169647737729128339219664578636910e-3"}}, + {{"4.27946433404347626492381095886230468750e4", "6.700893693973940896599361671803762874333187937736511230468750e-6", "1.00007146201085226752984788738357625307865767014027631803309640949680577376696724418376175136252913773532105485594068985474036691750060444806287575074228772867146937453568465581121950409526897590340390497454647087617789150538474509489560078795836109491866150406233412810302502603589419003168433407796"}}, + {{"5.40162932367991470775092643918924295576289296150207519531250e-5", "8.23362153160343446245406084926798939704895019531250e-1", "3.06423742747299574139652654980590788059822860773454214351500321781043318590458743790589432652553137712034307825892416077869655718345307052092676953436188880309769835515354046500269913785918625489459139881331406660934866445646807527177908193314853725313276753369974838311556362819425625446719126859340e-4"}}, + {{"6.98480482930233392835361883044242858886718750e1", "4.824235502562374379789678080499015777604654431343078613281250e-5", "1.00020487356414235503163915728935712973913169358041240146118411664231468676920896629650395007895636986611826729763726166983962518312776000911959157822099221405201493001705233813919293314432879950393142137203274049451871519519207057550355386892818843802770417350657588091700213982000763521441126819299"}}, + {{"1.011744866879515029722824692726135253906250e3", "2.80096038819214743220697982906131073832511901855468750e-2", "1.21386628363111930567875501391228231832773971221469956618940994372919354601446271218977478634940587702534597215097311823723977361204234536761437991482874205192547888855528921579052205936359371957155208181288324241439984156409711039174371275245144079425493549183603159162251977135775037801563222969321"}}, + {{"4.585276426770756863504630018724128603935241699218750e-3", "3.2042680303031754671105879594961152179166674613952636718750e-4", "9.98276019906690498641979219227000354726256121309260540509550375256349346398739094196651394582546860191649946783658447448964727247382391275461932541094336719168645988397711787831199214881092736264632640564846015317413042211277375865471754751928875230345189863352333606975129830522964976988522205012182e-1"}}, + {{"7.605178759788278064490896213101223111152648925781250e-2", "4.478670111360627537067102821310982108116149902343750e-2", "8.91022318181765750138709868330053023824369950588567785742389327678334961200987486582852651651749970246817747258718976307116965890616698349626417133054222982034680094324870404036435780314465221090580409266996951521555820905007542674615310907131989836681135988524628981589839950536317534105789412104573e-1"}}, + {{"8.7444178759210960467018400321670412722596665844321250915527343750e-7", "9.167217375397957368141077516554560133954510092735290527343750e-6", "9.99872128426369981492114383609632051952305521589536821086005990494116094292173923739983506376030713210025133335713606540746004193037337306885070775500980783374129579854971973151969528024543815880504327167057351706595072153954661171897742253459693134310482723707663819212838281958152922341896338434956e-1"}}, + {{"1.91138738236028468236327171325683593750e5", "1.41870493681337528357744304230436682701110839843750e-1", "5.61393719165089070084284302313399424679983675134163509852591590498735859530953368982681984829992497504960254661066913076235623948356021050016415986014420596315994017260378613566207333104954408470522228787617243604128057260092817202582188202107977088110567991555379686212833460754614025473450009263444"}}, + {{"3.9593580509452585829421877861022949218750e3", "9.6634279823755485708258738952736166538670659065246582031250e-5", "1.00080082312808327988582209522378397852005304579172107085124537382297137225033557828343923139785908077173538670582197264674005612125502043965115623737220659926592486850580770115661984729610019606048664824477525628872443957605574420631353398611478369946179434030057548832782863477926163435959118485879"}}, + {{"9.527494822481512651290991300356836291030049324035644531250e-4", "7.36644237252481737243670067982748150825500488281250e-2", "5.99043290744436080750367189311776962864514898582236218043546095145053426015403970275978470316955018068268507145854768132371105755976745328665490014149700831691054362640281890694866429566348288921720874015164835895723114083232661342953621394611916380955923119767515256749281015210664840084139488728470e-1"}}, + {{"2.484228956307928110188928960688770075648790225386619567871093750e-6", "9.5599312498941491078596754960017278790473937988281250e-2", "2.91195173359063670429359403048505978785219394151399979472770021116863735850753993687072273831783588580026886709426140199445066463954822741869299289627867228462101496659941594784834735871174181621098355725481647468654367330416914560339262972917390166297854884128515599346578674725441419457079115897184e-1"}}, + {{"4.9491118980876490240916609764099121093750e2", "3.004862775930479124042449257103726267814636230468750e-1", "6.45161540440045450223953783783894469144373503171768310299316311211396701039652476264548018632004490940551121650475174226555299061745541449779441170912616150358121670452871969103360706271231784736206842228875578338918267487091360709713844820843854370488212897734417544669039756642667411365232861750622"}}, + {{"5.86830898821921187469285996485268697142601013183593750e-2", "5.157145004755338615898274667870282428339123725891113281250e-4", "9.98538706799650092346821769070662036641738082636479009372539733284347573229317564170016552698886694627816395005478215973507005929122925461962335439146679105934195547032542346569150966461707254588652749552262131982196536881226818665443124490222705261425197752741794319954946333545210933092733146260794e-1"}}, + {{"7.83501026710203586844727396965026855468750e3", "3.3878804079488164524569526747654890641570091247558593750e-3", "1.03084303369653734759444079184018763110189145271757350290747789171120440011979438908956047437954061198621891331998729346005011749200857634828740000563446280260144290233886419978479827799434112209614567540357757105949708290107985650241181647155069956615108211465282807906696708079090952998142539773200"}}, + {{"7.24040157384670202134202554589137434959411621093750e-1", "3.2139750306174955096771839180291863158345222473144531250e-3", "9.98962718742601158545306104847042012373529894592940838744141601234699871358047935296869274717524339141323620050266212255881930805755665793284647269071772742030623661802389270250239007055699061760303889999391509361560603832488400525248124730452423718749922363976939807153833465852271516354356322016570e-1"}}, + {{"2.3773749185601933398004348418908193707466125488281250e-1", "4.166703987089275251776143704773858189582824707031250e-1", "5.49589428217805567802447379970866851398217501608629580197067814528656191899243702632356211673360505654178344944705028006574948563210523891802606219873940153904076904718577079606890006710252221715434732369471615966209956056482424699085238332051063676105524207191799310422842401999054890360978090765282e-1"}}, + {{"3.0164787400072270884265890344977378845214843750e1", "1.92136460953186087863286957144737243652343750e1", "2.67051217459346602496477010560417251705712700254048639078839264060325224717762633346441800378240849611262512392424682983226473649608304764571881449403455973384432668551726106109236708017847884189936294979084049530151497877322166267026808199785689058092334141134841250691148642129989881676444005953065e28"}}, + {{"2.6354055582639710278436417922875989461317658424377441406250e-4", "4.228204328677160894756070774747058749198913574218750e-1", "3.06662853666315384518454771688957273896640018166337060934230580664851581626370131366235045252515485872195142490483479220526746937459904335480861408290098145258297721984393013560504944686230699800648442282165588666276252945193146150539010418085408269547841393316042913883904363908615604194055289620194e-2"}}, + {{"2.26046063075346914672536513535305857658386230468750e-2", "1.3627038921997222664650450951739912852644920349121093750e-2", "9.49669691356986597021713215820093379236513850713669538194655152931335203737791678558428932820631859896635045077055245394317491407809178976243739664980597540207413635355482092381212167318467695663002155241642388129246468412919845420697165678187848016391630764936016535264450983179524692369001196616367e-1"}}, + {{"7.443698646524410378333413973450660705566406250e-2", "7.9213801433691943820747383142588660120964050292968750e-2", "8.14010675669123183496921521116811427733135459824631474903189627969592690975861278168724266785431509343760131532834105760648359541103464859507378780843287835638142981311936553660415847409900494706845746029735940277531884780112929935900839635096070137371899495277565868989524061668633390669303733877713e-1"}}, + {{"2.587073658438795997760450973146362230181694030761718750e-2", "1.947141104726958928949898108839988708496093750e2", "8.94285469588168562425042075510651649105332456874498432065780910860149873485515925490595348642217083245456881656394030092730262652761300876175697759058061470631341983801941103052127203347591729319027059625352617883993869442078699806792081819748879905962225386908139580991345038356748418452094703929970e-310"}}, + {{"5.98084615325454649337189039215445518493652343750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "7.54141705573080567892238490479428492108127102255821228027343750e-7", "1.00000134883014846657688131845485191611848674206835683154280061306464539283951337684813473177431132125670490032207511582839375165363167348982592154407605611359695341748966890300250815981718309647127029989133813099179248600056821756358657145575917892530126627067999467459186401635829661375435200555943"}}, + {{"6.95026071869872530406553323700791224837303161621093750e-4", "7.3122523971193590860973010592260834528133273124694824218750e-6", "9.99946829922765932774347186827261089119719545372876939189761602548364480617029835514052044796339343249676137993597737045638155557799285710458997819509839368231591299591459306098956962406996519241338464726435617191918273092870466980318418139849371272285377732672340181070589663937610591450209282798517e-1"}}, + {{"2.240734448249001586894735282839974388480186462402343750e-2", "5.72011372485644930879419844949040907522430643439292907714843750e-6", "9.99978273147710365618565727465750018434266860028552780634511158239820481200127637360576082082285493761515451879661983436902590331857062933298024957408602175417434650700857480478630047039957552639826605254005583176460691229891227955796802817287827361621819443402008175782397464338976239485836367013797e-1"}}, + {{"1.026963361521984101701332470213401393266394734382629394531250e-4", "2.11791001950321867638993289517657103715464472770690917968750e-4", "9.98056858099165538580460452287541225753365554206313892868475688098072267264713973803329319240088967254425048329384938932204820454762680502689447633583472338302047491675207245782389326788006117820440333632657775030341985234164850042741621548603372080092391251779877542034296864156086357253603371919108e-1"}}, + {{"8.6703705286307886090924057498341426253318786621093750e-3", "1.52133920341677693691129213959811750100925564765930175781250e-4", "9.99277952718489198651035604747543743540115676651768417733688848831717723612326298765655588890670608573536137096893609251918929861039853578444897886108139617036413401117695629638378951997111811960041138307910848973294872108144596558607179052633028242671568000242144929604511881481654385461936722413631e-1"}}, + {{"2.52535597921406917976128170266747474670410156250e1", "1.67545906951556844433071091771125793457031250e2", "8.98282264364143312494924261974141234695472294090992155155562018911995536275433125782292778674260525238398016330461123980463532873852775335243553615531641077025771609462191107211129184970987736565747180479720790198029098762244705019025351383419378700872375798060833692002857187730789356240125924455777e234"}}, + {{"2.616405991228279162896797060966491699218750e3", "1.04737226836765842108434299007058143615722656250e1", "6.25310610377006493866619672909110501466370730517133791833746014957247005356303121141646462034804208859942897670276612700251850886627624409691966399085604959689485003780186276442904234165384933316935452289326908453230024435075360037297385764282630607352032826861327915100978947458904222670931759368924e35"}}, + {{"2.820025944394430328365785953792510554194450378417968750e-2", "5.2890336039443846876881294427619195630541071295738220214843750e-6", "9.99981126663120663978315445418195178347518855090095327320928958000002380082757914082726230053423120527749961157170801907113926659877545130473348116514066094356797962151622116993547396704816898570832090901788549840104993042307779674567777216024811187461718618588120530554820575895739988590245022632269e-1"}}, + {{"1.05597237376428054744792461860924959182739257812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "9.74456803510535429779793048510327935218811035156250e-1", "1.05450439582280470237419243848514333965208787934652393730167951372955494178606431812200728304139567804628971230701860498398849175230634941866518705534394558725303044357497118657164159909944927143807152603979711611331658711835035945317940163428557910521645089962892594811777021284923659424445609434015"}}, + {{"1.9223890780950902978929661912843585014343261718750e-1", "1.08349612860076613971363479471676782850408926606178283691406250e-5", "9.99982133131096723846335477747571205458555360592772378989843831769539959961315480174186773210831188200236203659966289556452394505676789152783853641019895730138295352465651299769502538786481056285110475730395967855975688507419189456451422446526295567348482093213471867865722148473015661603656725132323e-1"}}, + {{"1.0463193386008525267243385314941406250e6", "7.4762865805834757826353609289071755483746528625488281250e-3", "1.10918690854877106790971565776367526216180983995819057803660864422406143847654780992569076690586240873186597255294638451033694659817944978005382660886521706741399259776875547778479274738700590433170032223482808245749786294093246294856718197278358866518098957741521257199802713807166809120449267805013"}}, + {{"6.36259548895734333359697210141803225269541144371032714843750e-6", "1.228097727883958611982961883768439292907714843750e1", "1.52598782338450286286135450458954573598472802663327374811636800203700927786701774385033841837545251692421774984587119423266677067201879737268514092791650544542213882071172025510515697098553107823303332247548034598510867132891098061561608401432719775239528846321974734634143406918807796517003534735158e-64"}}, + {{"2.130622669214181965626972448113463087793206796050071716308593750e-6", "2.38534614031968601466360269114375114440917968750e1", "5.19098455118066498520013706754490677591984461696830181149035955535619874262474066374087254218809585126187088590005269981305550987677753928730521021427525334082765124171365549957770314171493849134109885501003714622689267145862269434956103582260650590467252136804225198053437675495933201621005291059680e-136"}}, + {{"1.402904015919878020213218405842781066894531250e2", "1.13722689335705595681247359607368707656860351562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.76476316747050528850692000246200519522360470716902181350858525854503943786512297020242024222896565430817144786078487939900580658865175044648134728561580288938753166434593435107710997858417174150763109875175878816362192204521588377137231081824131646740939989148534654273494711671253618986609286323224e2"}}, + {{"4.372017573127668583765625953674316406250e4", "5.5089836882907093240646645426750183105468750e2", "3.50016375413563777673770541325000240347503109832508653488647336857427144256430628344920480322962866090482161278435394130795573385145704869750655237320185554045574687208211132875092396633526114578443250901360527371315672281676871350085960576744972765455104647558784495896122434499365424664074824652372e2556"}}, + {{"2.826577182614404106300587393718615203397348523139953613281250e-5", "1.0106583572245043299792435775863452818157384172081947326660156250e-6", "9.99989414562934374733570123984537478193847375990023521202992404597564318809152441993727777418090556514104681985844118458823465596529403699968559686663737740106923387493303105200565503166558779713221587331443491180025140468746214432126679720477339697928392369627582889524402889778083449486287091857918e-1"}}, + {{"1.8213158806543649700926401635570073267444968223571777343750e-6", "4.6651819945007291789984549268410773947834968566894531250e-3", "9.40207373373989750079079577094631199620167306803671706440022399491116271902378455342284164919251165911009699545436187010204381502830971843813249510091499154307328869929569251004649662529059388775244320275509563520973233815719214546857449027774185623555318990471004404713606927167122651605783870374832e-1"}}, + {{"1.46755915364810964092612266540527343750e5", "7.890436978365517006750451400876045227050781250e1", "4.64484232464543513497888195163429809804134777698713994865506287396508104602871734408178720046618390944324170991778876210342419644694461221793882529660281950244593440074231456401876196827229747637594809904497759425267031152839358279700896103069795279548051852526590187125738047135851503597639320208298e407"}}, + {{"8.3043328767694905400276184082031250e5", "2.526375713999676198007193761441158130764961242675781250e-3", "1.03503345548731106338710812130725055986503423501253010837510324365889248445099107670056377581266593900575457325985155519568071726317821696776190852210129272438899726884098324950090040468317646989831449979292183766681690581501814228892321721246601040936202160676525600474705308542633568308584316650080"}}, + {{"8.810761098079578951001167297363281250e5", "7.333727906319231770737587794428691267967224121093750e-2", "2.72892191263152309368418398483858745615162148917317277888912958706672096823639413941816735201743610855503568372158123380568416223942437204395543055191166267974357638190306465483077702922759360128463612732981531386413914170095452050612671264384868877433570747466951378322325020744405691770060335633788"}}, + {{"7.53729022560753492143703624606132507324218750e1", "1.44997674051331170439263495985926510911667719483375549316406250e-6", "1.00000626746844722828444925305995099577313805301524404103686494009081743532235207019307339151083010194102029079910572707461595043287395038108777455456317947638812268175715959797135803525856300281211049078122806988241700281453385528141559419083370029575853474851945010647429584718991721854559935746944"}}, + {{"9.29196125311857485939981415867805480957031250e1", "2.8736407594167267740004056975067214807495474815368652343750e-4", "1.00130310607123242618493657884019907082179077698498276221909900016213891825242765534255421206798520599892641330780794108614272121210817595736511473642012182311222406630247676600611837624670300497417793849558413334183751618128852678982366003027694097779362865347129226028454653385495003448455051752341"}}, + {{"1.43727353532569850358413532376289367675781250e1", "2.29608176142756548188117449171841144561767578125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "4.54783993491495810650470280449947427623348347028981499281421336796280567779408506141109574684107695839213640033321254129078108321583824176685378348816016878194065833488610016432724082665467588150668096361892027109844713789484964974482948538692616206482165899790288506924374902752205806598101379280087e2"}}, + {{"2.70759640224985531631318735890090465545654296875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "7.3053673155641374314939184841932728886604309082031250e-2", "1.07547877767428083419096142604570911700485352561609679581466039671852713698452759329634869067401784752327384511745999840407965753203664746748858043080448574928987130431330974864221970333531951352649388383982665219131905566066113253186390249711325528920747650049981618690921655600270254173866304929129"}}, + {{"4.86911459659213416298687016059432153269881382584571838378906250e-6", "4.644152955186586773095314129022881388664245605468750e-1", "3.4101267379164705515949071061179798401970959719776627431996781118094045712804741707881326020834426423441290104362376100384993102590570489653592904886896014643278015566215567423158647343389452934468386848973834157280506928166240077741426052002687656557079088494350099594841014879134383100929203824540e-3"}}, + {{"7.848546904342432184442657217005034908652305603027343750e-3", "1.462948744347492002759736351436004042625427246093750e-2", "9.31540724563669307320322491667157973956200661651434919571593303846115863894103669513415833366999982869469042192760040827577397824232012793869428364179080549290195624467934132481201575233560543620306283174662613044511585064238810137330925608875093333350849757044686376810419383361338035393598016327803e-1"}}, + {{"3.721202627829229459166526794433593750e4", "3.94908530795382262112980242818593978881835937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.12206584334504219728846621264973553250302703946785171831645645721830894010675262018545815052840050758849380777393422282576480781495344500008748097426459462508969278927821357065182790433439566919608820582252667225317461885443234193297904549706413625058399088149505555110903375380342716569207812657836e18"}}, + {{"2.37172835747338208930989900125041458522900938987731933593750e-4", "6.407577645033786170603029574976972071453928947448730468750e-5", "9.99465320336479719185464362393617871174305860472162937262848024567759736497677820188393809529906684006391677099787283285239332531375600773760223206100883246634220752238455329498878968166316454533321577818353913376078773928516840980584615525022113173652501922620733886925072518116022140332545581471584e-1"}}, + {{"3.53605103337158652720972895622253417968750e2", "2.8458247691311680682701990008354187011718750e2", "1.83532969791885885135620378353794410619553188299174712267165316998085251325072529407513466403156971688912550231810700054288873685181499788137652636209514628912399831379317778239395084315052983947372535292000124065735878003968456173427606734312841500343489942261612441073694733682134245803236657004841e725"}}, + {{"8.3104808982436933329331421593799689162551658228039741516113281250e-7", "4.155393517188396557138219122862210497260093688964843750e-3", "9.43482075927723057531497663442495255886217925614713738709933378320005101165593393456330280592636199704470243210249220699112677280162135519833702952111992891673206729843009842099688221317242192847449764385413153153282253151503752131156497992327652425308884952829049613144312048128169217759285595530627e-1"}}, + {{"1.1466602000178882008185610175132751464843750e3", "3.3412765154888893448514863848686218261718750e2", "1.74479451169065114507177142090694649425184490446641781570460948781576584635840991601731927655494758023459925015377386019778946251375096661299820054396659345784163916943122911769409035509491324432205386045800229510005976694475685559497072577311014446199955236237444975977941360792089045512126998703937e1022"}}, + {{"1.592844639464667579886736348271369934082031250e2", "2.373685961415714085198658267472637817263603210449218750e-2", "1.12790541394790276732931574594592716168427963234746835691403175587826006982488095536822241070760245600803352183137207993347315747261870544496930500337717553335079860285134922718636682581363247953489931749833309595523465412068635376914524529775388476847978990731073661981262435307448746968442209991247"}}, + {{"1.010374635480884575322590990253956988453865051269531250e-3", "3.8335008475018355511565459892153739929199218750e1", "1.46827959515471898774763024079995706113716782750728469166998382738205474672874505408339070961454993286360763402251395607969974201963555866889613983970569781895238062738547839409015372756811222082668539050479266568911339662981230077013588037391296361362960017408451588351832195207411208108858157498757e-115"}}, + {{"1.66695565004290529032004997134208679199218750e1", "8.71804015666434395370743004605174064636230468750e-1", "1.16219309185108283690353246115834277672387666007297244563945515894098174972467389980428784832971321037184548414733298149740082669071577857913503517445753714679820984984835536300423998074680014379718142053804437180632038614386541542054507333387434066222641647278889877313111291185910035634611028423893e1"}}, + {{"1.2846460229611635440960526466369628906250e4", "2.3245763842937037679803324863314628601074218750e1", "3.24945391385140670639469572823424256394544549042741674612450176003078448450232834405677926416541827735839125915448795224664876170676948629996836691342006517593947756961464160491430339434651171508096026536520981556090838358776179831242252299597098299062165399439487062435923683313278394249407345431587e95"}}, + {{"1.04339649065651030425752598951305571972625330090522766113281250e-5", "1.573485708305823038699600147083401679992675781250e1", "4.13059686908080605126564483508274490473647130063580548021629986277623406548383789633827569651948273474979014022501027829260141472868965231700274633764760142846471542740886183449424861759202613481741450387488820213753956013540876031520080117102079251759436887925675362188501650887210343405664270909838e-79"}}, + {{"5.98527292754746476077798433834686875343322753906250e-1", "5.92842618905841398438405498438896756852045655250549316406250e-5", "9.99969570850103897852254602475534171540024098089888531491644885537022647868647455296214377097624078476427734613966180360314627711193584708132475074727707481960045949327090840155765239976195485323033627665295521041657350135494380406033384926325020170964497589858453537791112107981125863527921983931294e-1"}}, + {{"1.201708216294719881386821036528544937027618288993835449218750e-5", "1.83573171858579975435077358270063996315002441406250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "9.28605001646404799122123246583375017811401439409264242217956456924187147921073178601773640157007541107990624712528914809901097933653148466740296742087373566926721281981068789281547799916665066119657434350735735616423796448248252402292977828214490771898387468010213868209841336736006316556313401379158e-10"}}, + {{"1.790278581302762177074328064918518066406250e3", "1.03754584982387711988849332556128501892089843750e1", "5.63044664995037750836987820374386953646551425036186940515842751543311970070428773125366390621088048509415536569966741084563251083225715464442813762547476523458275835451374563942157742199280762833831415410370539590912680755089996665637460577287883121257390441169299493248423283996313182295602073608455e33"}}, + {{"7.710751773353188842641259270749287679791450500488281250e-3", "2.641820563533838139846920967102050781250e2", "6.43972399050369154988520798910605088410360743083682368257478281007222478749780386934407011016164443028717189065642983648339942330570417348717676304330188520673656075843370307967688074309785894752170432378373350782687762813282030251151752809306457995236444306078641839344649086096494148698382826630683e-559"}}, + {{"1.225859617238612845540046691894531250e5", "1.01372669446815572924860959780346547631779685616493225097656250e-5", "1.00011878102928302779143036441761880708224532433147368168056931216968198406137164127175122694955536795144107173837990207593653143943257391177552069467355860858316175819319731322452047752960070552385154812027281420138955970684262089648831370958477699568344849874652831370849460274952408206982772881433"}}, + {{"5.82595149644963838930777910718461498618125915527343750e-2", "4.8505876863872399547749844628263815593527397140860557556152343750e-7", "9.99998621052671820010209082288722125377109323080442152434584440919377662337625060557131747020218413297035621822998191924210038600199853200536989949496907248450515440309961142400248274163420688419892365590086355187405743025995286488853302886303794885670413483577122364857720736276931131470386157699818e-1"}}, + {{"9.01125395544224438992841896833851933479309082031250e-2", "8.218060702910854331548762274906039237976074218750e-1", "1.38368157061396129371090614663532617206257134398324144105974743560347038187851945959992361814602150755480311739774866352614225040566667708793196627370259194113771020229764238603211377558658426209396490633521450588911944454397547213176293597692411663128824894095155297793732492904564527595779976674988e-1"}}, + {{"4.409654394722450909682720521232113242149353027343750e-1", "1.024539904317003369271787960315123200416564941406250e-1", "9.19534075097294910062427312364961024864527797483767863624171403928319226867976521096128692940847528103007338680691678979870596291215052686966371603169090630798213135736273205172476019108353742027081191692977102801637543740660392501627319952653856947188066651067307484842658131091249553304134437847486e-1"}}, + {{"1.93717944386320728433759086328791454434394836425781250e-2", "7.08574263216941169218898721737787127494812011718750e-2", "7.56194064144518235667018224449588679976819296337783156090494451036523029483949448332763991177580492553296509263765798810431727918219796862387760870580577134565230417714219352767669331762365217747400655499790736729474440290141888015988952364748907315410294417222286566628219298383793200309754712308589e-1"}}, + {{"3.6647989268164383247494697570800781250e2", "7.71145011595037033202970633283257484436035156250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "5.92304236247268349096312573893392045307545699411902317264880124837981164329935084560551082257778103184407170649203234984204658334295355705120603551098245781624244872037069412927213696722873101986921044921101077821551960590243440000669839151585453297946266135519928259442687204452169702512081165606273e19"}}, + {{"1.32708985351551091298460960388183593750e5", "6.56531833894015816668887630669360078172758221626281738281250e-5", "1.00077473925602097877583679698815018000110220247989590351745049914772258652489667683543311902850183669682134777670514222872443151397469262756195899010288195180434965887160900063533882057343026426147190468334739066751949659071732450855977621834587152702675615140712006936143437739732339126497413250346"}}, + {{"3.5277504526489622094231890514492988586425781250e1", "2.2020744129417768597534177388297393918037414550781250e-1", "2.19164668712694362712251058826210564533792000244902438405631163228898011483361552530774835675890492313952004188178746361986328169935055931569379688204574777223286241370824460769287348812931304022631646073013552253933784290828875633916987679684918077103703055564642008994164871305721849760321403415697"}}, + {{"5.2672115056769689545035362243652343750e2", "4.0259402110544599204255966640175756765529513359069824218750e-4", "1.00252610964243996116042029581448234570507107619387893463104238190901401098561255564385433004137657583567661490188312636640964083001255112695679226528406143723662756570159800308402030438165398677929717369572388554610405821138849352686065896479954227526563362385890018562652478441542017212666618852941"}}, + {{"2.85382232656423795447153679560869932174682617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.216220843310176213947215728694573044776916503906250e-1", "1.13603045090195516704596534175318401579207918841598587146324536013529784552205952203801294482696233870522877138037982641276177183524409958004888324787356863626406890600708780844863240402886258989044381114275612277702992295412653204859730899096318397139691123133990243168861782693287239971524166152533"}}, + {{"3.9338169463328451214145786707376828417181968688964843750e-3", "1.02640519319720624480396509170532226562500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "3.39863675434390989723351064011214037513398262547140577736762821607782111942948883337093856726075063500818067573716198405459606323946322650536233861891286348318106161892821504014313663700097828008365436512713907896457061009150442887680100088324705807016079909429412724343222986472982422270499720872159e-3"}}, + {{"1.9072397321581938740564510226249694824218750e3", "5.1298095404607061765026032595926608337322250008583068847656250e-6", "1.00003874831722429751496737922917004435479965257235816453591525868492670813319281541168275796018004391940278219820598993631669244673032352035813333397881915928790424205764915135090114218540888704442481908590391442502493189810976009897523082978954781479402200004590037271385433077485827559023806478611"}}, + {{"2.083523763392070122790755704045295715332031250e2", "5.7732837226565194486916851590585508802178082987666130065917968750e-7", "1.00000308249415661310193935943862153702303875909245307529450912006821815453371252563642757366042171762708256721399309832054533722706035892679765533583739735266608823632317266441068592608135365434098808509810551746075126687287986572543900322800829577692516676548344312574211742425657072976921014511642"}}, + {{"9.71724513689399464055895805358886718750e3", "1.5360000160986392791703791793622713157674297690391540527343750e-5", "1.00014104020491665960642725547509974756116986496973147973056122194845971531406444606607453003866992922578566310810305178136382912507500272971783788119308610688740112803511843108270710764262658648334376396166426766278251188688321297859103006142315969456950763638190401996565523343208463418705191958244"}}, + {{"1.398026293941192073040993837373946462321327999234199523925781250e-6", "3.51936644048749802671238740003900602459907531738281250e-2", "6.22241870897130620142553713444278896319414844301127628403550478555392596780554049192378201563747768162180873879073883732945738916895322915439456198565943172406197196260279982663959045275534018807122490359500452521705604768928620538202140216274727339329295923594705918674314862791990908520063913560002e-1"}}, + {{"1.827650077322046442973579871704714605584740638732910156250e-3", "4.8431895026975723794748773798346519470214843750e1", "2.44507161334831975914976330209249902713146345349963201960249788428960802366282255229864854849664361912073985037641790912699757539023105844864929631975643935921225809946412808629805438733741027621604921419911409131275740749522537202228860884159853851509071131465735369871648912668689687943767400944117e-133"}}, + {{"2.4987224228926152136409655213356018066406250e1", "4.7047570824358175833879158744821324944496154785156250e-2", "1.16348084392128872602170011561254935010976642009637548196335495165701186585536416597718806964461847864028617635977334329848073696152520245124091137376311572172062522206250814543168673719325221226847866492589752767830775399781911226358430095279351842770613889036173222279808875420192058143269430231674"}}, + {{"9.7372871127818103271014948951744827354559674859046936035156250e-7", "6.491316379063438724017487402306869626045227050781250e-2", "4.07165047632947683093273589058329846367047057355046748020009102510780065766705586588667687646255828190502946698129852184038457736930348397388946238687402139213354445146888181529201139114650892414118512134805367250310852437034078342906915160983796227481872425495472151960083249503055095175373933146792e-1"}}, + {{"4.4155834567063219006644025910190975992009043693542480468750e-4", "4.025802670302487543466107844380985625321045517921447753906250e-6", "9.99968900351231822950433739312428495072856038776486153703336951900488129027691896751286362525813536862927182360156159008954621569331770038862723809677808006540779343891491372231781933232571078612298233285052166498857617406809139173150092488738015228536389093793575323664246229233166651636689627818170e-1"}}, + {{"1.694399654820086253970146117353579029440879821777343750e-3", "2.7072429437320841283387551357009215280413627624511718750e-3", "9.82874963902734961145255850699575978876746826231267390332055952052622176060893943203741788304684214781121351119738947541263489494899175563981247061980860747331222509426652450764505228926170316851952179492921780437496906593243321687842665376169899786546461700589626075813241454757704572169462564574837e-1"}}, + {{"1.033763461817003553733229637145996093750e4", "1.289890172095206274938128387930191820487380027770996093750e-3", "1.01199452382152846374481951076631164582584661608322894290555407864227990207508639820617740715279797178581146570337346215682655494757376897027306747771093102874076785395996716253897920655609144243672317898938847395985100637001354712944101351050038536687079382428227717980685264632621156939159222226580"}}, + {{"3.112833052343313977594618791044922545552253723144531250e-2", "4.01353477046427009958251552745878143468871712684631347656250e-6", "9.99986074588519454560640521673442935641990554362956049271045530697088039943872329332770296441408515271037076808977915428133116228156704302455915102356256867263136007644093137679299480159178566422686424390921886424606676712277018147908640199369062110318937373042728100659267805929813035245614797996696e-1"}}, + {{"5.28149186098080924978148686932399868965148925781250e-1", "9.1665797514525820588460192084312438964843750e2", "7.28853014056156731737794697397317103994217559431541111572375406126519183769444357872853226505354592130101907012445487770770781129901235873025553849331106253792412404560306141938477978026852566898693906386886543485615404988699045603447639500571979436388663669239796393481965967462640474331680310932353e-255"}}, + {{"2.2225059936295621376700637483736500144004821777343750e-1", "4.642048948494684736942872405052185058593750e2", "6.32843078440077439221637641999286892206805235377727400014747144482178933184733036820827184969102097810334387052048590277206436733653974464975608297721942370810634826788083279979408768576378602999295622590369226553818034587114239802440932660296228167167346743576531361276267309223102513376997022773121e-304"}}, + {{"2.6440159763177344575524330139160156250e5", "2.48515468216955248692556779133155941963195800781250e-1", "2.22595558957063988125039996231413212457799685089809815878697787456948885300739760428233740293311835672030485009491199517382307607053064251483492857230753137256332086797523013500249415836024187602707789116720162609479623122987122977570646771495383250532455162474303561808394969890452286012410188771582e1"}}, + {{"1.09582116879168154355284059420228004455566406250e1", "5.1206272980605938016651634825393557548522949218750e-1", "3.40731230607113577867418131365007953849097556433032366687124266265609534681297061468250410931194577479128955229993084028648709681104213544161468193428670594705798621530529153971465865443890890717329532471903443507290510241292018220973611927868861647858691705199882686680328023542042496509604517393163"}}, + {{"2.8765032923235537509754067286849021911621093750e1", "3.296369943075922037678537890315055847167968750e1", "1.22908880787878338117870181426636174855444573322349359087228723914632875946311491878034980145023441888073390972797385266938998183475968716718276000295270333868881283934630328911650991709812223171518435502540229986453603655260898220094106548795285001784222894626512051690586979041086530161063766088286e48"}}, + {{"5.4319233558115521650136447995294020074652507901191711425781250e-6", "7.054908153364996056941191304723304256185656413435935974121093750e-7", "9.99991447218133598413920881391105179265568552579320617946001886143605253717825160221002770761833078341617996929941439664383856515269642825892255570319730959451798678974258583863414985420861854967974576953145352608585972242996479479728931155364675877878808323939895254383920003458645959690646207544957e-1"}}, + {{"4.2445062073765684948489784744651842629536986351013183593750e-4", "2.426176577767188979883883348520612344145774841308593750e-2", "8.28295177297287815001307142572162153750668927480049029937221930255174310738192949066940496577252702629998657734311395912708887847618250337367575924375521236807234588840327753338387239581722861162855798729933237542178055913633273793008757291901196363208416962469352000552707123078294608807586649015685e-1"}}, + {{"1.307332736315109170122106263534078607335686683654785156250e-3", "5.28858724063975630660591753517962843034183606505393981933593750e-6", "9.99964885633207072968580726334787422174518544602461721143383625224899368056665861649907581709049484723249000855383620986446956783244965088674964206494776757278305799759524067667215395257158003498553463221431113016348494389058271382782227321845047125985119505752219731349818937084514014330356212827292e-1"}}, + {{"5.05693319148356598344284940083070978289470076560974121093750e-5", "3.71295988486159203589842547899024793878197669982910156250e-3", "9.63937121881680868303835544307084885674388908256423717510775350630463810161245157254316013064889945722190309457613724784742119883122943867724213022530021363225255978426044946346577578461808416905152263622045415849140604671011655772958990313726815312540544848648362428160986497782665450731113127323529e-1"}}, + {{"4.844239692035090411081910133361816406250e4", "3.984134589118280486697010189800494117662310600280761718750e-4", "1.00430738669558002031403659131744896728312485313631409231096866927631637993851247415735380222493024677897434245013356617271278547792035688620287749522586547267897264556329014249359221662180556496497208175354676304526200770138492165863545577626683932270268515447259703077574615595169323328662157853185"}}, + {{"3.7078480365654198358527082746149972081184387207031250e-2", "5.5250170899286410453044027235591784119606018066406250e-2", "8.33573197351168666887962631201029384882638323647836131662987813863879776215233605661322116050262224430353678691583537529582375506359810080440891529163886160078411813398386404062767305381544566179454141780145518165423921596307439563187082576279320332050551415851387221311994490392675793780232895364275e-1"}}, + {{"9.716555147724156995536759495735168457031250e2", "4.591663841877569041116657899692654609680175781250e-1", "2.35377653844658353569031679679735299370922232948810544763027212743048187579990164187893014793934410534408779634667801500692064187926463087757507629287841868368096408503740782370080191376158895711024144836742418575636184986247750729343991462010937031402061673932392367262371858670977341473615463130359e1"}}, + {{"2.192645859365482010616688057780265808105468750e2", "6.96729316179001942387419288316152687912108376622200012207031250e-6", "1.00003755636032301823537943813016356575902489314188145066916221494580392625081472816947024292161874513732270899683702071327371665141574567958235034154797657204764921080200596842458370044167411926333595258330617813605034939486089552138840272033589961004832483480269032835319807553392086565465392533307"}}, + {{"3.079132493049849261801398370153037831187248229980468750e-3", "5.05463804011641570923529798164963722229003906250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.01796919571840276681288861157787148204747502682382876961304668410493347723226232435621763407251840958497596600197906374696494268910490419389807332560043086656936398322936521311486726743408171670806339766715147358441693728848925652781609216889389399280179459317545232154188799226490332505068768929180e-13"}}, + {{"2.72793625008602248271927237510681152343750e2", "3.45107876494454290927649253717390820384025573730468750e-2", "1.21356364414706225993709314217781803611734556534595777181951409142649823132949473277169982486320740015805393683502787636048469072138860871755431959907851351864995912275227191432009279405103766593019141570051245200073079914866268809278471723253071227068595740039873872137154853304817823898235004618070"}}, + {{"7.23608622250063859837609925307333469390869140625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "9.31713845716947162145515903830528259277343750e1", "1.20546015073919711264373148066122758661068546232444031541084969085534241548251886930568813690809866385000095984750691172127616802373754602142656508934912781801862005537086317665378844206989588374435568687107987862008034665185792976330120721552229886514045101504253350965371418298181204870517230728955e80"}}, + {{"2.570723035364298993954434990882873535156250e3", "2.69790274993758974475532852466130862012505531311035156250e-3", "1.02140974620888944930305959435799702728843289682449376214925750857783066006891649041158724227299321084257799199351924992147805951706584524451302681812312203333848599297059927350897068391576429287666840858314350106940048605718179391844174140189607359928083054157216235380992076831905704302805940691484"}}, + {{"6.270713787727346643805503845214843750e5", "9.7721370519921515454195293237660280283307656645774841308593750e-6", "1.00013045496457016358902387902369248820481792505684604793782357003458740283012026953971512527832247937686018956926918760579827820618149654974789601261789353438501933209142889274324701479760186259188286221595702693452369288516143444427753506877231697874469255361407264955531595418134590240336559943863"}}, + {{"1.22109376852135853575020973948994651436805725097656250e-1", "2.11543635047828820815521422282756702770711854100227355957031250e-6", "9.99995551589729160336804918676630911396340574056049766519068518427735361038006808700598379055737548489964622176597729664945550621782605173209704608243388212974829930345797712949588621847644770093271093043600103623962707878170666514346008821208975619634087411931268385031450753049330763535153583731711e-1"}}, + {{"1.529009903540106893315986269499262562021613121032714843750e-3", "4.07910792856703210418345406651496887207031250e2", "3.09437152552687759915144210042422837004776738858769798785362828201158918075365450163702134968526881164477730298716543350719085306748967317190021537573795780001155496528795641888775374745803795044275135632851107711558035622505495812638847592959079891240357223230602055612544312975892640303394964825816e-1149"}}, + {{"3.3357488035001949810975929722189903259277343750e1", "2.224099109229280202271183952689170837402343750e1", "7.53927322890034742368017335227292720005783821228941858003370629012694382557138392281089806659775813675293365836774015539525201899124038456550795641920581579865504101847353382339574548922971435920120403286201070202878099356466592276232925556211910029587973272230882852354333961947656943741233580547242e33"}}, + {{"2.938860932228841704727528849616646766662597656250e-1", "2.8315213921096252973688689458242606633575633168220520019531250e-5", "9.99965326837122789351065801513643019379691746234431978717545032882563543159129029000520238088911519893688798595680083260598269929340163335960195938697476035130411906261845669886681524297055544969116053569875568029319976030656002722062158836225698022385486930605555120535915405105091329811282147529892e-1"}}, + {{"1.0536390034124033263651654124259948730468750e3", "4.51733416318811920042719521006802096962928771972656250e-2", "1.36944656525417845173858897538026176879580880507614615066496128471220543538723767528991906038383446820702565624708556443997649629495841259671527437077527127938789704415913380536996498286764720566639200198900869760387706475703380674649201567096875423075710829719565752777057995176317511826228555593581"}}, + {{"7.04420993592731428016920358636809851304860785603523254394531250e-7", "1.8351438488835314366554030129918828606605529785156250e-1", "7.42999851704960956730922360017793140547106959683768718211070193339741510527923658661871542385815054985958418322575081567325471819065963185600217971978825670497003073742499873659741487280818814513977323524960437583297927902838999554519027556228317521167236540123085211060151247184818776639943050911394e-2"}}, + {{"1.364533448228305205702781677246093750e5", "3.64161706602405751964646185570018133148550987243652343750e-3", "1.04399795038635921897857958256316651977445152567453727222518284598769789391999595233661749274120961391885225992798836625746470159354169324537076101684572935560321844745400772917299981122731280255675880379891143456808614768985468915540339803333726839718219814716863124296189939533443325484535601906033"}}, + {{"2.96565824250737205147743225097656250e3", "2.516110448737411964259536034660413861274719238281250e-1", "7.47522068392867838732450708572135930567101005550555468267204809080882851453167258980507378379243415338266777301093835073449659828508711197010120745211201439735694186362327003324753635700543968787946652069972776477402704033680932298818937199049452926851734709666219333409709557278942834445272506685923"}}, + {{"3.49571885007329983636736869812011718750e4", "4.0503044287507061760322812915546819567680358886718750e-4", "1.00424637003637001346519445137047903985527298734444205998841513031143713650570988838061609722582515075163633719319500702266902153041674931227041528924269656845803454259997891649918404783522081199789884938037449889035577760958358376931686006190221056227385652828889051574541455553647177469994824093880"}}, + {{"3.48704350707848789170384407043457031250e2", "5.94470451369696548105103772741131251677870750427246093750e-4", "1.00348622623956426654419790365515385008204532308719120294458056691444071691627567637464093877906643804041743573926720499607391861016395825332249134843376717727039444569339034648222083969616342813466476442089528251404075917497087087133158228565604726619218594367232783173627524996497743616209681950686"}}, + {{"1.568663540524837252121415076544508337974548339843750e-1", "2.923824443941481013298222535468084970489144325256347656250e-4", "9.99458548775941655985641049562781270043468152203580071617312952591624765716886645437516907451083025631663787001723138256606416990037410952933773901687094742927210507959414283830075225958048767485241813607677989510714884949211624158456814965576504829085206941026015695802504061055800475236320588403791e-1"}}, + {{"3.02555496695998127343329997529508545994758605957031250e-2", "7.43476200926107111399687710218131542205810546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "5.07162439112148019358772224877510168973399161717373536875684406796915754460308189843582561832996734392043166689610197386058626738901780367190433337506557349349095623450517180395264699151519926104197461968535179024894054340573408793813826035189319052898390671701445304365679647915192850527101155372317e-12"}}, + {{"1.1330105736971599981188774108886718750e4", "1.63391498739915612750661644270167016657069325447082519531250e-4", "1.00152645922689671305334533143447522531808487470636607472600090062282095427316474560067944838274073843864628772883486893974636361201579261003896147984190781801313303984627253458134496161410984325183430174864002871499528387099093919980953756534711057395376377803880481128200568335684903772454493560544"}}, + {{"2.0028908021549927070736885070800781250e4", "8.6391933296204024372855201363563537597656250e2", "1.92699766759603617897105296135509926340232009672802063778499835631207758035200425882438232730073541633716557508264570905405926283429555595877466543065569320408150504538307810614249593452939955155496934950121411097262064539453295031460705244148452908856502571794692573823194011760644101511653087442625e3716"}}, + {{"1.32507839540064445080225219442127126967534422874450683593750e-4", "1.518878628834884239040547981858253479003906250e2", "1.03647722584318600030967144335207527953463651392633257231597431308252840118498779108498324584815641015064709374407448575779770810144009458027431983385495055750280990347720737478088901276233575808268895728220588756650828610378844764861577519796740508015409537773234457412772265295624580311112182954835e-589"}}, + {{"3.5760343141490902318935241055442020297050476074218750e-2", "5.25925527701659852259155614184749083506176248192787170410156250e-6", "9.99982482017295343923291140868824543861889706024267738325920940955163642168596277387382324596268313941030962899361898533933991225186157467591500415565798572470081783136017764613428509329263882432996891459823007909353566621634663513526224023265569627278594547455316883257611223218894909706813593928661e-1"}}, + {{"6.37895215316995745524764060974121093750e3", "1.3360686442100041778149877025327896262751892209053039550781250e-5", "1.00011705660623425091805720617137318115223118739797033368829524572193511821979599497313069101487866374165387923697805554918674050522785359139471078208862147954503878603840716656103170817064574728416607854591674468869938491395161398773239010400175784333016262331344116781579064223044329496394945074676"}}, + {{"7.381043432400802295489938842365518212318420410156250e-2", "2.785260961407158135936038001467807134758913889527320861816406250e-6", "9.99992740925564330652806516420746938988010148239633275154076421571630454719695668630175026322867662102076692387029189869547293172340508820534949790931051258505036554857756821592275590340005422029182367955076901146714768419205676755504470790282646601620852828276821380880075367804416790635127471984294e-1"}}, + {{"2.2460666646297293482348322868347167968750e4", "3.5622485300151595311035634949803352355957031250e1", "1.01973918494886267810001894567464669163247766970377570638787946610322435627850446066260492108701967988500602281478606685233882133420407449502588207373547970434356681888963673609480451591224779378429762251379481389292664486026843607177275521955621777327928762357765933587555111806380884809909558908126e155"}}, + {{"9.008001827101250191809356238081818446516990661621093750e-4", "9.6443272576535524209795369188213953748345375061035156250e-4", "9.93259995118943779913113450886803213157300236441759177808360979990670369813799397673229074691051859756881735508284831070803950318509897851789286938821324800564473083981421925321740139076048924264684734691750703913517330543410997193207195299362629750503027996358069377923999788650279477370768077765657e-1"}}, + {{"9.4182003413893980905413627624511718750e4", "7.774193002886642601045527611880459062376758083701133728027343750e-7", "1.00000890381075384949081595209139696411199492416870417459364082687864113657489926105641478106668362778068330268736600393352152923274282322515415108939987073582719187381060734722668227714154297709452559911296248629890116220184188866083605360898785001127921221360852853375996265543887873427220880943937"}}, + {{"3.7369273199951797900797423324092960683628916740417480468750e-5", "5.54122149350758519403825630433857440948486328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.92632813942166735469252865298175146289395053013193471532530902730842579927583105349449489218906918310069151271847219223504300355763614013961247019308729802033635205970100220700085021558381217246935232153985446384879850169504304149149649141113162707552300166988589633450196697040655835196191118606631e-25"}}, + {{"1.3620738122341888645672192126312438631430268287658691406250e-4", "2.62468618182947011518990620970726013183593750e2", "2.23349312978912488484797519539255018773821880984944037182332190114599517402131412348320914129812507474815113624208263309735483442308554370722059051755362465566371079854655405434396337539491832247301779055162543337811300162664812836135792078898777055591459214033387458633919871456241380657515870584905e-1015"}}, + {{"4.9943935269132489338517189025878906250e4", "3.826691408876888544909888878464698791503906250e1", "6.25800762575108176129137940894321369236803059535403474287787709049193999989553876351149791249607106743078893765328229169808063556877194151113548299740103775991789375636892691914854010648529483996498522632062568652379746122433944483375027665116468292026500341138320088041194003298397510386237462266236e179"}}, + {{"6.485392961276647838531062006950378417968750e1", "4.190817698307106042854286442889133468270301818847656250e-3", "1.01763841928646063179945311430619776672100366204545937731495139936077193534063748395270846081233643612207997993464082794803985613863394615181696471224069637239381759785944556677466232970035407360811317566511537057177507901702757204703329800142152099723806486139061978862458791045685416916469263617024"}}, + {{"1.261853587411265742446175863733515143394470214843750e-3", "4.1870787456376986138129048242717544781044125556945800781250e-4", "9.97208954505633083962348848418154736485944843062550245347612203304547965531131555025237286475690843458460809325029245321285039436520603179307117618768371875438665250167675789128497710216048233584274468422162333906486838232593986287174975031846178589748114260487176217087771250070897293526267935699686e-1"}}, + {{"4.35488942342848749831318855285644531250e4", "4.98678835531215099763358011841773986816406250e2", "2.28936120581079817550967747499324146341809782859497306106568788729215792440868081012592482836115918565108733027645928062811796100015424546044055914594061783213133483941275372186699846142681689537346156745852091720729474664315028859269079769914368203114147150204153490030106741528606576208240181832379e2313"}}, + {{"9.5207914036902785426264017587527632713317871093750e-1", "1.08107909706786978198955750940513098612427711486816406250e-3", "9.99946912731466247972527890006754510895764819973853843000662583785640845446566388520861934833991540886888853432324685563515222422612660717906957938307798158191679485565611171204322088502967506340693425660800080176478497228519680488062210430869030836704176100634086409155754383655120084467598988079204e-1"}}, + {{"1.0409068401303045448003103956580162048339843750e1", "1.936739214855335831089178100228309631347656250e2", "1.11210338662691592819619664979726597449100163292683513479170961681889868927958630114518483290408310841588879531996056535646660865328863109763975044243074863201932805945130071457158971557983161341534770079019284360491414192422030250649176833692020314068650401152520803465262499102820988511235853988648e197"}}, + {{"1.971498010271299783369158831192180514335632324218750e-1", "5.08739590531112617632913952547824010252952575683593750e-3", "9.91773157361409781701715493663763866515090466561690289420891165770114164193580683686846646130438934752909209919079027125210567061374829822112866779201464446464651026659338435230202216580437945262368984290532688736997482187636274012593325315635831427955296981578931251003363149110123293975764983649974e-1"}}, + {{"2.79971511541740710526937618851661682128906250e2", "5.787218752022283210778574868982104817405343055725097656250e-4", "1.00326623969490901566461359485954800182836515927200276988639325398663724684484176518830065683294723102506600723636309590040090118084917994679575687454329398419185701984750026134555302778342008308134679599723649132979721129657717437355628051914400727321111879908949789141417261266151891576137055521720"}}, + {{"6.471802775221924264315020991489291191101074218750e-2", "3.54396046637904049703138298355042934417724609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "6.11393159288848940315388484390073955173736785149894558116032886653088516351969818186256818732041463123159800744120590173108691581334056179094211775690837141959813271450679799058611736101514220405786918675156348944553549256908731766892776136986705072991002327432436231317606705791658862062772822668961e-5"}}, + {{"4.6847849382473068544641137123107910156250e3", "8.085034584903098675567889586091041564941406250e1", "5.97762155395492793734284548790084346203097684458052431296538227291993735975496781864258983550151454075639982388971649044469779839674940147551147838593024539580668837295332526092577626791361518961708496544368414553255175123291725694241746786254191457634438577633532650001615818789185478534006606741407e296"}}, + {{"1.5439145955192981607417834766238229349255561828613281250e-2", "9.3029150204543831215175941906636580824851989746093750e-3", "9.61942064374907006758472323953419672912600288860094391695046538452658427001421356899386802781741233841276963853691331000772213773371503948038327239870459585412114416103967368390201886001946927622637207918880459451317082626408706757400699845882572764664471363683650469561537447695573432201521718527705e-1"}}, + {{"6.48003875925739691865601344034075736999511718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "3.261210824526329004127700450510474183829501271247863769531250e-5", "1.00006094496769763278820872383817879036100529479018908630432836412716347076273911182394224909321200839758060396148281450949863621182268008379068612869939290370399199699187329868380547441347229000962054100848350577521278040241049817698210922858722233509600098748764436396006044192563867258556456726002"}}, + {{"1.02255146268133501052943756803870201110839843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "5.8993269109875526301500769932317780330777168273925781250e-3", "1.00013156917767091552599892235129254853484398955770015153844565825349128084659104946293310766324345122756751921898192510410177121820174080396618577123202206891707775599129806431636068338328182197155856712217515198962725685962829886150997851437588418591804207516238583892908865355284748545102405714042"}}, + {{"2.81888129121324254811042919754981994628906250e2", "4.073526023631882098108292211691150441765785217285156250e-3", "1.02324693289074461806065314601130588099455748535483252525100029761881094483032981058215632709470546862166291555062468221229877852679809354657976457141823806639541535849041446001105725715917762334478759524935613974359759936992996718201195710259035985781666122257084622777055529931477121573215140197696"}}, + {{"2.0718540452792653982008741486708913726033642888069152832031250e-5", "5.35292300705978618680092040449380874633789062500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "8.48850440195174823298359540121818302112603372945421421598869878434979555804675505735326375593302973038814914197710751833892726619856756218734694899102028024355384042325664532283875944124268902285546831042825514027899847395159917919088321233227951525026080119430650746383889735094027434636578283016912e-26"}}, + {{"4.31935286049695476781606906513388821622356772422790527343750e-5", "2.674460276028911646364547016752055696997558698058128356933593750e-6", "9.99973122517169758868298611393816315674468708382437784046013092517874934197350186005397961789565235843871109955511656116413964407693637441952651815512224774438246717669200447114406421198392169132912944363201879586414171509537947822165122722681222879324770937027844102716000158168894762456660415032672e-1"}}, + {{"5.6072865956525586847219652653073751480405917391180992126464843750e-7", "6.380308531301886202031017902847054301673779264092445373535156250e-7", "9.99990816207746297627000228090032149940299388165914304992280548917955938225443662692605137525666097388080408339273626056667955459490552137971306327684500228508064672496432612203803093818358636762048072433804065084080756285538210846111127149390742779965190790248566867146590543170273767758612958658971e-1"}}, + {{"4.943658727909295636307462906700038729468360543251037597656250e-5", "6.081072865861608534032711759209632873535156250e1", "1.41889634080305711655291544430541860422410170311666966191109605478799772032330347327796646352426019590688459329571978188218768772574725991603534645626444629132445446486278236532522655245444099755490849273965885852698636839519891473821647868673766453693048753250768728056307822453273785810806442880557e-262"}}, + {{"4.578630412410618737339973449707031250e5", "1.279961392849584456143929855898022651672363281250e1", "2.85252911535679891073378835901479886089967576299789401385670015780551662533990060451545346245206661914640102653229509656129118798311517873586006356564037704026911300448200277564257378774264510533411693099418541902845247573044373703549276907520323049567611007543654341177174512295005876331502328496351e72"}}, + {{"2.08423524510303792567356140352785587310791015625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.35070210371325316600632504560053348541259765625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.69650994818884808551478851790421398330849110943521821889862054443832715742450095948994740658527477301306542925058870703929885411081233767845292798598894899925369153906803097693018622562446710881324699679389099964263723003154543262693904642747226514772235244787350437914151428906711221635213885798789"}}, + {{"7.0350735533994179782268929557176306843757629394531250e-2", "8.66736311094788106856867671012878417968750e2", "7.68909935340978860422757035820741960584342288164122209394216788923406587897458745269054408633969378408300698489680800368145152233150125878615072546588959342193206959268161227822392820692595901101440058139059566058188384350410226233241151749648406111214064140648607944967440645591239738930953785109368e-1000"}}, + {{"4.44777561798017704859375953674316406250e4", "4.37314005329937316446375916711986064910888671875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.12314549862845492717877595964768115546325186339715764453604920761210996544623734651949041265076846799054130789000520895961692269440989421981634150513113011053879079524507516981642085862682964932699084859566571367826867471772759871670601934760070910316789800074922999274803369631048113774053097073929e20"}}, + {{"4.78949184649386006640270352363586425781250e3", "1.791833511743041071895277127623558044433593750e2", "2.79637132177375382162263956935980813855595791264327736518378404210637984016731507340572257630052502643907564502937056932274446805895054500000116906646009851736492937513833076602489625307279653461589071484812740516746714953908730424736460829219077432204380475346934742691432944334479643432469277088306e659"}}, + {{"6.22325830215437599690631031990051269531250e3", "2.25225952793516384642380501190928043797612190246582031250e-3", "1.01987069469372759270453628912642728954230513534833089604954661995171725801656380902963421144934906141234552439696120736550210382743489449329697576830407056888118360526079463661066722214220114165138840831176499526985462507289995825151030297233511088604059436353741508088143154130210563278515547311543"}}, + {{"9.1240044070163778613946625739572482416406273841857910156250e-5", "2.34400553054916376341521022652614192338660359382629394531250e-4", "9.97821977486950583166084719161557689663568325790003522306021158417755185644936647878316368235185593329253132043532554677812935724747863173935255764658313396824835230126055857216828346612262350441572667853382236006603976105644273478945602579828808105896550462847104108659412377316272488653010471184196e-1"}}, + {{"1.33795627811531119277788093313574790954589843750e1", "1.4818381285251529879158291502783129089948488399386405944824218750e-6", "1.00000384349299045776862801360403732363545774843774701655200272080627739941386437175886379606902727479191090187794979610761904053274682140855025508483613322969568848488035529156236560186742600966591613965074184599845133474883618868818832890976311295886503114503738779326119140373893527826165039256344"}}, + {{"7.0693904131002636859193444252014160156250e3", "7.520701131772273129172390326857566833496093750e1", "3.16601617096668251300410633861451144300904853213668949893514704576723535839139585890152639279492333481781656085682222252609689619088940700517823681224990153082715763605916833922234577262387169239662906567674441665483003247288718595609022710170750805174093013421029787059183231600348513197446175716344e289"}}, + {{"1.4680947481997885795124147989554330706596374511718750e-1", "6.551502580580362278261929986911127343773841857910156250e-3", "9.87508829078291473496350060709599928627355203095913409392108636898471105714839831302147923025254259824329731513966469918955762532776229610929533035120642195606951641982085398951090528368050382553009140996960228822308531093162518295270230167711636888797942089811261515649759631850124542086583338696866e-1"}}, + {{"2.13403424835757107302924850955605506896972656250e1", "6.748819597020269678289139392290962859988212585449218750e-3", "1.02087023232278898673025082821180943357336233310089987611387411667231521549575677239762600896132782138671932320359043850059141855317509884880628897347559802452573752440941620827448739200875424446592178873469737214134752340014718109265906882735838254335143242217171430272779729156476847140495477447567"}}, + {{"7.9523384475269076610004503891104832291603088378906250e-3", "2.848516784813468483150700194528326392173767089843750e-1", "2.52320441273088937482705455163451804728010853035570734024869989669472225400000323970014547943529070869582874785761555559916107563529628329435884632549334664560080647778917243975126257892837384804686623525333256233581024540617818741704180357848449262419278792476592443919338009722004675820379508226554e-1"}}, + {{"4.86469155616132400629658683044453937327489256858825683593750e-5", "5.2287743444463866127058793153992155566811561584472656250e-3", "9.49398596693121402232511551773946216238940594887656584112333721649128338309222255715733045830942439483758414668436262063880698192055748811167639524982228502529443333539688201437948685066022343441584667892362197265423697997073104183476242310932155094648160217817878533689247152065556146288540676206268e-1"}}, + {{"9.97061023610679164619341463549062609672546386718750e-2", "5.8806435521089213125378591939806938171386718750e1", "1.31339250305317586137103280435203540286641209041963686984564977317675267872546421630007855518104235103746292194256810045376453068069833982650717834727768128915903290190711155087191155109113681049655966851631090461344965018352997694452739029417934674832819743056725077543693812469593253205921308221308e-59"}}, + {{"9.250672288777586627084303927404107525944709777832031250e-3", "6.580410957004390049007724883267655968666076660156250e-2", "7.3479441170322764076883455903714667808123745049715180864128469285725740507392126144584630714483987624811982136825764300996419478406647597069868650694836325508907243957328574154916156467594981153576656803869050960269309839419957622805799157028500973756402769602128058256241358541254395091132685326210e-1"}}, + {{"1.2714451115926221973495557904243469238281250e3", "6.1883631944992800733018611936131492257118225097656250e-2", "1.55634262177085310455272777009125596103461766420555774353254576944288801886851836915203973701385795773437574206488784269131348804974222211728133676956373754063980028710578189114584286886146802067657659439377822750677886486205610448378645450751753499248735236114037268909383185086028320044219137753422"}}, + {{"1.422058718410514757124474272131919860839843750e2", "2.49175822061007323782177991233766078948974609375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.31499443769464065089935605375459683035642863575091614297392875457512297919442473147075015935528487370816930373009973708163470195938036050657595355692444453780282744702410807810566482106290630446087507470829783752836539009991223629616484834464198297022741851935670638283977884632514115384409382379451e5"}}, + {{"1.7983084647168379888171330094337463378906250e2", "5.15740741801222002740900940409574104705825448036193847656250e-5", "1.00026780930725147708425182905646433452420215464014520968261578887024273841780021979940791064143678705875846798937060716374571767664452465951073901977576420551043883735274454852404885141087100496560513919957329201186421887438051030917217421635429456043545707951122601188323754670287140035060211268236"}}, + {{"1.416174937472059980336780427023768424987792968750e1", "8.06659473408631241819755075539433164522051811218261718750e-4", "1.00214037426842670551611147350147052752193345171802567422360034056719592273707967867550926051192650203531759829732673928643729296057128383914827597014066465351929167430158631190618779931772000386360976972135737607634338444086468691888473748375182457345550820744493891034677687786078596412978684852640"}}, + {{"3.036204456962959472021701401445170631632208824157714843750e-4", "1.777555595293553447611145656992448493838310241699218750e-2", "8.65907453809699509460147409829901675941527854788885630333979265214696163822247505595008528776776735251807610239492515526114770917079309768787319965003601255566849812163333057688474056980168539317656182802355025321396669769362336327872219770789870937515083196007462468888621524361865732646086424336453e-1"}}, + {{"1.8815079698449000716209411621093750e4", "1.96075222779542400530772283673286437988281250e2", "1.33268783679377583213014321394305562443708551652324893198731298378098553656636607906131354129802125769805603337990709647117721910862833606977379369954861887407787985331605230823250624512728814254652735899657072127956911865541366861599183456838203731048557393074731179271410020592240238165188774584943e838"}}, + {{"8.89727582886910006720881938235834240913391113281250e-1", "1.041279960771747739589621062350488500669598579406738281250e-3", "9.9987834430235824472224814411122243776265486577981177293571821321821517441659311658576556678112989769575007643432909365063217328716826322973493501036244864951726160136161783061801068077323413577888781728469725649419290963386640028890564993827733767871754809898250945769328951487990853772174957746180e-1"}}, + {{"1.83083205221824460440238624414632795378565788269042968750e-5", "8.5130581526808327907929196953773498535156250e1", "5.08759465190948202575969824985581134108808966132826957045953621966485495100532942367792704772987024490520063202480279983957515910756497430137889290866515761789926914423548570454774810411630371091100113544891279153106437138536746735808516608107152208446229082973737250416694137957514739571766896873306e-404"}}, + {{"3.346653408259039663751391313617489231546642258763313293457031250e-6", "3.7868598858803215989610180258750915527343750e2", "3.52212078787830927194297643296251781134291925779877466674871728836105722487573580131785145484495276918545575844013070305855330551951353365366550132397674036846629030890995284036782751533644901503503905390007269189142085867922573306793968734446410118933272999821289312420310855129959801669881803865858e-2074"}}, + {{"5.3392773503090527415166147151559528083453187718987464904785156250e-7", "6.207661898675727671229399029506623719498747959733009338378906250e-7", "9.99991034310800110010707678195555035460840436574922962233018600570397473321611757701145927433415065972844383465094874922585959664097551124468322387734536918015102243687653110114625528443011692213994065730522520240541725522418247328328568974843758308408263849244150678651666777627782107985602066092068e-1"}}, + {{"2.19994195074324068173154955729842185974121093750e1", "3.06707480325778616969678580517211230471730232238769531250e-3", "1.00952545862365855685219042115608145190455235613268820530406120489310419092421063376518661644406509494089174786391890344365290616699827245940846567812410266752069452669091303167176618868615804832415636793311353407444727299687139263635273616648724056070625009496090575286667611858626054037393426920940"}}, + {{"9.494261316265068537459392850053063739323988556861877441406250e-6", "3.33658593189578134285966370953246951103210449218750e-1", "2.10953513637051167906362488703903898283324995313357160919327331939686921714903739192273840983847338772103005796728222224591772689334463276313863779738778665022741134644128703431090827473653846081611135627094959784765932765625500258444912393296945910143335619574776807349923037475968356403544804516261e-2"}}, + {{"1.58204381201744226359551248606294393539428710937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.699670888752343416014042865036515195242827758193016052246093750e-6", "1.00000077966919198536118506000604021848342587459233214812502825319036185927111842640720441778472762148840769009480654434988580516960635247026640481971290957649218368276357248615028690535272593446475039055115505472342603119011692356413204456935489635677140077206818440909527541341514742179392759484948"}}, + {{"7.89159836081502775182242026552614788670325651764869689941406250e-7", "4.816961061463680380256846547126770019531250e2", "1.94147359401180853490618926342983857830809890106752620847948172427377774972592621604834694930262822082783398795004418901297871494637794539318032606545630879764294273346094400196886499691750495365869112152459387957968585556903274684614177896724684391146995388586545846815713970966406314356957705636188e-2940"}}, + {{"1.289097083842133870348334312438964843750e5", "6.9303987741382092058195496520056622102856636047363281250e-3", "1.08496647090160629262865176257751429047729744058064486558757367783712447981236338124011887293782800275409466363098994983981904989007840757365461380428739706364354348918768376442904733609028311603151255847131247523710764847675936168535507206845244124708518371354311381017836653040028826211975497871572"}}, + {{"1.88979339146257488413205294364161090925335884094238281250e-3", "1.507462797900369366743689170107245445251464843750e1", "8.76918423991144038304021445193438173201942067819279237648900596695575024236585474624026460405210909663314261583560910578839787952809598740673148266220449752385049510413309645447866767727463403580780664879153239139760411591518829772808581212853680494395035365090735562853954119264286528501466090236373e-42"}}, + {{"8.41517212362860789198748534545302391052246093750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "3.64690954096749919699504971504211425781250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.36385641555849335879047779054573450503531219143280186506059811952516602814802026798922317458022305556248077861115239238036534162971730930403784483407045473794360984711531633071954017599185535725837014265828161774595330813847033913388549400091383297967089159291617295023155265969142242902513558326176e3"}}, + {{"7.794539153729454028507461771368980407714843750e1", "1.375701859744113164651935221627354621887207031250e1", "1.06022076559461302576262215724290203547920286581395364873074659478022575993646868223512587189711310741927159850526321306597320278985726000202501743927791980296512242522543006053260060771089791556404973296770985910119125940674256012428243689156025466514102435785983398909290409351186888763744330929933e26"}}, + {{"1.53996830801468109712004661560058593750e5", "1.5575394558063157535165998979209689423441886901855468750e-2", "1.20447431374301175187511662239775886280442123057569989101048717965641664163683965122530380365781626549245733448495292659434928101251174655724999866929500920292760069066534315397658186379331270528348085084759405281722204998903474609597521346801285181467380964556686904383585877178604246579963496131145"}}, + {{"1.58292085642406949773430824279785156250e5", "2.39839658341223938009534322191029787063598632812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.95369184630899349835322600435195771430552393938403392920497743251505007693757163085390208500076347439614593692001276141903681987497427879862172599262551403341684739246319058993775975522937386429303489479759146923528741632009619169067978673180741577543638362298805900307916877489621750277562246056785e12"}}, + {{"1.3400796278978785267099738121032714843750e4", "1.930784873528596304326221400060603627935051918029785156250e-3", "1.01851774851557016267678896947673493426952146980838508956199625705868791978344101642179134412654468177801448310465798049263061832294449615311708734175434429497593168411288076223275335865898358255932555661831601275564405349791579099870920484601878548075981946266790952650050188664408833668093366337128"}}, + {{"6.575650904605106461531249806284904479980468750e1", "2.95349579102368409166956553235650062561035156250e1", "4.92883670959819008737323351550818895693909971573197862669756297233542900030950953480711710193053129535412775508169382249001427538228339649766961919628309117712145393012207284297044617755253176225355208718450804357511545954540599873761726532747435308616642768909463909723766874135347528684022648860560e53"}}, + {{"7.73401481707858096115160151384770870208740234375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.491481202776960799383232370018959045410156250e2", "2.21022119284238444262099118632640694751857489911985882302778583637174384391251394588072250813144879442061174245455228341031066580984347413608919792407019123272438031870871777573323381609534176617167457318208979616222032754767955294734636001910121462806120247278470491361024670390806812831433737112379e221"}}, + {{"1.109788988632283901134001347088542388519272208213806152343750e-5", "1.3221937740391638271830743178725242614746093750e1", "3.07947867569658321194458380597181231565685445537647073748124994390202466909582021155440785847623999110729024670271166064504654713592331835440877924887265726281088902886492996205474623955394661696347608605548560131153946508949187941058346142181719469523416895370937975489878692955467549849494731965625e-66"}}, + {{"6.01388538493091151515557157836155965924263000488281250e-2", "2.600229311077009085274511224206150927784619852900505065917968750e-6", "9.99992690524283092045041727666257712294170472055655983655789156306985603524706361035867762480294454684826579379760817381252880474747063748101481751389649370586878847928039436815138481244723824252557644191693486953238362877605577315573573222917218930477592061427550313462645068276263623663297863327092e-1"}}, + {{"2.155348014323840710737556491949362680315971374511718750e-2", "4.0581281467163221599037115083774551749229431152343750e-2", "8.55799445393602464144976083125961944702079982479924287374752573999342183140040918969698718557087349720031284500593972794455976395816766982409031253828819168807248785638632014800512514311905184872890032777260194266023572565329278809193542262172193713145497824126566400120337339261082686915643720103934e-1"}}, + // Integer exponents: + {{"1.250e-01", "0.0e+00", "1.0e+00"}}, + {{"-1.250e-01", "0.0e+00", "1.0e+00"}}, + {{"7.50e-01", "0.0e+00", "1.0e+00"}}, + {{"-7.50e-01", "0.0e+00", "1.0e+00"}}, + {{"1.0e+00", "0.0e+00", "1.0e+00"}}, + {{"-1.0e+00", "0.0e+00", "1.0e+00"}}, + {{"1.250e+00", "0.0e+00", "1.0e+00"}}, + {{"-1.250e+00", "0.0e+00", "1.0e+00"}}, + {{"5.5250e+01", "0.0e+00", "1.0e+00"}}, + {{"-5.5250e+01", "0.0e+00", "1.0e+00"}}, + {{"1.250e-01", "1.0e+00", "1.250e-01"}}, + {{"-1.250e-01", "1.0e+00", "-1.250e-01"}}, + {{"7.50e-01", "1.0e+00", "7.50e-01"}}, + {{"-7.50e-01", "1.0e+00", "-7.50e-01"}}, + {{"1.0e+00", "1.0e+00", "1.0e+00"}}, + {{"-1.0e+00", "1.0e+00", "-1.0e+00"}}, + {{"1.250e+00", "1.0e+00", "1.250e+00"}}, + {{"-1.250e+00", "1.0e+00", "-1.250e+00"}}, + {{"5.5250e+01", "1.0e+00", "5.5250e+01"}}, + {{"-5.5250e+01", "1.0e+00", "-5.5250e+01"}}, + {{"1.250e-01", "2.0e+00", "1.56250e-02"}}, + {{"-1.250e-01", "2.0e+00", "1.56250e-02"}}, + {{"7.50e-01", "2.0e+00", "5.6250e-01"}}, + {{"-7.50e-01", "2.0e+00", "5.6250e-01"}}, + {{"1.0e+00", "2.0e+00", "1.0e+00"}}, + {{"-1.0e+00", "2.0e+00", "1.0e+00"}}, + {{"1.250e+00", "2.0e+00", "1.56250e+00"}}, + {{"-1.250e+00", "2.0e+00", "1.56250e+00"}}, + {{"5.5250e+01", "2.0e+00", "3.05256250e+03"}}, + {{"-5.5250e+01", "2.0e+00", "3.05256250e+03"}}, + {{"1.250e-01", "3.0e+00", "1.9531250e-03"}}, + {{"-1.250e-01", "3.0e+00", "-1.9531250e-03"}}, + {{"7.50e-01", "3.0e+00", "4.218750e-01"}}, + {{"-7.50e-01", "3.0e+00", "-4.218750e-01"}}, + {{"1.0e+00", "3.0e+00", "1.0e+00"}}, + {{"-1.0e+00", "3.0e+00", "-1.0e+00"}}, + {{"1.250e+00", "3.0e+00", "1.9531250e+00"}}, + {{"-1.250e+00", "3.0e+00", "-1.9531250e+00"}}, + {{"5.5250e+01", "3.0e+00", "1.686540781250e+05"}}, + {{"-5.5250e+01", "3.0e+00", "-1.686540781250e+05"}}, + {{"1.250e-01", "4.0e+00", "2.441406250e-04"}}, + {{"-1.250e-01", "4.0e+00", "2.441406250e-04"}}, + {{"7.50e-01", "4.0e+00", "3.16406250e-01"}}, + {{"-7.50e-01", "4.0e+00", "3.16406250e-01"}}, + {{"1.0e+00", "4.0e+00", "1.0e+00"}}, + {{"-1.0e+00", "4.0e+00", "1.0e+00"}}, + {{"1.250e+00", "4.0e+00", "2.441406250e+00"}}, + {{"-1.250e+00", "4.0e+00", "2.441406250e+00"}}, + {{"5.5250e+01", "4.0e+00", "9.318137816406250e+06"}}, + {{"-5.5250e+01", "4.0e+00", "9.318137816406250e+06"}}, + {{"1.250e-01", "5.0e+00", "3.05175781250e-05"}}, + {{"-1.250e-01", "5.0e+00", "-3.05175781250e-05"}}, + {{"7.50e-01", "5.0e+00", "2.3730468750e-01"}}, + {{"-7.50e-01", "5.0e+00", "-2.3730468750e-01"}}, + {{"1.0e+00", "5.0e+00", "1.0e+00"}}, + {{"-1.0e+00", "5.0e+00", "-1.0e+00"}}, + {{"1.250e+00", "5.0e+00", "3.05175781250e+00"}}, + {{"-1.250e+00", "5.0e+00", "-3.05175781250e+00"}}, + {{"5.5250e+01", "5.0e+00", "5.1482711435644531250e+08"}}, + {{"-5.5250e+01", "5.0e+00", "-5.1482711435644531250e+08"}}, + {{"1.250e-01", "6.0e+00", "3.8146972656250e-06"}}, + {{"-1.250e-01", "6.0e+00", "3.8146972656250e-06"}}, + {{"7.50e-01", "6.0e+00", "1.779785156250e-01"}}, + {{"-7.50e-01", "6.0e+00", "1.779785156250e-01"}}, + {{"1.0e+00", "6.0e+00", "1.0e+00"}}, + {{"-1.0e+00", "6.0e+00", "1.0e+00"}}, + {{"1.250e+00", "6.0e+00", "3.8146972656250e+00"}}, + {{"-1.250e+00", "6.0e+00", "3.8146972656250e+00"}}, + {{"5.5250e+01", "6.0e+00", "2.84441980681936035156250e+10"}}, + {{"-5.5250e+01", "6.0e+00", "2.84441980681936035156250e+10"}}, + {{"1.250e-01", "7.0e+00", "4.768371582031250e-07"}}, + {{"-1.250e-01", "7.0e+00", "-4.768371582031250e-07"}}, + {{"7.50e-01", "7.0e+00", "1.33483886718750e-01"}}, + {{"-7.50e-01", "7.0e+00", "-1.33483886718750e-01"}}, + {{"1.0e+00", "7.0e+00", "1.0e+00"}}, + {{"-1.0e+00", "7.0e+00", "-1.0e+00"}}, + {{"1.250e+00", "7.0e+00", "4.768371582031250e+00"}}, + {{"-1.250e+00", "7.0e+00", "-4.768371582031250e+00"}}, + {{"5.5250e+01", "7.0e+00", "1.571541943267696594238281250e+12"}}, + {{"-5.5250e+01", "7.0e+00", "-1.571541943267696594238281250e+12"}}, + {{"1.250e-01", "8.0e+00", "5.96046447753906250e-08"}}, + {{"-1.250e-01", "8.0e+00", "5.96046447753906250e-08"}}, + {{"7.50e-01", "8.0e+00", "1.0011291503906250e-01"}}, + {{"-7.50e-01", "8.0e+00", "1.0011291503906250e-01"}}, + {{"1.0e+00", "8.0e+00", "1.0e+00"}}, + {{"-1.0e+00", "8.0e+00", "1.0e+00"}}, + {{"1.250e+00", "8.0e+00", "5.96046447753906250e+00"}}, + {{"-1.250e+00", "8.0e+00", "5.96046447753906250e+00"}}, + {{"5.5250e+01", "8.0e+00", "8.682769236554023683166503906250e+13"}}, + {{"-5.5250e+01", "8.0e+00", "8.682769236554023683166503906250e+13"}}, + {{"1.250e-01", "9.0e+00", "7.4505805969238281250e-09"}}, + {{"-1.250e-01", "9.0e+00", "-7.4505805969238281250e-09"}}, + {{"7.50e-01", "9.0e+00", "7.50846862792968750e-02"}}, + {{"-7.50e-01", "9.0e+00", "-7.50846862792968750e-02"}}, + {{"1.0e+00", "9.0e+00", "1.0e+00"}}, + {{"-1.0e+00", "9.0e+00", "-1.0e+00"}}, + {{"1.250e+00", "9.0e+00", "7.4505805969238281250e+00"}}, + {{"-1.250e+00", "9.0e+00", "-7.4505805969238281250e+00"}}, + {{"5.5250e+01", "9.0e+00", "4.7972300031960980849494934082031250e+15"}}, + {{"-5.5250e+01", "9.0e+00", "-4.7972300031960980849494934082031250e+15"}}, + {{"1.250e-01", "1.0e+01", "9.313225746154785156250e-10"}}, + {{"-1.250e-01", "1.0e+01", "9.313225746154785156250e-10"}}, + {{"7.50e-01", "1.0e+01", "5.6313514709472656250e-02"}}, + {{"-7.50e-01", "1.0e+01", "5.6313514709472656250e-02"}}, + {{"1.0e+00", "1.0e+01", "1.0e+00"}}, + {{"-1.0e+00", "1.0e+01", "1.0e+00"}}, + {{"1.250e+00", "1.0e+01", "9.313225746154785156250e+00"}}, + {{"-1.250e+00", "1.0e+01", "9.313225746154785156250e+00"}}, + {{"5.5250e+01", "1.0e+01", "2.65046957676584419193459510803222656250e+17"}}, + {{"-5.5250e+01", "1.0e+01", "2.65046957676584419193459510803222656250e+17"}}, + {{"1.250e-01", "1.10e+01", "1.164153218269348144531250e-10"}}, + {{"-1.250e-01", "1.10e+01", "-1.164153218269348144531250e-10"}}, + {{"7.50e-01", "1.10e+01", "4.223513603210449218750e-02"}}, + {{"-7.50e-01", "1.10e+01", "-4.223513603210449218750e-02"}}, + {{"1.0e+00", "1.10e+01", "1.0e+00"}}, + {{"-1.0e+00", "1.10e+01", "-1.0e+00"}}, + {{"1.250e+00", "1.10e+01", "1.164153218269348144531250e+01"}}, + {{"-1.250e+00", "1.10e+01", "-1.164153218269348144531250e+01"}}, + {{"5.5250e+01", "1.10e+01", "1.464384441163128916043863797187805175781250e+19"}}, + {{"-5.5250e+01", "1.10e+01", "-1.464384441163128916043863797187805175781250e+19"}}, + {{"1.250e-01", "1.20e+01", "1.45519152283668518066406250e-11"}}, + {{"-1.250e-01", "1.20e+01", "1.45519152283668518066406250e-11"}}, + {{"7.50e-01", "1.20e+01", "3.16763520240783691406250e-02"}}, + {{"-7.50e-01", "1.20e+01", "3.16763520240783691406250e-02"}}, + {{"1.0e+00", "1.20e+01", "1.0e+00"}}, + {{"-1.0e+00", "1.20e+01", "1.0e+00"}}, + {{"1.250e+00", "1.20e+01", "1.45519152283668518066406250e+01"}}, + {{"-1.250e+00", "1.20e+01", "1.45519152283668518066406250e+01"}}, + {{"5.5250e+01", "1.20e+01", "8.090724037426287261142347479462623596191406250e+20"}}, + {{"-5.5250e+01", "1.20e+01", "8.090724037426287261142347479462623596191406250e+20"}}, + {{"1.250e-01", "1.30e+01", "1.8189894035458564758300781250e-12"}}, + {{"-1.250e-01", "1.30e+01", "-1.8189894035458564758300781250e-12"}}, + {{"7.50e-01", "1.30e+01", "2.3757264018058776855468750e-02"}}, + {{"-7.50e-01", "1.30e+01", "-2.3757264018058776855468750e-02"}}, + {{"1.0e+00", "1.30e+01", "1.0e+00"}}, + {{"-1.0e+00", "1.30e+01", "-1.0e+00"}}, + {{"1.250e+00", "1.30e+01", "1.8189894035458564758300781250e+01"}}, + {{"-1.250e+00", "1.30e+01", "-1.8189894035458564758300781250e+01"}}, + {{"5.5250e+01", "1.30e+01", "4.4701250306780237117811469824030995368957519531250e+22"}}, + {{"-5.5250e+01", "1.30e+01", "-4.4701250306780237117811469824030995368957519531250e+22"}}, + {{"1.250e-01", "1.40e+01", "2.273736754432320594787597656250e-13"}}, + {{"-1.250e-01", "1.40e+01", "2.273736754432320594787597656250e-13"}}, + {{"7.50e-01", "1.40e+01", "1.781794801354408264160156250e-02"}}, + {{"-7.50e-01", "1.40e+01", "1.781794801354408264160156250e-02"}}, + {{"1.0e+00", "1.40e+01", "1.0e+00"}}, + {{"-1.0e+00", "1.40e+01", "1.0e+00"}}, + {{"1.250e+00", "1.40e+01", "2.273736754432320594787597656250e+01"}}, + {{"-1.250e+00", "1.40e+01", "2.273736754432320594787597656250e+01"}}, + {{"5.5250e+01", "1.40e+01", "2.46974407944960810075908370777771249413490295410156250e+24"}}, + {{"-5.5250e+01", "1.40e+01", "2.46974407944960810075908370777771249413490295410156250e+24"}}, + {{"1.250e-01", "1.50e+01", "2.84217094304040074348449707031250e-14"}}, + {{"-1.250e-01", "1.50e+01", "-2.84217094304040074348449707031250e-14"}}, + {{"7.50e-01", "1.50e+01", "1.33634610101580619812011718750e-02"}}, + {{"-7.50e-01", "1.50e+01", "-1.33634610101580619812011718750e-02"}}, + {{"1.0e+00", "1.50e+01", "1.0e+00"}}, + {{"-1.0e+00", "1.50e+01", "-1.0e+00"}}, + {{"1.250e+00", "1.50e+01", "2.84217094304040074348449707031250e+01"}}, + {{"-1.250e+00", "1.50e+01", "-2.84217094304040074348449707031250e+01"}}, + {{"5.5250e+01", "1.50e+01", "1.364533603895908475669393748547186153009533882141113281250e+26"}}, + {{"-5.5250e+01", "1.50e+01", "-1.364533603895908475669393748547186153009533882141113281250e+26"}}, + {{"1.250e-01", "1.60e+01", "3.5527136788005009293556213378906250e-15"}}, + {{"-1.250e-01", "1.60e+01", "3.5527136788005009293556213378906250e-15"}}, + {{"7.50e-01", "1.60e+01", "1.0022595757618546485900878906250e-02"}}, + {{"-7.50e-01", "1.60e+01", "1.0022595757618546485900878906250e-02"}}, + {{"1.0e+00", "1.60e+01", "1.0e+00"}}, + {{"-1.0e+00", "1.60e+01", "1.0e+00"}}, + {{"1.250e+00", "1.60e+01", "3.5527136788005009293556213378906250e+01"}}, + {{"-1.250e+00", "1.60e+01", "3.5527136788005009293556213378906250e+01"}}, + {{"5.5250e+01", "1.60e+01", "7.539048161524894328073400460723203495377674698829650878906250e+27"}}, + {{"-5.5250e+01", "1.60e+01", "7.539048161524894328073400460723203495377674698829650878906250e+27"}}, + {{"1.250e-01", "1.70e+01", "4.440892098500626161694526672363281250e-16"}}, + {{"-1.250e-01", "1.70e+01", "-4.440892098500626161694526672363281250e-16"}}, + {{"7.50e-01", "1.70e+01", "7.51694681821390986442565917968750e-03"}}, + {{"-7.50e-01", "1.70e+01", "-7.51694681821390986442565917968750e-03"}}, + {{"1.0e+00", "1.70e+01", "1.0e+00"}}, + {{"-1.0e+00", "1.70e+01", "-1.0e+00"}}, + {{"1.250e+00", "1.70e+01", "4.440892098500626161694526672363281250e+01"}}, + {{"-1.250e+00", "1.70e+01", "-4.440892098500626161694526672363281250e+01"}}, + {{"5.5250e+01", "1.70e+01", "4.1653241092425041162605537545495699311961652711033821105957031250e+29"}}, + {{"-5.5250e+01", "1.70e+01", "-4.1653241092425041162605537545495699311961652711033821105957031250e+29"}}, + {{"1.250e-01", "1.80e+01", "5.55111512312578270211815834045410156250e-17"}}, + {{"-1.250e-01", "1.80e+01", "5.55111512312578270211815834045410156250e-17"}}, + {{"7.50e-01", "1.80e+01", "5.6377101136604323983192443847656250e-03"}}, + {{"-7.50e-01", "1.80e+01", "5.6377101136604323983192443847656250e-03"}}, + {{"1.0e+00", "1.80e+01", "1.0e+00"}}, + {{"-1.0e+00", "1.80e+01", "1.0e+00"}}, + {{"1.250e+00", "1.80e+01", "5.55111512312578270211815834045410156250e+01"}}, + {{"-1.250e+00", "1.80e+01", "5.55111512312578270211815834045410156250e+01"}}, + {{"5.5250e+01", "1.80e+01", "2.30134157035648352423395594938863738698588131228461861610412597656250e+31"}}, + {{"-5.5250e+01", "1.80e+01", "2.30134157035648352423395594938863738698588131228461861610412597656250e+31"}}, + {{"1.250e-01", "1.90e+01", "6.9388939039072283776476979255676269531250e-18"}}, + {{"-1.250e-01", "1.90e+01", "-6.9388939039072283776476979255676269531250e-18"}}, + {{"7.50e-01", "1.90e+01", "4.228282585245324298739433288574218750e-03"}}, + {{"-7.50e-01", "1.90e+01", "-4.228282585245324298739433288574218750e-03"}}, + {{"1.0e+00", "1.90e+01", "1.0e+00"}}, + {{"-1.0e+00", "1.90e+01", "-1.0e+00"}}, + {{"1.250e+00", "1.90e+01", "6.9388939039072283776476979255676269531250e+01"}}, + {{"-1.250e+00", "1.90e+01", "-6.9388939039072283776476979255676269531250e+01"}}, + {{"5.5250e+01", "1.90e+01", "1.271491217621957147139260662037222156309699425037251785397529602050781250e+33"}}, + {{"-5.5250e+01", "1.90e+01", "-1.271491217621957147139260662037222156309699425037251785397529602050781250e+33"}}, + {{ + "-1", + "18446744073709551615", + "-1", + }}, + {{ + "-1", + "18446744073709551614", + "1", + }}, + }}; + + unsigned max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + T val = pow(T(data[k][0]), T(data[k][1])); + T e = relative_error(val, T(data[k][2])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + val = pow(T(data[k][0]), -T(data[k][1])); + e = relative_error(val, T(1 / T(data[k][2]))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + } + std::cout << "Max error was: " << max_err << std::endl; + // + // Special cases come last: + // + BOOST_CHECK_EQUAL(pow(T(0), T(0)), 1); + BOOST_CHECK_EQUAL(pow(T(0), 0), 1); + BOOST_CHECK_EQUAL(pow(T(0), T(2)), 0); + BOOST_CHECK_EQUAL(pow(T(0), 2), 0); + BOOST_CHECK_EQUAL(pow(T(1), T(0)), 1); + BOOST_CHECK_EQUAL(pow(T(1), 0), 1); + BOOST_CHECK_EQUAL(pow(T(1), T(2)), 1); + BOOST_CHECK_EQUAL(pow(T(1), 2), 1); + + if (!boost::multiprecision::is_interval_number<T>::value) + { + T bug_case = -1.05 * log((std::numeric_limits<T>::max)()) / log(T(1.01)); + + for (unsigned i = 0; i < 100; ++i, bug_case *= 1.05) + { + if (std::numeric_limits<T>::has_infinity) + { + BOOST_CHECK_EQUAL(pow(T(1.01), bug_case), 0); + } + else + { + BOOST_CHECK_LE(pow(T(1.01), bug_case), (std::numeric_limits<T>::min)()); + } + } + } +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); + // Check low multiprecision digit counts. + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_rat_float_interconv.cpp b/src/boost/libs/multiprecision/test/test_rat_float_interconv.cpp new file mode 100644 index 00000000..29393fda --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_rat_float_interconv.cpp @@ -0,0 +1,294 @@ +// Copyright John Maddock 2013. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if defined(TEST1) || defined(TEST2) || defined(TEST3) || defined(TEST4) +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/cpp_int.hpp> +#else +#include <boost/multiprecision/mpfr.hpp> +#endif +#include <boost/math/special_functions/next.hpp> + +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/chrono.hpp> +#include "test.hpp" +#include <boost/array.hpp> +#include <iostream> +#include <iomanip> + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +template <class Clock> +struct stopwatch +{ + typedef typename Clock::duration duration; + stopwatch() + { + m_start = Clock::now(); + } + duration elapsed() + { + return Clock::now() - m_start; + } + void reset() + { + m_start = Clock::now(); + } + + private: + typename Clock::time_point m_start; +}; + +template <class T> +struct exponent_type +{ + typedef int type; +}; +template <class T, boost::multiprecision::expression_template_option ET> +struct exponent_type<boost::multiprecision::number<T, ET> > +{ + typedef typename T::exponent_type type; +}; + +template <class T> +T generate_random_float() +{ + BOOST_MATH_STD_USING + typedef typename exponent_type<T>::type e_type; + static boost::random::mt19937 gen; + T val = gen(); + T prev_val = -1; + while (val != prev_val) + { + val *= (gen.max)(); + prev_val = val; + val += gen(); + } + e_type e; + val = frexp(val, &e); + + static const int max_exponent_value = (std::min)(static_cast<int>(std::numeric_limits<T>::max_exponent - std::numeric_limits<T>::digits - 20), 2000); + static boost::random::uniform_int_distribution<e_type> ui(0, max_exponent_value); + return ldexp(val, ui(gen)); +} + +template <class Float, class Rat> +void do_round_trip(const Float& val) +{ +#ifndef BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS + BOOST_MATH_STD_USING + Rat rat(val); + Float new_f(rat); + BOOST_CHECK_EQUAL(val, new_f); + // + // Try adding or subtracting an insignificant amount + // (0.25ulp) from rat and check that it rounds to the same value: + // + typename exponent_type<Float>::type e; + Float t = frexp(val, &e); + (void)t; // warning suppression + e -= std::numeric_limits<Float>::digits + 2; + BOOST_ASSERT(val == (val + ldexp(Float(1), e))); + Rat delta, rounded; + typedef typename boost::multiprecision::component_type<Rat>::type i_type; + i_type i(1); + i <<= (e < 0 ? -e : e); + if (e > 0) + delta.assign(i); + else + delta = Rat(i_type(1), i); + rounded = rat + delta; + new_f = static_cast<Float>(rounded); + BOOST_CHECK_EQUAL(val, new_f); + rounded = rat - delta; + new_f = static_cast<Float>(rounded); + BOOST_CHECK_EQUAL(val, new_f); + + delta /= 2; + rounded = rat + delta; + new_f = static_cast<Float>(rounded); + BOOST_CHECK_EQUAL(val, new_f); + rounded = rat - delta; + new_f = static_cast<Float>(rounded); + BOOST_CHECK_EQUAL(val, new_f); + + delta /= 2; + rounded = rat + delta; + new_f = static_cast<Float>(rounded); + BOOST_CHECK_EQUAL(val, new_f); + rounded = rat - delta; + new_f = static_cast<Float>(rounded); + BOOST_CHECK_EQUAL(val, new_f); +#endif +} + +template <class Float, class Rat> +void test_round_trip() +{ +#ifndef BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS + std::cout << "Testing types " << typeid(Float).name() << " <<==>> " << typeid(Rat).name() << std::endl; + std::cout << "digits = " << std::numeric_limits<Float>::digits << std::endl; + std::cout << "digits10 = " << std::numeric_limits<Float>::digits10 << std::endl; +#ifndef BOOST_NO_CXX11_NUMERIC_LIMITS + std::cout << "max_digits10 = " << std::numeric_limits<Float>::max_digits10 << std::endl; +#endif + + stopwatch<boost::chrono::high_resolution_clock> w; + + int count = 0; + +#ifndef CI_SUPPRESS_KNOWN_ISSUES + while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 200) +#else + while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 50) +#endif + { + Float val = generate_random_float<Float>(); + do_round_trip<Float, Rat>(val); + do_round_trip<Float, Rat>(Float(-val)); + do_round_trip<Float, Rat>(Float(1 / val)); + do_round_trip<Float, Rat>(Float(-1 / val)); + count += 4; + if (boost::detail::test_errors() > 100) + break; + } + + std::cout << "Execution time = " << boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() << "s" << std::endl; + std::cout << "Total values tested: " << count << std::endl; +#endif +} + +template <class Int> +Int generate_random_int() +{ + static boost::random::mt19937 gen; + static boost::random::uniform_int_distribution<boost::random::mt19937::result_type> d(1, 20); + + int lim; + Int cppi(0); + + lim = d(gen); + + for (int i = 0; i < lim; ++i) + { + cppi *= (gen.max)(); + cppi += gen(); + } + return cppi; +} + +template <class Float, class Rat> +void test_random_rationals() +{ +#ifndef BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS + std::cout << "Testing types " << typeid(Float).name() << " <<==>> " << typeid(Rat).name() << std::endl; + std::cout << "digits = " << std::numeric_limits<Float>::digits << std::endl; + std::cout << "digits10 = " << std::numeric_limits<Float>::digits10 << std::endl; +#ifndef BOOST_NO_CXX11_NUMERIC_LIMITS + std::cout << "max_digits10 = " << std::numeric_limits<Float>::max_digits10 << std::endl; +#endif + + typedef typename boost::multiprecision::component_type<Rat>::type i_type; + stopwatch<boost::chrono::high_resolution_clock> w; + + int count = 0; + +#ifndef CI_SUPPRESS_KNOWN_ISSUES + while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 200) +#else + while (boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() < 50) +#endif + { + Rat rat(generate_random_int<i_type>(), generate_random_int<i_type>()); + Float f(rat); + Rat new_rat(f); // rounded value + int c = new_rat.compare(rat); + if (c < 0) + { + // If f was rounded down, next float up must be above the original value: + f = boost::math::float_next(f); + new_rat.assign(f); + BOOST_CHECK(new_rat >= rat); + } + else if (c > 0) + { + // If f was rounded up, next float down must be below the original value: + f = boost::math::float_prior(f); + new_rat.assign(f); + BOOST_CHECK(new_rat <= rat); + } + else + { + // Values were equal... nothing to test. + } + if (boost::detail::test_errors() > 100) + break; + } + + std::cout << "Execution time = " << boost::chrono::duration_cast<boost::chrono::duration<double> >(w.elapsed()).count() << "s" << std::endl; + std::cout << "Total values tested: " << count << std::endl; +#endif +} + +#if defined(TEST2) + +void double_spot_tests() +{ + boost::multiprecision::cpp_rational rat = 1; + boost::multiprecision::cpp_rational twiddle(boost::multiprecision::cpp_int(1), boost::multiprecision::cpp_int(boost::multiprecision::cpp_int(1) << 54)); + rat += boost::multiprecision::cpp_rational(boost::multiprecision::cpp_int(1), boost::multiprecision::cpp_int(boost::multiprecision::cpp_int(1) << 50)); + + double d = rat.convert_to<double>(); + + rat += twiddle; + BOOST_CHECK_EQUAL(d, rat.convert_to<double>()); + rat += twiddle; + // tie: round to even rounds down + BOOST_CHECK_EQUAL(d, rat.convert_to<double>()); + rat += twiddle; + BOOST_CHECK_NE(d, rat.convert_to<double>()); + rat -= twiddle; + BOOST_CHECK_EQUAL(d, rat.convert_to<double>()); + rat += boost::multiprecision::cpp_rational(boost::multiprecision::cpp_int(1), boost::multiprecision::cpp_int(boost::multiprecision::cpp_int(1) << 52)); + // tie, but last bit is now a 1 so we round up: + BOOST_CHECK_NE(d, rat.convert_to<double>()); +} + +#endif + +int main() +{ + using namespace boost::multiprecision; +#if defined(TEST1) && !defined(BOOST_MSVC) + test_round_trip<number<cpp_bin_float<113, digit_base_2, void, boost::int16_t> >, cpp_rational>(); +#elif defined(TEST2) + double_spot_tests(); + test_round_trip<double, cpp_rational>(); +#elif defined(TEST3) && !defined(BOOST_MSVC) + test_random_rationals<number<cpp_bin_float<113, digit_base_2, void, boost::int16_t> >, cpp_rational>(); +#elif defined(TEST4) + test_random_rationals<double, cpp_rational>(); +#elif defined(TEST5) + // This does not work: gmp does not correctly round integer to float or + // rational to float conversions: + test_round_trip<double, mpq_rational>(); +#elif defined(TEST6) + test_round_trip<mpfr_float_100, mpq_rational>(); +#elif defined(TEST7) + test_random_rationals<mpfr_float_100, mpq_rational>(); +#elif defined(TEST8) + test_random_rationals<double, mpq_rational>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_rational_io.cpp b/src/boost/libs/multiprecision/test/test_rational_io.cpp new file mode 100644 index 00000000..b1d9b369 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_rational_io.cpp @@ -0,0 +1,147 @@ +// Copyright John Maddock 2011. + +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#if !defined(TEST_MPQ) && !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT) +#define TEST_MPQ +#define TEST_TOMMATH +#define TEST_CPP_INT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPQ) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_TOMMATH) +#include <boost/multiprecision/tommath.hpp> +#endif +#ifdef TEST_CPP_INT +#include <boost/multiprecision/cpp_int.hpp> +#endif + +#include <boost/algorithm/string/case_conv.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/multiprecision/rational_adaptor.hpp> +#include "test.hpp" +#include <iostream> +#include <iomanip> + +template <class T> +T generate_random() +{ + typedef typename boost::multiprecision::component_type<T>::type int_type; + static boost::random::uniform_int_distribution<unsigned> ui(0, 20); + static boost::random::mt19937 gen; + int_type val = int_type(gen()); + unsigned lim = ui(gen); + for (unsigned i = 0; i < lim; ++i) + { + val *= (gen.max)(); + val += gen(); + } + int_type denom = int_type(gen()); + lim = ui(gen); + for (unsigned i = 0; i < lim; ++i) + { + denom *= (gen.max)(); + denom += gen(); + } + return T(val, denom); +} + +template <class T> +void do_round_trip(const T& val, std::ios_base::fmtflags f, const boost::mpl::true_&) +{ + std::stringstream ss; +#ifndef BOOST_NO_CXX11_NUMERIC_LIMITS + ss << std::setprecision(std::numeric_limits<T>::max_digits10); +#else + ss << std::setprecision(std::numeric_limits<T>::digits10 + 5); +#endif + ss.flags(f); + ss << val; + T new_val = static_cast<T>(ss.str()); + BOOST_CHECK_EQUAL(new_val, val); + new_val = static_cast<T>(val.str(0, f)); + BOOST_CHECK_EQUAL(new_val, val); +} + +template <class T> +void do_round_trip(const T& val, std::ios_base::fmtflags f, const boost::mpl::false_&) +{ + std::stringstream ss; + ss << std::setprecision(std::numeric_limits<T>::digits10 + 4); + ss.flags(f); + ss << val; + T new_val; + ss >> new_val; + BOOST_CHECK_EQUAL(new_val, val); +} + +template <class T> +struct is_number : public boost::mpl::false_ +{}; +template <class T> +struct is_number<boost::multiprecision::number<T> > : public boost::mpl::true_ +{}; + +template <class T> +void do_round_trip(const T& val, std::ios_base::fmtflags f) +{ + do_round_trip(val, f, is_number<T>()); +} + +template <class T> +void do_round_trip(const T& val) +{ + do_round_trip(val, std::ios_base::fmtflags(0)); + if (val >= 0) + { + do_round_trip(val, std::ios_base::fmtflags(std::ios_base::showbase | std::ios_base::hex)); + do_round_trip(val, std::ios_base::fmtflags(std::ios_base::showbase | std::ios_base::oct)); + } +} + +template <class T> +void test_round_trip() +{ + for (unsigned i = 0; i < 1000; ++i) + { + T val = generate_random<T>(); + do_round_trip(val); + do_round_trip(T(-val)); + } +} + +int main() +{ +#ifdef TEST_MPQ + test_round_trip<boost::multiprecision::mpq_rational>(); + test_round_trip<boost::rational<boost::multiprecision::mpz_int> >(); + test_round_trip<boost::multiprecision::number<boost::multiprecision::rational_adaptor<boost::multiprecision::gmp_int> > >(); +#endif +#ifdef TEST_TOMMATH + test_round_trip<boost::rational<boost::multiprecision::tom_int> >(); + test_round_trip<boost::multiprecision::tom_rational>(); +#endif +#ifdef TEST_CPP_INT + test_round_trip<boost::rational<boost::multiprecision::cpp_int> >(); + test_round_trip<boost::multiprecision::cpp_rational>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_round.cpp b/src/boost/libs/multiprecision/test/test_round.cpp new file mode 100644 index 00000000..a582a212 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_round.cpp @@ -0,0 +1,469 @@ +// (C) Copyright John Maddock 2007. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/math/special_functions/round.hpp> +#include <boost/math/special_functions/trunc.hpp> +#include <boost/math/special_functions/modf.hpp> +#include <boost/math/special_functions/sign.hpp> +#include <boost/random/mersenne_twister.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_MPFR_50 +#define TEST_MPFI_50 +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_MPFR_50 +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_MPFI_50 +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif + +#ifdef BOOST_MSVC +#pragma warning(disable : 4127) +#endif + +boost::mt19937 rng; + +template <class T> +T get_random() +{ + // + // Fill all the bits in T with random values, + // likewise set the exponent to a random value + // that will still fit inside a T, and always + // have a remainder as well as an integer part. + // + int bits = boost::math::tools::digits<T>(); + int shift = 0; + int exponent = rng() % (bits - 4); + T result = 0; + while (bits > 0) + { + result += ldexp(static_cast<T>(rng()), shift); + shift += std::numeric_limits<int>::digits; + bits -= std::numeric_limits<int>::digits; + } + return rng() & 1u ? T(-ldexp(frexp(result, &bits), exponent)) : T(ldexp(frexp(result, &bits), exponent)); +} + +template <class T, class U> +typename boost::disable_if_c<boost::multiprecision::is_interval_number<T>::value>::type check_within_half(T a, U u) +{ + BOOST_MATH_STD_USING + if (fabs(a - u) > 0.5f) + { + BOOST_ERROR("Rounded result differed by more than 0.5 from the original"); + std::cerr << "Values were: " << std::setprecision(35) << std::setw(40) + << std::left << a << u << std::endl; + } + if ((fabs(a - u) == 0.5f) && (fabs(static_cast<T>(u)) < fabs(a))) + { + BOOST_ERROR("Rounded result was towards zero with boost::round"); + std::cerr << "Values were: " << std::setprecision(35) << std::setw(40) + << std::left << a << u << std::endl; + } +} +template <class T, class U> +typename boost::enable_if_c<boost::multiprecision::is_interval_number<T>::value>::type check_within_half(T a, U u) +{ + BOOST_MATH_STD_USING + if (upper(T(fabs(a - u))) > 0.5f) + { + BOOST_ERROR("Rounded result differed by more than 0.5 from the original"); + std::cerr << "Values were: " << std::setprecision(35) << std::setw(40) + << std::left << a << u << std::endl; + } + if ((upper(T(fabs(a - u))) == 0.5f) && (fabs(static_cast<T>(u)) < fabs(a))) + { + BOOST_ERROR("Rounded result was towards zero with boost::round"); + std::cerr << "Values were: " << std::setprecision(35) << std::setw(40) + << std::left << a << u << std::endl; + } +} + +// +// We may not have an abs overload for long long so provide a fall back: +// +inline unsigned safe_abs(int const& v) +{ + return v < 0 ? static_cast<unsigned>(1u) + static_cast<unsigned>(-(v + 1)) : v; +} +inline unsigned long safe_abs(long const& v) +{ + return v < 0 ? static_cast<unsigned long>(1u) + static_cast<unsigned long>(-(v + 1)) : v; +} +inline unsigned long long safe_abs(long long const& v) +{ + return v < 0 ? static_cast<unsigned long long>(1u) + static_cast<unsigned long long>(-(v + 1)) : v; +} +template <class T> +inline typename boost::disable_if_c<boost::is_integral<T>::value, T>::type safe_abs(T const& v) +{ + return v < 0 ? -v : v; +} + +template <class T, class U> +void check_trunc_result(T a, U u) +{ + BOOST_MATH_STD_USING + if (fabs(a - u) >= 1) + { + BOOST_ERROR("Rounded result differed by more than 1 from the original"); + std::cerr << "Values were: " << std::setprecision(35) << std::setw(40) + << std::left << a << u << std::endl; + } + if (abs(a) < safe_abs(u)) + { + BOOST_ERROR("Truncated result had larger absolute value than the original"); + std::cerr << "Values were: " << std::setprecision(35) << std::setw(40) + << std::left << a << u << std::endl; + } + if (fabs(static_cast<T>(u)) > fabs(a)) + { + BOOST_ERROR("Rounded result was away from zero with boost::trunc"); + std::cerr << "Values were: " << std::setprecision(35) << std::setw(40) + << std::left << a << u << std::endl; + } +} + +template <class T, class U> +void check_modf_result(T a, T fract, U ipart) +{ + BOOST_MATH_STD_USING + if (fract + ipart != a) + { + BOOST_ERROR("Fractional and integer results do not add up to the original value"); + std::cerr << "Values were: " << std::setprecision(35) << " " + << std::left << a << ipart << " " << fract << std::endl; + } + if ((boost::math::sign(a) != boost::math::sign(fract)) && boost::math::sign(fract)) + { + BOOST_ERROR("Original and fractional parts have differing signs"); + std::cerr << "Values were: " << std::setprecision(35) << " " + << std::left << a << ipart << " " << fract << std::endl; + } + if ((boost::math::sign(a) != boost::math::sign(ipart)) && boost::math::sign(ipart)) + { + BOOST_ERROR("Original and integer parts have differing signs"); + std::cerr << "Values were: " << std::setprecision(35) << " " + << std::left << a << ipart << " " << ipart << std::endl; + } + if (fabs(a - ipart) >= 1) + { + BOOST_ERROR("Rounded result differed by more than 1 from the original"); + std::cerr << "Values were: " << std::setprecision(35) << std::setw(40) + << std::left << a << ipart << std::endl; + } +} + +template <class T> +void test() +{ + BOOST_MATH_STD_USING + + for (int i = 0; i < 1000; ++i) + { + T arg = get_random<T>(); + T r = round(arg); + check_within_half(arg, r); + BOOST_TEST(r == round(arg + 0)); + r = trunc(arg); + check_trunc_result(arg, r); + BOOST_TEST(r == trunc(arg + 0)); + T frac = modf(arg, &r); + check_modf_result(arg, frac, r); + + if (abs(r) < (std::numeric_limits<int>::max)()) + { + int i = iround(arg); + check_within_half(arg, i); + BOOST_TEST(i == iround(arg + 0)); + i = itrunc(arg); + check_trunc_result(arg, i); + BOOST_TEST(i == itrunc(arg + 0)); + r = modf(arg, &i); + check_modf_result(arg, r, i); + } + if (abs(r) < (std::numeric_limits<long>::max)()) + { + long l = lround(arg); + check_within_half(arg, l); + BOOST_TEST(l == lround(arg + 0)); + l = ltrunc(arg); + check_trunc_result(arg, l); + BOOST_TEST(l == ltrunc(arg + 0)); + r = modf(arg, &l); + check_modf_result(arg, r, l); + } + +#ifdef BOOST_HAS_LONG_LONG + if (abs(r) < (std::numeric_limits<boost::long_long_type>::max)()) + { + boost::long_long_type ll = llround(arg); + check_within_half(arg, ll); + BOOST_TEST(ll == llround(arg + 0)); + ll = lltrunc(arg); + check_trunc_result(arg, ll); + BOOST_TEST(ll == lltrunc(arg + 0)); + r = modf(arg, &ll); + check_modf_result(arg, r, ll); + } +#endif + } + // + // Test boundary cases: + // + if (std::numeric_limits<T>::digits >= std::numeric_limits<int>::digits) + { + int si = iround(static_cast<T>((std::numeric_limits<int>::max)())); + check_within_half(static_cast<T>((std::numeric_limits<int>::max)()), si); + BOOST_TEST(si == iround(static_cast<T>((std::numeric_limits<int>::max)()) + 0)); + si = iround(static_cast<T>((std::numeric_limits<int>::min)())); + check_within_half(static_cast<T>((std::numeric_limits<int>::min)()), si); + BOOST_TEST(si == iround(static_cast<T>((std::numeric_limits<int>::min)()) + 0)); + si = itrunc(static_cast<T>((std::numeric_limits<int>::max)())); + check_trunc_result(static_cast<T>((std::numeric_limits<int>::max)()), si); + BOOST_TEST(si == itrunc(static_cast<T>((std::numeric_limits<int>::max)()) + 0)); + si = itrunc(static_cast<T>((std::numeric_limits<int>::min)())); + check_trunc_result(static_cast<T>((std::numeric_limits<int>::min)()), si); + BOOST_TEST(si == itrunc(static_cast<T>((std::numeric_limits<int>::min)()) + 0)); + + si = iround(static_cast<T>((std::numeric_limits<int>::max)() - 1)); + check_within_half(static_cast<T>((std::numeric_limits<int>::max)() - 1), si); + si = iround(static_cast<T>((std::numeric_limits<int>::min)() + 1)); + check_within_half(static_cast<T>((std::numeric_limits<int>::min)() + 1), si); + si = itrunc(static_cast<T>((std::numeric_limits<int>::max)() - 1)); + check_trunc_result(static_cast<T>((std::numeric_limits<int>::max)() - 1), si); + si = itrunc(static_cast<T>((std::numeric_limits<int>::min)() + 1)); + check_trunc_result(static_cast<T>((std::numeric_limits<int>::min)() + 1), si); + } + if (std::numeric_limits<T>::digits >= std::numeric_limits<long>::digits) + { + long k = lround(static_cast<T>((std::numeric_limits<long>::max)())); + check_within_half(static_cast<T>((std::numeric_limits<long>::max)()), k); + BOOST_TEST(k == lround(static_cast<T>((std::numeric_limits<long>::max)()) + 0)); + k = lround(static_cast<T>((std::numeric_limits<long>::min)())); + check_within_half(static_cast<T>((std::numeric_limits<long>::min)()), k); + BOOST_TEST(k == lround(static_cast<T>((std::numeric_limits<long>::min)()) + 0)); + k = ltrunc(static_cast<T>((std::numeric_limits<long>::max)())); + check_trunc_result(static_cast<T>((std::numeric_limits<long>::max)()), k); + BOOST_TEST(k == ltrunc(static_cast<T>((std::numeric_limits<long>::max)()) + 0)); + k = ltrunc(static_cast<T>((std::numeric_limits<long>::min)())); + check_trunc_result(static_cast<T>((std::numeric_limits<long>::min)()), k); + BOOST_TEST(k == ltrunc(static_cast<T>((std::numeric_limits<long>::min)()) + 0)); + + k = lround(static_cast<T>((std::numeric_limits<long>::max)() - 1)); + check_within_half(static_cast<T>((std::numeric_limits<long>::max)() - 1), k); + k = lround(static_cast<T>((std::numeric_limits<long>::min)() + 1)); + check_within_half(static_cast<T>((std::numeric_limits<long>::min)() + 1), k); + k = ltrunc(static_cast<T>((std::numeric_limits<long>::max)() - 1)); + check_trunc_result(static_cast<T>((std::numeric_limits<long>::max)() - 1), k); + k = ltrunc(static_cast<T>((std::numeric_limits<long>::min)() + 1)); + check_trunc_result(static_cast<T>((std::numeric_limits<long>::min)() + 1), k); + } +#ifndef BOOST_NO_LONG_LONG + if (std::numeric_limits<T>::digits >= std::numeric_limits<boost::long_long_type>::digits) + { + boost::long_long_type j = llround(static_cast<T>((std::numeric_limits<boost::long_long_type>::max)())); + check_within_half(static_cast<T>((std::numeric_limits<boost::long_long_type>::max)()), j); + BOOST_TEST(j == llround(static_cast<T>((std::numeric_limits<long long>::max)()) + 0)); + j = llround(static_cast<T>((std::numeric_limits<boost::long_long_type>::min)())); + check_within_half(static_cast<T>((std::numeric_limits<boost::long_long_type>::min)()), j); + BOOST_TEST(j == llround(static_cast<T>((std::numeric_limits<long long>::min)()) + 0)); + j = lltrunc(static_cast<T>((std::numeric_limits<boost::long_long_type>::max)())); + check_trunc_result(static_cast<T>((std::numeric_limits<boost::long_long_type>::max)()), j); + BOOST_TEST(j == lltrunc(static_cast<T>((std::numeric_limits<long long>::max)()) + 0)); + j = lltrunc(static_cast<T>((std::numeric_limits<boost::long_long_type>::min)())); + check_trunc_result(static_cast<T>((std::numeric_limits<boost::long_long_type>::min)()), j); + BOOST_TEST(j == lltrunc(static_cast<T>((std::numeric_limits<long long>::min)()) + 0)); + + j = llround(static_cast<T>((std::numeric_limits<boost::long_long_type>::max)() - 1)); + check_within_half(static_cast<T>((std::numeric_limits<boost::long_long_type>::max)() - 1), j); + j = llround(static_cast<T>((std::numeric_limits<boost::long_long_type>::min)() + 1)); + check_within_half(static_cast<T>((std::numeric_limits<boost::long_long_type>::min)() + 1), j); + j = lltrunc(static_cast<T>((std::numeric_limits<boost::long_long_type>::max)() - 1)); + check_trunc_result(static_cast<T>((std::numeric_limits<boost::long_long_type>::max)() - 1), j); + j = lltrunc(static_cast<T>((std::numeric_limits<boost::long_long_type>::min)() + 1)); + check_trunc_result(static_cast<T>((std::numeric_limits<boost::long_long_type>::min)() + 1), j); + } +#endif + // + // Finish off by testing the error handlers: + // + T result; +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(result = static_cast<T>(iround(static_cast<T>(1e20))), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(iround(static_cast<T>(-1e20))), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(lround(static_cast<T>(1e20))), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(lround(static_cast<T>(-1e20))), boost::math::rounding_error); +#ifdef BOOST_HAS_LONG_LONG + BOOST_CHECK_THROW(result = static_cast<T>(llround(static_cast<T>(1e20))), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(llround(static_cast<T>(-1e20))), boost::math::rounding_error); +#endif + if (std::numeric_limits<T>::has_infinity) + { + BOOST_CHECK_EQUAL(static_cast<T>(round(std::numeric_limits<T>::infinity())), std::numeric_limits<T>::infinity()); // See C99 Annex F. + BOOST_CHECK_THROW(result = static_cast<T>(iround(std::numeric_limits<T>::infinity())), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(iround(-std::numeric_limits<T>::infinity())), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(lround(std::numeric_limits<T>::infinity())), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(lround(-std::numeric_limits<T>::infinity())), boost::math::rounding_error); +#ifdef BOOST_HAS_LONG_LONG + BOOST_CHECK_THROW(result = static_cast<T>(llround(std::numeric_limits<T>::infinity())), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(llround(-std::numeric_limits<T>::infinity())), boost::math::rounding_error); +#endif + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + BOOST_CHECK((boost::multiprecision::isnan)(round(std::numeric_limits<T>::quiet_NaN()))); + BOOST_CHECK_THROW(result = static_cast<T>(iround(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(lround(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error); +#ifdef BOOST_HAS_LONG_LONG + BOOST_CHECK_THROW(result = static_cast<T>(llround(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error); +#endif + } + BOOST_CHECK_THROW(result = static_cast<T>(itrunc(static_cast<T>(1e20))), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(itrunc(static_cast<T>(-1e20))), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(static_cast<T>(1e20))), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(static_cast<T>(-1e20))), boost::math::rounding_error); +#ifdef BOOST_HAS_LONG_LONG + BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(static_cast<T>(1e20))), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(static_cast<T>(-1e20))), boost::math::rounding_error); +#endif + if (std::numeric_limits<T>::has_infinity) + { + BOOST_CHECK_EQUAL(static_cast<T>(trunc(std::numeric_limits<T>::infinity())), std::numeric_limits<T>::infinity()); + BOOST_CHECK_EQUAL(static_cast<T>(trunc(-std::numeric_limits<T>::infinity())), -std::numeric_limits<T>::infinity()); + BOOST_CHECK_THROW(result = static_cast<T>(itrunc(std::numeric_limits<T>::infinity())), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(itrunc(-std::numeric_limits<T>::infinity())), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(std::numeric_limits<T>::infinity())), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(-std::numeric_limits<T>::infinity())), boost::math::rounding_error); +#ifdef BOOST_HAS_LONG_LONG + BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(std::numeric_limits<T>::infinity())), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(-std::numeric_limits<T>::infinity())), boost::math::rounding_error); +#endif + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + BOOST_CHECK((boost::multiprecision::isnan)(trunc(std::numeric_limits<T>::quiet_NaN()))); + BOOST_CHECK_THROW(result = static_cast<T>(itrunc(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error); +#ifdef BOOST_HAS_LONG_LONG + BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(std::numeric_limits<T>::quiet_NaN())), boost::math::rounding_error); +#endif + } + if (std::numeric_limits<T>::digits >= std::numeric_limits<int>::digits) + { + BOOST_CHECK_THROW(result = static_cast<T>(itrunc(static_cast<T>((std::numeric_limits<int>::max)()) + 1)), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(itrunc(static_cast<T>((std::numeric_limits<int>::min)()) - 1)), boost::math::rounding_error); + } + if (std::numeric_limits<T>::digits >= std::numeric_limits<long>::digits) + { + BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(static_cast<T>((std::numeric_limits<long>::max)()) + 1)), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(ltrunc(static_cast<T>((std::numeric_limits<long>::min)()) - 1)), boost::math::rounding_error); + } +#ifndef BOOST_NO_LONG_LONG + if (std::numeric_limits<T>::digits >= std::numeric_limits<boost::long_long_type>::digits) + { + BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(static_cast<T>((std::numeric_limits<boost::long_long_type>::max)()) + 1)), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(lltrunc(static_cast<T>((std::numeric_limits<boost::long_long_type>::min)()) - 1)), boost::math::rounding_error); + } +#endif + if (std::numeric_limits<T>::digits >= std::numeric_limits<int>::digits) + { + BOOST_CHECK_THROW(result = static_cast<T>(iround(static_cast<T>((std::numeric_limits<int>::max)()) + 1)), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(iround(static_cast<T>((std::numeric_limits<int>::min)()) - 1)), boost::math::rounding_error); + } + if (std::numeric_limits<T>::digits >= std::numeric_limits<long>::digits) + { + BOOST_CHECK_THROW(result = static_cast<T>(lround(static_cast<T>((std::numeric_limits<long>::max)()) + 1)), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(lround(static_cast<T>((std::numeric_limits<long>::min)()) - 1)), boost::math::rounding_error); + } +#ifndef BOOST_NO_LONG_LONG + if (std::numeric_limits<T>::digits >= std::numeric_limits<boost::long_long_type>::digits) + { + BOOST_CHECK_THROW(result = static_cast<T>(llround(static_cast<T>((std::numeric_limits<boost::long_long_type>::max)()) + 1)), boost::math::rounding_error); + BOOST_CHECK_THROW(result = static_cast<T>(llround(static_cast<T>((std::numeric_limits<boost::long_long_type>::min)()) - 1)), boost::math::rounding_error); + } +#endif +#endif +} + +int main() +{ +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); +#endif +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::cpp_bin_float_100>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_sf_import_c99.cpp b/src/boost/libs/multiprecision/test/test_sf_import_c99.cpp new file mode 100644 index 00000000..3df6998f --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_sf_import_c99.cpp @@ -0,0 +1,2143 @@ +// (C) Copyright John Maddock 2016. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifdef _MSC_VER +#pragma warning(disable : 4127) // conditional expression is constant +#endif + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) && !defined(TEST_CPP_DEC_FLOAT_2) && !defined(TEST_CPP_DEC_FLOAT_3) && !defined(TEST_CPP_DEC_FLOAT_4) && !defined(TEST_CPP_DEC_FLOAT_5) && !defined(TEST_CPP_DEC_FLOAT_6) && !defined(TEST_CPP_BIN_FLOAT_2) && !defined(TEST_CPP_BIN_FLOAT_3) +#define TEST_MPF_50 +#define TEST_MPFR_50 +#define TEST_MPFI_50 +#define TEST_CPP_DEC_FLOAT +#define TEST_CPP_DEC_FLOAT_2 +#define TEST_CPP_DEC_FLOAT_3 +#define TEST_CPP_DEC_FLOAT_4 +#define TEST_CPP_DEC_FLOAT_5 +#define TEST_CPP_DEC_FLOAT_6 +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT +#define TEST_CPP_BIN_FLOAT_2 +#define TEST_CPP_BIN_FLOAT_3 + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#ifdef TEST_MPFR_50 +#include <boost/multiprecision/mpfr.hpp> +#endif +#ifdef TEST_MPFI_50 +#include <boost/multiprecision/mpfi.hpp> +#endif +#if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_2) || defined(TEST_CPP_DEC_FLOAT_3) || defined(TEST_CPP_DEC_FLOAT_4) || defined(TEST_CPP_DEC_FLOAT_5) || defined(TEST_CPP_DEC_FLOAT_6) +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#if defined(TEST_CPP_BIN_FLOAT) || defined(TEST_CPP_BIN_FLOAT_2) || defined(TEST_CPP_BIN_FLOAT_3) +#include <boost/multiprecision/cpp_bin_float.hpp> +#include <boost/multiprecision/debug_adaptor.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif + +#include <boost/math/constants/constants.hpp> +#include <boost/math/special_functions/gamma.hpp> +#include "test.hpp" + +#ifdef signbit +#undef signbit +#endif +#ifdef sign +#undef sign +#endif +#ifdef changesign +#undef changesign +#endif +#ifdef copysign +#undef copysign +#endif +#ifdef fpclassify +#undef fpclassify +#endif +#ifdef isinf +#undef isinf +#endif +#ifdef isnan +#undef isnan +#endif +#ifdef isnormal +#undef isnormal +#endif + +#ifdef MPFR_VERSION_MAJOR +#define BOOST_MPFR_VERSION MPFR_VERSION_MAJOR * 10000 + MPFR_VERSION_MINOR * 100 + MPFR_VERSION_PATCHLEVEL +#endif + +template <class T, class U> +void test_less(T a, U b) +{ + BOOST_CHECK(a < b); + BOOST_CHECK(a <= b); + BOOST_CHECK(!(a > b)); + BOOST_CHECK(!(a >= b)); + BOOST_CHECK(!(a == b)); + BOOST_CHECK((a != b)); + + BOOST_CHECK(b > a); + BOOST_CHECK(b >= a); + BOOST_CHECK(!(b < a)); + BOOST_CHECK(!(b <= a)); + BOOST_CHECK(!(b == a)); + BOOST_CHECK((b != a)); + + BOOST_CHECK(isless(a, b)); + BOOST_CHECK(islessequal(a, b)); + BOOST_CHECK(!isgreater(a, b)); + BOOST_CHECK(!isgreaterequal(a, b)); + BOOST_CHECK(islessgreater(a, b)); + + BOOST_CHECK(!isless(b, a)); + BOOST_CHECK(!islessequal(b, a)); + BOOST_CHECK(isgreater(b, a)); + BOOST_CHECK(isgreaterequal(b, a)); + BOOST_CHECK(islessgreater(b, a)); +} +template <class T, class U> +void test_equal(T a, U b) +{ + BOOST_CHECK(!(a < b)); + BOOST_CHECK(a <= b); + BOOST_CHECK(!(a > b)); + BOOST_CHECK((a >= b)); + BOOST_CHECK((a == b)); + BOOST_CHECK(!(a != b)); + + BOOST_CHECK(!(b > a)); + BOOST_CHECK(b >= a); + BOOST_CHECK(!(b < a)); + BOOST_CHECK((b <= a)); + BOOST_CHECK((b == a)); + BOOST_CHECK(!(b != a)); + + BOOST_CHECK(!isless(a, b)); + BOOST_CHECK(islessequal(a, b)); + BOOST_CHECK(!isgreater(a, b)); + BOOST_CHECK(isgreaterequal(a, b)); + BOOST_CHECK(!islessgreater(a, b)); + + BOOST_CHECK(!isless(b, a)); + BOOST_CHECK(islessequal(b, a)); + BOOST_CHECK(!isgreater(b, a)); + BOOST_CHECK(isgreaterequal(b, a)); + BOOST_CHECK(!islessgreater(b, a)); +} +template <class T, class U> +void test_unordered(T a, U b) +{ + BOOST_CHECK(!(a < b)); + BOOST_CHECK(!(a <= b)); + BOOST_CHECK(!(a > b)); + BOOST_CHECK(!(a >= b)); + BOOST_CHECK(!(a == b)); + BOOST_CHECK((a != b)); + + BOOST_CHECK(!(b > a)); + BOOST_CHECK(!(b >= a)); + BOOST_CHECK(!(b < a)); + BOOST_CHECK(!(b <= a)); + BOOST_CHECK(!(b == a)); + BOOST_CHECK((b != a)); + + BOOST_CHECK(!isless(a, b)); + BOOST_CHECK(!islessequal(a, b)); + BOOST_CHECK(!isgreater(a, b)); + BOOST_CHECK(!isgreaterequal(a, b)); + BOOST_CHECK(!islessgreater(a, b)); + + BOOST_CHECK(!isless(b, a)); + BOOST_CHECK(!islessequal(b, a)); + BOOST_CHECK(!isgreater(b, a)); + BOOST_CHECK(!isgreaterequal(b, a)); + BOOST_CHECK(!islessgreater(b, a)); +} + +template <class T> +void test() +{ + // + // Basic sanity checks for C99 functions which are just imported versions + // from Boost.Math. These should still be found via ADL so no using declarations here... + // + T val = 2; + BOOST_CHECK(signbit(val) == 0); + BOOST_CHECK(signbit(val + 2) == 0); + val = -val; + BOOST_CHECK(signbit(val)); + BOOST_CHECK(signbit(val * 2)); + + val = 2; + BOOST_CHECK_EQUAL(sign(val), 1); + BOOST_CHECK_EQUAL(sign(val + 2), 1); + val = -val; + BOOST_CHECK_EQUAL(sign(val), -1); + BOOST_CHECK_EQUAL(sign(val * 2), -1); + val = 0; + BOOST_CHECK_EQUAL(sign(val), 0); + BOOST_CHECK_EQUAL(sign(val * 2), 0); + + val = 2; + BOOST_CHECK_EQUAL(changesign(val), -2); + BOOST_CHECK_EQUAL(changesign(val * 2), -4); + val = -2; + BOOST_CHECK_EQUAL(changesign(val), 2); + BOOST_CHECK_EQUAL(changesign(val * 2), 4); + val = 0; + BOOST_CHECK_EQUAL(changesign(val), 0); + BOOST_CHECK_EQUAL(changesign(val * 2), 0); + // Things involving signed zero, need to detect it first: + T neg_zero_test = -(std::numeric_limits<T>::min)(); + neg_zero_test /= (std::numeric_limits<T>::max)(); + T one(1); + bool test_signed_zero = !boost::multiprecision::is_interval_number<T>::value && std::numeric_limits<T>::has_infinity && (one / neg_zero_test < 0); + if (test_signed_zero) + { + BOOST_CHECK(signbit(changesign(val))); + BOOST_CHECK(signbit(changesign(val * 2))); + } + + T s = 2; + val = 3; + BOOST_CHECK_EQUAL(copysign(val, s), 3); + BOOST_CHECK_EQUAL(copysign(val, s * -2), -3); + BOOST_CHECK_EQUAL(copysign(-2 * val, s), 6); + BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), 6); + s = -2; + BOOST_CHECK_EQUAL(copysign(val, s), -3); + BOOST_CHECK_EQUAL(copysign(val, s * -2), 3); + BOOST_CHECK_EQUAL(copysign(-2 * val, s), -6); + BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), -6); + val = -3; + BOOST_CHECK_EQUAL(copysign(val, s), -3); + BOOST_CHECK_EQUAL(copysign(val, s * -2), 3); + BOOST_CHECK_EQUAL(copysign(-2 * val, s), -6); + BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), -6); + s = 0; + BOOST_CHECK_EQUAL(copysign(val, s), 3); + // Things involving signed zero, need to detect it first: + if (test_signed_zero) + { + BOOST_CHECK_EQUAL(copysign(val, s * -2), -3); + } + BOOST_CHECK_EQUAL(copysign(-2 * val, s), 6); + BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), 6); + // Things involving signed zero, need to detect it first: + if (test_signed_zero) + { + s = changesign(s); + if (signbit(s)) + { + BOOST_CHECK_EQUAL(copysign(val, s), -3); + BOOST_CHECK_EQUAL(copysign(val, s * -2), 3); + BOOST_CHECK_EQUAL(copysign(-2 * val, s), -6); + BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), -6); + } + } + + val = 3; + BOOST_CHECK_EQUAL(fpclassify(val), FP_NORMAL); + BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_NORMAL); + BOOST_CHECK(!isinf(val)); + BOOST_CHECK(!isinf(val + 2)); + BOOST_CHECK(!isnan(val)); + BOOST_CHECK(!isnan(val + 2)); + BOOST_CHECK(isnormal(val)); + BOOST_CHECK(isnormal(val + 2)); + val = -3; + BOOST_CHECK_EQUAL(fpclassify(val), FP_NORMAL); + BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_NORMAL); + BOOST_CHECK(!isinf(val)); + BOOST_CHECK(!isinf(val + 2)); + BOOST_CHECK(!isnan(val)); + BOOST_CHECK(!isnan(val + 2)); + BOOST_CHECK(isnormal(val)); + BOOST_CHECK(isnormal(val + 2)); + val = 0; + BOOST_CHECK_EQUAL(fpclassify(val), FP_ZERO); + BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_ZERO); + BOOST_CHECK(!isinf(val)); + BOOST_CHECK(!isinf(val + 2)); + BOOST_CHECK(!isnan(val)); + BOOST_CHECK(!isnan(val + 2)); + BOOST_CHECK(!isnormal(val)); + BOOST_CHECK(!isnormal(val * 2)); + BOOST_CHECK(!isnormal(val * -2)); + if (std::numeric_limits<T>::has_infinity) + { + val = std::numeric_limits<T>::infinity(); + BOOST_CHECK_EQUAL(fpclassify(val), FP_INFINITE); + BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_INFINITE); + BOOST_CHECK(isinf(val)); + BOOST_CHECK(isinf(val + 2)); + BOOST_CHECK(!isnan(val)); + BOOST_CHECK(!isnan(val + 2)); + BOOST_CHECK(!isnormal(val)); + BOOST_CHECK(!isnormal(val + 2)); + val = -val; + BOOST_CHECK_EQUAL(fpclassify(val), FP_INFINITE); + BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_INFINITE); + BOOST_CHECK(isinf(val)); + BOOST_CHECK(isinf(val + 2)); + BOOST_CHECK(!isnan(val)); + BOOST_CHECK(!isnan(val + 2)); + BOOST_CHECK(!isnormal(val)); + BOOST_CHECK(!isnormal(val + 2)); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + val = std::numeric_limits<T>::quiet_NaN(); + BOOST_CHECK_EQUAL(fpclassify(val), FP_NAN); + BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_NAN); + BOOST_CHECK(!isinf(val)); + BOOST_CHECK(!isinf(val + 2)); + BOOST_CHECK(isnan(val)); + BOOST_CHECK(isnan(val + 2)); + BOOST_CHECK(!isnormal(val)); + BOOST_CHECK(!isnormal(val + 2)); + } + s = 8 * std::numeric_limits<T>::epsilon(); + val = 2.5; + BOOST_CHECK_CLOSE_FRACTION(asinh(val), T("1.6472311463710957106248586104436196635044144301932365282203100930843983757633104078778420255069424907777006132075516484778755360595913172299093829522950397895699619540523579875476513967578478619028438291006578604823887119907434"), s); + BOOST_CHECK_CLOSE_FRACTION(asinh(val + T(0)), T("1.6472311463710957106248586104436196635044144301932365282203100930843983757633104078778420255069424907777006132075516484778755360595913172299093829522950397895699619540523579875476513967578478619028438291006578604823887119907434"), s); + BOOST_CHECK_CLOSE_FRACTION(acosh(val), T("1.5667992369724110786640568625804834938620823510926588639329459980122148134693922696279968499622201141051039184050936311066453565386393240356562374302417843319480223211857615778787272615171906055455922537080327062362258846337050"), s); + BOOST_CHECK_CLOSE_FRACTION(acosh(val + T(0)), T("1.5667992369724110786640568625804834938620823510926588639329459980122148134693922696279968499622201141051039184050936311066453565386393240356562374302417843319480223211857615778787272615171906055455922537080327062362258846337050"), s); + val = 0.5; + BOOST_CHECK_CLOSE_FRACTION(atanh(val), T("0.5493061443340548456976226184612628523237452789113747258673471668187471466093044834368078774068660443939850145329789328711840021129652599105264009353836387053015813845916906835896868494221804799518712851583979557605727959588753"), s); + BOOST_CHECK_CLOSE_FRACTION(atanh(val + T(0)), T("0.5493061443340548456976226184612628523237452789113747258673471668187471466093044834368078774068660443939850145329789328711840021129652599105264009353836387053015813845916906835896868494221804799518712851583979557605727959588753"), s); + val = 55.25; + BOOST_CHECK_CLOSE_FRACTION(cbrt(val), T("3.8087058015466360309383876359583281382991983919300128125378938779672144843676192684301168479657279498120767424724024965319869248797423276064015643361426189576415670917818313417529572608229017809069355688606687557031643655896118"), s); + BOOST_CHECK_CLOSE_FRACTION(cbrt(val + T(0)), T("3.8087058015466360309383876359583281382991983919300128125378938779672144843676192684301168479657279498120767424724024965319869248797423276064015643361426189576415670917818313417529572608229017809069355688606687557031643655896118"), s); + if (!boost::multiprecision::is_interval_number<T>::value) + { + val = 2.75; + BOOST_CHECK_CLOSE_FRACTION(erf(val), T("0.9998993780778803631630956080249130432349352621422640655161095794654526422025908961447328296681056892975214344779300734620255391682713519265048496199034963706976420982849598189071465666866369396765001072187538732800143945532487"), s); + BOOST_CHECK_CLOSE_FRACTION(erf(val + T(0)), T("0.9998993780778803631630956080249130432349352621422640655161095794654526422025908961447328296681056892975214344779300734620255391682713519265048496199034963706976420982849598189071465666866369396765001072187538732800143945532487"), s); + BOOST_CHECK_CLOSE_FRACTION(erfc(val), T("0.0001006219221196368369043919750869567650647378577359344838904205345473577974091038552671703318943107024785655220699265379744608317286480734951503800965036293023579017150401810928534333133630603234998927812461267199856054467512"), s); + BOOST_CHECK_CLOSE_FRACTION(erfc(val + T(0)), T("0.0001006219221196368369043919750869567650647378577359344838904205345473577974091038552671703318943107024785655220699265379744608317286480734951503800965036293023579017150401810928534333133630603234998927812461267199856054467512"), s); + } + val = 0.125; + BOOST_CHECK_CLOSE_FRACTION(expm1(val), T("0.1331484530668263168290072278117938725655031317451816259128200360788235778800483865139399907949417285732315270156473075657048210452584733998785564025916995261162759280700397984729320345630340659469435372721057879969170503978449"), s); + BOOST_CHECK_CLOSE_FRACTION(expm1(val + T(0)), T("0.1331484530668263168290072278117938725655031317451816259128200360788235778800483865139399907949417285732315270156473075657048210452584733998785564025916995261162759280700397984729320345630340659469435372721057879969170503978449"), s); + + val = 20; + s = 2; + BOOST_CHECK_EQUAL(fdim(val, s), 18); + BOOST_CHECK_EQUAL(fdim(s, val), 0); + BOOST_CHECK_EQUAL(fdim(val, s * 2), 16); + BOOST_CHECK_EQUAL(fdim(s * 2, val), 0); + BOOST_CHECK_EQUAL(fdim(val, 2), 18); + BOOST_CHECK_EQUAL(fdim(2, val), 0); + + BOOST_CHECK_EQUAL(fmax(val, s), val); + BOOST_CHECK_EQUAL(fmax(s, val), val); + BOOST_CHECK_EQUAL(fmax(val * 2, s), val * 2); + BOOST_CHECK_EQUAL(fmax(val, s * 2), val); + BOOST_CHECK_EQUAL(fmax(val * 2, s * 2), val * 2); + BOOST_CHECK_EQUAL(fmin(val, s), s); + BOOST_CHECK_EQUAL(fmin(s, val), s); + BOOST_CHECK_EQUAL(fmin(val * 2, s), s); + BOOST_CHECK_EQUAL(fmin(val, s * 2), s * 2); + BOOST_CHECK_EQUAL(fmin(val * 2, s * 2), s * 2); + + BOOST_CHECK_EQUAL(fmax(val, 2), val); + BOOST_CHECK_EQUAL(fmax(val, 2.0), val); + BOOST_CHECK_EQUAL(fmax(20, s), val); + BOOST_CHECK_EQUAL(fmax(20.0, s), val); + BOOST_CHECK_EQUAL(fmin(val, 2), s); + BOOST_CHECK_EQUAL(fmin(val, 2.0), s); + BOOST_CHECK_EQUAL(fmin(20, s), s); + BOOST_CHECK_EQUAL(fmin(20.0, s), s); + if (std::numeric_limits<T>::has_quiet_NaN) + { + BOOST_CHECK_EQUAL(fmax(val, std::numeric_limits<T>::quiet_NaN()), val); + BOOST_CHECK_EQUAL(fmax(std::numeric_limits<T>::quiet_NaN(), val), val); + BOOST_CHECK_EQUAL(fmin(val, std::numeric_limits<T>::quiet_NaN()), val); + BOOST_CHECK_EQUAL(fmin(std::numeric_limits<T>::quiet_NaN(), val), val); + } + if (std::numeric_limits<double>::has_quiet_NaN) + { + BOOST_CHECK_EQUAL(fmax(val, std::numeric_limits<double>::quiet_NaN()), val); + BOOST_CHECK_EQUAL(fmax(std::numeric_limits<double>::quiet_NaN(), val), val); + BOOST_CHECK_EQUAL(fmin(val, std::numeric_limits<double>::quiet_NaN()), val); + BOOST_CHECK_EQUAL(fmin(std::numeric_limits<double>::quiet_NaN(), val), val); + } + + test_less(s, val); + test_less(2, val); + test_less(s, 20); + test_less(s + 0, val); + test_less(s, val * 1); + test_less(s * 1, val * 1); + test_less(s * 1, 20); + test_less(s + 2, val * 2); + + test_equal(val, val); + test_equal(20, val); + test_equal(val, 20); + test_equal(val + 0, val); + test_equal(val, val * 1); + test_equal(val * 1, val * 1); + test_equal(val * 1, 20); + test_equal(val * 20, val * 20); + + if (std::numeric_limits<T>::has_quiet_NaN) + { + s = std::numeric_limits<T>::quiet_NaN(); + test_unordered(s, val); + test_unordered(s, 20); + test_unordered(s + 0, val); + test_unordered(s, val * 1); + test_unordered(s * 1, val * 1); + test_unordered(s * 1, 20); + test_unordered(s + 2, val * 2); + if (std::numeric_limits<double>::has_quiet_NaN) + { + double n = std::numeric_limits<double>::quiet_NaN(); + test_unordered(n, val); + } + } + + T tol = 8 * std::numeric_limits<T>::epsilon(); + s = 2; + BOOST_CHECK_CLOSE_FRACTION(T(hypot(val, s)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(hypot(val, 2)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(hypot(val, 2.0)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(hypot(20, s)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(hypot(20.0, s)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, s)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, s * 1)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, 2)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, 2.0)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(hypot(20, s * 1)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(hypot(20.0, s * 1)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol); + + BOOST_CHECK_CLOSE_FRACTION(lgamma(val), T("39.339884187199494036224652394567381081691457206897853119937969989377572554993874476249340525204204720861169039582"), tol); + BOOST_CHECK_CLOSE_FRACTION(lgamma(val + 0), T("39.339884187199494036224652394567381081691457206897853119937969989377572554993874476249340525204204720861169039582"), tol); + + BOOST_CHECK_EQUAL(lrint(val), 20); + BOOST_CHECK_EQUAL(lrint(val * 2), 40); + BOOST_CHECK_EQUAL(llrint(val), 20); + BOOST_CHECK_EQUAL(llrint(val * 2), 40); + + val = 0.125; + BOOST_CHECK_CLOSE_FRACTION(log1p(val), T("0.117783035656383454538794109470521705068480712564733141107348638794807720528133786929641528638208114949935615070"), tol); + BOOST_CHECK_CLOSE_FRACTION(log1p(val + 0), T("0.117783035656383454538794109470521705068480712564733141107348638794807720528133786929641528638208114949935615070"), tol); + val = 20; + BOOST_CHECK_CLOSE_FRACTION(T(log2(val)), T("4.321928094887362347870319429489390175864831393024580612054756395815934776608625215850139743359370155099657371710"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(log2(val + 0)), T("4.321928094887362347870319429489390175864831393024580612054756395815934776608625215850139743359370155099657371710"), tol); + + BOOST_CHECK_EQUAL(T(nearbyint(val)), 20); + BOOST_CHECK_EQUAL(T(nearbyint(val + 0.25)), 20); + BOOST_CHECK_EQUAL(T(rint(val)), 20); + BOOST_CHECK_EQUAL(T(rint(val + 0.25)), 20); + + BOOST_CHECK_GT(nextafter(val, T(200)), val); + BOOST_CHECK_GT(nextafter(val + 0, T(200)), val); + BOOST_CHECK_GT(nextafter(val + 0, T(200) + 1), val); + BOOST_CHECK_GT(nextafter(val, T(200) + 1), val); + + BOOST_CHECK_GT(nexttoward(val, T(200)), val); + BOOST_CHECK_GT(nexttoward(val + 0, T(200)), val); + BOOST_CHECK_GT(nexttoward(val + 0, T(200) + 1), val); + BOOST_CHECK_GT(nexttoward(val, T(200) + 1), val); + + val = 21; + s = 5; + BOOST_CHECK_EQUAL(T(remainder(val, s)), 1); + BOOST_CHECK_EQUAL(T(remainder(val, 5)), 1); + BOOST_CHECK_EQUAL(T(remainder(21, s)), 1); + BOOST_CHECK_EQUAL(T(remainder(val * 1, s)), 1); + BOOST_CHECK_EQUAL(T(remainder(val * 1, s * 1)), 1); + BOOST_CHECK_EQUAL(T(remainder(val, s * 1)), 1); + BOOST_CHECK_EQUAL(T(remainder(val * 1, 5)), 1); + BOOST_CHECK_EQUAL(T(remainder(21, s * 1)), 1); + int i(0); + BOOST_CHECK_EQUAL(T(remquo(val, s, &i)), 1); + BOOST_CHECK_EQUAL(i, 4); + i = 0; + BOOST_CHECK_EQUAL(T(remquo(val, 5, &i)), 1); + BOOST_CHECK_EQUAL(i, 4); + i = 0; + BOOST_CHECK_EQUAL(T(remquo(21, s, &i)), 1); + BOOST_CHECK_EQUAL(i, 4); + i = 0; + BOOST_CHECK_EQUAL(T(remquo(val * 1, s, &i)), 1); + BOOST_CHECK_EQUAL(i, 4); + i = 0; + BOOST_CHECK_EQUAL(T(remquo(val * 1, s * 1, &i)), 1); + BOOST_CHECK_EQUAL(i, 4); + i = 0; + BOOST_CHECK_EQUAL(T(remquo(val, s * 1, &i)), 1); + BOOST_CHECK_EQUAL(i, 4); + i = 0; + BOOST_CHECK_EQUAL(T(remquo(val * 1, 5, &i)), 1); + BOOST_CHECK_EQUAL(i, 4); + i = 0; + BOOST_CHECK_EQUAL(T(remquo(21, s * 1, &i)), 1); + BOOST_CHECK_EQUAL(i, 4); + i = 0; + val = 5.25; + tol = 3000; + BOOST_CHECK_CLOSE_FRACTION(tgamma(val), T("35.211611852799685705225257690531248115026311138908448314086859575901217653313145619623624570033258659272301335544"), tol); + BOOST_CHECK_CLOSE_FRACTION(tgamma(val + 1), T("184.86096222719834995243260287528905260388813347926935364895601277348139267989401450302402899267460796117958201160"), tol); + + BOOST_CHECK_CLOSE_FRACTION(T(exp2(val)), T("38.054627680087074134959999057935229289375106958842157216608071191022933383261349115865003025220405558913196632792"), tol); + BOOST_CHECK_CLOSE_FRACTION(T(exp2(val + 1)), T("76.109255360174148269919998115870458578750213917684314433216142382045866766522698231730006050440811117826393265585"), tol); + val = 15; + BOOST_CHECK_CLOSE_FRACTION(T(exp2(val)), T(32768uL), tol); + BOOST_CHECK_CLOSE_FRACTION(T(exp2(val + 1)), T(65536uL), tol); + + i = fpclassify(val) + isgreaterequal(val, s) + islessequal(val, s) + isnan(val) + isunordered(val, s) + isfinite(val) + isinf(val) + islessgreater(val, s) + isnormal(val) + signbit(val) + isgreater(val, s) + isless(val, s); +} + +template <class T> +void test_poison() +{ + // use these macros as proxies for determining C99 support: +#if defined(FP_ILOGB0) && defined(FP_INFINITE) + // + // These tests verify that our function overloads for Boost.Multiprecision + // don't do anything nasty to the std:: overloads for built in types: + // + using namespace std; + using namespace boost::multiprecision; + //using namespace boost::math; + + T a(2), b(0.3f), c(4), result(0); + int i; + + result += abs(a); + result += cosh(a); + result += fmod(a, b); + result += logb(a); + result += remquo(a, b, &i); + result += acos(b); + result += erf(a); + result += frexp(a, &i); + result += lrint(a); + result += rint(a); + result += acosh(b); + result += erfc(b); + result += hypot(a, b); + result += lround(c); + result += round(c); + result += asin(b); + result += exp2(a); + result += ilogb(b); + result += modf(a, &b); + result += scalbln(a, i); + result += asinh(b); + result += exp(b); + result += ldexp(a, i); + result += scalbn(a, i); + result += atan(b); + result += expm1(a); + result += lgamma(a); + result += sin(b); + result += atan2(a, c); + result += fabs(a); + result += llrint(a); + result += sinh(b); + result += atanh(b); + result += fdim(a, b); + result += llround(a); + result += nearbyint(a); + result += sqrt(b); + result += cbrt(a); + result += floor(b); + result += log(a); + result += nextafter(a, b); + result += tan(b); + result += ceil(b); + result += fma(a, b, c); + result += log10(a); + result += nexttoward(a, b); + result += tanh(a); + result += copysign(a, b); + result += fmax(a, b); + result += log1p(a); + result += pow(a, b); + result += tgamma(a); + result += cos(b); + result += fmin(a, b); + result += log2(a); + result += remainder(a, b); + result += trunc(b); + result += (min)(a, b); + result += (max)(a, b); + +#if !BOOST_WORKAROUND(BOOST_LIBSTDCXX_VERSION, < 60000) + + i = fpclassify(a) + isgreaterequal(a, b) + islessequal(a, b) + isnan(a) + isunordered(a, b) + isfinite(a) + isinf(a) + islessgreater(a, b) + isnormal(a) + signbit(a) + isgreater(a, b) + isless(a, b); +#endif +#endif +} + +template <class T> +bool type_sets_errno(const T&) +{ + return true; +} +#ifdef TEST_MPFR_50 +template <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates> +bool type_sets_errno(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>&) +{ + return false; +} +#endif +#ifdef TEST_FLOAT128 +bool type_sets_errno(const boost::multiprecision::float128&) +{ + return false; +} +#endif + +template <class T> +typename boost::enable_if_c<std::numeric_limits<T>::is_specialized>::type check_invalid(const T& val) +{ + if (std::numeric_limits<T>::has_quiet_NaN) + { + BOOST_CHECK(isnan(val)); + } + else + { + BOOST_CHECK_EQUAL(val, 0); + } + if (type_sets_errno(val)) + BOOST_CHECK_EQUAL(errno, EDOM); + errno = 0; +} + +template <class T> +typename boost::disable_if_c<std::numeric_limits<T>::is_specialized>::type check_invalid(const T& val) +{ + check_invalid(static_cast<typename T::result_type>(val)); +} + +template <class T> +void check_erange(const T& val) +{ + if (type_sets_errno(val)) + BOOST_CHECK_EQUAL(errno, ERANGE); + errno = 0; +} + +template <class T> +void test_c99_appendix_F() +{ + // + // Tests conformance to non-normative appendix F.9.1 of C99, basically how to handle + // special cases, infinities and NaN's. + // + errno = 0; + T tol = std::numeric_limits<T>::epsilon(); + // F.9.1.1: + T arg = 1; + T val = acos(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = 2; + check_invalid(acos(arg)); + arg = -2; + check_invalid(acos(arg)); + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + check_invalid(acos(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(acos(arg)); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(acos(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(acos(arg)); + } + // F.9.1.2: + arg = 0; + val = asin(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = asin(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + arg = 2; + check_invalid(asin(arg)); + arg = -2; + check_invalid(asin(arg)); + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + check_invalid(asin(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(asin(arg)); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(asin(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(asin(arg)); + } + // F.9.1.3: + arg = 0; + val = atan(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = atan(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = atan(arg); + BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>()); + arg = -std::numeric_limits<T>::infinity(); + val = atan(arg); + BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(asin(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(asin(arg)); + } + // F.9.1.4: + arg = 0; + T arg2 = 0; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + arg2 = -arg2; + if (signbit(arg2)) + { + arg = 0; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, boost::math::constants::pi<T>()); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, -boost::math::constants::pi<T>()); + BOOST_CHECK(signbit(val)); + } + arg = 0; + arg2 = -2; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, boost::math::constants::pi<T>()); + arg = -arg; + if (signbit(arg)) + { + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, -boost::math::constants::pi<T>()); + } + arg = 0; + arg2 = 2; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + arg = -2; + arg2 = 0; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>()); + arg2 = -arg2; + if (signbit(arg2)) + { + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>()); + } + arg = 2; + arg2 = 0; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>()); + arg2 = -arg2; + if (signbit(arg2)) + { + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>()); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = 2; + arg2 = -std::numeric_limits<T>::infinity(); + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, boost::math::constants::pi<T>()); + arg = -arg; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, -boost::math::constants::pi<T>()); + arg = 2; + arg2 = std::numeric_limits<T>::infinity(); + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(-T(0))) + { + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + arg = std::numeric_limits<T>::infinity(); + arg2 = 2; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>()); + arg = -arg; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>()); + arg = std::numeric_limits<T>::infinity(); + arg2 = -2; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>()); + arg = -arg; + val = atan2(arg, arg2); + BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>()); + arg = std::numeric_limits<T>::infinity(); + arg2 = -std::numeric_limits<T>::infinity(); + val = atan2(arg, arg2); + BOOST_CHECK_CLOSE_FRACTION(val, boost::math::constants::three_quarters_pi<T>(), tol); + arg = -arg; + val = atan2(arg, arg2); + BOOST_CHECK_CLOSE_FRACTION(val, -boost::math::constants::three_quarters_pi<T>(), tol); + arg = std::numeric_limits<T>::infinity(); + arg2 = std::numeric_limits<T>::infinity(); + val = atan2(arg, arg2); + BOOST_CHECK_CLOSE_FRACTION(val, ldexp(boost::math::constants::pi<T>(), -2), tol); + arg = -arg; + val = atan2(arg, arg2); + BOOST_CHECK_CLOSE_FRACTION(val, -ldexp(boost::math::constants::pi<T>(), -2), tol); + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + arg2 = 2; + check_invalid(atan2(arg, arg2)); + std::swap(arg, arg2); + check_invalid(atan2(arg, arg2)); + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(atan2(arg, arg2)); + } + } + // F.9.1.5: + arg = 0; + val = cos(arg); + BOOST_CHECK_EQUAL(val, 1); + arg = -arg; + BOOST_CHECK_EQUAL(val, 1); + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + check_invalid(cos(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(cos(arg)); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(cos(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(cos(arg)); + } + // F.9.1.6: + arg = 0; + val = sin(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = sin(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + check_invalid(sin(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(sin(arg)); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(sin(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(sin(arg)); + } + // F.9.1.7: + arg = 0; + val = tan(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = tan(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + check_invalid(tan(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(tan(arg)); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(tan(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(tan(arg)); + } + // F.9.2.1: + arg = 1; + val = acosh(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + check_invalid(acosh(arg)); + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = acosh(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + + arg = -std::numeric_limits<T>::infinity(); + check_invalid(acosh(arg)); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(acosh(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(acosh(arg)); + } + // F.9.2.2: + arg = 0; + val = asinh(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = asinh(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = asinh(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + + arg = -std::numeric_limits<T>::infinity(); + val = asinh(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(asinh(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(asinh(arg)); + } + // F.9.2.3: + arg = 0; + val = atanh(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = atanh(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + arg = 2; + check_invalid(atanh(arg)); + arg = -3; + check_invalid(atanh(arg)); + + if (std::numeric_limits<T>::has_infinity) + { + arg = 1; + val = atanh(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + BOOST_CHECK(signbit(val) == 0); + check_erange(val); + arg = -arg; + val = atanh(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + BOOST_CHECK(signbit(val)); + check_erange(val); + + arg = std::numeric_limits<T>::infinity(); + check_invalid(atanh(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(atanh(arg)); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(atanh(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(atanh(arg)); + } + // F.9.2.4: + arg = 0; + val = cosh(arg); + BOOST_CHECK_EQUAL(val, 1); + arg = -arg; + if (signbit(arg)) + { + val = cosh(arg); + BOOST_CHECK_EQUAL(val, 1); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = (std::numeric_limits<T>::max)(); + val = cosh(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = cosh(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = std::numeric_limits<T>::infinity(); + val = cosh(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = cosh(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(cosh(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(cosh(arg)); + } + // F.9.2.5: + arg = 0; + val = sinh(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = sinh(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = (std::numeric_limits<T>::max)(); + val = sinh(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = sinh(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + arg = std::numeric_limits<T>::infinity(); + val = sinh(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = sinh(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(sinh(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(sinh(arg)); + } + // F.9.2.6: + arg = 0; + val = tanh(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = tanh(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + arg = (std::numeric_limits<T>::max)(); + val = tanh(arg); + BOOST_CHECK_EQUAL(val, 1); + arg = -arg; + val = tanh(arg); + BOOST_CHECK_EQUAL(val, -1); + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = tanh(arg); + BOOST_CHECK_EQUAL(val, 1); + arg = -arg; + val = tanh(arg); + BOOST_CHECK_EQUAL(val, -1); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(tanh(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(tanh(arg)); + } + // F.9.3.1: + arg = 0; + val = exp(arg); + BOOST_CHECK_EQUAL(val, 1); + arg = -arg; + if (signbit(arg)) + { + val = exp(arg); + BOOST_CHECK_EQUAL(val, 1); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = exp(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = exp(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = (std::numeric_limits<T>::max)(); + val = exp(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = exp(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(exp(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(exp(arg)); + } + // F.9.3.2: + arg = 0; + val = exp2(arg); + BOOST_CHECK_EQUAL(val, 1); + arg = -arg; + if (signbit(arg)) + { + val = exp2(arg); + BOOST_CHECK_EQUAL(val, 1); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = exp2(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = exp2(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = (std::numeric_limits<T>::max)(); + val = exp2(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = exp2(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(exp2(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(exp2(arg)); + } + // F.9.3.3: + arg = 0; + val = expm1(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = expm1(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = expm1(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = expm1(arg); + BOOST_CHECK_EQUAL(val, -1); + arg = (std::numeric_limits<T>::max)(); + val = expm1(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = expm1(arg); + BOOST_CHECK_EQUAL(val, -1); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(expm1(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(expm1(arg)); + } + // F.9.3.4: + arg = 0; + int ival; + val = frexp(arg, &ival); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK_EQUAL(ival, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = frexp(arg, &ival); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = frexp(arg, &ival); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = frexp(arg, &ival); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + val = frexp(arg, &ival); + BOOST_CHECK(isnan(val)); + } + // F.9.3.5: + typename T::backend_type::exponent_type eval; + typename T::backend_type::exponent_type fp_ilogb0 = (std::numeric_limits<typename T::backend_type::exponent_type>::min)(); + typename T::backend_type::exponent_type fp_ilogbnan = +#ifdef FP_ILOGBNAN + FP_ILOGBNAN < 0 ? (std::numeric_limits<typename T::backend_type::exponent_type>::min)() : (std::numeric_limits<typename T::backend_type::exponent_type>::max)(); +#else + INT_MAX; +#endif + + arg = 0; + eval = ilogb(arg); + BOOST_CHECK_EQUAL(eval, fp_ilogb0); + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + eval = ilogb(arg); + BOOST_CHECK_EQUAL(eval, (std::numeric_limits<typename T::backend_type::exponent_type>::max)()); + arg = -arg; + eval = ilogb(arg); + BOOST_CHECK_EQUAL(eval, (std::numeric_limits<typename T::backend_type::exponent_type>::max)()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + eval = ilogb(arg); + BOOST_CHECK_EQUAL(eval, fp_ilogbnan); + } + // F.9.3.7: + arg = 1; + val = log(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + if (std::numeric_limits<T>::has_infinity) + { + arg = 0; + val = log(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -arg; + if (signbit(arg)) + { + val = log(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + } + arg = -1; + check_invalid(log(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(log(arg)); + arg = std::numeric_limits<T>::infinity(); + val = log(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(log(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(log(arg)); + } + // F.9.3.8: + arg = 1; + val = log10(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + if (std::numeric_limits<T>::has_infinity) + { + arg = 0; + val = log10(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -arg; + if (signbit(arg)) + { + val = log10(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + } + arg = -1; + check_invalid(log10(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(log10(arg)); + arg = std::numeric_limits<T>::infinity(); + val = log10(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(log10(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(log10(arg)); + } + // F.9.3.9: + arg = 0; + val = log1p(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = log1p(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = -1; + val = log1p(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -2; + check_invalid(log1p(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(log1p(arg)); + arg = std::numeric_limits<T>::infinity(); + val = log1p(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(log1p(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(log1p(arg)); + } + // F.9.3.10: + arg = 1; + val = log2(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + if (std::numeric_limits<T>::has_infinity) + { + arg = 0; + val = log2(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -arg; + if (signbit(arg)) + { + val = log2(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + } + arg = -1; + check_invalid(log2(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(log2(arg)); + arg = std::numeric_limits<T>::infinity(); + val = log2(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(log2(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(log2(arg)); + } + // F.9.3.11: + if (std::numeric_limits<T>::has_infinity) + { + arg = 0; + val = logb(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -arg; + if (signbit(arg)) + { + val = logb(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + } + arg = std::numeric_limits<T>::infinity(); + val = logb(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -std::numeric_limits<T>::infinity(); + val = logb(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(logb(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(logb(arg)); + } + // F.9.3.13: + arg = 0; + val = scalbn(arg, 2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = scalbn(arg, 2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = scalbn(arg, -100); + BOOST_CHECK_EQUAL(val, arg); + arg = -arg; + val = scalbn(arg, -100); + BOOST_CHECK_EQUAL(val, arg); + } + // F.9.4.1: + arg = 0; + val = cbrt(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = cbrt(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } +#if !(defined(TEST_FLOAT128) && defined(BOOST_GCC_VERSION) && (BOOST_GCC_VERSION < 40800)) + // + // This test fails with early implementations of libquadmath - not our issue! + // + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = cbrt(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -std::numeric_limits<T>::infinity(); + val = cbrt(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } +#endif + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(cbrt(arg)); + arg = -std::numeric_limits<T>::quiet_NaN(); + check_invalid(cbrt(arg)); + } + // F.9.4.2: + arg = 0; + val = fabs(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = fabs(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = fabs(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -std::numeric_limits<T>::infinity(); + val = fabs(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + } + // F.9.4.3: + arg = 2; + arg2 = 0; + val = hypot(arg, arg2); + BOOST_CHECK_EQUAL(val, arg); + arg2 = -arg2; + val = hypot(arg, arg2); + BOOST_CHECK_EQUAL(val, arg); + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + arg2 = 2; + val = hypot(arg, arg2); + BOOST_CHECK_EQUAL(val, arg); + arg = -arg; + val = hypot(arg, arg2); + BOOST_CHECK_EQUAL(val, -arg); + arg2 = std::numeric_limits<T>::quiet_NaN(); + val = hypot(arg, arg2); + BOOST_CHECK_EQUAL(val, -arg); + arg = -arg; + val = hypot(arg, arg2); + BOOST_CHECK_EQUAL(val, arg); + } + // F.9.4.4: + if (std::numeric_limits<T>::has_infinity) + { + arg = 0; + arg2 = -3; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -arg; + if (signbit(arg)) + { + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + } + arg = 0; + arg2 = -2; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -arg; + if (signbit(arg)) + { + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + check_erange(val); + } + arg = 0; + arg2 = 3; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + arg = 0; + arg2 = 2; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + } + arg = -1; + arg2 = std::numeric_limits<T>::infinity(); + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg2 = -std::numeric_limits<T>::infinity(); + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg = 1; + arg2 = 0; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg2 = std::numeric_limits<T>::infinity(); + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg2 = -std::numeric_limits<T>::infinity(); + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg2 = std::numeric_limits<T>::quiet_NaN(); + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg = 0; + arg2 = 0; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg2 = -arg2; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg = std::numeric_limits<T>::infinity(); + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg2 = -arg2; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg = std::numeric_limits<T>::quiet_NaN(); + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + arg2 = -arg2; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 1); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = -2.5; + arg2 = 2.5; + check_invalid(pow(arg, arg2)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = 0.5; + arg2 = -std::numeric_limits<T>::infinity(); + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -0.25; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = 2.5; + arg2 = -std::numeric_limits<T>::infinity(); + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + arg = -arg; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + arg = 2.5; + arg2 = std::numeric_limits<T>::infinity(); + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -std::numeric_limits<T>::infinity(); + arg2 = -3; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + if (signbit(-T(0))) + BOOST_CHECK(signbit(val)); + arg2 = -2; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg2 = -2.5; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg2 = 3; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + arg2 = 2; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg2 = 2.5; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; // +INF + arg2 = -2; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg2 = -3; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg2 = -3.5; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg2 = 2; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg2 = 3; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg2 = 3.5; + val = pow(arg, arg2); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + } + // F.9.4.5: + arg = 0; + val = sqrt(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = sqrt(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } +#if !(defined(TEST_FLOAT128) && defined(BOOST_GCC_VERSION) && (BOOST_GCC_VERSION < 40800)) + // + // This test fails with early implementations of libquadmath - not our issue! + // + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = sqrt(arg); + BOOST_CHECK_EQUAL(val, arg); + arg = -arg; + check_invalid(sqrt(arg)); + } +#endif + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(sqrt(arg)); + } + // F.9.5.1: + arg = 0; + val = erf(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = erf(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = erf(arg); + BOOST_CHECK_EQUAL(val, 1); + arg = -arg; + val = erf(arg); + BOOST_CHECK_EQUAL(val, -1); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(erf(arg)); + } + // F.9.5.2: + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = erfc(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + val = erfc(arg); + BOOST_CHECK_EQUAL(val, 2); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(erfc(arg)); + } + // F.9.5.3: + arg = 1; + val = lgamma(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = 2; + val = lgamma(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); +#if !defined(BOOST_MPFR_VERSION) || (BOOST_MPFR_VERSION > 30103) + arg = 0; + val = lgamma(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -1; + val = lgamma(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -2; + val = lgamma(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -std::numeric_limits<T>::infinity(); + val = lgamma(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); +#endif + arg = std::numeric_limits<T>::infinity(); + val = lgamma(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(lgamma(arg)); + } + // F.9.5.4: + if (std::numeric_limits<T>::has_infinity) + { + arg = 0; + val = tgamma(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + check_erange(val); + arg = -arg; + if (signbit(arg)) + { + val = tgamma(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + check_erange(val); + } + arg = -1; + check_invalid(tgamma(arg)); + arg = -std::numeric_limits<T>::infinity(); + check_invalid(tgamma(arg)); + arg = std::numeric_limits<T>::infinity(); + val = tgamma(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(tgamma(arg)); + } + // F.9.6.1: + arg = 0; + val = ceil(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = ceil(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = ceil(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = ceil(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(ceil(arg)); + } + // F.9.6.2: + arg = 0; + val = floor(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = floor(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = floor(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = floor(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(floor(arg)); + } + // F.9.6.3: + arg = 0; + val = nearbyint(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = nearbyint(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = nearbyint(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = nearbyint(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(nearbyint(arg)); + } + // F.9.6.4: + arg = 0; + val = rint(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = rint(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = rint(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = rint(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(rint(arg)); + } + // F.9.6.6: + arg = 0; + val = round(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = round(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = round(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = round(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(round(arg)); + } + // F.9.6.8: + arg = 0; + val = trunc(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = trunc(arg); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + val = trunc(arg); + BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity()); + arg = -arg; + val = trunc(arg); + BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity()); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + check_invalid(trunc(arg)); + } + // F.9.7.1: + arg = 0; + arg2 = 2; + val = fmod(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val) == 0); + arg = -arg; + if (signbit(arg)) + { + val = fmod(arg, arg2); + BOOST_CHECK_EQUAL(val, 0); + BOOST_CHECK(signbit(val)); + } + if (std::numeric_limits<T>::has_infinity) + { + arg = std::numeric_limits<T>::infinity(); + check_invalid(fmod(arg, arg2)); + arg = -arg; + check_invalid(fmod(arg, arg2)); + arg = 2; + arg2 = 0; + check_invalid(fmod(arg, arg2)); + check_invalid(fmod(arg, -arg2)); + } + if (std::numeric_limits<T>::has_quiet_NaN) + { + arg = std::numeric_limits<T>::quiet_NaN(); + arg2 = 2; + check_invalid(fmod(arg, arg2)); + swap(arg, arg2); + check_invalid(fmod(arg, arg2)); + check_invalid(fmod(arg2, arg2)); + } + // + // Bugs: + // + int sign = 0; + boost::math::lgamma(T(0.000001), &sign); + BOOST_CHECK_EQUAL(sign, 1); + sign = 0; + boost::math::lgamma(T(0.5), &sign); + BOOST_CHECK_EQUAL(sign, 1); + sign = 0; + boost::math::lgamma(T(0.9), &sign); + BOOST_CHECK_EQUAL(sign, 1); + sign = 0; + boost::math::lgamma(T(1.1), &sign); + BOOST_CHECK_EQUAL(sign, 1); + sign = 0; + boost::math::lgamma(T(1.9), &sign); + BOOST_CHECK_EQUAL(sign, 1); + sign = 0; + boost::math::lgamma(T(2.1), &sign); + BOOST_CHECK_EQUAL(sign, 1); + sign = 0; + boost::math::lgamma(T(20), &sign); + BOOST_CHECK_EQUAL(sign, 1); + sign = 0; + boost::math::lgamma(T(-0.0000000000001), &sign); + BOOST_CHECK_EQUAL(sign, -1); + sign = 0; + boost::math::lgamma(T(-0.5), &sign); + BOOST_CHECK_EQUAL(sign, -1); + sign = 0; + boost::math::lgamma(T(-1.5), &sign); + BOOST_CHECK_EQUAL(sign, 1); + sign = 0; + boost::math::lgamma(T(-2.5), &sign); + BOOST_CHECK_EQUAL(sign, -1); + sign = 0; + boost::math::lgamma(T(-3.5), &sign); + BOOST_CHECK_EQUAL(sign, 1); +} + +int main() +{ + test_poison<float>(); + test_poison<double>(); +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + std::cout << "Testing MPFR: " << MPFR_VERSION_STRING << std::endl; + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); + test_c99_appendix_F<boost::multiprecision::mpfr_float_50>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); +#if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise + test<boost::multiprecision::cpp_dec_float_100>(); +#endif + test_c99_appendix_F<boost::multiprecision::cpp_dec_float_50>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT_2 + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); +#if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); +#endif +#endif +#ifdef TEST_CPP_DEC_FLOAT_3 + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); +#if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); +#endif +#endif +#ifdef TEST_CPP_DEC_FLOAT_4 + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); +#if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); +#endif +#endif +#ifdef TEST_CPP_DEC_FLOAT_5 + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); +#endif +#ifdef TEST_CPP_DEC_FLOAT_6 + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100>, boost::multiprecision::et_on> >(); +#endif +#ifdef TEST_CPP_BIN_FLOAT_2 + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif +#ifdef TEST_CPP_BIN_FLOAT_3 + test_c99_appendix_F<boost::multiprecision::cpp_bin_float_50>(); + test_c99_appendix_F<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100>, boost::multiprecision::et_on> >(); +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); + test_c99_appendix_F<boost::multiprecision::float128>(); +#endif + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_sin.cpp b/src/boost/libs/multiprecision/test/test_sin.cpp new file mode 100644 index 00000000..07714f5b --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_sin.cpp @@ -0,0 +1,373 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_MPFR_50 +#define TEST_MPFI_50 +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +struct has_poor_large_value_support +{ + static const bool value = false; +}; +#ifdef TEST_CPP_DEC_FLOAT +template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> > +{ + static const bool value = true; +}; +#endif +#ifdef TEST_CPP_BIN_FLOAT +template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates> +struct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> > +{ + static const bool value = true; +}; +#endif + +template <class T> +void test() +{ + std::cout << "Testing type: " << typeid(T).name() << std::endl; + static const boost::array<const char*, 101u> data = + {{ + "-9.71360659712083391437631022096936715962104815777147739346439739644168480837178969413799829610404829247283169084501281105e-1", + "-5.95431113317256105006804890684659010940293672390817519158205264611725147142085353698349092164137652363446368483953564682e-1", + "5.09924118934356013545988500545586843463766955556781588535384546070893806324487181574368899833574915659357543038822935347e-1", + "9.90602974910637417521410554344955057938063175873799034495811832851567842600306335485818201417146475654562543760051881571e-1", + "2.57755634110962773819397192502372718147953063328591480930319110437537556577887190430547163274290595074462686853519200826e-1", + "-7.90852129665907861812449876176102241731921451584589870529143390612597378289323905030142878920134443274067663564142249906e-1", + "-8.70636054394434218558219672958497111094237434037462776135170928197514857325641761722162169311905082223410873872693125021e-1", + "1.16142192225871586802402588799179588339908282696987123538816621894316618250692422106879105583060486278819650782761165055e-1", + "9.60641850565339311654365605083646127348817546384991780755200411966145627086231307074524787693440076802209868233548778731e-1", + "6.28318825240308217440049590303028869715272770671179428040549526344092598897275498972932981684079339892035243316790587027e-1", + "-4.73718579778960595001132927360485548840577209745936881040433718918629103032639945353908537818475936329314134212199346978e-1", + "-9.95432766494621395340223548609251497842694553405493731879049259799325119533316838972006879914623359183523219011870805961e-1", + "-2.97704078652633309130390182393607392013126109733352620573058826659738026681661456497779386104992235762190242017128767206e-1", + "7.64723391125286889782047394187107836056829439952009227196240883193721606229047061163517791688110517783506991004016374431e-1", + "8.90335717074674250432504838435892622513509178529392798127561987551398090841490265311069534613651712468228001675091153605e-1", + "-7.47469618974513669394515485690188234127771130501791709462887130373371023385813212165673231177548426835629029005547008861e-2", + "-9.48261778982069330544079494960981900232314056127899219497335245577354566418258722147558010380033694835705634428764954401e-1", + "-6.60119969404606610211922488494059074732492583049845598285779387022002845776084527598443564095143849120847643366330179739e-1", + "4.36693827009658961576344650626557410722590226545637608661764593658572210930294024902150766064738444736422263939746970132e-1", + "9.98541130824430070642243744636010968399851408459030982248969144276197147611376115185206245742327729890090526273555800490e-1", + "3.37137695943362070360548307779555944485385294617304662646987679063953108310365389494460188124285214040163147170304540339e-1", + "-7.37272196933518190054375156317136276073182897209685319124536092629865074949247291797880288692223977281455156619510259042e-1", + "-9.08495699506960201290293288218820500948312195353635174830883006841931398581001427066173033535720385301624330783999899511e-1", + "3.32224697427099307204044509056982627738295866011152619834749776109067529453431741767996787924292629814505731320175556430e-2", + "9.34241854135599266375493853147210486293657026766576383005045752264274587199837314096798394557243705656211732557069413970e-1", + "6.90779551281016826784976005137338585011513089446563025258584317423906941741640583083551185645679047405447557105684226754e-1", + "-3.98913888475082839741071010629509607776766095858433376450534753556286110518195743624946499527251336022805096741714382999e-1", + "-9.99922692526403520897313527841668431397204867244750030781062964701898557028332255650446046614062333174844253917288331438e-1", + "-3.75988292423704532504216998833472116186771022412627192871974303806891208635376610998425108046077306043945435504842144332e-1", + "7.08546019140379445669962535829318394094758212505515423960726677977484727061149949358051741627739138448760095710063342839e-1", + "9.25084597170819667485373176055260044057716794391569156042799693611964098948722923916237050181882167134906470192542857299e-1", + "8.35947487571472125423673177137150279693224632368449469153892167972732129345714981936363891382927399742266512920038864004e-3", + "-9.18606321039298722214219289469027246078943851192917449117591801249272620492502932760495762195965214412326830491755901723e-1", + "-7.20244550473164405555518647469765134103488938825118543602681358279149452868549672550326500728323814331193184035259160414e-1", + "3.60444097985855629825697367385029316833790934188475151408740160657889784929257301330229580694580194294034115152177674537e-1", + "9.99575062430677992414643463029115424067356090568060307410717467085018957489304987413609313388961297483138454662118061646e-1", + "4.14188682766963304833862149212585018360876819555612195218295874225032162838027842720351664698295767693697842043579048219e-1", + "-6.78594534657286312316409269272929566493548786915986771929001823358451551885758307761400157853363173388867780400090112946e-1", + "-9.40073722462713282312837596921874850901167502371739429501407718251639587081137893231736511487958940802467918593519005653e-1", + "-4.99269632411748222821310824324558181913141458235676771744322439351386139493233963671531219603373207564905654915871172017e-2", + "9.01382218619061521491363679812206948759377256420255657634443270431495336446996377562469573885297156497163691224107230524e-1", + "7.48464012406957686684753003872919309910943477238245908909177973105841950470333390670719219379167068809799710776770734833e-1", + "-3.21350982331168500558883709193541886146178412146971245706190880193067020283050714591560922441331235332970961845050217575e-1", + "-9.97498841702838239659412520756556451623238132913559678626409839807628110807613195403956929948379909495726426243705794281e-1", + "-4.51672806064485973599605876288778011355969815150135195358334589946828629430271875346142404286368814526016297993583170592e-1", + "6.47469539349743367777844577149239337681085253251300560380374646379682072633705733561446355539618404778987844138766238618e-1", + "9.53437154306238691456130012770111782377503876017231780889420296856266641153714110120975772709549811845909173386912105405e-1", + "9.14081116365893107669584386407698218216480671014671832303147213716318806206478591012619084058741626713939006968851852873e-2", + "-8.82599332954202005638662236444958997569939600897565089251125658458817750203393016337212996488633688567918453254294067039e-1", + "-7.75389136447631492669594511701990356678047393586968390929688701894781023967621486245394406725747074772996680491766725244e-1", + "0", + "9.21877670451674413245307018032333288624288893879527153976730741889055419244554390143014969580425598422296522787223865492e-1", + "7.14420247379307162288182477560228852605155250738051326022559557923361829606843109334201812861061126243914893718333771523e-1", + "-3.68229061503980158220203193441625324286779814470455045264018328963975686564161509474566417124652588774892207244798533238e-1", + "-9.99783810945210864429782835782052003838999970584938136857974918523615732378678641269300999292060748749245257644847852880e-1", + "-4.06565491434208630299086167510578859920684132980243005899494321151205958987020300473732138517681916554185382528057861016e-1", + "6.84710967469127345624707128760638003100107237269026812211460044517359789036617753689648451870956943571853410785082804567e-1", + "9.37190534692875414284475879207349713030454322911019395907169592096165438597133651606167760904128838721803617281109050826e-1", + "4.15761692057244148543310701200534576325308397337003695681679007540324069366547327722258885686349619359915993749152386902e-2", + "-9.04970579658619470380865991258110513843850446973806499697900678159194774744593408797468966041695053471205276923200577190e-1", + "-7.42894062146919717307486895770712177633720181625852464705801879158549930143011385755502810839808877188169347497140463278e-1", + "3.29255843672460745277513964057060067396377984587222455665841087186879420769340447084849343957766905952270152874052907066e-1", + "9.98054859318969984153930327705164465077718593220578997216979734167429154849012382322757855259404199572095265136279871773e-1", + "4.44198837297768694342150710437773511448850303134514239359160353596186338967438818161771076138440975975069051604632938785e-1", + "-6.53817599431343721060913145888825198919543068369083977787231740776950274433927919565042681494795499030972133972973154991e-1", + "-9.50882691455803790808811011811129940528171185220498569922200361836899859377942311459807744784166538095896117442350480286e-1", + "-8.30804396823694462619418608693397504202900045660409997788297791645107264729830105800672434941805906654953509298579082883e-2", + "8.86498500176738212245618093138553877114943127333459437678466772704535139826656179981455385901664422134192971441152486596e-1", + "7.70083171278361495868782270594413506070341191348346709317329019377797940394556787220273230008072684372906392335068211595e-1", + "-2.89713235318575682157337623325710322388267200178020040738121279630672170355171163891332847251952971324782327373734923025e-1", + "-9.94599945986602107902462030221489305674036413322184167100620086215068494963807086265519051279456167270901961176645890910e-1", + "-4.81064018790479216363003919039401079745827607566793090566247167201506427394383426836725220489510187378030886775425254046e-1", + "6.21793567954698234151923123976248746751871911018984490371928031737872104124834908200003970971778452547150523318639635937e-1", + "9.62930462544790791995256817531759605974030310743258985429278608944994805716203043054967792555227147404499205611680348343e-1", + "1.24441037037160425420824052419427892644210865386492893504553391973646623439822770473194845274620957661128504291608680469e-1", + "-8.66493376243885476034533210550037276824055111358129259572484897399197578809821587005093985112028866251515011805996119334e-1", + "-7.95940555954229526911811786010975888490876487056728372525209250018208474961217211282867562886053609351620626802054272020e-1", + "2.49669618482792917975718339302754781070461300705127317300546100189317933291972223791458678771914034385073586648459580423e-1", + "9.89425045617789945796335206411736550560149597573171983909624851636680028232543261568285131480585113303281176722731984359e-1", + "5.17097284014384149171097163430722725596083616428334032893201431916692899725128152827282357887267679461332587145165393473e-1", + "-5.88694253013035419947972745515246684318073372460957150709985237608958241550865774225576562359889367149484593966586261944e-1", + "-9.73313013442224866478107643999632554759604190263325143130961313777287157745245701134838602677190253924612391775436901182e-1", + "-1.65586435334914172055850479429458408174448669771862313204835451683387762284114799645762688524058144409210946183564694437e-1", + "8.44989803230758608979729460217254170202748876564967551526138387646760352687916491884649142029664716335759879232648284164e-1", + "8.20421500340164168068753907367027481963552257850283600606773656660614708517253273174848291641569969886126754639035754147e-1", + "-2.09194241612317592929856274655591551278574667482924447651723415490434554354833563537792618079275726893013991849104465053e-1", + "-9.82539107299636472172005507105476251789057582568202763534005396813858490465264145708502581273803767931004018272989858624e-1", + "-5.52236319725534543207688775430217404447704139560595336544456138148662731976576062425879410116209671353021251780801885578e-1", + "5.54576894095302137473562870411642498454159878739464625116831971740997730359915227524075717328436463081497500485416831879e-1", + "9.82012389338213987427432686899213579991770436451929205950504261612336440523069987734051927060071228336651935114247230018e-1", + "2.06445480789661722781085666935934466710665000093111315471318244086154187788240397407764949071589419997001126229699279918e-1", + "-8.22024967814241172490083350373664443948382772873119098939533117836179462362265599942085298240078400862839510315401568501e-1", + "-8.43483668915081157881609334416452212500481988371373212797897630926101856989377353686006695443683562952698091745372956064e-1", + "1.68357099807987317797633647903674089665368628422558854222230995142941489911909308417314277825877040168111682241442337249e-1", + "9.73954039060780508698548127540108987785881109985102169990241290387386676882934112332475075476604334818263785540220696343e-1", + "5.86420359093869515237687266954561200160006212641211187483350874672859136679499954407470935299385535928011115437979374327e-1", + "-5.19500491219840443397382144913775579016253538466887540765306393159738082663675375499840773403952929977354698339617261390e-1", + "-9.89013546180296021750901758474634735102493497248279924875522015911873550276888689676425102442986261848126775556194306727e-1", + "-2.46947514812703938169894550153319655995779907820829748198209521180129269232387596803077057086642606505827139155491603712e-1", + "7.97638583669534812597149574893980942155226403291812660315816507318428697361476484505958849067790885048775312980075497096e-1", + "8.65087179683067252708187359165577777305998628817518314353161876891989239932835217904989326717355654871984067712207255166e-1", + }}; + + boost::uintmax_t max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + static const T euler_gamma = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1"); + T val = sin(euler_gamma * ((100 * k) - 5000)); + T e = relative_error(val, T(data[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + val = sin(-euler_gamma * ((100 * k) - 5000)); + e = relative_error(val, T(-T(data[k]))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 5000000000uLL); + + static const boost::array<const char*, 51u> small_data = + {{ + "0.010890646307437399028563191160252839599929232814970922208664909237494716181484215717644776933044418903207919912063594159099133490979634344811936925144447725948305353257042599564404885434349760121009797816724142318243738364307036155852011004353462651092012819894667485840322627440332163428546845499107471983896711023161969130462687924045508477090891879273259947713367290982391204265694893491531721581439", + "0.029754394000520972141380267705677256353702996169858414168445272181777338962866552847084800544086743338130195210005002660881957584567978770485056322086472328896988088721899728258224129935989180857437073412730903070983582129359565450458299328041955729258476583848159389714290107649243089149974776893563078190705561325124542669960182002956940545214147678093802442811362846262655415145897575707676223535749", + "0.04860754948595027759689273751438643634234576398271158524070718139962965653841137425728738193533514318422431877217110239554743968609870039776938201724688048349972662394084789924867267405853696017478160702683117974766657840965270625814482422398422216605490620054574252910928068433847115132429726072853170339113804838625536981361490008602432476302086066307320875870985443111858828925332085101376920451257", + "0.067443401266329792365583268418977022587089806595860818790246293104463576184436096833111903064801552379988362224633198052490234517656318474005568709048710308123967082103235230201516378834855764348740505470176912466587139988300259624310153055247378188811239571439869254255368050758213303082097176168650573121101094016896349982672715603054645687782535250201448606757920212668324401846105554332382154705308", + "0.086255244004175604199645786226683865650130764638142939010554245919172299560583634262067769465886944689883333394099120765964771092069938753689253686543017871063587988437235057514131760587649504670117933814486942187589706655157340717185354058186603027300571692666150552274324933749082047517987509942119060274537912867956274549119040817359639741746006374702951412541338483858389306953539029174581171144916", + "0.10503638090893519164596691292161072193010174143933600597680115817738720676321226654184308409972393036413684625874294713490753271261380987552528236660688624108474124469034444076627315674234385578608111398112242272762722849083801773818689342174907858373883192220827687618321085007917387951532673599267211035785307947515638810735621964273183425401191468313574763898720597251843424536611952986478638938787", + "0.12378012612096459891996422671239906394195356627713556749926735466337892925173796651675302282473738808218327028589606894825728784823540605065317506645900565980161901287116410208049542818796994171203890952761651470187834173644651508025088970034800067245131759655003164127161058084682831906406941473650395873577925901419536540828468001386512234321890242266327761400155849351025221609783793228816606096155", + "0.14247980709161433833827358255114404185333478069639957369769805221957506649654851981837061160249376538785737485777248817812720592537597263252706422066438137522011148566625861552209380620325080441618503257506798981598559897331754555335688284111417797211888381141445522536739542765207936516297907076923899840216864191777039028622886076254231994264908278499537587536902686114072117102531777746791366147472", + "0.16112876695857673825462942280040873226725445145336882995544646098546697397681955191516861690559627281570477802647683153249828731761062718487424104325152088763220776831248566486363299448443795266104568555186977695939803420793575204146124697832793773870449082377964029658283741910741804550762511379894890589132658450368609377005630322641674351408014813725947288936865021810537922503050280596331958949813", + "0.17972036691564914131189073707203611766536704952071818203835281740755093560444625679032703078557333645546302532200674729781663838075105196332695024246509042831095553050804767663788014113177991938252225120228302734228632787082072480689719322299247090887229731260135165819595797392665106642595359433094386743214852929965104946276195924300495453775467378376551444126292108291215861133471208854009513721707", + "0.19824798857606934571352609051549058593435535174283382080060738672122306773474119459815363636791069253463660528114022041674780565798655265640072669329819802234483545444085426470661233958030668844326674768815456315879868376252722369574694411591080512527683145774214215193268992508938562109669843137270238454905091555179756374512457742554641355319960601765568460966738628365652972463731882673979926092423", + "0.2167050363285819704223187876642169717474346025766606244643176750460657731203611217470241676182041675112171974414875203007374497968642376196256262296063879827128970901451226217571636202438144440234868076467587220541438440149682254317134405302648426790500751310485432990930185087578150399032543990173811106465656404530116032387260432178319507278340110997943206401370789106214680733463126804159766688178", + "0.23508493968539701289801441539326267060915175918342580386836036980227948313782327655061004506711767031388143537081826986030990557707922203603349984851809173788402101756510017046639631528282698404857654444279509591873678208318484036337040837844539190863615310872984455261973647897667843302241773795592355085118273592671348602240382153223466391512738221253451636183066773121830262978729780866153048605159", + "0.2533811556212047542679161173582151227103672187769971543582388259784795155332622779547839459016647290250036005712168909799523370471647322112833886051217950625710683025675691585734514265087749450457714578451290681140064635291501640395753290532318406110106892218388811781561305402570000283806458134435822529043797962340420841850011846648265787470508569124672250211852546600514370101687713861131209463861", + "0.27158717090241435065755609312085387589073221253701701142877476904254125053252466469600403650634482409879186635717002370089097070045821182432642232618427944489732133359996899812980722107011126957850576210476679069162561257167921627603536603943342268770727524690332400255408587654094512383349857596775777725888982277559281982571487656535560758087235441872907962373375423740325723506626374882319859924962", + "0.28969650440578692965912855479777150523900698183973110358010443581781966348171378962307935462457921708108325003566673849851640304571019200113280406744551445148200341554501141174444530008329262826786160080931309057528673711507934822659456861163197618813727062179453555460400169858233923358238607875306523866767536243361049306545596678120228677505849040202788510059415993219975440657979707947898632705847", + "0.30770270942563778634443222550824378057595253208974144909939396933701715445493088586920897452838893301853350676955400357197838773823140696209649573828382477454711986806154497998912926265388494228459988323524548750870702083339285969468391846533348589851520262990720843670148790211009236063622194282315540801467216625666505663699480592080398449845511909092071640909885054719301078547683325662349532658001", + "0.32559937596878634249263192973385963275552570142977727375619908690982968889531407133936548327912894149757305868454394002531385820341045863161146695151908269553629121372700695833373968533510661265854738947940689721812230819575490874211279007289828369964583273676393398981064015459284982970048174649094549631109312941188691838118955683939990881732219088392629316401227525790752712758279892546851835776728", + "0.34338013303643689435259984865624959352259286039436985939426483729323987764837568376066164703227630278807584950278626035763399164177429894322425866236150336898079573258157833074772287354310049676029566569737995054499018518699450946056626536479822852758163848528920078247789349605898976290484284018984355696648190967701849464571286257873661615051036433297599097073117151941857301740816310919312668936753", + "0.36103865089217782674224266392907326208964452822379102503439414768728197653534265911503054023760783622236800804794470785631737993143180071550223728801984904852623160397230839644629077782630949486339104760008566935013234195735777070582106661423219379374522941522832331186147905332977726043795737008218909226025962294880541867964419424128310806148008435847967256901208159302482322730929744194185143496647", + "0.37856864331529191294683302986737462527422720295203122486985051910813389831630458742420433021640718832999264813674938157273375290592788753133996741859965258034273428657399863159488519434113093863042179261649202584979828347495161391780592433454809420632605178105958049630938532568156789806946629309375790343585791884755866400295470651281289167454617624179556306285775538273640784278475358303871406797294", + "0.3959638698385755489557710011250921602780605301308457595569865098132061251227321128681128349835212212508810246299921462519655630208347321575504292305860152320513799100372630595769065936291506594220617567642210250680560302662459931036815131767702563357378794733903424219866581554015722958062178902473414883933807190920961687912191470152974845756609418554739641361171541363409996648143043979357302190703", + "0.41321813796987028521091431473013916161596830805293649687424341688961507413716621591649879163383882641673238540682782626959358955002216003316726344623613626809950993449214457071292961126188761860214007662067345193545393653191742497646193189677890657992964660139924463087072704096969748995358605459064076775540679952182100013584273877612509536257834358450242426357122974687246428904315337788603554112487", + "0.43032530539651581726649227346608528709372859200683817125277384462849187532000288969537766724897319030479860713591459932866508254904869456423088312945970943686450425589907227275358186473310644458353392107693439475272544181726520566221333846008220008702070460626739342310039148106649726719665728169819714333172605016313499067227953767878741853545763313707499816244740855778447731454065384788859848319503", + "0.44727928217193967651655712666040617006236300257644793444619887007723922383970962870988815495150987337761018019128790177957898245520422485269324604484642139354461290347689315448558082058132330317789105861674569680430563377440355102600184370927625450804550114009478901349833826102470780452480255838220723171955252412104006070322080932915859579006653276371401264439817338080069936810866666557553662506811", + "0.46407403288360522126660904671571257203469668709200603873826642103612288853249598361813813213381052968904786566929537791978751985511297321991996818974870946807510786919602279514706154473236597480481149516597293844121405001964448599792635426082163120478756812832932606227610137817312140031064078333902425335570730565173883252754294319888872518149175050583958244086010074110878967984441526026195572046031", + "0.48070357880154616464768530714893198018226307768872832018696934136162055774617690112915494983829868655926209174893609677823844628976682666861087174925649829592164380174433963170047900751735818142724368678683601091750819984658303806035572915499999180599872513173096429390456178642478189724903758698238722978406369084171804020040246631229610021517925007543961283845124822740019511921386188934760298241688", + "0.49716200000672278683141570737786924159326600032981923078600441023882683095816876734389429898823686013764499093454507915253215528870989821318738227798745591597923864925733083640574132559603114206682739488541451077277291582357627881380008066440685837422009543184722898767087492264154499861112499590934108906196324393034778681622285346845867860458748417916763883649390228287689107774312170267691257606116", + "0.51344343749844216224309565441486087365890516381683759696704839526386373494321578458551193514743669178342420835082611868891019193801223760604220552152028015878259509179672236586872004169442377393342941368136686044214656339879518691219516228434732537186028321245942076903928921929607502848888640267094590400556200402256089794954485061564115688273804254406706725374971267431122825004095102239220991848356", + "0.52954209528009218542956877037980380998240467111773187487177084701668417706002935457309027480414979338624119758863233287969233845786459113619958146654397106933375312089626001011352424174223416515118670901639015699899005014886945323983797633471828049323917701068414699189471811508040323789047713536270617216249222074877291822920747392986535291960399633972613345908694327479738445245500914715996152461985", + "0.54545224242244689926647810432697721723945987179773365856990386707254353534614807468692870318816991084937065603191754270239773531928848863926268254420020634174904439920465735399587679402503040251639815041072160696029528969373711375024524059535996077596844557011786411865071706766713049961515353664484996577751962474564968659755104983468313555304855249829815310291744255989014492588353749587481644931913", + "0.56116821510380861353700162760755101727268623115746212675907859515911800480855365905235006799852352328451502804871577600277181740574994973635138803211912076695967558806493981733454148905054449991651227073996616835900542604367257843601995979944175684600136575098939764120745952964355353589317556067474680987527548079297833539998258342242865222215681747969549869015697939554127499557081626950060916329896", + "0.57668441862626054773920164705882295031880435874490231795930393597704964539534854834250638055542815083463738683146430082379073149079998953871974990605030531115748567904948229002538680465351816034414085890696196467615521969543006224204433997063527288514443404935419253943724579872472854300703798475966107579038880496698051818375532546368197809806544115496171522444187250876233927302975709248591908972346", + "0.59199532940731223634617420193837196766186356068263223313261061480558639436412180991021350240470913092271149633483820904350945127229180169976070379470147429711011056203078210298313829635000565303787641997857930629432231274870246836108452732993007541125359738273485061324228778750531830069944570036169084871305329515261365955383178502917713214334808810726412625844210978481512366368025275438632291862785", + "0.60709549694622869462483067245797028399468956070763942538530335526853282815406226053099893555611232739741099281199863420254333016184720313024881100010161759837083928797224725640021095785125988238992410296927225409984765886863313873892022531648958451940083661715815760806237878803609330649695132473889046508160482887768573723088361332267243452286610176948724186843039692112797106039213976473403724518188", + "0.62197954576434335539696684219824327976988998993669475584026026679831221725774460365328908947620452777457191790806959938899059379387140391128845696987642418506611453321626607869801717870254836897328796165084605948086983949944714226464644755644542238083403302661596239269476252222614109836597348873471190787660391585694078779921390758232910639208518119325492789999941075221166054973249356136808607130253", + "0.6366421773186640485920116318191204083389644098160828009666722635549477083039305904975813615643101060893999315509501318081025137289051787335454356108133761354485193083183997634369795655283340428506642872565827559825155045924936470784378552800563136355526499002558162019410271880717338646318471375684163442601830537613691628498474632262547856029932241457937391840960919415488213025664314613747543749464", + "0.65107817188809080279752785471799265973958362274943758073000075578938519480042543196041314945170036193559782763524413154927612489597355144799562963417455961310886431794132437757357185377007718709790504976900339191552944965308823754898079933186431693664015814010551367365293786806527034958873669211570906132849013497458819941168651227792824572805777219160376304646562062564773441718051418178414899683019", + "0.6652823904315739978766556052897347198651017349760138699519597733553278561013395851136458951983261597283585391502588949649092379467069209284755289821255744166256794329589771465045421874634188329764638118238723545310838064785644468083837991172367935880462068347034222894524074808990476036821633127927532229213401486467496527893691588255513769781016943243185567913995336109327864083859254466073492381187", + "0.67924977641755138662041086036801948989088186294785002709809874961811116536667286127777672928127306388394020078452402417993836722984523906631302047812425809759286220237826357465064765092612104224837992075711035615650942777454297235908308024053950635657488001916036801234116581671119069849133344664024677517075723660642709275823456343659009540444032487248071553674961012055521740306092600444870718199652", + "0.69297535762401272778114932738244728669670875114228232862389083194872888693112134130021641463393969624412179768291914405554577080353247136859984307940401373940521815913274464950964347624918449081645304540343160683388727015489772202472645406318288749244334156857814927405528763108558137488794292057315715995191324964500528600378291562277858608403425720078390497455476055579003286296442406491998525563297", + "0.70645424790855122905182233963742667718470686911515869065744744473731249895412640632516625097411541437953942564566468313798077366853928608154168668667806938130662439220702019172328936889436324187304262248463334787504456805683070026006307765178787997020889111556678907849442591478755800698808480163225125777511828352357189284217101098738405458071150544253514248561787426067001460586251699075230390564367", + "0.71968164894777168289159927814596788937422432901416956306230349431557362414856173295064125294878325237342190029914430775648665560145040598898117000971783978541799092281781000633902779626437866517288284324732827083065703448279654800632624171861777710582293639879819116932680545313562525074940809403693475624332169458744562386580074420532959714281903926902622613852892104465683714186704831143197300465955", + "0.73265285194543608674851404628602868786755398311878599262050209465658337331457767882450516660833910207846986678480603058221329185506983962144302950162737505562091432645466997334653618075359372680522922578429510783107155224742867979206003853893418268095936450823867623873015528453108944563276576646508412198497923383466470895808777876544429706485835161864475122029711660543090876323595451165397047981956", + "0.74536323930873866831066285008063416514858255428941319323031554151661731879818806472410911187787504167842137286019020264008471692607030872105020489874402631524823767448432915438225335869622093354538021006314536198469136634364850042715775621307965524560308901397550829610851125072518884822515926626213581949190024268711827023522012804341871590177804438418738255381261594827085100659777173578154500251787", + "0.75780828629211358196731753685850074775187628883294491833833279769413437275246840580617185041212744084038976069700142887035937511309419495512390089087847775651833369173386038513330257480188204696687136231267595399438343156895032682495327740328291738325217778497473260463740600852973600297913238958828132336080624048815574113414592522918778477418427876829087439774857073733879539765547872800792711360592", + "0.76998356260799010064124325420889481428942836988785464918451704687709959533402569414853910266075223008145347866420469852220997470992987183595134711278161994827010482478666523199914707457365681979989417199177427808129308850228595726632468139527316915481709465938257650120793934685421343443942356060396291075752713480402305699120964704579260218579751719693291565685728074939857101460901984240449471777639", + "0.78188473400392189344901888012886357289691591193533323711550248487573232160560048524966536928562079994581390209192526509899176077393862245482807165569409036943146775931090958041945317489351020506180957959482939768275851398130892970557450783138983566392455270904228057175489097967314871299150832712632639718878702471658606369540854496281803565819545728647765960328269135853132407415684491934581417388002", + "0.79350756380552895006859336306152006552993066088382163294295016384877329185292344719536879395060919553184640006473875955257330264813115929942877156894433233876161573894628944452740080653935089289153173836334040374431360850336851424574668632837338016740333716530963434291489645017931035529052587483629111178971917421121398732580060101294617212337648611654041575132820234403350225337355214099696493406567", + "0.80484791442470288298134387731514331459831415420391927496917008531718727007136925375073869996549995938671025493755987802316807560672754205522916341547950527416285009447065632296220924964603370109747266700136618832767813938243784759073035555035361911772169687111972294262096081393656654067512785827139608367560009298721819281091010743363153063005841441400130721362346287552727162527118465104052539630019", + "0.81590174883253870457705586780548750833668862852238889952372206236774966573191832400412494946116015154305873210759963247859431688393192829248700535837612167242633896627292821666890819736549652534738107012873094812825219601489880060491958385552979476621004236099490018887651186347086675381603801017940808290855340870383683075409122477045713172106217670870448929077822708030574128623585863036730829850118", + }}; + + max_err = 0; + for (unsigned k = 0; k < small_data.size(); k++) + { + static const T euler_gamma = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1"); + T val = sin((euler_gamma + k) / 53); + T e = relative_error(val, T(small_data[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + val = sin(-(euler_gamma + k) / 53); + e = relative_error(val, T(-T(small_data[k]))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 20); + + // + // Test with some exact binary values as input - this tests our code + // rather than the test data: + // + static const boost::array<boost::array<T, 2>, 9> exact_data = + {{{{0.5, static_cast<T>("0.479425538604203000273287935215571388081803367940600675188616613125535000287814832209631274684348269086132091084505717418")}}, + {{0.25, static_cast<T>("0.247403959254522929596848704849389195893390980386965810676544830494398136043486821690984848527973792338327197752176516138")}}, + {{0.75, static_cast<T>("0.681638760023334166733241952779893935338382394659229909213625262151100388887003782753145274849781911981438190343146876189")}}, + {{std::ldexp(1.0, -20), static_cast<T>("9.53674316406105439710335272649306549801506698739838753888815787489707114648106832493113326022411646219016312547902694921e-7")}}, + {{2, static_cast<T>("0.909297426825681695396019865911744842702254971447890268378973011530967301540783544620126688924959380309967896742399486261")}}, + {{5, static_cast<T>("-0.958924274663138468893154406155993973352461543964601778131672454235102558086559603076995955429532866596530638461663378937")}}, + {{10, static_cast<T>("-0.544021110889369813404747661851377281683643012916223891574184012616757209640493425707075673894983216158293824238262832286")}}, + {{0, 0}}, + {{static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064"), 1}}}}; + max_err = 0; + for (unsigned k = 0; k < exact_data.size(); k++) + { + T val = sin(exact_data[k][0]); + T e = relative_error(val, exact_data[k][1]); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 20); + +#include "sincos.ipp" + max_err = 0; + for (unsigned k = 0; k < sincos.size(); k++) + { + T val = sin(sincos[k][0]); + T e = relative_error(val, sincos[k][1]); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 20); + + if (has_poor_large_value_support<T>::value) + { + T bug_value = 12 / std::numeric_limits<T>::epsilon(); + for (unsigned i = 0; i < 20; ++i, bug_value *= 1.1) + { + BOOST_TEST(sin(bug_value) == 0); + } + } +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); + // Check low multiprecision digit counts. + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_sinh.cpp b/src/boost/libs/multiprecision/test/test_sinh.cpp new file mode 100644 index 00000000..a7f25e34 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_sinh.cpp @@ -0,0 +1,258 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_MPFR_50 +#define TEST_MPFI_50 +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +void test() +{ + std::cout << "Testing type: " << typeid(T).name() << std::endl; + static const boost::array<const char*, 51u> data = + {{ + "0.33937643772780730649735035088117439284797964277099188367427256402032493952288848579083622213428182842627923924487560393743204013166230906610274533504451302298480596207257724471359936027198954417317381228420986152562253196896619001418292769103034561794393400788635610424360775622370491149170501475453034747306600304507650361914904138327962144190354572359428689767990353722392457982930942617983634601752", + "5.9746833446871871874685235810964396457491766537010251792063372398172074828151074989468673672535421045923659313715467371148678693662985453590831122722616951299822923837410906027605763677066945998696776562438704017846907508677186762421899376364636371743116519071733413775650991880222096045615827530741679305666041641331859757012015389431793705875600863391408448065773828563483223117178640044499399723744", + "383.32826140718915582837967448860824902040431804683461630967288341613741467095168380744762629948507973653220772087887989292128183196493611623766470283358542341824134250511562240487252437079958429586344329111208041197054162309164204144237855212391474938076935722386012246677813568519769393617755607372817372398764101401294149353978426057544810680225593132066193858006901125069663362991172745649465725272", + "180470.88334757918167934673473709881208559849920820465419382707969109187448281704429118605409224039018180517847684905660962429505828088398660499158213746722168139372781263849989865384042531846290813274318773753295025006473736660333640052386121946183935053629928496714560749082485275242374067168149435272169334475060524974384307351757201698786200303374802146857634893509516262245925287553380389076772488", + "6.2781497954189513207977998975338639259302378413658035459603622432839117790845430762753614618299222131433987986511235061633658516824123179660244932375967566163895461895213509376427850290780942550513918615228886566287592461085762554208269169000672149592375451149457664991726947185145469263932975075681560662428417041932848357447220175607720561540370653825438750168143857523868718856189519864027430308779e8", + "1.6137831147508521132232267071463247985636947830692243664921522457394294988129666666745854084767325882717254318322908201512400243137564101564235450151960593110176457803621675408660678871179456625850704076654060872094257085919134755925910859520026379969099492921728083639989029675808598278170215911879751320574053132699172028082102336989338403081942130794464992491330850160862146024982135931859868176809e13", + "3.065121004865094886953119667134247741359538615435533822684602797608029400610449009335078883525336625519599034934744634528257351124420564267197918749480389135525897886434344884370577475363556341414615470556433033106705280531443046669163916446454890662947185057748542735928453570069226294801221403438864013368364219717148075652123561545773399076318560221173734215703610924057158101731263882232550297741e18", + "4.3016893602106215864771434464025735547192956887049374680649926707919814241961779812200280749930256501997849507695395125441756421661413154730888574483309057229943886742437071251707738990393977398403536175642762242808350076543018009682725019125106175929448866428526984370017465117236484653179596869643117790492866002064306593104169410537341890174831622159415936125041593936992634719906123727028419057537e24", + "4.4608685929681360001024935791890661655506049487122331222491789265929503651540405036031990380918459104583255735620288691363060079360758406339887417913286769718423759522832754263499878135869223253358698774066131403822428286318351390574838877307934317251880890827523325360658275060099119902102399714992704146743744108968362755624325107486994088414126705458507082103811086372240878942983212662081104875997e31", + "3.4181315955816806472569357441100390029536003312981931954091744304974491527743599822230006760631204302243855667216955365986192324833652299336285826148922073950348547795494738267861098328516497599288314822606511466743212319770180141969147554023326883651348621187276823849839283609071336923316655316828855943689100621619083822127788284160652232283630351386798636794979234576432977468152969056493038423561e39", + "1.9352946282727908101414530212785249763640776919052480158881659190625166733449770912626442628329346416132299268886589920690636914906717492301836773331460154604580407945460359957380672599434023197425489039882987443681919056322268437224184910074985583829184831034293865504101338027818555871946080687710035062238789949143319550108801094190098446234092310048150477274502060870736716324117412815209633124145e48", + "8.0964449511890098565841496436016431651692307764702784234901741408135381374668439020986470675941110923614446905696410406066640351065195237123718468440597743167713019447544827353458477844468727834630038609140168354634397475741840053079910210908251252223665806813131724262334693137656218010287981601097259534068903471812189212459231851835393208367369054618963204727992168556204168791513644815218096463093e57", + "2.5028257092625174549175008952222569141816383637904981644379473858250736896174216539673733521627607209322019413420937570273676341726636306931304501320694017061891400181233108050930610234076339285157392030024769366663118692571469493256243952018705693924919037621083041696227375589264811876761430035546270312014570431860268644276406457398485042029556392894799022733858611415899182421526634018060028309384e68", + "5.7168370213792649967466315312864179662895170192695050789061362839510836418124645968032989149068311018994324517420345278843446068634292140996241291031113395887824145000873531937856827299256489358571593850210528248202703396455363364446996158929674989959483681393263782486430231288067231095140919741928337466492665857902913114664767450432510739209971738097074002526312039248809036478310948111740897528204e79", + "9.6487261169670031207955841899729386502708125098394777808615183927342163909284025992243201020435915122698808649711566042372911206942311277943247994427354130507790526857797833309691667375441761513692598664419973302444660838882173718713387158013802112502169254860961105745895124415352002289485483908952674562396552790441656755711709645516914188860464353624992313010889765422981069429049436524222321550149e91", + "1.2032977660238608232537005158851668311089986235965463249220377778638489972355974848209035082333822309902237165042868213438627625544096344578102199846440476859557339736747791529782018329078191477783605471526120462726353510147373798347292650122930289404816748193194907382572774906323766342758092979989633448828636445074016110331338699464788279882402189027828261039788079556739180915346692779065476431369e105", + "1.1088306081278288754492401130897590262404571813281460605683836139669281218442501421935533170636990866165181664561596333701204545493730707210930818738817252706131805203538144119244917164949716209095542194899833868499263375700313934257155600824601418042452138211549248837967344874095248283887929145923103153332810091693393888809653081365270947112297406471162377655179657693898463736926911943490619163092e119", + "7.5499880591625965663868042832675300901799245732418501707646792135512053284835138294796976048691668315442427834949618514094329533376442442492757936744857569785450769927581802961191319878260712808001736830227501518832554201816224207300614310712430470538022948957433004823102746037654096845266998518623332118892916505020627868405618942429551700207476696585635930562973459491424179233918050890206232214765e133", + "3.798536358006797624025033016530070695826982685154937173246022092345982280900791849578041210970037835270398289956157015064696375146357207576854029748413680946201805214954504282866534528711715039215051307866373994662368105368505465037259587291440042344663580680646178313958620437868058550744621854406871361710599007951099013146571208384054250556080476992977623024059268095813712424244902009427293468485e149", + "1.4121319341572581270215359848706630542776633675711529687593487346259283960708095601494823112486631023721124235640943167173029348028743563902367757599140008654691320430919753414890689949599421028277624880392344132646738394546195638261279687543208503932172926275294218429086816560213399180179494004109164546844899632385177835442946174653663068675983237955855108059376913611877439522917217336109804190399e166", + "3.8790307719997974510664339744260233373881096199933152202662556556779783775106563986911859526413282055258612522499767709123313205863879946518297779104337686883587019222829967005608205535314284003183828513113021722123872387036435113517356676447376715595408179555267871947671679098986651665719279348025058713817796876795915844151719103197410787508530261619841035613531487094949084263218956635085585632719e183", + "7.8733605373835840397434523264038598405672829925651165847065668324385430746087633348848905637835428739401439679896923081980364912472282573695612463537585283007941057172128277340402716645674443632827653710173742423648839359547777694778576675604645880219833375227941998426325886558435214355022240854563558864080627758653439429917072753785194675103766900514602432580639079224631229479607396935864512990879e201", + "1.1808262995038900942517891457926200063018079695348469762725520377876370005771518954251015338402886097689762895044056273430051256244413916763438966705458118354189107806216991150264176024521937328179762640422127608560103802431672144866013216405157197709788484197720057702118788168789816074560208078260433548283881535909071116553897893659656781376448427981358955547508806938614921874867135186509274509121e221", + "1.3085817499987842655130548827168955655838432140245228169691892267707778790498773914833199368916114043966197329562444577848635313938483757629541576533880917215885485474416704968999200090496252044959849927443732134176975867869986011315975625868009065373046224716063168977788103866885720471095547385342868632018951910603936835789387464412366605713487321530237148912677199033012777178113821791621549557963e241", + "1.0715308148006899161903881353829644069217121138682658034413051575604561649576261428568888094218620444635013220705511245290719605273316790249367622122178650529000528086055415007045458486410501636380119413632657994999412652188430063128470336817401482172580366374079331295129200936246446347832380606353293858222758687479612927181530236387227215663399410099251455256898414199913458340065553949424990477448e262", + "6.483319651006309502237640505955012384293570932602353784849377890534620180296272226076424490097577093511886503973590409376477611667988893542117173598716788837179265384921201772013611631892729250835822804494742316330406688475091973437669111728949960922002370308207819760146543720499389938855072810566961589413895110830251224194598788696990065693705615156654866578134664648091752361824241438921952031149e283", + "2.8985391304542768293172709775230767981477721528885408305355619530690119426207269563049756824939397157221877775531212262059946098575425050827283362457005503261796116156917077778477251551070762614233325253060283603452216492681531839154649232080928787066338399915850327381614672456102374248950210248266796072457623370079195574322846594267768883120374288952014885152055438195794090975578878933873824774214e306", + "9.57524433627083921372674145950563946532138741951042299439035158875449060589509856903496678820625880407684156184675763001790613289835869844325821965070261880894138207436003366195024403902162467929095155787852409710735775347490909311196315332711680552044467458169615366116872469435840608534489425322247278926672059747911266981024366989976214521515026692183039600169984107883592297128416659318858313127e329", + "2.3372734503362369375381009524197350830316472034721759761797536237738670471009423543542251572488229045699598160834162677357730620072441755506075897500940629883044875771104686291523502165266242030847074909362622098365719455332359938746138629161304717385265309980898079489959955157644566232440805137701071311495653330606071611331941246434767948905863368638163788562679785940566685500460815077065003612487e354", + "4.2155879126937199240969909448599186868484717887298729605150033299123534992857332918168135230843738695925698383815575417820480732378749635394939513838137876524333991937836847074991505476867647762082587225838063325020413513077128321581439429001485977751765798011101092072613053687422983352140468569171564773941232256057064161142341661775359191159220450305300322654184921617310753474842253496677498824723e379", + "5.6181811613375701248970224378256740494692066242437602652469740512738297599235414593999616891945156186827736326184687322137498447792007445397397290336810468925670064733464757082986791232916898141597610692740388799796632396708149027243436859752526805112778790645096555770227809873695589969805678601106157556386974221647669590827712353133603091803570183764883405340587430017053183637835511899658145649708e405", + "5.532511069282205350923830187073466127274584467195468607886763750877294392993663821432158885753563495238131394373865428654052604326264330104646257659760161386620716716703631608643312613245804625511813964275109451513736558514977338129201153666764317441936156609643185133981728847167450887861106642311329612564652645663234240748195490808151911497393974690166034839217817023634217121406163178148652748479e432", + "4.0256666306761331240653217136731531623017017695713942917027851762705346357330788586411431378972009980532310757689380174461664677676028378924382554201434975574729861177781849023768222381429947872325368088023224591306630434887529215459580760863075907686248521168590309636468448648513752893851767315693469638980874648457114335557202115472595647478331668869318302753802858726588719006447471192697846325955e460", + "2.1644237346681663424601781769159797919834245365230735589058796985974745594485988855971413936820871935714602237643458356241187573307428309041919648027960168541647193436225977495680484218384107820095589356463058222584008532497069179993678533431131233629312850771528970443634604290143149079209513868130585713006080733488491160321145735562062411305931183571279530201672366980412430529846635995189699318073e489", + "8.5987580981195983662047247216936066485731760315371506386077056691409579856014763032619539539935299716110411688793466397984311640631361934500807639285587334983206556915704635831992012926186843826981296831658998834850783404713050829093753126189556625095994621605300047199962332098857236359801681157419606676412198783092816364336047306243999363335004760439115355072350465422891365411868472688286678516314e518", + "2.5241673163187127276134610716954724162270290228773641734420864618245211926017624829840685860130579257772126398622324109858115624706486522844752512951837805396709793171502497523431473021570806024043139443284538862368635312799539108264084028032731295487282188616820261689634926427135060887942797635147693849950058672753458576476491733064455826768562371858057444914175251596852571637211466017938478085247e549", + "5.475067911823387661325942057081957044927796274441278042805014835144678321092623034147031518807063234976073102574257079170283458172046752719724152941316842521196069804425876507927418423409523739261726681120662097159943049401039490818332686968135012747332468921142470970507219403290422458185430415836291605355383658657658638112408092789126678938878667507151950931633694006471359998448912249374833586727e580", + "8.7750549689950256776639468724574158629603320014390275681028674550826357080136422399476213432791376656222763800628593282303459051561266270006921840049305819767639184391149913915312831894296821356222752594264134130151457242713539248421883837353442181724530706933220158507240760325182068001553294949268596178418634164323874971937997072367419479635154591248667559627811893588163238012665671798461211917208e612", + "1.0392000158337773273751156576416024664653679689973856373456304843339302977923254238376497044027728158058903302390909588333829463843362779584402914847447592731182614369968957680281500946805571235013941407979569788567794900810257154433592958167545186687137810101848000107335074486050959387974516414654638879740966175786016492797845169374594168995878543584318334800124941205910589727264397237600733483158e646", + "9.0936326753636727240574546678839170665019169110943878894933093211555976995701468041449327370073681898690638466136204694745206283652338526673125958055131610409923286526192661778126811265116493171283319361595267283588121098349703951929669281966675596890266483864217591555707552765565756842701056144290075867893520379419521775913047964393758374891516340929062076304350159966063972713118995033247759001609e679", + "5.8798281636930489964162009429009257867906792508058801627042121953599912951265315933723440185825519080102988056836911095299854840387008575164090793635997912930561430335216151607097220208013034399895832350235280120270626904356196935166701773768680311063264380891331021514518757839220818506905997847228783439015252768055166165941582030353226255576433910936297965207260585437762430381969160714956727596198e714", + "2.8091881292911108404345975896815558958477835260737794579417284512413473388968057587088555041266297486841923628702282019643659456724373332519583025947015025975126598748630623031951723754960589046233996595466021913942587558326660593063197905288573353559106884645285531497626940379800500474282446929237914568534665868703742731713632349090897884403966643055728471509474896855575286123275564417626861566706e750", + "9.917129372597671132067673866739246238179742417231064062960232866725337575281938597212073697168000155027158148165861617400080837699968785505107579831803685516054837447325150388867488754170677228096524224392410232206238263933144338637103531441623303187445874039234973380151391274490746625993568552049954630793219419614845431626975962881182662815760423226111647056071831411664335144052772436215105801395e786", + "2.5869027163543111121878679987081647715187872826677398475096738640583659800068967379551376322170347537454918190603891312949716382621902484616361664158953484778255247083652726854621059785392022847887382779010079407502679229021085320675903109573769331277413372272363218896397965662581357886739691376204316908974081821980432178065394228926767529685562155837452626029223937027004015040825450642409597700449e824", + "4.9861251931207080923785686798881789193813879610842675205361210155894774686328710893906543682447029206928934967525495260314937837003448878215156341411477636831113484416124080974502217578408248150338565305116223944900839866528622960352723938548713319425798453345402992146078868053263606234074443024155243450623634720912438841022969909473424559262711669905282193529250216454066716533180418518228387188393e862", + "7.1012569014339068241101751233953234216522840280342406520909288232012799547871960723719836516359548198842749536961644100550279020276709043358260853581760590386456213180291689322352732545965831405519844109680619067101311180959399339922706596098526969148981173519865139508665631317310424178378833370605922449094745510812618563813537347841030916512147874232760564378443782164868016244561788356251308121716e901", + "7.4730215360486642135431754747074885377840195683583018254892502245011973712084221116813364423492802080799768174534590613188275471080608467087354983850284805514875889145266688973752185071777341375422809910165581997555433091939959406569831183459872344778707098094941193489061532160249775856426569696127193453339548371679229676272663084782830276508737129506676031759345288056484158647796152349867328841634e941", + "5.8109375364209112227579654658730977030869454388607076903639465992296616832002964138000947668837140543325908222688655359602408511410663722770167244801973012245657865182739637159804595049180263175014778215232564251739259624759589953677661356104554831551073263668188283861123521688445132164147762321111597028523130093864153999974376790494383016372210442340324038686843345053322425194077414241243050491297e982", + "3.33875955701899627718146291382268063073604182131575843695486667154496711979350813988644889979275310892951143249901398447859083674739840084454465850475774696325142148671937407108540250845900941142800157345665761403930889797424808979569550325271558518404559007551625637761142662107757913763221912282957681784053564387104062317729788737215450574233690655931888608424916152893688106181220341997128198692e1024", + "1.4174672877823334709610117319768830739080734407353905145632612088824955720198734996604261250019291955883620333545750761619015467840567122066622229379056280064206319780047687015558007624774062399477328822231085767309831266032616053065858739373818651687128093335640388513396191118537181280334430292439188737524362269789272308905723812818882228503013875816702686587035844437102478263525616196832018321602e1067", + "4.4466189016791091516801723880812533528438597080549410911235655611382010503145789286158745555771483577943662768773465284793798720178177605712848440200402906836390133865748188969184005230383247111166918721449908133920663776952786683837038180436264738937354101153867171804315769471050303182129269442292354388037298125177941217926845803005587166270803697433886463469168814941555804311717400657004050157245e1110", + }}; + + T eg = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1"); + + unsigned max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + const T x = eg + k; + T val = boost::multiprecision::sinh(x * x); + T e = relative_error(val, T(data[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + val = boost::multiprecision::sinh(-x * x); + e = relative_error(val, T(-T(data[k]))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + + boost::array<const char*, 50> small_values = + {{ + "8.223167319358299807036616344469138485821440027829633696917375433348917938654659351596020080036406671343718039863220496616e-01", + "2.526123168081683079141251505420579055197542874276608074880949653019810769068593790606537020961198741487692473633089323967e-01", + "8.342981744595282037256218647969712476322487890550784823763249893556153270975172951404094950587944959561849750490537201329e-02", + "2.778135016068299789938671680845480653984976507019542653788637161116587306168290886761259072846829249121589698206609261524e-02", + "9.259391565199916442789400306996794489540862711193761818262415211084389468754315525525896238827358889826875006042447587516e-03", + "3.086424653287772358219607529932097884435043040527155440187640095572710676452654803730003577747633690318001961509535020849e-03", + "1.028806765851002064810061084014826478832745077469708149635730407866217436751337520417458090265791086156438275231514030381e-03", + "3.429355348425226988441198390119109217716503769838753365112550442738406326637684639052252898314646892490045395290022292013e-04", + "1.143118429558603374406653541544292690548937361618336125287018361332072426474632105217297150810234138626767253281422813482e-04", + "3.810394757818873406266877296641684693312194735341898368873067089928172619067423751257049691985638480762032673977695116880e-05", + "1.270131585666421832817527834137477593266387525701388601975733237436369505733715799310429349744168792375082834509467436523e-05", + "4.233771952120219947940459634636576539101577724347428305072378100562649548884420218224692461748739725090626754420296122389e-06", + "1.411257317369659013704209000288436132710449162963127340562961271337242582661013580874165903770246169179192268836124421074e-06", + "4.704191057897475365825409916786898392364235667906752767514580467152163619657508910797742266406961516358439252434955007668e-07", + "1.568063685965773714045928492719360014894368531987759414833778466374819836545157375950693756664550256136222396871173634254e-07", + "5.226878953219226673524993193392503058475862017726848548717100658392470633650387274004511940515056405069137033934323251644e-08", + "1.742292984406408185991240874995689487745140228031202510923711784729440494088066989430128101759261047316736074663327672115e-08", + "5.807643281354693692124967044009687283114597355717062156493618245876910131607338183944830908381903728560328284173507220743e-09", + "1.935881093784897887701686451485601671131342930785061493703969418728524594573922282309665275558709040519461560600768780392e-09", + "6.452936979282992955422916851920785543106383715381924626175995859924351552325880931187614903984801793287071578640505194508e-10", + "2.150978993094330985008279519046512957825521218238790792201835497215534851989750722105234826300738623838446309250309905466e-10", + "7.169929976981103283311786261663531258230547972690500493476881079295129579131280734024784107219045379345460886663104148486e-11", + "2.389976658993701094435441884684454421835327948893136184573938864819002944442339456827931472237274353903634036758669394620e-11", + "7.966588863312336981450798799860506345287566898810744342680146925029151178981033890759916168189916177504592939240995619757e-12", + "2.655529621104112327150241298135440075805848488054800577703768668100658036999584228451100239039042920681377381394421710121e-12", + "8.851765403680374423834128412864530361591097252230621965426275532533242581680245794741067906285298655116802944992368126680e-13", + "2.950588467893458141278042461784956914687338675140497707333871358819185395356569206661450997145748756956497959702280685427e-13", + "9.835294892978193804260141412430145318398649753331401112621871794012928366988233744354238387090649589382104704221708773516e-14", + "3.278431630992731268086713799445120869198593899364655036314007566906378666339665297288092596796135684816883503781385164489e-14", + "1.092810543664243756028904599641030626636532928735904320784337625844108091213506619051042206148385975354700234586478575025e-14", + "3.642701812214145853429681998738987398752764686754626492252324567456938623579239392678142797020213493844816454129960310753e-15", + "1.214233937404715284476560666243942169089106312534317920490462975351305354471020532764015606315872085933262687299655265697e-15", + "4.047446458015717614921868887478923169619805517194433471908835726595116905187672132801369948377551282604828733616045843751e-16", + "1.349148819338572538307289629159608313551890152969010184597042496758528297346351553643241208769191557898925543369605617734e-16", + "4.497162731128575127690965430532015584807024576774799020494128293451281927637267192489558050090835454302448780391749096414e-17", + "1.499054243709525042563655143510671412452985626833998379862387948592418229228808284088934491020852037924756758483008288052e-17", + "4.996847479031750141878850478368904541825005460277179305602161748681654262243578435201096986093377131577325573917436618470e-18", + "1.665615826343916713959616826122968174447164290616980189746184851537351248309665330601503343215376981550822569162631313560e-18", + "5.552052754479722379865389420409893912541965834349657578615232567585047309856390957625702896178052275806406957076143469634e-19", + "1.850684251493240793288463140136631304096139902769381795814754672989850701401641374814254071564872119933498619234778448524e-19", + "6.168947504977469310961543800455437680289164351695283493312025632359317744715643192414807145394613572397590534364339391526e-20", + "2.056315834992489770320514600151812560095228784236601072113743484455321300338926430301421880927367590178440922006775473367e-20", + "6.854386116641632567735048667172708533650333231531203539518552950777817440179277823487619201513258000884052637516041835420e-21", + "2.284795372213877522578349555724236177883428507451482660054557452824460619777642844796449091646418601791047308814504431261e-21", + "7.615984574046258408594498519080787259611422468149787192854095139994568043598766360557598146279482678180281335390895949036e-22", + "2.538661524682086136198166173026929086537140604567639372655275057673980680372673609490963070062819520295998328327889923353e-22", + "8.462205082273620453993887243423096955123801934429554813185698344472203995997708879527322555715697860578416576045982358004e-23", + "2.820735027424540151331295747807698985041267308484077168753311108116374235508697904826049959781116012127075951788533527897e-23", + "9.402450091415133837770985826025663283470891027171945709804152456669015193736201020401750153196590359525341207466344738924e-24", + "3.134150030471711279256995275341887761156963675682933328476437810109959425395050019306074135780459168092270327572635795510e-24", + }}; + + max_err = 0; + T v = 0.75; + for (unsigned k = 0; k < small_values.size(); ++k) + { + T val = boost::multiprecision::sinh(v); + T e = relative_error(val, T(small_values[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + val = boost::multiprecision::sinh(-v); + e = relative_error(val, T(-T(small_values[k]))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + v /= 3; + } + + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 2000); +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); + // Check low multiprecision digit counts. + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_sqrt.cpp b/src/boost/libs/multiprecision/test/test_sqrt.cpp new file mode 100644 index 00000000..7588c263 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_sqrt.cpp @@ -0,0 +1,239 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_MPFR_50 +#define TEST_MPFI_50 +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +void test() +{ + static const boost::array<const char*, 101u> data = + {{ + "0", + "1.77245385090551602729816748334114518279754945612238712821380778985291128459103218137495065673854466541622682362428257066623615286572442260252509370960278706846203769865310512284992517302895082622893209537926796280017463901535147972051670019018523401858544697449491264031392177552590621640541933250090639840761373347747515343366798978936585183640879545116516173876005906739343179133280985484624818490205465485219561325156164746751504273876105610799612710721006037204448367236529661370809432349883166842421384570960912042042778577806869476657000521830568512541339663694465418151071669388332194292935706226886522442054214994804992075648639887483850593064021821402928581123306497894520362114907896228738940324597819851313487126651250629326004465638210967502681249693059542046156076195221739152507020779275809905433290066222306761446966124818874306997883520506146444385418530797357425717918563595974995995226384924220388910396640644729397284134504300214056423343303926175613417633632001703765416347632066927654181283576249032690450848532013419243598973087119379948293873011126256165881888478597787596376136", + "2.50662827463100050241576528481104525300698674060993831662992357634229365460784197494659583837805726611600997266520387964486632361812673618095785565596614793191343548045812373113732780431301993880264715023446550489842580232941386277966868361303367582384418115607849009560004137515027529165146122584386186492069906092666409118801573969725237770253874824784863348864259750658951309573876342725192688040202857185924973630809978452538550099964101929825864558813716963467480152897452330473583474775619896089188931497718648548480469365216002979523919601823809165790411297975297712884880166754700558630196824142164233836361751921305615135984170982837036342343558097687424487526178010922324284883919536725153974582825630336511862808790203551930088145604026487771415650048376723275094136806424717481635184471307383168191953698843723340165605500555063029823385865249561125896634362311039438867484401970215424844692673432572876116452243380115662703163531763018031226825617668891776095502388960424467990521700581770868994182958846287294933254842394882655811767896697230383860684402997328870793925904767307522570843", + "3.06998012383946546543865487466779458212212931325292345360920786339428774168895114940961908166467541760759370742449261902703454294050994162164179758776674921695210543321431976582792749695268039936031183310664759907107096641183589015949857072626264281130269822115622663836956231385381805315027562932655928781117811850728886383553772535550181070778545447895443834405205758132853217474114166659516983365541988620856642054467498643554872029717170398214071471942791253118514487638811304670059307541182798357443181785843119089299569008318867284816553359946310778010700675312493633986577498099096587006610844378385188518085716548910095121883158502955712612589941408660542373794977570528185247073824741671612893506514342410201362222059007498227945177352958046758148141756202994673600560820713848287574799339070054752116909136251765469324207685490757710781971553227808407026035595494277776874273936176792674139758867775825077183338566625556426910971465911191049352588901212917090887839548860059100937478465817844825147395110789153650851340493729565322385491250242078198566481445683133486898404370694024388072677", + "3.54490770181103205459633496668229036559509891224477425642761557970582256918206436274990131347708933083245364724856514133247230573144884520505018741920557413692407539730621024569985034605790165245786419075853592560034927803070295944103340038037046803717089394898982528062784355105181243281083866500181279681522746695495030686733597957873170367281759090233032347752011813478686358266561970969249636980410930970439122650312329493503008547752211221599225421442012074408896734473059322741618864699766333684842769141921824084085557155613738953314001043661137025082679327388930836302143338776664388585871412453773044884108429989609984151297279774967701186128043642805857162246612995789040724229815792457477880649195639702626974253302501258652008931276421935005362499386119084092312152390443478305014041558551619810866580132444613522893932249637748613995767041012292888770837061594714851435837127191949991990452769848440777820793281289458794568269008600428112846686607852351226835267264003407530832695264133855308362567152498065380901697064026838487197946174238759896587746022252512331763776957195575192752273", + "3.96332729760601101334502876512018303152235975639619479270725806219673871802657165722877418785963403123274056479329535362288655768235647487599476465537517349983459959396942125116402730874711739662452418728544662333652033991382097872017643021546533893998444782653493302314148486254376557154660429700133894837513481248619445021033294987995072089685196890751303705448870314051631971912137432499217943513505107459328579034234471969034380444279483175756904340168935694146646969758408612915912693951504143726276325727089094957428376128777490747011483653095038326498799910297470352498638922548951534285262912166233490129232297588127154122989932582549543207430381783967345221251717788180706706197608063733887726205509696294918128904282730298886608490931339746624769514837195042182809390984886538469878790432756760740967852006981627342718373868089930899834470763073879097175124340898791818850834951894187606842759251386865815997713188572196024482151907891258713869124247005410786490332294268446455782911914942752568277824622418634516620092362780994044583559067632108995042187023154200764184950878131638370936876", + "4.34160752734960595617808776374477460723265336870727556185727396662220923171777437150069768940869308257867815441035461967651472282081172615279256504443662226606580627885152042042903335792297058916252842051925089290836831715454034263505813680769125291515266958692652530407528011558306762163905143207811598688431871170088962518292286615299738096190444738533203161905492043851016820053962091086343470680514156330656554108208679889001485483033545415301817702473378043508312559202170115728182897990337699623761986171416615021158179762123766012269021534563660979972864906653441725316241881374716900480598276640840394699718984639649897058274667150152948516142801074260038108590401332448730361188129358652703927446859710621067457990618378017703891730724396666299819790072397688972686459430503026856861736069218065420528347106866972580915029753621255304587561985717307629932540410639210302482882847873727015801634901755832519840544096758977294231047035556754992897011888753217953080197537610448726652746992121685068257440261763964980703424121083058605934982281210054435774069392790646709404966217005552197344493", + "4.68947209983475140722248849561783002846415813208241069816339837584532567997445983205028355189765592648498726557587869684603896433394456735512692292415879610033794342501630732934996209978740746985164578019897211786300244708711916089199260058311084265831293902281791295846169702839730909351250374703986364508165540235333505281067384239291594323539816814423865582516577000094943855922812941268841597446572000848645702560088494072507948045804364964153467630734509663721026050762887316466331441449595084971862668493255933265611225629677595775797966272446890047531313544059153687362017301654537115283160575298256857111770084802622759507512748413868494678293024737576577634559012937002405564693237564782661478500575417457048864770102766387138956802222948987452086048547098754786648793023622941962569186040944009281487954082049335826413270469685003200962898734900372045181956983558503256265211391593721293841419380653006415407706145131700572194167555007645631927616801157793244790467083152103173240943823769137606544644820547634530641496507929783339735192083140914072272339899107017006649210880028740845785609", + "5.01325654926200100483153056962209050601397348121987663325984715268458730921568394989319167675611453223201994533040775928973264723625347236191571131193229586382687096091624746227465560862603987760529430046893100979685160465882772555933736722606735164768836231215698019120008275030055058330292245168772372984139812185332818237603147939450475540507749649569726697728519501317902619147752685450385376080405714371849947261619956905077100199928203859651729117627433926934960305794904660947166949551239792178377862995437297096960938730432005959047839203647618331580822595950595425769760333509401117260393648284328467672723503842611230271968341965674072684687116195374848975052356021844648569767839073450307949165651260673023725617580407103860176291208052975542831300096753446550188273612849434963270368942614766336383907397687446680331211001110126059646771730499122251793268724622078877734968803940430849689385346865145752232904486760231325406327063526036062453651235337783552191004777920848935981043401163541737988365917692574589866509684789765311623535793394460767721368805994657741587851809534615045141685", + "5.31736155271654808189450245002343554839264836836716138464142336955873385377309654412485197021563399624868047087284771199870845859717326780757528112880836120538611309595931536854977551908685247868679628613780388840052391704605443916155010057055570205575634092348473792094176532657771864921625799750271919522284120043242546030100396936809755550922638635349548521628017720218029537399842956453874455470616396455658683975468494240254512821628316832398838132163018111613345101709588984112428297049649500527264153712882736126128335733420608429971001565491705537624018991083396254453215008164996582878807118680659567326162644984414976226945919662451551779192065464208785743369919493683561086344723688686216820973793459553940461379953751887978013396914632902508043749079178626138468228585665217457521062337827429716299870198666920284340898374456622920993650561518439333156255592392072277153755690787924987985679154772661166731189921934188191852403512900642169270029911778526840252900896005111296249042896200782962543850728747098071352545596040257730796919261358139844881619033378768497645665435793362789128409", + "5.60499121639792869931128243386880089385432377521078326495835339365228337765188797433638433752458537394171467057445629904555420755398315175666449466777454516186127276489666213119783783503829250827797595051437870440938931280680358959301715436419833364761665112542860561623096658225538557287000997305661352632293104827706037023135997795899396723258283708659284220534304000728311717413345472853792896822724499122866947121737000944102509490771269197783584170349935127887498647119562411695900883847124507613781432804229894058444676290534036738474342530360927632101836180145945813951643250885687876144098262191352431818136969137533863587873139725102593606754797723773610593636883665209271759639631465381618953021812982067002849796433240989364353192362974216155114226322430340671719312492223369487631048057665757861195096925695551107847621963544401115555199917577802008717751423237289036673475431186363543556380872803928482717387196307480474684969943012499128760245113496312609854517190311704797289830560651678579059756085781560282375298034806741180400732788584921019507521738918616603376508365622727087150932", + "5.87856438167412823505442087789707097199843492103867437517314210715732455817816855246687780176492612349299503748836474526021467611461493586217913925495851405816296682706960791383913340375739628111898270614813266755200083564799407766788027485532332352024027224698199060815938197172865670956402289304658624389748945536687871488565787601288863899811544146566179125054361345491299666333144296548463580152591320203647485383402648565396566035890953872530543987300700877916661520962595410666627445873003711787722452859856569260494472375128936533790154715039734447084354515787738062350432618897439009684320850395595213875985248081961123885179420668160222435104348738172793787396737481265016580386986993101160673821650068377182350730255005754757604683510524357896861879706617761317908260663342673848298530050583191985919675390877532981022238129601627016291632330926779809631293070560375804444455958596407594955858475081851191996245268822870776361657887467004531332263395611291120089229481068789229695018187723686024313640325575962035428327239557079268995825494033666401736558372076816062703768818475224366442780", + "6.13996024767893093087730974933558916424425862650584690721841572678857548337790229881923816332935083521518741484898523805406908588101988324328359517553349843390421086642863953165585499390536079872062366621329519814214193282367178031899714145252528562260539644231245327673912462770763610630055125865311857562235623701457772767107545071100362141557090895790887668810411516265706434948228333319033966731083977241713284108934997287109744059434340796428142943885582506237028975277622609340118615082365596714886363571686238178599138016637734569633106719892621556021401350624987267973154996198193174013221688756770377036171433097820190243766317005911425225179882817321084747589955141056370494147649483343225787013028684820402724444118014996455890354705916093516296283512405989347201121641427696575149598678140109504233818272503530938648415370981515421563943106455616814052071190988555553748547872353585348279517735551650154366677133251112853821942931822382098705177802425834181775679097720118201874956931635689650294790221578307301702680987459130644770982500484156397132962891366266973796808741388048776145354", + "6.39067324283344282612593456066836977441869915362953508565729525367923342752058036792717988019560288813706968456779323116609349360225813396901702110619796078057334552019514797946669652098699860634363540091309264934180808145340898043417996593792792270890934539784162252743214627553825160296688912049057995757459733133778428381528832147374042143201083422723391419017423476330077549613969668943960552183346770788992856348755201584958184758568943497685412776464637452851023132948222137176500877587016169499594616364239121570837276604948806785595382545249190023683014214186698190428219840682236280784558646634466507658233281348215201532077497422563499058676631131322841280086826370841460898715011137512038685864392079526912553523177019272440755510704279946872616455555313590656257840391404433847924673482299505689689769822347893968864046186358674105429643912021090605610906309627700793415194628412350783590691473324467581637253579290246840759262280795786394666829277098636383739586574194509405681992353099095656288666217128758044223382834658781601679058686559406948665993762673723079305381020139309264407402", + "6.63191504395654222093463225517095044257167358492883535520176025342395774211712657468200830942121109644363941340107615485128085049415855416468332623498613542536495098385995084442339062608583978638604918143347913056760626947758803721255941289939544782980624105947726287394246015934530636662452762740891034120692720860989191872617116876270993379145692068344563800080161568845297279023268580882621139265056001709415926357601143767499984660052292050156852098465716279953503805000122483365981348049448669145674005237424902758331184292667285733831838736385479377968893647208473593030642721808734551034183742049017463013327984017500270415348903044357529006803230836576763451403141885042163557880315832238470993889819388689962997828261446921618788229788339158160824684571810429272556119989956914418082964164895325888955223056217505031535326694543563995771654860377141087298652099371042888622930700365091746883791244230649741108473410207660026523417093735663777713562847430184433298925557785602803469943746593977417910571201562354064143775475359422531818578919533441219169564634992179085747739421396934533170253", + "6.86468424647826745014070025117717964024823451584566770298700199608686799810550334183271384036184024738713075357138304363500729701192009148330990514337822154917664169841019331985106373480242557119822580196465316734207821863081970176402541887949909079651180860550135778414330866329785285584237686124445664832783599634024854488870218943262246632754953077685614238917113547631797236909830439953169012672877303232625810370072296875077876422022480554261365112845624378648826827015798512264531843127157809664230543124721508342792582642801227649598361094857362199437229919720183995231808663615464777549808840564458629976163064258768399634097749419103019327558046204392219063653339901570969874642832022669018679996962548734797438261313737916279431144129292768130662584134756962916924264725125780137451698441993315631510366262043104603857813311015159104411207656587159892683007990478175317339407414253752547566811439103970532316615414849940518882874013736359501398823560697095317586441184708051608329999378177452455843424936412317738990534790002839870054268627101977849744783551897006721190846394315014179836658", + "7.08981540362206410919266993336458073119019782448954851285523115941164513836412872549980262695417866166490729449713028266494461146289769041010037483841114827384815079461242049139970069211580330491572838151707185120069855606140591888206680076074093607434178789797965056125568710210362486562167733000362559363045493390990061373467195915746340734563518180466064695504023626957372716533123941938499273960821861940878245300624658987006017095504422443198450842884024148817793468946118645483237729399532667369685538283843648168171114311227477906628002087322274050165358654777861672604286677553328777171742824907546089768216859979219968302594559549935402372256087285611714324493225991578081448459631584914955761298391279405253948506605002517304017862552843870010724998772238168184624304780886956610028083117103239621733160264889227045787864499275497227991534082024585777541674123189429702871674254383899983980905539696881555641586562578917589136538017200856225693373215704702453670534528006815061665390528267710616725134304996130761803394128053676974395892348477519793175492044505024663527553914391150385504545", + "7.30801444381621929576410414169825272457257572273051004511973439898925887398217614148081823016200949202834301901341123741998769012029715026961550074765354322325117408706019312795809700115432061001422232366558866090103569420172751971374783210350559722862260759626145820691043338967446065368729759698186882375361190232710825561214648603121419802078232806394885971508914082308000592725279784010670779537521209568997392415395010518735400320816396054990550737425086661554419518324971399666539322809263579915158239535250650034449433728950585403021312904469201906868572755498527768200566105436948987083446413896510763908286033307148367944294928994814851182637242369700047960905551015550891703778083820346244133873451184266447103836670847395501001367479270898875772403881434563877248062713559640372882766006167571899610660259996723172304669594755157014583499099899215181509673430723657636479581940652958938443019241663200400679385786760329883423015546482354218805580324551932049528493376425537320109696781135375077474891741199783559527857010245972108769520093587637938249980386334004821761518122012885593787752", + "7.51988482389300150724729585443313575902096022182981494988977072902688096382352592483978751513417179834802991799561163893459897085438020854287356696789844379574030644137437119341198341293905981640794145070339651469527740698824158833900605083910102747153254346823547028680012412545082587495438367753158559476209718277999227356404721909175713310761624474354590046592779251976853928721629028175578064120608571557774920892429935357615650299892305789477593676441150890402440458692356991420750424326859688267566794493155945645441408095648008938571758805471427497371233893925893138654640500264101675890590472426492701509085255763916845407952512948511109027030674293062273462578534032766972854651758610175461923748476891009535588426370610655790264436812079463314246950145130169825282410419274152444905553413922149504575861096531170020496816501665189089470157595748683377689903086933118316602453205910646274534078020297718628349356730140346988109490595289054093680476853006675328286507166881273403971565101745312606982548876538861884799764527184647967435303690091691151582053208991986612381777714301922567712528", + "7.72594721818665232400474478573212164113820580488963719814529844615257171391366083837598391841280737832475169393182272541886671862529201489762301217381727573506969107619318907033743713523584964748522235434860386240308259592226625308659565532071953554996921178294803994916620561170523298903408385287659414301910401193614716492481152548641726819012461794117027835912991336708840836650710281453954679059886797070453447940199379600879845764678851272615250256962113900000364647452410778972648375707943133926939195015381201426487954498462993056064744870715359730063675217952027028557542103700913113678148959057734510658771520791956879881016752781141774540974358264943959912543543231872348745595316009779251124673800869204892703157616225827295653493619371958957677652500482852408284671621135986394278188285088465620289846607059129785050607459357597788813170941394726408533348925805369815717709891710786025165701419078226562572328981485933748567540138562641027503508306197019193198804817270177795577482266694943462207325431350513542160949582976461379550638607760760045294712529920901600994240565773585313185966", + "7.92665459521202202669005753024036606304471951279238958541451612439347743605314331445754837571926806246548112958659070724577311536471294975198952931075034699966919918793884250232805461749423479324904837457089324667304067982764195744035286043093067787996889565306986604628296972508753114309320859400267789675026962497238890042066589975990144179370393781502607410897740628103263943824274864998435887027010214918657158068468943938068760888558966351513808680337871388293293939516817225831825387903008287452552651454178189914856752257554981494022967306190076652997599820594940704997277845097903068570525824332466980258464595176254308245979865165099086414860763567934690442503435576361413412395216127467775452411019392589836257808565460597773216981862679493249539029674390084365618781969773076939757580865513521481935704013963254685436747736179861799668941526147758194350248681797583637701669903788375213685518502773731631995426377144392048964303815782517427738248494010821572980664588536892911565823829885505136555649244837269033240184725561988089167118135264217990084374046308401528369901756263276741873753", + "8.12240393759049993775056085790344905374064693901884539671441829845338578772903259406144188243219398035169276840513008383162269420554517811059936012081975520344394583550625149140104890709858952675303897227339074601057818074118589698571155136079180679720382723235231538458633009534010518571057778133890494075838487054606092393806209145857916456072372240571169803355429160587649756506023316970860684505132706954885924145348134169632738593180936266392964765757145617588713808060798434336980045883860242149289652316891255507207532033909817967022156020135008789172223827513417867030366597530330645580768779589871599830015247516272684746457878444123615590973536303130500232072733480785298450742941376024222195955073652956648240243919431159576650278660779563988680861574614265500071902828098808112054130736935301171188377689518808421589113550324566036499684989624896195759485888011688106014339156094756792157734665908674538715149602342862415095116193802949560661722409343540501008020488626114518430540516030303410754550714099923563850234789351977675338732716128448507828986158960243138593921163553099984790877", + "8.31354547584695967940566378712267275288624539467359186240950261388420109063530469298372814586792322543394723656678356561805557643176058539909258806409526952143256265316829288574367192300134911326662579540672482872991356622029261017993364337446668505438648868283461277399259103747660496390168344220787056266691284920945026070198958124599742654165567628853365640939746555309453490999458540074120276825684247685153740702582674467303878126564742370625497947819552642763989933468008133993752611603522750223144711829552595043853200184607806501342069297514482919782863001913353586468996478801683403541333200250999752731449803793607515150980663437341133381305911283161078249341037269510562017916894714417589792091216017912110414165892331827272726552875986295229205099562827308056238370455191631964062828836731217300323551683849308479366652512262425881556198411502851577353998426212961146886854599036602811970862235743112454698389727605325232872049778977783694191972600155385422071256805381015864689257913905946358386236370406339271062529911829230871245337410607604318231151206871615890518289557823950960924210", + "8.50039005178969681405606694066857144339871874464321576831825225912653747873113563539576206921739603496466768191005963101509608216565231580166435976841183722328004091691395570837807106693569643325702021135074219386315687196397182977310724857959339705673410615655661738050498092907663921364482163693412990352699674010982361328463115845819153103736613515518538534444209396391044515527047534370066166976494484027905402462724778219101349242704419346472667550031765101749789603575074461809215731212887738126264415774177469700439565715044625979289026800701352092929127409916129794527211068956300531815748065200493298365734410099333662178356881545890691882401846675346795963611125059579096807842008824231421616080054119488676338739204001665175181321425845571967990452486774866455322197409200481385043451140315730188098217149173808292210439135828385844496694628703028478095465983540068867270220327383626367373083798876294946716176284955504565982296829544751335108774407823029718852800476212574258039209896227934401044333736396538381519446030490401670705477490565602459130058989097840050168516571928831986962913", + "8.68321505469921191235617552748954921446530673741455112371454793324441846343554874300139537881738616515735630882070923935302944564162345230558513008887324453213161255770304084085806671584594117832505684103850178581673663430908068527011627361538250583030533917385305060815056023116613524327810286415623197376863742340177925036584573230599476192380889477066406323810984087702033640107924182172686941361028312661313108216417359778002970966067090830603635404946756087016625118404340231456365795980675399247523972342833230042316359524247532024538043069127321959945729813306883450632483762749433800961196553281680789399437969279299794116549334300305897032285602148520076217180802664897460722376258717305407854893719421242134915981236756035407783461448793332599639580144795377945372918861006053713723472138436130841056694213733945161830059507242510609175123971434615259865080821278420604965765695747454031603269803511665039681088193517954588462094071113509985794023777506435906160395075220897453305493984243370136514880523527929961406848242166117211869964562420108871548138785581293418809932434011104394688986", + "8.86226925452758013649083741670572591398774728061193564106903894926455642295516090687475328369272332708113411812141285333118076432862211301262546854801393534231018849326552561424962586514475413114466047689633981400087319507675739860258350095092617009292723487247456320156960887762953108202709666250453199203806866738737576716833994894682925918204397725582580869380029533696715895666404927423124092451027327426097806625780823733757521369380528053998063553605030186022241836182648306854047161749415834212106922854804560210213892889034347383285002609152842562706698318472327090755358346941660971464678531134432612210271074974024960378243199437419252965320109107014642905616532489472601810574539481143694701622989099256567435633256253146630022328191054837513406248465297710230780380976108695762535103896379049527166450331111533807234830624094371534989417602530732221927092653986787128589592817979874979976131924621101944551983203223646986420672521501070282116716519630878067088168160008518827081738160334638270906417881245163452254242660067096217994865435596899741469365055631280829409442392988937981880682", + "9.03777677270990269726949426172862835196387072970673604230446563698972563128792797577778210699007499500445574250898762044933778750351774122552995617564832932129894429850247153326323323596747185514513829114667599621242841895828094634599104752390660626316359597361160805506977060785864672892966797271805786612860244448725471833865343085096665002696889160030343332226214610521511200144375391579536397373156980251473081426535067176615086187889982851260244145348339114794114481076655003899438879933457078775812975837503314934547103980296764470525861438620896571785240248887907778823513254337650341006992728965834432443948838718849505116031704247005966435163013464172640987633315418180257980416126510536269126886862377598402609093638096342316879109441931256004415158100347181648434500606990925357893191947800032622820087068319734681796146574385134374500536260087114364120328174363307505811192446227573869975931538764994397186624871438876822552201130556306754697296734741569342977980309931897617697257730057945805570021974106384510091603635687409774141632668637120038927426728226929784072977105651339473101367", + "9.20994037151839639631596462400338374636638793975877036082762359018286322506685344822885724499402625282278112227347785708110362882152982486492539276330024765085631629964295929748378249085804119808093549931994279721321289923550767047849571217878792843390809466346867991510868694156145415945082688797967786343353435552186659150661317606650543212335636343686331503215617274398559652422342499978550950096625965862569926163402495930664616089151511194642214415828373759355543462916433914010177922623548395072329545357529357267898707024956601854449660079838932334032102025937480901959732494297289761019832533135155565554257149646730285365649475508867137837769824225981627121384932711584555741221474225014838680519543027230604086666177022494683835532058874140274444425268608984020801682462141544862724398017210164256350727408755296407972623056472273132345914659683425221078106786482833330622821808530378022419276603327475231550015699876669280732914397733573148057766703638751272663518646580177302812435397453534475442185332367460952554021481188695967156473750726234595699444337049400460695213112082073164218031", + "9.37894419966950281444497699123566005692831626416482139632679675169065135994891966410056710379531185296997453115175739369207792866788913471025384584831759220067588685003261465869992419957481493970329156039794423572600489417423832178398520116622168531662587804563582591692339405679461818702500749407972729016331080470667010562134768478583188647079633628847731165033154000189887711845625882537683194893144001697291405120176988145015896091608729928306935261469019327442052101525774632932662882899190169943725336986511866531222451259355191551595932544893780095062627088118307374724034603309074230566321150596513714223540169605245519015025496827736989356586049475153155269118025874004811129386475129565322957001150834914097729540205532774277913604445897974904172097094197509573297586047245883925138372081888018562975908164098671652826540939370006401925797469800744090363913967117006512530422783187442587682838761306012830815412290263401144388335110015291263855233602315586489580934166304206346481887647538275213089289641095269061282993015859566679470384166281828144544679798214034013298421760057481691571217", + "9.54495610016641218053318050888027529952710202531153199575774210745792169686775867122286336893013980770883110393522762476818358876088129524710547725582400752350379006684967820956995284778747313445279111803934019554639715103722176378053227974233654201464826899178346960385701319012743023002834221825212678330062853593931422954382790959273783367681208829081125750296573583945273785727616528225035230730367043489573228646448365807546311686441424497747445818035366984113867781703025697773957490231025374107987159920796065423503962296590063470579872505263841733246548152591941651333013912614638133883335123920373070975004252305213546254181990284206802141740422901313199964786740911915995115427439794642825914605300283815175742959582878011011823566253034650282755730842497543625168601556462908567644285914941630229285900004349592874758990965409149767611455899099763319215107166406191621967564685710927764812630422088568711352107239482256315420275932243379732104022438119314824626037473517483829358567542790510299355289069031782291584296420055747908391149240325877115257851162524812619999740512151814664737655", + "9.70812956277849627020013008432023090142391629970752953381907255677408677683608283777972133699852226057384221251532058096143107203837634058545789370004650021408813594346758795590127624936380909477521162346782666694927945494282229717053636144889370566148233104188061190841182087686652430168640066046228725465172358875908141846376474355637636250095973439621439980693326786799959495956257525100473767694685408934461084692899974993028686930219291782447513786152395692604500383372485738542065647909407318214440351068221656470065118040045018410800167501279347597149519022186563837419966281229875188530501814945342053480368694378460223735611289594593646472862387163956627509412278526670700766402504793826839677765281076427340901353768173748184477638624215647772178191872811543334258915265427131978394362810703976093768885428630849932102391562462424663355002600929871388002261215265969294828417306845017134019844876207436524153517810279329274165301203983428519852972984397790790147707779427760025639355001932966608597649497333189984495365421369654196836993842047830874262598283161232047618963368717192374581237", + "9.86860538583256911820721127887475338860580572014113804764764567126280797502596779665406841324694419448453464475175038076268453561722477590781196193451866802150809759490712608888093911291954287843130175265867101964469755453143964084226755674039351003953563412948117884754289084798586264882426396661496381950383124624978217697985543751868445611832757526512148116901823991753587937386414616186527759915861182575983960867544511432164162055576224548617161606250500799648602173880407153261952724142638011741327947253437647196929757560958075420545787575757761080599830662321444781770561880447820833072140574469797429581558718245198502380676502327269925525873736136551448095090807729668471638614047172598418830416390391932045518785962567615347617805861430300764479148941742520703366317243140861995853488523921623877514753981220597859917397820846973107706661150411207144792858833362409021546109104485305007696344300462841655088641041139133938632803072811438751371559900802700904742289494188612587210415338399019832109459618353269954649298194490921810882187710461971651611477483705188781040460993037832290727754", + "10.0265130985240020096630611392441810120279469624397532665196943053691746184313678997863833535122290644640398906608155185794652944725069447238314226238645917276537419218324949245493112172520797552105886009378620195937032093176554511186747344521347032953767246243139603824001655006011011666058449033754474596827962437066563647520629587890095108101549929913945339545703900263580523829550537090077075216081142874369989452323991381015420039985640771930345823525486785386992061158980932189433389910247958435675572599087459419392187746086401191809567840729523666316164519190119085153952066701880223452078729656865693534544700768522246054393668393134814536937423239074969795010471204368929713953567814690061589833130252134604745123516081420772035258241610595108566260019350689310037654722569886992654073788522953267276781479537489336066242200222025211929354346099824450358653744924415775546993760788086169937877069373029150446580897352046265081265412705207212490730247067556710438200955584169787196208680232708347597673183538514917973301936957953062324707158678892153544273761198931548317570361906923009028337", + "10.1819721846243116158211195253926465666143347779815073047979911288728454119358550456874471060202706503091805338588626998024526166707650425773136658258074400903070578475129191134262714581830920726995815514653824789384673555040322558822640155690142138250981661144460598431698331929864441089428405069965236237150722105664811612049206741649626761309984600129580251270318577455853101292940548425839036066861121228690420716119923444705834233799961792271274742610225908970795751081615038981535248648458311885095799828145600663740483135495656806225462943772037314913924014868167062651948437081797920497967655996219852832742745294377907352391106793565373082008386931837077219804533025205245429016269305924868300059131465990367513110617768155977075582917392828200481639719171646996937843435515414397834073681939587838302796801187221313907962667869992989319909211964361393188990384040622902615977028693735275429763987359474700539603288721055646644016768647749162193038655134281042688011723482785471924105498640148127126652745316007086053077591814555887669601195725983108276147651242913586147914229810924624624361", + "10.3350931404633683691947436472707444709708693615480182604123950370334349544443021679231379500921649218800863593926760528756661011078126321844492668291462478393476503125536591219070509735210428947761875792828673301887541398513337078226608138436426593790404989932058023039769630384800611394806279966525193241106630459881453504032664228967399745528185257298594581458987077801324925958107100694837096169968690367946833033746754352596262639045628825434791015203759110279895685375377254959267384242428992179590079538654788434703331515082118259553412887391533698850248031662366010669929529784194795489078820235616519309873494295540734349932360576182477685064907138632368679604675882383935711506161826635113153997912713265877050477273997328780264216580134895532814312026671290109568535316587756940503116601114428904476514966934012890148992229020985082631236739332830184773141236150086303025054599442020885304151228567409725486746114685532611428843970696553723054870710919524255238928541738356450696516302034137957025179252274911492305284875580251537498242752152958407117066303014561567387290966125697410459079", + "10.4859783938191844505415935988555812169983910386669556187311537807971601489415184480294324534243750962935064587431065554132339655732601450466677346771766404683525586939467074949776376839516117900277707447519492965025773007813570350841194233890993183787851607015508682597768217867560501711087754801339252398186169563368609851974003387177803015256072875765438214167126280799321733391301521412815249368328101551446918784488181577223454487520647934057527710710187315407383842241034812304414618212426764289725514443697625658320934830119552552349454613146318727307440539214183275364282577270889732517818803743197835075972826771689559984211698450313448053374104683526842305753510193148049529361498811259623906343956382898276922773672099874559380274456904526382655867821184634279087424431765532414870700646132525635436192820560367779661664927428988733468931949806424994253052465407314901679252685856376776344476864227019344231976962348967817311235507614203388405955265951309377513783090550287722753128747261754207014515315881341170594023794216162541770211605362973081229737656368414853828067103315720270750873", + "10.6347231054330961637890049000468710967852967367343227692828467391174677075461930882497039404312679924973609417456954239974169171943465356151505622576167224107722261919186307370995510381737049573735925722756077768010478340921088783231002011411114041115126818469694758418835306531554372984325159950054383904456824008648509206020079387361951110184527727069909704325603544043605907479968591290774891094123279291131736795093698848050902564325663366479767626432603622322669020341917796822485659409929900105452830742576547225225667146684121685994200313098341107524803798216679250890643001632999316575761423736131913465232528996882995245389183932490310355838413092841757148673983898736712217268944737737243364194758691910788092275990750377595602679382926580501608749815835725227693645717133043491504212467565485943259974039733384056868179674891324584198730112303687866631251118478414455430751138157584997597135830954532233346237984386837638370480702580128433854005982355705368050580179201022259249808579240156592508770145749419614270509119208051546159383852271627968976323806675753699529133087158672557825682", + "10.7814158709708600973470860025697540134833131069132002021875135200480437122785122611113481677522707878078270440052147356092727695527920302171183192478655274869472668345393510398722323555179529207792958553208776624344340893028683838808544904189559530608618288330229561660785494464076778823090275262667649435818366046674470097351430635081878043122218079020162033184280808128488592626175069016310564044843363282384351603178223984429085151346774445891706273636784622362866483557972819012892787057761108736681050757369877123799164633273904139629258646240624506200184033024483531204256854941841214015611888414080581230610166978791113905519323893487804024647095097676311979368148451812686908830353037070405782315727089541764339584093637958422138796375184575441595432133925090181949043536072178753049486872204759334059020258970699357154378751215836144836352430031659044940188023466979385706234766354871873384990411026120082971281373943799958524209806200235642459562870710282507653952117525804197309040193746636407624935115304309270078857483676519373602411048897743124249850703751765985347181558029527375643215", + "10.9261393381382494183949485187745355142392643001293200037804399336898503279246222062168613731063277954463829865410973870577192080366472062964040509440033278743615823412810808078908898807870613199997974098405643999383690286991545964650196935814017029950722564391559018285106664794338502744786047104831103687602494259961816398342935032870065474763913436754495569767978627808003615457573685732588153239217166014299098858554629191013913370517654023841228586351241202877223367260494855558385058038046339898004510183855157527283289679410125378588229499416948431610345648489884658061910043475079418189307489137285545541133794341838958556245644032832230955632382851912531436083565766604594268028883405369333102861811110938475059430428576302304134018133552423994855168237965050769662481212059909922125002130317511819126236377187306085364203705624983640591322488295607424619160166746461204981597459574970519980426620414393119798825541827904061106147335114790118012457207318406183818422346913078125642646008877987007918624713747892824771389677121777686596898164466209882065864762628266271132718624356253452793196", + "11.0689707511584805117811434659236005479075122572654030261378132541766399464801053452268915436339505264869099960261186473580786841783940799119071862844203935756997737196827013181251824477181865522696656125604284386736805412679099995442756521262882968085901005737598504818120062960533623452879232321601862728439436565082413065419068437974996041360159534876356676912365960559399896203071153029799663110896121451617844812242705440244059051070332217484066565235938948140400311999208370258263622580614733135218175221722605324220534894428960790855444760163600390939087544087363052520657480331091788922029648714976820617337239621908921583216442263332160508780261589523500129489988435510612958327244523134689294673236630152564918827636287844901928132768223334355784295928691382783374669003085509906226346278070859886444582772115212199422165986886962139084337282264595688658520928296714120909731973712859435413818042451694188522026870751629872095477433593107333415373943667221266057108367464732484461448541683512088757459353259534085109191456436195932802460979824143610395941363551604400219577421540555259221554", + "11.2099824327958573986225648677376017877086475504215665299167067873045667553037759486727686750491707478834293411489125980911084151079663035133289893355490903237225455297933242623956756700765850165559519010287574088187786256136071791860343087283966672952333022508572112324619331645107711457400199461132270526458620965541207404627199559179879344651656741731856844106860800145662343482669094570758579364544899824573389424347400188820501898154253839556716834069987025577499729423912482339180176769424901522756286560845978811688935258106807347694868506072185526420367236029189162790328650177137575228819652438270486363627393827506772717574627945020518721350959544754722118727376733041854351927926293076323790604362596413400569959286648197872870638472594843231022845264486068134343862498444673897526209611533151572239019385139110221569524392708880223111039983515560401743550284647457807334695086237272708711276174560785696543477439261496094936993988602499825752049022699262521970903438062340959457966112130335715811951217156312056475059606961348236080146557716984203901504347783723320675301673124545417430186", + "11.3492422124642983926102856582985015285395067466832927043380356548562390804853608284602050743042816031793047600978062552284631473271698301080420930678002935270860213755533376410950434831683129266708417862791056849585318715091316511224772804579306952692391203428022706911552905897215022011255923056920968598357445951686767158007175858503283841137547847702169068881757041416256682026875119665861386894957609106355261396135163282225259885976498039746087649186814655905823222925759171803884806349350968882196634773164961078791229532476208824156202390581863307496926197095334795614010135645721792945689410813947143894261828309379674182914788493173415091362063280686801906811659162851572848118095721313328315435166989609801810101070813864563570801067282282192253552931615123833493584040857696592187534301264584146553957310718712255292573453576205261351861700915480639583301267167270018138941290820062263217901164511455735107338870881079416882936221444752202024321144178837275657426737380444900404799010786716522164241960362132578101367581203971478969200704781556667157536062389987737624943537002727294733986", + "11.4868138076131153078093551672152110823792896720438206208589815428358866831391271502916151740432833498923733353034882653574261402114885623063517466286983135609311347428616058487641764580040391132399123735354188924995726084316672645564644522404101010145113496826905661533851564869311026284567807835770793084267376582965078917724760751368098985709220493218989081195410084107253702771346532326060479533778255009456352092653858186317227040032545274297836762746748179412232929420302325855877594918256439049163258491252026402004889017462470314144712637559338394573924897045814379676299403438700340396558709369818377199922811836650582080165464955651223303653264959752987238908036388800978603698543078745746928727371682109974731915482666302457811317513367974821492659153756397368790555646602353958513206947086398520237613898204615597814371058763275824648368925762130837683909032578524176198944131412130278847693768941107158139354113448426375117837953121182384305427053092552066260458822741364621133976801759853058864467919702658753108948232787444346415009083332605651415456404729714544798893173653905698148137", + "11.6227571644752653007277348109508691363662508507756756751036701167061120453681652358829612013449512186720692331837632298664953191556594884903747923711091159798037951823211201052540116242903833376452779227088949634320335447650281101165924512030256613650508677820241405437704762762206782047959767675141661427645411489541320052642562158115270383536284327256491550000081996990946292465147038958140512483013436893674439652156220554266153922101105181022227884639488325310071375913459006514297537440977563220662148148970327960819157453757205132071390336936162228686072898193957868554143074268366176486204705456695741921244062641977969446800006474326691825663289023526630549872030867738441378997270522928994756399267446297804673669222384728768703789276705361232508520458717382592703150193394825544156320863346704391789739396085519417964187584947528508961792799045137827190950383493042007176116232841260864577432961637844272929218361324891683925506702245396833672138534821860627603036634022415963773401638269124800251684954328516467828750283529560003793822429188759689400075614871516086231035596052689743737025", + "11.7571287633482564701088417557941419439968698420773487503462842143146491163563371049337556035298522469859900749767294905204293522292298717243582785099170281163259336541392158276782668075147925622379654122962653351040016712959881553357605497106466470404805444939639812163187639434573134191280457860931724877949789107337574297713157520257772779962308829313235825010872269098259933266628859309692716030518264040729497076680529713079313207178190774506108797460140175583332304192519082133325489174600742357544490571971313852098894475025787306758030943007946889416870903157547612470086523779487801936864170079119042775197049616392224777035884133632044487020869747634558757479347496253003316077397398620232134764330013675436470146051001150951520936702104871579372375941323552263581652132668534769659706010116638397183935078175506596204447625920325403258326466185355961926258614112075160888891191719281518991171695016370238399249053764574155272331577493400906266452679122258224017845896213757845939003637544737204862728065115192407085665447911415853799165098806733280347311674415363212540753763695044873288556", + "11.8899818928180330400350862953605490945670792691885843781217741865902161540797149716863225635789020936982216943798860608686596730470694246279842939661255204995037987819082637534920819262413521898735725618563398700095610197414629361605292906463960168199533434796047990694244545876312967146398128910040168451254044374585833506309988496398521626905559067225391111634661094215489591573641229749765383054051532237798573710270341590710314133283844952727071302050680708243994090927522583874773808185451243117882897718126728487228512838633247224103445095928511497949639973089241105749591676764685460285578873649870047038769689276438146236896979774764862962229114535190203566375515336454212011859282419120166317861652908888475438671284819089665982547279401923987430854451158512654842817295465961540963637129827028222290355602094488202815512160426979269950341228922163729152537302269637545655250485568256282052827775416059744799313956571658807344645572367377614160737274101623235947099688280533936734873574482825770483347386725590354986027708834298213375067720289632698512656106946260229255485263439491511281063", + "12.0213668967023250475121483705231298685008638313363655540949682389613264866896132906306098642187026618532213215211701448267391188368047667853571572694775536356753264174403972755252732243831827044176139209024924394250581368618462046261557956041495153611139167826243672443648055383775943303041688490663671373136155053510360540267843423005332353653056262845689595224998209096627100780784418138991680078849703487894125005007545215782339870314429009558182449825490593249314052067759681658697789673578678949212809806351598964422253804794344853941490798950989758297119239095904492398955585999875857616109880042018712293986158989479506589338238909339482879806698524858243147005443655293460070165320341112926446082098108538465624611435423462989443724332948895564374322613862644840100579844319808606840135928070026153435302458230552287194862404115544729553555860135767866296645359954013075856567898559441124011177102556776336026301858215217613058011231118563314739369153408486077998475470304773205610152830759374129202640779824926230644346880253659061205608241669503029250691241581669322113673069664040300361434", + "12.1513313969589473215460257145568651201497518877897922428050262513288347242121973389754626809925134955645428561432377800707082867615886711829398230527046072149152117757833141185434477765869902183850205483276767851442668275870416792912369988091698336520343468857746751071883637173754271209585483303314697136442637145609733795560874016392837967424129624669796698075496202528858880383635774883501185883268804218639948489991597161620364526639036982352505612319544441359778240876504358105343789015081880171993801331134760442658432233574812308195804501595367608510691945957205786397773541197798945975331217200866768614798768369352312293373100870145040568859670724160372893783528980570376945737242122861351956826347861801637766043000626205823928280244639867984099618586640713739887577174825475613963518050410729443551908819114265689677577478145683280934590715455378138742260694148005560374430740814239204990726910962840148903954657341678891978442315098243895522200158153790667123362932646639672146391300060334021960329885543548050873714607049607780426796959929658969497274971918388832149882433776112378434610", + "12.2799204953578618617546194986711783284885172530116938144368314535771509667558045976384763266587016704303748296979704761081381717620397664865671903510669968678084217328572790633117099878107215974412473324265903962842838656473435606379942829050505712452107928846249065534782492554152722126011025173062371512447124740291554553421509014220072428311418179158177533762082303253141286989645666663806793346216795448342656821786999457421948811886868159285628588777116501247405795055524521868023723016473119342977272714337247635719827603327546913926621343978524311204280270124997453594630999239638634802644337751354075407234286619564038048753263401182285045035976563464216949517991028211274098829529896668645157402605736964080544888823602999291178070941183218703259256702481197869440224328285539315029919735628021900846763654500706187729683074196303084312788621291123362810414238197711110749709574470717069655903547110330030873335426650222570764388586364476419741035560485166836355135819544023640374991386327137930058958044315661460340536197491826128954196500096831279426592578273253394759361748277609755229071", + "12.4071769563386121910871723833880162795828461928567098974966545289703789921372252696246545971698126579135877653699779946636530700600709582176756559672195094792342638905717358599494762112026557836025246676548757396012224731074603580436169013312966381300981288214643884821974524286813435148379353275063447888532961343423260740356759285255609628548615681581561321713204134717540225393296689839237372943143825839653692927609315322726052991713273927559728897504704226043113857065570762959566602644918216789694969199672638429429945004464808633659900365281397958778937764586125792705750168571832536005054994358820565709437950496363494452954047921238695415144815274982050006786314548526164253480435527360117258227218473895919440988655875440528203125946747677251876874785141679432309253336655217406754914545493066933803303046355614733012876287373212014898518464354302511069792971558150198002542994517182497196658469446954272237277648451310578098894153010149839496340312748322929392343542401192635791443342446849357926898503374322883315593972409393470519281160983565963805711107788379316117321935018451317463295", + "12.5331413731550025120788264240552262650349337030496915831496178817114682730392098747329791918902863305800498633260193982243316180906336809047892782798307396595671774022906186556866390215650996940132357511723275244921290116470693138983434180651683791192209057803924504780002068757513764582573061292193093246034953046333204559400786984862618885126937412392431674432129875329475654786938171362596344020101428592962486815404989226269275049982050964912932279406858481733740076448726165236791737387809948044594465748859324274240234682608001489761959800911904582895205648987648856442440083377350279315098412071082116918180875960652807567992085491418518171171779048843712243763089005461162142441959768362576987291412815168255931404395101775965044072802013243885707825024188361637547068403212358740817592235653691584095976849421861670082802750277531514911692932624780562948317181155519719433742200985107712422346336716286438058226121690057831351581765881509015613412808834445888047751194480212233995260850290885434497091479423143647466627421197441327905883948348615191930342201498664435396962952383653761285421", + "12.6578523191369022687748451647920884211351618089655179455231284731368243638831930092692097344570437079901479457687357718509226590879392775115842265975597049724341563061418697031268607830263630749575108233222183077768581512869483056352211926808706010251598533367951222352547093385705143351301673698003798847470899037622815846893505998436154809431208770604783851594929676185652397778605631719747005946930957513095696933347983859316339644080864356270066190757023433598780191812725848826161342208170182063208964958296027351135838121377963924650053695239000481943588371643194130257120532938135164021072988780496867855135805902766925269096358874433009794964404505124093744345096904976475426376615294176138495927979455477696384319750513407338903997493563537351640190122018222196334825106936172049588584462292486129117684021653955548443028996098787136328122645959968477838803895341464736220878601918003630919411584046348014738162733741711244046308733521756823739827300238391611818552174369697043280135230378038036669764857912765848567411839492389221128518450325850349211951118365174902595493189143091128924607", + "12.7813464856668856522518691213367395488373983072590701713145905073584668550411607358543597603912057762741393691355864623321869872045162679380340422123959215611466910403902959589333930419739972126872708018261852986836161629068179608683599318758558454178186907956832450548642925510765032059337782409811599151491946626755685676305766429474808428640216684544678283803484695266015509922793933788792110436669354157798571269751040316991636951713788699537082555292927490570204626589644427435300175517403233899918923272847824314167455320989761357119076509049838004736602842837339638085643968136447256156911729326893301531646656269643040306415499484512699811735326226264568256017365274168292179743002227502407737172878415905382510704635403854488151102140855989374523291111062718131251568078280886769584934696459901137937953964469578793772809237271734821085928782404218121122181261925540158683038925682470156718138294664893516327450715858049368151852456159157278933365855419727276747917314838901881136398470619819131257733243425751608844676566931756320335811737311881389733198752534744615861076204027861852881480", + "12.9036588082705845248371543632003751697456908407741692410784368848786088725089065725375873804520087666996942746345726834840639975755506362717246534706442221166298621207504273622834658505486588760226060303402875348318760592759886407055350301443543632102422510097863033684320708847504885397025676888805608608575632588352908208382177260510976770708247524111302977184221988730373831487689478022518795416243743368791870779402875990432576302206741559354874008433704301896418503322037242979413682693250947191295393881165307605408058206874512520008288998516843589530555818279993680055875466221805842339665434759158713770816962051147931208116808824595295514375045899970471981704078070597035475020898965145851209954427460157152268663408082085125094326139800815655980081696754509782998928240270234248524845103756193355528876937225771208802709529190373396585475974586241329821820837801569449366833520227139445910446436020810058939318594350345270816751238237726135838608689569520523122450244404454913108932211269247818789816060744177821446724166244434311897023559474757455995497570838056986157112960941696803729504", + "13.0248225820488178685342632912343238216979601061218266855718218998666276951533231145020930682260792477360344632310638590295441684624351784583776951333098667981974188365545612612871000737689117674875852615577526787251049514636210279051744104230737587454580087607795759122258403467492028649171542962343479606529561351026688755487685984589921428857133421559960948571647613155305046016188627325903041204154246899196966232462603966700445644910063624590545310742013413052493767760651034718454869397101309887128595851424984506347453928637129803680706460369098293991859471996032517594872564412415070144179482992252118409915695391894969117482400145045884554842840322278011432577120399734619108356438807595811178234057913186320237397185513405311167519217318999889945937021719306691805937829150908057058520820765419626158504132060091774274508926086376591376268595715192288979762123191763090744864854362118104740490470526749755952163229027693188269314110667026497869103566625965385924059261283134617995824097636505520477232078529189494211027236324917581780494684363016330732220817837194012821489865101665659203348", + "13.1448695675323697034354136539313425180677406990253396231413553532158284729201772491011000710677650219054903693738656249197132353617817043139899355573740668204032909567434296038746304150062741309218977952141761472466065644454165057415693463642194136073230607947203262919479440729879071393287017368357538247791027372780044529165958694345741149609916405379143996738502906726395310549057499135876771945647726253389292849661459433071570826833703064597528372476669325238379807256995707509496936873280377426680968490544204144850652418667102858872780887677263338414336218554299503848227359603371483052714037382060524446989585125868194539667288699342590529933341716843693870456228542919094333819496744852442099842703290379050058483746581999303382422470703068869484513287507363016362925163918396245228476769779932001778978178333151597445957345163009522871315976591629005355442432626542153837481717190476686292454901373614541009740405739756345322959707818426567664529141400786956674079108340389783956916039981285613130422619726646882192158229279130067633381058950064006933912115038270746168224845260024281286513", + "13.2638300879130844418692645103419008851433471698576707104035205068479154842342531493640166188424221928872788268021523097025617009883171083293666524699722708507299019677199016888467812521716795727720983628669582611352125389551760744251188257987908956596124821189545257478849203186906127332490552548178206824138544172197838374523423375254198675829138413668912760016032313769059455804653716176524227853011200341883185271520228753499996932010458410031370419693143255990700761000024496673196269609889733829134801047484980551666236858533457146766367747277095875593778729441694718606128544361746910206836748409803492602665596803500054083069780608871505801360646167315352690280628377008432711576063166447694198777963877737992599565652289384323757645957667831632164936914362085854511223997991382883616592832979065177791044611243501006307065338908712799154330972075428217459730419874208577724586140073018349376758248846129948221694682041532005304683418747132755542712569486036886659785111557120560693988749318795483582114240312470812828755095071884506363715783906688243833912926998435817149547884279386906634051", + "13.3817331184947121778387694156683631366934609178535869224734646839530858830882778845431320165557527082867167385741007241233972349668341335799303120558949874914731632596672292536486840252369343075578062661394846729290886120806335230931470676125584836958188275362750631959355148413735909208659653125785489545299880650571571989789816736276472548899331360413686815340230072317761139617108693201596677053371411718241422778714572140731264458353536124425397143067303995240635567710414918725517399711583125030933885900593041624549493909270279061801044266813541511476059360070953132414715897099793064187618904913446179695444823627572975718616435530412231897626821211591630120456854888471296525545355847536852618755937846705639827645780754110681069739162703086029559215644121294709889120500305321671981859220528418810561091642459738043327836329007402390418543140043048855442197107222952090170835732458531444797752568765756885481280298531950424829111511736236703060978513393719587267334516212509718247535160103206224947196863863264871876290808068433102976710291998849009357718081807090905471789659277124839575212", + "13.4986063691111464245935803057163445333446588880954505218387843221811866477814509702726201994868384090085699517429739877130502525078353243003832198065078057206125867558943180721358516952593492926100016791442634700742497189485375590347895515367419024810678201127613962063650779588258427129303547853247317558007027886497918350521735648476962160113303483169507138322563300579235728423638552959320773585796896051727660519635215799533389594349417041464679040078438099479890297375500511781991113346083206493978277223781060900609203238286306467871141396991230768088662632124270257464480586088316850690383023345309392492732989705825016919526022563362954082266181904414071139631058950012713540527049102477938879051900769524120919579312018938311603558253092272074870766079137716555254983943200583248719785173513772917080626726235739995775731701263869010544645677727292023394850886826745691463821983518385802531448450511994014078687762847948523441279737079750421003933691499255395954393282954286628119050279442723264746413216878905804503870657461514746916596067609999603045774298320322180133249625717533859092149", + "13.6144763601762444379926521651240108493489429948062675392899749011656367981822455178853834668853591318227100171777478230478862293910435061059034482102617694499353623610929608083252219728860071814777496237554962825789860436664713007380885823257620705055571016537859083323332155283573726935538232458058826315899029704394102678491521465094178345832292296568693637792747393915301530583743993444025896838065118897343043328452916631236017814449542928117422626902025859794220329730506629124433815526321617718341415931415683837830843770074490481176348422362162861812661346849873918814224705384024355691424864367748319171681413896659635516678441852608440834144162761248958567982479001381585906063881204351628751599665209292094281446522809539191841105420891950899912208472122984294731662074195162813392306707005283151329632622622723286645815527491117005404146816741085203466335075802165744347567892995323123529815454414242781188328567365653543913086263285794736485546877191137857066664712691746005042143722635223400766012268118857311779477233465292274708583508374133748593182509627918787117455241091542819813359", + "13.7293684929565349002814005023543592804964690316913354059740039921737359962110066836654276807236804947742615071427660872700145940238401829666198102867564430983532833968203866397021274696048511423964516039293063346841564372616394035280508377589981815930236172110027155682866173265957057116847537224889132966556719926804970897774043788652449326550990615537122847783422709526359447381966087990633802534575460646525162074014459375015575284404496110852273022569124875729765365403159702452906368625431561932846108624944301668558516528560245529919672218971472439887445983944036799046361732723092955509961768112891725995232612851753679926819549883820603865511609240878443812730667980314193974928566404533803735999392509746959487652262747583255886228825858553626132516826951392583384852945025156027490339688398663126302073252408620920771562662203031820882241531317431978536601598095635063467881482850750509513362287820794106463323082969988103776574802747271900279764712139419063517288236941610321665999875635490491168684987282463547798106958000567974010853725420395569948956710379401344238169278863002835967332", + "13.8433071145943080802284382623942725643459634316370295832402490811584690521837914916840395377602432304386346321516022467700817063042586192089471811215559491096430603765490105342479464734028031685014017988597008866099563434747509151656359907403458022227708855288944495192855866834164923404580317751114810233440974813740088485452355904551218828581183511828392819322800423143611251652965268254587551056785058961962030307952250857929384076417852708688910729480334385710261322295627380646587526400594088017012104793668923859704481465512725231143313046840031532848517753228102569245860823651766421422437423742518931925679240338180398466042655884199628267998290371715502966743259677385997995351151244386978277483823663420757491844034607904266068469818830496093618976553620949696221798505339106720245367168877405376645269053274617909080172273096809275302452571198400347118006550023013802032386296495237116432503947861118574507348019315687686050292633217476405553408632695073744388341821217781854190838168727859124017786167368413748894627539001773837225674001211236781270826204317868935713403376698315709386501", + "13.9563155783525897163028298734019451091984537120228258009450472188267318438067135063202368534135430885083946298549306330756477989556178368665622436754180093476324880937959506547854538083370019416256575776948316707917842310903894619857591393548227911657101468449311608259623964684665016119377046647048049581386101096936670413063222259162339202191273628263372563875815041957309547200658623166127371954284217563921132238888463255849732942787630189806285692737078454631222616459782467155377806421107402656800251572053070998411099760060179547316216902478018563990476197410484317348357273331772258891407220597320756586444959820203436442764666649896682610015685305787123195940452350461973507211933252869415122355860564522872963830841829314900168567809701229312807570848373079796018588703327116777837136272491150569217486925114594308036945621245791848046986349492932929571328689798094081442393417715210813349185572333277619344160965594558435011430506853671006276522611925991500789685436288350432338677840599188216306552667639876278614865474090999682755277088033035543967117665417559338997296158961230538684255", + "14.0684162995042542216674654868534900853924743962472320944901951275359770399233794961508506556929677794549617967276360905381168930018337020653807687724763883010138302750489219880498862993622224095549373405969163535890073412613574826759778017493325279749388170684537388753850910851919272805375112411195909352449662070600051584320215271787478297061945044327159674754973100028483156776843882380652479233971600254593710768026548221752384413741309489246040289220352899116307815228866194939899432434878525491558800547976779979683367688903278732739389881734067014259394063217746106208605190496361134584948172589477057133531025440786827852253824524160548403487907421272973290367703881100721669407971269434798443550172625237114659431030829916141687040666884696235625814564129626435994637907086882588770755812283202784446386224614800747923981140905500960288869620470111613554587095067550976879563417478116388152425814195901924622311843539510171658250266502293689578285040347337973437140124945630951972283147130741281963393446164290359192448952378935001920557624942274221681701969732105101994763264008622253735683", + "14.1796308072441282183853398667291614623803956489790970257104623188232902767282574509996052539083573233298145889942605653298892229257953808202007496768222965476963015892248409827994013842316066098314567630341437024013971121228118377641336015214818721486835757959593011225113742042072497312433546600072511872609098678198012274693439183149268146912703636093212939100804725391474543306624788387699854792164372388175649060124931797401203419100884488639690168576804829763558693789223729096647545879906533473937107656768729633634222862245495581325600417464454810033071730955572334520857335510665755434348564981509217953643371995843993660518911909987080474451217457122342864898645198315616289691926316982991152259678255881050789701321000503460803572510568774002144999754447633636924860956177391322005616623420647924346632052977845409157572899855099445598306816404917155508334824637885940574334850876779996796181107939376311128317312515783517827307603440171245138674643140940490734106905601363012333078105653542123345026860999226152360678825610735394879178469695503958635098408901004932705510782878230077100909", + "14.2899797929645988880465370254439290463492686909646365784756651098966688981604710380521849261282420820080718993444184921140050946072295733777832552069831871497137709875484943005092844538329601721866028257517525127400112068229653107318786632214087321828354194286744189213884282476820178532929026410946336549250316411573632399544976436381304928255592757344082191936540818455775028244579956105065883479913799108021321113869783952904182528280242051379454218665561448727584030626615636178822706926814162499131369332023155252856087861647757703882420420084149242345266216149260241941567215880661724399293386262636274265942504563029111804888220594251821006906781849767633589028769011495517300679816156698760917682079890665846007154923427386849193920295060178471954901369186035029069580960675884569751521212531321426347035716993287569668349433572526231363707210075671937119893845403234179825305216364116472043430327447622673443562491607514186170086950732726413599236608453920182597620790203604341499252603323429275866821091530657037950087409657380807571921060480257877831704466578263052537696771142883837667113", + "14.3994831552013127711282056937351191001504093681728491932833832593979434994003430971466998201017992112805329010979828688660650916169722207860723532331591812462512916668982966008728885975214700393366748922112781560669442805260850747279232150993153692443149737581771637951619052246592314537389589547596925358885851353137852240888588511143973759301432800806312328067688373837578111007355067907342413561415117098106229593114120795475094598890952936412656420669510625019084604237747484641036400610081271857751008108979431957256358635365498727651936976456111883065483148617986465457792466402273815217241817163501352405823111497054361243886482686577961223780674009485714921257768842405600740516816638273826990939617065159558546972545307457270500896948955482426026947281134410487716638801651876698608693876104397820386663227664888754028406305427233767301780066332483940467863387166158701953351518332400189178702153049021261024299343478982543905250789402003398874430729393561464367541193884402280665307850918818544192856877565661864230591257923543269259287766045586392906627455350388206936516877511705006505488", + "14.5081600415254637821968107724614159379846815250015966632796986302946639359084284397562134794977873371225673488011687447300524372638777391491271044047013009672846765153462292968052361902815148016221806543555516416870983561046485697445468525590089690561736144515682350187091487327533880302736617743526917603555494921673130404909292620569107730648244440333842777280190694749887082191823918012255416939347228605499563575333082299453802606427072078361952092566154166904748856523531473204373911618483373304549076618565708179979210316820872299882348744668938414281930060202535519438925657354409407529756410826043868530687455675261372284869586600498214736517437102860130625263737648428644588668437974421283838793145810608177937448518286819323950509354081962798121406813386052183361387375237142429814580328643754914782720125219937145864600464244591497580867134545593652723923600055555437968222771839658325503488203860238775496018875409219820657867877489532429308420073127288519458470515585824162233002589242653827817278322155993680288963941768325132608929167231803325441134141466079523533004874074960297398614", + "14.6160288876324385915282082833965054491451514454610200902394687979785177479643522829616364603240189840566860380268224748399753802405943005392310014953070864465023481741203862559161940023086412200284446473311773218020713884034550394274956642070111944572452151925229164138208667793489213073745951939637376475072238046542165112242929720624283960415646561278977194301782816461600118545055956802134155907504241913799478483079002103747080064163279210998110147485017332310883903664994279933307864561852715983031647907050130006889886745790117080604262580893840381373714551099705553640113221087389797416689282779302152781657206661429673588858985798962970236527448473940009592181110203110178340755616764069248826774690236853289420767334169479100200273495854179775154480776286912775449612542711928074576553201233514379922132051999344634460933918951031402916699819979843036301934686144731527295916388130591787688603848332640080135877157352065976684603109296470843761116064910386409905698675285107464021939356227075015494978348239956711905571402049194421753904018717527587649996077266800964352303624402577118757550", + "14.7231074538527950476608918508913485210193928960438010156179716284477839899656296406728660773561791479300392640548844362423376122815685515054605750659875846934795898267446279294839998923205284269250511553190404067373365705229426342396747030473106863384763359235329631176350397962888021561481413516660292977014970409803172385929807914633372249932127302974588451306885951998924516950174494016508742886729576894104195203891310671564861400064652564905406159871623321437476286879872259083518836208723342177364371256650666793948295098750435124566209886842002880143316847324199429697285209003531473719741904014483758049310397090719533728097260541450500261317080346355382466832396046849587639939461239781658290728113330095841108422751523386313998448194981539672857289889090299694644812449713503451035671101363587351933041787935726164774892898031020620075494054191750748238175302842601156452243294124366476294688491666489019848361123258726182091191116324806207133930412068583323189688687308435693004227410778794481033787991938082837748996778982096020946799825701362360467247804846582233346459021849435486394414", + "14.8294128592903342463108620791209811162154136750542777284601531691224280305317915513146089525434202545204740516997954296244402311661887141413394532911541491603071708609940180070016261017915762557510278422457087524038813467378351272004581598457324467747373030877616178977537315248779792746942842469899245159612381076176060345997493587854288545462033896684057639832634271247921538572263389626921342927751757718681583536839938535751092658431596624136867197010308317749181005637423090876543873298238850113918296817041690209369633579425326504751223838947047626606883955090485790288429021610217101252189548742578539077253367329082514118063765427191960206852366367930126992346062168587627226173914689723039724555064028133389228017987680521282524145956765953246086551097796047782148791998851951221419883319817993999053278752506962511065678830257218401748568500747333591882058597483002531463654177181720203177842917132707292556291289892843397045703928170161651798774202385266858024628481292908429107158745626477532254897607152843489836358490936853541807395474017791353789095258403694863885903856428866385139618", + "14.9349616137730772518742205278502213908354666769768829412154208873914099415699826430905240500055519452566108757946045864392050766773281378318859154769239371884763198843033880284347786378856604370045769280031694584512791649322990279975840486835965869228399135416024953621164643532400693170358493033550812154255730604795122027373166382306083361422620489180286334685541856384068029463428651261328445748342560926139564774421725776053820917605563776256951832599871875185183132937072360851486597203051765984337363986545459745401275505488192448731938753525598111844098064910555199796449249197864727749286292996338718305630998619908744286323602224649686053449748987583874785327499948813912602137839272202488683363930706928086605262922617223633664247999608682512707009348695830289960455591428363355858586332036652696876145134314146004076987087103822970399358514255536649174532275760391584685618135079679840634515711782148326692482011033477006288036228152078965813370535741600755067904328039271925962758975702936379448509324264036066209770450856159966672496255612322665295729865499903170425957082810506551820498", + "15.0397696477860030144945917088662715180419204436596298997795414580537619276470518496795750302683435966960598359912232778691979417087604170857471339357968875914806128827487423868239668258781196328158829014067930293905548139764831766780121016782020549430650869364709405736002482509016517499087673550631711895241943655599845471280944381835142662152324894870918009318555850395370785744325805635115612824121714311554984178485987071523130059978461157895518735288230178080488091738471398284150084865371937653513358898631189129088281619129601787714351761094285499474246778785178627730928100052820335178118094485298540301817051152783369081590502589702221805406134858612454692515706806553394570930351722035092384749695378201907117685274122131158052887362415892662849390029026033965056482083854830488981110682784429900915172219306234004099363300333037817894031519149736675537980617386623663320490641182129254906815604059543725669871346028069397621898119057810818736095370601335065657301433376254680794313020349062521396509775307772376959952905436929593487060738018338230316410641798397322476355542860384513542506", + "15.1438523405392099196696941526680757548021305645205291142290551070202545969870806060651771792665589490055461678011089894664863226391200155446121001161264758488222957146306674042780025430540877651260123695207749882929804823786072408198311834035741094722904703994169074927527266054117152533255107532619942528281884626828101541096773239563535294095652383393617113444649817226044992144468812474731988014146393516008194986121551417317503118242518823714684606734325443399645596959933855453707336231367089097896345978026922587762215370241399967794400041904056720435869378522780399983882254234030896553717060098405070969432588607227990450595751600391582489120049548888787130887917656163272514952919890907132626716845497133112466950843147056634292546916486178521992255691504244921986125000809530997425200716615625657674011024011250858696591746091527644535689099940477872177573673286692409322089652390467243801596188075140733650997142370201841877916119994009448748653226635048181819256281784782880874622975340845523108222703652277923638344521781640569055426282343260980758922970221905010015543051560514662433274", + "15.2472245463115253370040636354083283666887786708714985639777668988830176955007183975627913778852644689341469297550544080185597077331715777153346360021007242495125392214774851264280715894226066393672643745253857483137929607374086675166192281961765358804770989187738591443219457532796617012663647789609431774075740567432008038961013943937307134814420860312306044163504297043835283963554752015900991148417739158394289066018572722217110593352847089201745718938357549727957979705487561467680940950578965108092971745951832261598491593612429568718722411875570411732507363965110669584642166670193068764600247928278340651032872526563501469069542627171043818450750969393729921266850657068206236571831577209919077311206015198636883915870987141318717046234082051220681758363352349761727350749598802358775860890853785340760259057433823505166593652654890358333190798767847250596060513312651361844271657521510045055877766996925314299833842766830666961654150747864536564429858555272922415110649733857674682620223561453248275694304210618254529601023775975491296511721889498789622849848564452286751061016082497088131584", + "15.3499006191973273271932743733389729106106465662646172680460393169714387084447557470480954083233770880379685371224630951351727147025497081082089879388337460847605271660715988291396374847634019968015591655332379953553548320591794507974928536313132140565134911057811331918478115692690902657513781466327964390558905925364443191776886267775090535389272723947721917202602879066426608737057083329758491682770994310428321027233749321777436014858585199107035735971395626559257243819405652335029653770591399178721590892921559544649784504159433642408276679973155389005350337656246816993288749049548293503305422189192594259042858274455047560941579251477856306294970704330271186897488785264092623536912370835806446753257171205100681111029503749113972588676479023379074070878101497336800280410356924143787399669535027376058454568125882734662103842745378855390985776613904203513017797747138888437136968088396337069879433887912538591669283312778213455485732955595524676294450606458545443919774430029550468739232908922412573697555394576825425670246864782661192745625121039099283240722841566743449202185347012194036339", + "15.4518944363733046480094895714642432822764116097792743962905968923051434278273216767519678368256147566495033878636454508377334372505840297952460243476345514701393821523863781406748742704716992949704447086972077248061651918445325061731913106414390710999384235658960798983324112234104659780681677057531882860382080238722943298496230509728345363802492358823405567182598267341768167330142056290790935811977359414090689588039875920175969152935770254523050051392422780000072929490482155794529675141588626785387839003076240285297590899692598611212948974143071946012735043590405405711508420740182622735629791811546902131754304158391375976203350556228354908194871652988791982508708646374469749119063201955850224934760173840978540631523245165459130698723874391791535530500096570481656934324227197278855637657017693124057969321411825957010121491871519557762634188278945281706669785161073963143541978342157205033140283815645312514465796297186749713508027712528205500701661239403838639760963454035559115496453338988692441465086270102708432189916595292275910127721552152009058942505984180320198848113154717062637193", + "15.5532194199919290973914478271101509782761473427556110871326128562635425877948922439065276333739001292422317859939226322742544533781551368669476914135913677167870569871992237487074670090250710391585542749455379676350917711973517231870663274531838871780463639607198142971742006771650734656927254936190760891498433170178096075966621078837969943641749478412326387664953246784721461426256026142642356786959544769333983224947181138296945030840334549653119000316260143077956508210419522473362562194412180815212162799927642323378945617932239804210721035735661553698229406968222610664812153679540697776845028123042956550110363507444357710659863250974690713371372128989567244046052322175878868097778138345843971318806979435481065172044184336853266870505659167792988132948583467977404968694959221486656240243417746389624264522689502159242881137811206933660406168854853625265097649099854630342455703384775379760129637369884518317406075014753125436006487026676158299533450354777908097205026564092618416813042451075357865075958584347010560603909401672674530473016380690156057342486458799820056849296157803970758151", + "15.6538885577994285336615322473375966991656095021435737363246099636760165366202196502339470259559417674183944684300887447920118633727001251716571523443596918848444675379732072543560564133448336770198458947224033362634921875944735296488201053135882187385898631210771646381454433721775116899072292857866394011427204808403618078909248941183413487233021402017272788966706121586469579730897499975748868490518551337318808652816220884250194097501134581362589451191335370815112714612837896607752466579681001969484402775834313370422194201064429923758665189369487888128968954146148578820551889951620171166054882708759173934381781451338459291737123198762967272009330015190135251071755806152473036989743744301736751164450587318893784207514998879026913548107957822584996296731105979982593758231329776234669559571495246544966721659816165141685360821041442768655874261766471614879723279695129605131434774277154659938308116466122952625429526707433155213455467498548671879756157972690042396634723002326783535035168700456971324492035298595293576869795744389366846556161860716979752870417581809090754427851499367674362389", + "15.7539144225679246209830112311867562489275000482982979660467978944730262881956936027247186896733459505337734582610770093614470487327551772081823931905589550005108629069012648755348782514228521197088346998693251351381154586496257153314478419466512135062477857636559546187276312380852109985976404783376323163746995587475215213229589580070616867837675337919606283901588189302295510731616001258677000217918798250564696325480908966629389997769717889909303798070409227548291667767301493099723866749466998823232247966469030308331085073105913646005885136696884725098040065704027444469765094470600930146845779530531161938075234915622678545819344667609350674211649145259963974499132458151510972295814587234589477382477724361318542752546281937647008728052174217050786598039517009852677136114528982242252373617954020044735443912957185708403871758652762532215592658585695740093871059422733899587935643096714258513937804831673775551390957596911031295963904326636986587614829199748400378284270489821119258092593559132400132757457303025648114989713809051372859786312670557557455024113430415444733469786577609605818156", + "15.8533091904240440533801150604807321260894390255847791708290322487869548721062866289150967514385361249309622591731814144915462307294258995039790586215006939993383983758776850046561092349884695864980967491417864933460813596552839148807057208618613557599377913061397320925659394501750622861864171880053557935005392499447778008413317995198028835874078756300521482179548125620652788764854972999687177405402042983731431613693788787613752177711793270302761736067574277658658787903363445166365077580601657490510530290835637982971350451510996298804593461238015330599519964118988140999455569019580613714105164866493396051692919035250861649195973033019817282972152713586938088500687115272282682479043225493555090482203878517967251561713092119554643396372535898649907805934878016873123756393954615387951516173102704296387140802792650937087349547235972359933788305229551638870049736359516727540333980757675042737103700554746326399085275428878409792860763156503485547649698802164314596132917707378582313164765977101027311129848967453806648036945112397617833423627052843598016874809261680305673980351252655348374751", + "15.9520846581496442456835073500703066451779451051014841539242701086762015613192896323745559106469019887460414126185431359961253757915198034227258433864250836161583392878779461056493265572605574360603888584134116652015717511381633174846503017116671061672690227704542137628252959797331559476487739925081575856685236012972763809030119081042926665276791590604864556488405316065408861219952886936162336641184918936697605192640548272076353846488495049719651439648905433484003530512876695233728489114894850158179246113864820837838500720026182528991300469647511661287205697325018876335964502449498974863642135604197870197848793495324492868083775898735465533757619639262635723010975848105068325903417106605865046292138037866182138413986125566393404019074389870752413124723753587841540468575699565237256318701348228914889961059600076085302269512336986876298095168455531799946876677717621683146126707236377496395703746431798350019356976580256457555721053870192650781008973533558052075870268801533388874712868860234888763155218624129421405763678812077319239075778407441953464485710013630549293699630738008836738523", + "16.0502522595242423047658196757944506380174575705759839278253230321445250829639481910961471931453116564538738497439478557175108609739886591120839569490500534822875304849736326488209685631259797055597162087990625950864597269364766964393819102203843223113243118426671582284256752979792222658121065967489791739897901556464359571005944335246989093673473307922127953030743811956112527855213800208534921642131401366328104759081292508449281353427532625724955074014554055167375410461346511957866858023371199864971286184642392511378752324547642788064420065819699737323404789938130114304157002506318247766787276624518432056105705328622750000206435275106450682964574301892472715679021266368586162764998585907621481532861299023329709215002403001723015543872591121222930217538067739593739604698257682609428654874555491602494919829715215979019400567591170934142751177256545981785724618392334660345395676518512531709484372866958613593771143352725257746445919068135186009397759278633269127719426191365945433194069995854695522773330552489914970861258642696680947645047295192118341734641074275298677776747132725952692040", + "16.1478230807732358804057911156359975578643269683364195005563293802325983679008984974142648714564442396471730040316476902098875094502600153583773509818474040254222873787323736489817652011370386406266250541511480202000072979598788155627873931210965950356003142252258291831141254744970185472236595284729309004225710563295709356523567610266397233789715267714804425396668330717742603267969954704057766975076430627334443597598422164729733865234176455146920250925398679022857258803104782468690438474584298601058258695871408692587584948563444892617899745726543714797413684357745555329038056593572733989924153298466060559153513812177648291034169614177512283257755959087939669505720323242559668932499003542818847651691092512987952257177634187849222278857431112238824103335198289105119122009380272498965826349738709572199722545419521302521285254070487073289909851344138939360922891594389079867498143873584750623589649101531017564978708138390620735321513779148712154176474583208544330503651654716904907116042682578169464107303714557388993154579350605533888231564568424188460142954331592433579506586890005695885131", + "16.2448078751809998755011217158068981074812938780376907934288365969067715754580651881228837648643879607033855368102601676632453884110903562211987202416395104068878916710125029828020978141971790535060779445467814920211563614823717939714231027215836135944076544647046307691726601906802103714211555626778098815167697410921218478761241829171583291214474448114233960671085832117529951301204663394172136901026541390977184829069626833926547718636187253278592953151429123517742761612159686867396009176772048429857930463378251101441506406781963593404431204027001757834444765502683573406073319506066129116153755917974319966003049503254536949291575688824723118194707260626100046414546696157059690148588275204844439191014730591329648048783886231915330055732155912797736172314922853100014380565619761622410826147387060234237675537903761684317822710064913207299936997924979239151897177602337621202867831218951358431546933181734907743029920468572483019023238760589912132344481868708100201604097725222903686108103206060682150910142819984712770046957870395535067746543225689701565797231792048627718784232710619996958175", + "16.3412170769233839606963694201612486691212128081356542739834914529370956581095536199949227667563196669751881720330847867749383217493562824508538192834810436530795251403748280815986888683090444963568544342830253998350516075153587022434123870840098964485733650438270480924257439534833868943235183119239136909416092084248849001763157362588633568969048428387870886333191418072195613026763062715704979389513606318621766300613512341969898200938319702408657590012474789777007123467808768282135872999150490149110158277006503250724953661837621574840115483372782860303277647284047119064007533593648396594330123081102605014990883472685835045389875767425672113541605338848610128464772662573977617761213414690520480262408650017838431407962017900140324046253143316145470737963355177005851379248147035370433387833420553321888460391167558380062662113254804107448975955978227341116496076743206260952106365143827443135137267145015186532545755133066280336384345677654367847031873202744469936264238113240447117511360963000412145400308169673233984915808549522819952866570114619293558801485679439444177553637843192666077022", + "16.4370608141699779533272474043612773161336096733770488551072483958825670966030102770671692026351162758060426915952129701085867802729318106406251695179863885464546615845148228047143539122431375925160247632834389582278394024330480487104411090951724620355644351152169170545009407362559853715960254174609992367516445002937337915452344034027633137804671869009243012191216273628143810422653645542449220632441502889291380255597379975105906010494299091436098925393391453500383425028779847395212818216089937829167091842984754080301999529208965785570901563511025237838322249140592553123941513540557406487062630678801556860907709013663182736461628834763074768624936750014768974286417533180445348738169351441886657201423938621061945983927061958409374247097943865562851972717122204967234909902165207404812597672553085816768537588350650139595857211821910608937442187518672584714044022382415383735643991420907608195400673486843199910879900829598881279040861315931094524028380978241183376771806462591007552168307790120399348941306657109189741410463773559051033330925696056841916167522766228211393262242421521807262490", + "16.5323489215027158446880825763336276539766654254272088764809875681257710901986514691251337281589597719030480979213983912333851607240138763154510692762929645134059390271108447868644173448984649545846075027064353386413401987057840078259547584916364797582515654545908036217306641693761885158675919161061304000673810487248591975444958643217446048240102727684132123680636339276356809494454912918773518940016680535088516253123764670882202459282812565757616402645579638779334204722728987624467180608880772319027534713555789150175287611585325048568498467487723808179090257348438123807077849594237725002857165318916587733119054901238012585296647106745143265490190013740659650259863719019289349488568359299562334530428982968033376892598005685239623058868742620448370226790430347712128643558758014939672725409586893221245647244200231825250935867451601474997763673733348363862073700502793354719022161931458435920378330557182605440069878979638381549353114629450034341931427150761577849342839121295284737993268351881523490532278330519022627550209271545051013287036978208888323804801374289519895876593198148288412392", + "16.6270909516939193588113275742453455057724907893471837248190052277684021812706093859674562917358464508678944731335671312361111528635211707981851761281905390428651253063365857714873438460026982265332515908134496574598271324405852203598672867489333701087729773656692255479851820749532099278033668844157411253338256984189005214039791624919948530833113525770673128187949311061890698199891708014824055365136849537030748140516534893460775625312948474125099589563910528552797986693601626798750522320704550044628942365910519008770640036921561300268413859502896583956572600382670717293799295760336680708266640050199950546289960758721503030196132687468226676261182256632215649868207453902112403583378942883517958418243203582422082833178466365454545310575197259045841019912565461611247674091038326392812565767346243460064710336769861695873330502452485176311239682300570315470799685242592229377370919807320562394172447148622490939677945521065046574409955795556738838394520031077084414251361076203172937851582781189271677247274081267854212505982365846174249067482121520863646230241374323178103657911564790192184842", + "16.7212961868837069596057427052330107838993265239842708646860851842703326371466460550285293861073853336430183927150625107744808082403658130218547877377223408626609338367841882539006706085525641360251738080907390644127125042595230279880637143368202331046893342048365464875596596339640431519843405480605327189233621288814329341353255673008710460439879747397502025941747471573127868412038250150005699065690619898644879967858901930028888717317423009915633225475656314991246247179300655948036458387420845855288877301555946710757857081888614708196039221016144384209347600898967572348354997689536324424925550167367649124956548098079407104673133738019223267238283865985764961736835718647168600253346670325018729936886914389649147361585260144938350502362779387053821926782839707071611980639055740818753798912061341260095450383120266085280004484309135011098574017285860156410583019562874766816141902023632532127548071497727038984896353454326117060152368514028177470621582059370306418123530554777252590192842881894048535435254976906742189935635359698594705800588739642243011198473083262224352068070947521888133964", + "16.8149736491937860979338473016064026815629713256323497948750601809568501329556639230091530125737561218251440117233688971366626226619494552699934840033236354855838182946899863935935135051148775248339278515431361132281679384204107687790514630925950009428499533762858168486928997467661567186100299191698405789687931448311811106940799338769819016977485112597785266160291200218493515224003641856137869046817349736860084136521100283230752847231380759335075251104980538366249594135868723508770265154137352284134429841268968217533402887160211021542302759108278289630550854043783744185492975265706362843229478657405729545441090741260159076361941917530778082026439317132083178091065099562781527891889439614485685906543894620100854938929972296809305957708892264846534267896729102201515793747667010846289314417299727358358529077708665332354286589063320334666559975273340602615325426971186711002042629355909063066914261841178544815216158892244142405490982903749738628073534048893782956355157093511439186949168195503573717926825734468084712589410442022354120219836575476305852256521675584981012952509686818126145279", + "16.9081321108119800703237241338254436690744863062204119333243683660599775226753565893209713389767766163161342358021127981271381134650847016286405604432987298022336098638563576267935354939301846494369816655337783246226209880075011315863553918585959135040655522896546602388719639509065495093614444330145112109456097752772698468793609700122810958534616000768715917714125275538225625413748533473685169190832331617113246579894504494307284312332165945233891016849490928121382853036960384597592081111721835630475340517447933339362704327966786541965781642013462403621512902647219230788448655730199762241068447349463838875501396349840327689919737332595302012041802495467706531267072999713901403393223067607382639770962103669304655143862584052038284208763832029931753811022041122025100304848953045363327544205876760304756720535938198106981928743202962212743831014622551526319592553193580573329441708624935281603762989949456873712545791427861490109968314910368234559629841124132807220595321318685022115111820471491845170412521830502033004342105561816928208532788908700951934092518100776316736470776442731692226738", + "17.0007801035793936281121338813371428867974374892864315366365045182530749574622712707915241384347920699293353638201192620301921643313046316033287195368236744465600818338279114167561421338713928665140404227014843877263137439279436595462144971591867941134682123131132347610099618581532784272896432738682598070539934802196472265692623169163830620747322703103707706888841879278208903105409506874013233395298896805581080492544955643820269848540883869294533510006353020349957920715014892361843146242577547625252883154835493940087913143008925195857805360140270418585825481983225958905442213791260106363149613040098659673146882019866732435671376309178138376480369335069359192722225011915819361568401764846284323216010823897735267747840800333035036264285169114393598090497354973291064439481840096277008690228063146037619643429834761658442087827165677168899338925740605695619093196708013773454044065476725273474616759775258989343235256991100913196459365908950267021754881564605943770560095242514851607841979245586880208866747279307676303889206098080334141095498113120491826011797819568010033703314385766397392583", + "17.0929259281098732308568909665181706090496358902951216052253094189082758184705768795728909606854105818308409911054301261308877905438819451701225816708775064163858458811220345957117443399486918793485162274149097723524277233813071363121925271943987039923392571390254618731212423397735256468820990712184553680703600120940437674047217109360209678344268629771031575160683542930850707582417669810552350662093148256275597877537621451125081219588556687019419120479317429823172107590283143446497248490970649768152464725806707130059311761908605648006129152794658287289985756220544649174887465478997809837771313116429454050449336877009922282134713999375548742678240072088620118531202157406755008724496781361076606758611169943346574996481406674965729735501106625955985540926899693816341047327437159278090340558983247348348622180363741547423011416478126650485047347378185921229539834418983942666680991963426108094492973587943493986808103947127419030775318104983559336517699874867642430990267257306908318775712545165790980870833770357342634597715966182879292691159156387989718754333799048530940386842225448232251458", + "17.1845776624693504399278552427660121759014355872173486225007203824024372840436910407549731315312720641661312015514244338979423498353490793511266853712442843525886341505446387699669856777170226001440090937353259650728051196433419270760984455065871632331371517893432279015787092579337531691612539497018543844203336945831070057415570861416522661341142055293762783441277787020381532046055783982924019170148071336852167967942723659657524174803803803905087308384416784431284819770363195053820968301578868801810080541678810607866404802296225462621786603189632403039176608470841164659717593262258932759900746120866956926679585397696382726469136456383993490336779413736927110713121992182458332821162549136160976369409523883489900369202140222731089221360463387016825261552399416009215359001253955577936829021948708246676341112942870776695271407974775582902477226815721865733052145151608560413760572173015439460907252134033256691370749495569198954137521453923556632774376333569072404958969821817487022660731421354245851272428708325787898296874181411803997899332362008586913072670711064770984500148015011826261837", + "17.2757431704407540851904450153949790380186687458654220684915230386503275825407063160604517288734546119505644391694970728295669021023983949819859759900830880079629779705059154865670128635551815720536815841099639525614851417689538084914680867424196821634089586241442130192038834512446570011888290802100133594182555986337723487386416534433468263224465623305274641330130540795411919391711267934371941107593205550581646424497484790190474300721785629523248847972136552642048161447129520586107875881613551369904113055686380180469790846706208691893855593511420750973530511165283555627597887745887134627634145517416050748158800890514425554639321377870923909855121500878983383395887478657227223962509627436500904372492098670589675883214674156834456454663362930882283624845127465731275714349781314030602882871329526710766294672136474269162102821374407938659858184740917810129868058466378108500499655709083903249046674366509191153761430075951411439469754773409282874508134728609913829574500910503209081050228705417132900939410588699788540167873020190018123072161219964179184690554184874930100756126982018853834025", + "17.3664301093984238247123510549790984289306134748291022474290958664888369268710974860027907576347723303147126176414184787060588912832469046111702601777464890642632251154060816817161334316918823566501136820770035716334732686181613705402325472307650116606106783477061012163011204623322704865562057283124639475372748468035585007316914646119895238476177895413281264762196817540406728021584836434537388272205662532262621643283471955600594193213418166120727080989351217403325023680868046291273159196135079849504794468566646008463271904849506404907608613825464391989145962661376690126496752549886760192239310656336157879887593855859958823309866860061179406457120429704015243436160532979492144475251743461081570978743884248426983196247351207081556692289758666519927916028959075589074583772201210742744694427687226168211338842746789032366011901448502121835024794286923051973016164255684120993153139149490806320653960702333007936217638703590917692418814222701997158804755501287181232079015044179490661098796848674027302976104705585992281369648433223442373992912484021774309627757116258683761986486802220878937797", + "17.4566459378143413191692225015426086274031136235582935243632385313858201877701704036484032520749642131133778450955342272025602510829158221972777670586061661701347328186526764805212080639525455982292015938346325289124302844332447725669617702921917808500525274187600536620801147819163613587837238728871997225991025080525180442534466864555824862414662339955733621810264862776187374419901285240431490175974449378317927398381519709919509933689563116335690204265534027606560764875449531405967998639356231702870487782798115026659692007825259723146752469612698767331463901780062493519689225278109283378310274389559679038834170680206517259537270404175432248633893701903077868034694197984698018454399995348712691476944938462701653906803877183551688371651410557476681964972950883316889946306025542494264115645449898893118484226513921500673490556592825150254681189771557834158711489644867165103165017573599086205249218767497287654393905135560681295542932352259490763907188060867843701402082704725079265886683176519491584308173914664681606671056250177292407244890772315688524722948557271250549147036005452988137053", + "17.5463979224170035169103569936773167710489071842695682164094650343960555822548938246261708686464008628120698086564271575140642653268871532667049895917630355233940483632068661179612946301911395716185300516412585342889806163058970394576807852912357307669092680925494306692002896260519270415602285809070330544448934264866486383161101778807666439177712377349404344204981825461265916701713439907634881628142000030147481541566984916776985069974871350878105191169601874427236107028216631331508432342933927262432252048403053983936328555651202085666743721276666416053287908582708399019416116728290391041137776899514963685453226344913930595188919687985925439640490668381197141268324607645626999418743675707607782207977941235558303966153142486351061701922818541439990955033863706292565895764497302237144629129915168217734367589190606338115923850388544120876370105674692788127644053617727607207239081379150797391284871402801013281516570366080963892214472234112621858777932368224243266851672272297127593365190407239608295928071192401106453278389676417859068237527688061268702479082098130209555748133337115265799590", + "17.6356931450223847051632626336912129159953047631160231255194263214719736745345056574006334052947783704789851124650942357806440283438448075865374177648755421744889004812088237415174002112721888433569481184443980026560025069439822330036408245659699705607208167409459718244781459151859701286920686791397587316924683661006361446569736280386659169943463243969853737516308403647389899899943288964539074045777396061094245615020794569618969810767286161759163196190210263374998456288778623199988233761901113536316735857956970778148341712538680960137046414511920334125306354736321418705129785669231702905296255118678564162795574424588337165553826200448066730531304621451838136219021244379504974116096097930348202146495020513154705219076501726427281405053157307369058563911985328395372478199002802154489559015174957595775902617263259894306671438880488104887489699278033942889387921168112741333336787578922278486757542524555357598873580646861232908497366240101359399679018683387336026768844320636768908505456317105807294092097672788610628498171867123780698747648210099920520967511623044818811130645542567309932834", + "17.7245385090551602729816748334114518279754945612238712821380778985291128459103218137495065673854466541622682362428257066623615286572442260252509370960278706846203769865310512284992517302895082622893209537926796280017463901535147972051670019018523401858544697449491264031392177552590621640541933250090639840761373347747515343366798978936585183640879545116516173876005906739343179133280985484624818490205465485219561325156164746751504273876105610799612710721006037204448367236529661370809432349883166842421384570960912042042778577806869476657000521830568512541339663694465418151071669388332194292935706226886522442054214994804992075648639887483850593064021821402928581123306497894520362114907896228738940324597819851313487126651250629326004465638210967502681249693059542046156076195221739152507020779275809905433290066222306761446966124818874306997883520506146444385418530797357425717918563595974995995226384924220388910396640644729397284134504300214056423343303926175613417633632001703765416347632066927654181283576249032690450848532013419243598973087119379948293873011126256165881888478597787596376136", + }}; + + T pi = static_cast<T>("3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913152"); + + unsigned max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + T val = sqrt(pi * k); + T e = relative_error(val, T(data[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + } + std::cout << "Max error was: " << max_err << std::endl; +#if defined(BOOST_INTEL) && defined(TEST_FLOAT128) + BOOST_TEST(max_err < 30); +#else + BOOST_TEST(max_err < 20); +#endif + // + // Some tricky special cases: + // + BOOST_CHECK((boost::math::isfinite)(sqrt((std::numeric_limits<T>::max)()))); + BOOST_CHECK((boost::math::isfinite)(sqrt((std::numeric_limits<T>::min)()))); +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); + // Check low multiprecision digit counts. + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >(); + // Check up to 1000 multiprecision digits. + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<500> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<1000> > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_tan.cpp b/src/boost/libs/multiprecision/test/test_tan.cpp new file mode 100644 index 00000000..70b1d68b --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_tan.cpp @@ -0,0 +1,660 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_MPFI_50 +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_MPFR_50 +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +struct has_poor_large_value_support +{ + static const bool value = false; +}; +#ifdef TEST_CPP_DEC_FLOAT +template <unsigned Digits10, class ExponentType, class Allocator, boost::multiprecision::expression_template_option ExpressionTemplates> +struct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<Digits10, ExponentType, Allocator>, ExpressionTemplates> > +{ + static const bool value = true; +}; +#endif +#ifdef TEST_CPP_BIN_FLOAT +template <unsigned Digits, boost::multiprecision::backends::digit_base_type DigitBase, class Allocator, class Exponent, Exponent MinE, Exponent MaxE, boost::multiprecision::expression_template_option ExpressionTemplates> +struct has_poor_large_value_support<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>, ExpressionTemplates> > +{ + static const bool value = true; +}; +#endif + +template <class T> +void test() +{ + std::cout << "Testing type: " << typeid(T).name() << std::endl; + static const boost::array<boost::array<const char*, 2>, 500> data = + {{ + {{"0", "0"}}, + {{"0.03125", "0.03126017650125595642059651621507489147877835880393069701338513042228140662868270178810496567920444849"}}, + {{"0.0625", "0.06258150756627501465828481747745378814263718044751609194477198396918772026898277636891147279909599223"}}, + {{"0.09375", "0.09402562724573195576489755283678159034525247904824579838425258406126459673745015890895186868431790389"}}, + {{"0.125", "0.1256551365751309677926782186297740007586657638922255426688666139272557034809288714758416649081949452"}}, + {{"0.15625", "0.1575341073252716106852257741724104906661974475121544257009051769486388715993896887955248205741956572"}}, + {{"0.1875", "0.1897286107180591328910833700730338162710122536010363055257273177325079653665703027537671734777793159"}}, + {{"0.21875", "0.2223072805534313308722888175879995822319104918387718270273535559005416973923742249393961682186904743"}}, + {{"0.25", "0.2553419212210362665044822364904736782042016388008226217404756502588831981346542579493165026310550454"}}, + {{"0.28125", "0.2889081724405147260015884454642448286982056723714186732378896291489603033944207768995735063901118923"}}, + {{"0.3125", "0.3230862443517455201183006557179619743037036164759656335249943943470835620899848486165999610265179128"}}, + {{"0.34375", "0.3579617388480169983883959631794471406375375900948760280972554801967920011385682070576100261097824193"}}, + {{"0.375", "0.3936265759256327582294137871012180981856966444080712949818309739116951585799388015457993878787997269"}}, + {{"0.40625", "0.4301800474642300490203296054472752679963181652078151755042924196261397876727827800621729454863519218"}}, + {{"0.4375", "0.467730025452391799921342706961992620413738282701114114727311802060193364671415150855360089743973883"}}, + {{"0.46875", "0.5063943574962298120708227547071771387085972911587370796115595547436950963394141008177411206688111652"}}, + {{"0.5", "0.5463024898437905132551794657802853832975517201797912461640913859329075105180258157151806482706562186"}}, + {{"0.53125", "0.5875973675914432213941588631578976924522062928763012976297627647411436985181631978010052165746790249"}}, + {{"0.5625", "0.630437673835884766852611429299775209903293946951939898251650513745196222165381994293674222073197888"}}, + {{"0.59375", "0.6750004851442429076631779494777229128864061685897319107997999948317524157945835559284790797708856594"}}, + {{"0.625", "0.7214844409909044199895178832795946807605892812145963657590722733756611374332889471678213489198161525"}}, + {{"0.65625", "0.770113551344208705005983660052773240245517035179766333813336659352553100285016757206110401160028615"}}, + {{"0.6875", "0.8211418015898941219114239653747117008753716453086877023306268412086961091026737960147423436480371207"}}, + {{"0.71875", "0.874858760554482349539671907932155532231782257040588572549027780010892786023906162883923961511720127"}}, + {{"0.75", "0.9315964599440724611652027565739364281886913399722189970823760758473440872606463942290222395451727347"}}, + {{"0.78125", "0.9917378983632686802568573899299023689572109767948642785884455151680071204845003794305054375396567381"}}, + {{"0.8125", "1.055727639411919906905928322585893795895648561782414602487481288436493656539800004691156074588329712"}}, + {{"0.84375", "1.124085134704560944131255965236688143403009777898521429483610660496648114350313475950507899270640935"}}, + {{"0.875", "1.197421629234347972339226617276609445975806623418086002265951386950959459751336541541255052511392263"}}, + {{"0.90625", "1.276461828982383445402617843263224436254612963462020761243811395954456362359102470162910199798207331"}}, + {{"0.9375", "1.362071976376228231137266640571127531383954502011184315622281795551984309995647087587519913956728759"}}, + {{"0.96875", "1.455296662469072910283351203225910848640458285194500237036240390915811463257413817682188441906818248"}}, + {{"1", "1.557407724654902230506974807458360173087250772381520038383946605698861397151727289555099965202242984"}}, + {{"1.03125", "1.669970130353601668362228999287655840466243330137306547430306024592587314737242276409239980979443174"}}, + {{"1.0625", "1.794932157265411111412512666640647365321540790157497713363548060626019826336277151761592643681562889"}}, + {{"1.09375", "1.934751011916103924218794082343652203808222523749686394781135509079848569244264225172363092871198012"}}, + {{"1.125", "2.092571276372179004423733981234886782259941716148720572913991515339894408382371607574079035650497628"}}, + {{"1.15625", "2.272484060247449371554848155118626331407879143446651944395567708418983252993702557436552564850427597"}}, + {{"1.1875", "2.479912917556758792437515574454698934001624072586467858166295252178386457324268836053055868956236971"}}, + {{"1.21875", "2.722205296368710926927932441765877991142333599010908457349133016162381084884183783877142234320889929"}}, + {{"1.25", "3.009569673862831288157563894386243931391637699606062181047618417194668052548525026087449023543493348"}}, + {{"1.28125", "3.356619539863437446801254212059537717694035906934171604782430676182834617443082960603002796648697006"}}, + {{"1.3125", "3.785038166535876194630450975067081020082611278470578710038656250838244608554256510046862645943214168"}}, + {{"1.34375", "4.328443997051826678273102914917348524900160978527585314859991445919675557868173766988955991311583481"}}, + {{"1.375", "5.04191525648136332110647205436422898660842030191113551461354742130497045161358084541551547909572374"}}, + {{"1.40625", "6.02236781523945747670227618692239447637023828129226996489330674807031833318199939459376428890858723"}}, + {{"1.4375", "7.457597366497314807346683309400119820853357043059007743950216525315136075258562571085388447049580691"}}, + {{"1.46875", "9.765431722939984318153137075537986427219225446494026346174651506537333303940271000197727980305021618"}}, + {{"1.5", "14.10141994717171938764608365198775644565954357723586186612326758608969627041415526864870292630944229"}}, + {{"1.53125", "25.27361509038201021888564593774203447137999639112919943365223977030408052066444435679945642193151117"}}, + {{"1.5625", "120.5325057225426126499709994255564804478992494692406282802019970839232698437518852292295322760051977"}}, + {{"1.59375", "-43.55836040673973128976461522014256814059799632626649998645431997677346427573993827534701436489680689"}}, + {{"1.625", "-18.43086276236962258434966752738448975654856844592479276671012332110139541995382323486170528839748939"}}, + {{"1.65625", "-11.67374867215481348216513536293945130766869617358776549669176281104274968860961548954064974733991076"}}, + {{"1.6875", "-8.529773993911653209272999783778324026196719414411590092375294867302897481134537117581472896391856125"}}, + {{"1.71875", "-6.709482397820695376442251396240149572345307174060614879543507453718786710576833294867753884694537068"}}, + {{"1.75", "-5.520379922509330168089935698420205500301122430036809938027371836902288281994865833387763391132527793"}}, + {{"1.78125", "-4.681280325336429567316481395066494078522124421106252324368679821712511116596067067167862140573504461"}}, + {{"1.8125", "-4.056414052170035671394695838412072312925972547334020477371203912084804008892977770267448199074447777"}}, + {{"1.84375", "-3.572185661861125859870109039981697499670205624150737204067785923886464814599307447743073100872203818"}}, + {{"1.875", "-3.185238919501229169914672833591055563068190813252958079987355697225012578404488535638528315769681186"}}, + {{"1.90625", "-2.868371726567042158384165205507273428429609298347592604875428057959086996590505442480814626239318494"}}, + {{"1.9375", "-2.603652912010850547260718033703880538638622594696262109914178307203938532760442947667909676035790898"}}, + {{"1.96875", "-2.378782114044268462754557076702009514149544247914950239975234530609231791907385965883627186285245033"}}, + {{"2", "-2.185039863261518991643306102313682543432017746227663164562955869966773747209194182319743542104728548"}}, + {{"2.03125", "-2.016072402071886080344963601799448100479409508905552305715636690184075224937451135890591580854847922"}}, + {{"2.0625", "-1.86713988123437020407782794323860043132451055327769468817959958079457004467338400013589662215485346"}}, + {{"2.09375", "-1.734634103946532053863260773540976834775727590591832428183425859927779370855756294581920109583545138"}}, + {{"2.125", "-1.615759423973460045704218998135983105718634789435135146363364502252797531256854000679335498343468236"}}, + {{"2.15625", "-1.508315836353881219959349807787957061590021089263168744744644715237923771519750208817662219357365791"}}, + {{"2.1875", "-1.410548011813148830578875195416796900655621273730614063607851296345238287109255775298602026828637775"}}, + {{"2.21875", "-1.321038011883972941371242354544773427461451983076687172335288474134737150563349929598365091185906691"}}, + {{"2.25", "-1.238627616224096475286573358483115818987811679840895892063010057942989763968416082248247538779346115"}}, + {{"2.28125", "-1.162361144121629479886631062456510653121514437736910570208484412489182649570861593071569298439919991"}}, + {{"2.3125", "-1.091442725473163592445273166049218471062020679322657236270267019564600575624640388147984118518979059"}}, + {{"2.34375", "-1.025203931548868392935198625444103909279764848147237361743751176005185409221197679274034521026108332"}}, + {{"2.375", "-0.9630789471610371325783309326887526239686440615099207880230611368370468000350460791927023591069451265"}}, + {{"2.40625", "-0.9045853091742213054875350240709441597937968403208608690036487459318455608785453421438664490396695609"}}, + {{"2.4375", "-0.8493088059488314622450104194218363224080665638942044768228802750401486144919082454646163741529209686"}}, + {{"2.46875", "-0.7968915235352686521345041809817019192899787435677815043081356746793473472915009329509869865385574704"}}, + {{"2.5", "-0.747022297238660279355352687825274557904116956883011279066593089700271855760843718388592769933778409"}}, + {{"2.53125", "-0.699429020084844342139783831016239425344370000759297142831905446726651787263273111657622358057530982"}}, + {{"2.5625", "-0.653872397910572369605836837404416068498526729423046632151562590225826018439381877458767572737519508"}}, + {{"2.59375", "-0.6101408409895599924272199138429116429964861640554001463611527892708422318404310839955568952517348978"}}, + {{"2.625", "-0.5680462555551780726648895974757705443146437970424414412380682777625097984947690751561280498460825515"}}, + {{"2.65625", "-0.5274205529869757121326571336563206310413652365485599902702063856643631953989601868253259786432770197"}}, + {{"2.6875", "-0.4881127351190876547388242189029165584838796506348536005759885166591812246270986452391896414818116207"}}, + {{"2.71875", "-0.4499864448356251166356611982487791354890745233650543094554613558499691453012194865420102877343872536"}}, + {{"2.75", "-0.412917894484932487763966873261129123736255820362062889934249403216388494265361969753200463293305801"}}, + {{"2.78125", "-0.3767941025635464453019403649599866905758314392515266200296815335892123350214817069316692446879993786"}}, + {{"2.8125", "-0.3415113829599005939054709337126887266408130303329754956325710946559071503247227755879401227074384719"}}, + {{"2.84375", "-0.3069740418053874743538801719778118186539092328300496832334808000582741898558068313989599567333495833"}}, + {{"2.875", "-0.2730932453907306446782089914481699536905769611886147850801712661656164014954781669815730570254890551"}}, + {{"2.90625", "-0.2397860292133634315864717364763276794949749917725083450148739709007738169658284872978100162537831057"}}, + {{"2.9375", "-0.2069744234334290889140606202259876249518274239071734165293810142417092926391409078539182667795178826"}}, + {{"2.96875", "-0.1745846741378176862031217701953393007964354401947395498383109594878301292911980508212117939922029155"}}, + {{"3", "-0.1425465430742778052956354105339134932260922849018046476332389766888585952215385380591060583477669114"}}, + {{"3.03125", "-0.1107926710961848652307179061543482824777047419183290635786540267776792824053626901819122659270065422"}}, + {{"3.0625", "-0.07925799258597813975964847855303205226643624625818783981886842299834648957527837719024324414633813629"}}, + {{"3.09375", "-0.04787918970239737242913390208792864526960233706882073548585416320272138422285616307162127608218497512"}}, + {{"3.125", "-0.01659417649935840190191646601956655481659118246051776036792478758448298530865094236374141834995963483"}}, + {{"3.15625", "0.01465839615112051363829193218735346545420611046761168233490628016451488745447998876530695315188732072"}}, + {{"3.1875", "0.04593962329265888212191655478619122278727029224118607262776824432506068644004151566997697327162767079"}}, + {{"3.21875", "0.07731082437922182842323045510047455560710445548270932232603347976675416898602720984389229982663062937"}}, + {{"3.25", "0.1088340255133297195139603974000083015109646348076838424061656004036607221464457317348103204356071731"}}, + {{"3.28125", "0.1405724535178196442425946789234394740490046721659763531803771463602023716095051057689530418533761391"}}, + {{"3.3125", "0.172591050272744891901962315250310519786980119755314731828011976218754514667360156546007027602360458"}}, + {{"3.34375", "0.2049570163396922924222670027465798026391019465616329916778651389384367221289434591672530287680469817"}}, + {{"3.375", "0.237740393762143806988724415397077124401764815151774813277613941354927085310634989951327775643776322"}}, + {{"3.40625", "0.2710146991120596316784994914008470605846614604634004480958302230976152416477575814862222371539690966"}}, + {{"3.4375", "0.3048576194048116313509686061976383012732471442214687629070980813100980504220010433668547826451536192"}}, + {{"3.46875", "0.33935178550149794902043849733017382894738729159656755127388089028458110314950118486374283672385814"}}, + {{"3.5", "0.3745856401585946663305125799891473884508822842892592306930231225774355972615263725457922224498281269"}}, + {{"3.53125", "0.4106544211005646795132687105613188412302653916099336518744517138690111552283413041415216571077234329"}}, + {{"3.5625", "0.447661283553583556404846819303519593092219301719424669894622854440119111664920988209774876249304265"}}, + {{"3.59375", "0.4857185918149514991806435613800961704649349211376530235980832426061445834319868210377502054789684188"}}, + {{"3.625", "0.5249494159434426029201266393240939090334746308513972623727472919160131375298663507047002581644827389"}}, + {{"3.65625", "0.5654892779403682511970427653303379875705726194565986095362182202060326386665976843463927284690694492"}}, + {{"3.6875", "0.6074882023842700195137806696254362966726637333828709216522375901698082716779542882925451551904376524"}}, + {{"3.71875", "0.6511131401046877694771154604832169765858772246556092408841970307496747807017677126165226354908150626"}}, + {{"3.75", "0.6965508511114601330600221624003410002384063251948773727536766307711270568580190864635818668189622464"}}, + {{"3.78125", "0.7440113559767865266278722337979770721544668975249127911732590346704528413537145792818180362367062195"}}, + {{"3.8125", "0.7937320950520845038640709755691971987193904745863880210276991068348251595048327258835950484424829585"}}, + {{"3.84375", "0.8459829748791345210684014414635237310065611239815471815195561711011715779741435605360151278986068963"}}, + {{"3.875", "0.9010725345768489830226429310383860542057548011724428357500976339946729939388193110037885928433616767"}}, + {{"3.90625", "0.9593555370605378999830231072930600308342084750238673386763085477722047681353378531697620720257631096"}}, + {{"3.9375", "1.021242388200347736200680021836703924511025898807046899043703227626470466798902950286611342705663006"}}, + {{"3.96875", "1.087210922446937924973630130633474302114867753655250594086911814333271884554141747835703519160797518"}}, + {{"4", "1.157821282349577583137342418267323923119762767367142130084857189358985762063503791325897570132020188"}}, + {{"4.03125", "1.233734886297294089608083483431716940428204649552146125435266924766182484146724296986257289579785258"}}, + {{"4.0625", "1.315738861236497278595002752513023767487817470172494220905161864739955592222079472915707284820672627"}}, + {{"4.09375", "1.404777873409928816791398747372142291632709052730067982243952454765008272213717678329031865335794425"}}, + {{"4.125", "1.501996112821481350670183703711495663471610930233216088609964712367465201389736354667815373825067405"}}, + {{"4.15625", "1.608793425833300449400383022559449738336897468383397721431496100147808519893555398680197430417094739"}}, + {{"4.1875", "1.726901492741173774258474522465444605840834193796631414995320087774658896048364103982815258692096685"}}, + {{"4.21875", "1.858488933532261262387603943116424040560957193049648082245398381173590809878153982869279424951736518"}}, + {{"4.25", "2.006309027858059435312199733843025004203991000201116744630971025635743461495678364523854925961565933"}}, + {{"4.28125", "2.173911671176453464233801926617652208987805422324233358984523813313677124319401603031463553334586795"}}, + {{"4.3125", "2.365954706436810886261405424430153147538433069393544616996159851851045098884294543485330531184033036"}}, + {{"4.34375", "2.58867360110912318951821732893635523217217883697807084314676743075156168098379747192932679404932885"}}, + {{"4.375", "2.850612135014197347464512007371469511624647336547380863597026522958389351638925329325864211361675359"}}, + {{"4.40625", "3.163800603288976619542297558662099459127776345948257172928079751633780670148333702513937775996967237"}}, + {{"4.4375", "3.545737656638732611056781822478653525618506322500845353570490033964184425114602742381228738013800916"}}, + {{"4.46875", "4.022897320897881433471367965265766624497222626661161034375557752511167850308209715183529923181209519"}}, + {{"4.5", "4.63733205455118446831908669495962673002033167604849908135592490784364853630436659035964429989580423"}}, + {{"4.53125", "5.460110732358225081268571201584576241967507554680233568022847841671382048904153089722943992228366072"}}, + {{"4.5625", "6.621566538917184779658822397475662809951450423939232173471067230932326374886115835513736745573657993"}}, + {{"4.59375", "8.389349373172668043480112406855801804399985563752529469857319424831372393351619823015010870227400011"}}, + {{"4.625", "11.41394586984414667039249686700424655784704375419079662399301751232175345550471908433956600220150528"}}, + {{"4.65625", "17.794217921195291872116110930917322871062931030345133311457707064544221956249568351463091932558272"}}, + {{"4.6875", "40.17012705640036449304190879290789586501901676251470634007061519017512737181345480527620292167336129"}}, + {{"4.71875", "-157.2053810419425516610333761767147984621064081691004376958977511691902151494982722512124394464246881"}}, + {{"4.75", "-26.57541423100021444925624133456621507049828719711987551420375127874685894467704404079281767156965171"}}, + {{"4.78125", "-14.49904303397407169401387138739025359024482851876427547784737429808056788404653273313794074954104547"}}, + {{"4.8125", "-9.955517692663199659497301146983549868138803040917546840671025802878897403111578981570237166977305366"}}, + {{"4.84375", "-7.568770928466597669950125714728032038595443682400782384350047230172533622281584347829485301888539665"}}, + {{"4.875", "-6.095345265174791895543529207308251915058396610943153120402963827367536675687235397631104150517714925"}}, + {{"4.90625", "-5.093551747761417849838605582864480592041118085930024194611183352044275362666663197560756285563557591"}}, + {{"4.9375", "-4.366960809832423113382187614785174399552256061595826665894310062349100292377458713017173941901099366"}}, + {{"4.96875", "-3.814918596744426621193354615307784649480559936141816068738250826073519922812423391628708426424484949"}}, + {{"5", "-3.380515006246585636982705879447343908709569208285459877176820980918346010201206056831791856009410428"}}, + {{"5.03125", "-3.029148102302771164961521436423971160566131129828714146460894246137584114582867735365596418294127015"}}, + {{"5.0625", "-2.73856823245603647865430226656274757425295307326689315789016177502179223572750955725123296691662252"}}, + {{"5.09375", "-2.493817050876063510228483889992811590654110757263765873027034424090589388194896708294715609776449821"}}, + {{"5.125", "-2.284466361999853132376034939699606124682746442696980078901017290742647881722505799438755300967817548"}}, + {{"5.15625", "-2.103023353734157432798966856819893312894278382156270431204069828145019096032929826221618815522735662"}}, + {{"5.1875", "-1.94396519241478443283285298645374010314101176847753574637302261542129293949555826361500398886874374"}}, + {{"5.21875", "-1.803131092461690600361529359360266463729989122374270260332052248390551413451160551386405337128358437"}}, + {{"5.25", "-1.677326406624389127684834446781355734878514221167662440011355600468562011653802826535309338734910053"}}, + {{"5.28125", "-1.564057206075927617852462348582481289639348906743456817576975327632362277790709160010002260498590699"}}, + {{"5.3125", "-1.461347784441303570775301256747389266430752496556055422309798378517676612642129660840051802732712867"}}, + {{"5.34375", "-1.36761235448791393113713404156603997628029078648313063442112198771680848353561063900933679869893461"}}, + {{"5.375", "-1.281563046345464215429873432637423222317866003116950751512613373376845314748305445490135781753417754"}}, + {{"5.40625", "-1.202142762311081825673780483344209940977316276937937096782702116019344314429792428912212274465011549"}}, + {{"5.4375", "-1.128475389186388730418668294914420100814289081230956940736485357975544285270667364906582995184004442"}}, + {{"5.46875", "-1.059828347715565927266867602143137996921061876523369816266086983272908895834550263458873978282357056"}}, + {{"5.5", "-0.9955840522138850177019161740702867286905993509040201421089147368547994233084178348523042915084083077"}}, + {{"5.53125", "-0.9352178996735373313249149491276249977722839556692437323635652451207536878974422360418217978053551773"}}, + {{"5.5625", "-0.8782811077026627420028846442823333510762218192932291958379466783448865095622083395150126065512344446"}}, + {{"5.59375", "-0.8243871973186229222115460053416379931615277523370335469512772188350449840600638037662602397836368723"}}, + {{"5.625", "-0.7732012463758734614771474685457909254527078194270700631060606366411896649393019485319264721701600447"}}, + {{"5.65625", "-0.7244312708999757737148502388902211557937330882505616499576249426224616653330080051888518816616123148"}}, + {{"5.6875", "-0.6778212563139696041943536024958433042316769928076303165171422834039846729764625273526488517789737417"}}, + {{"5.71875", "-0.6331454792161440424929262529011204753164261484247750443857435235991899745283883164285814469564729784"}}, + {{"5.75", "-0.5902038468644901054170195032663081108054249240846444267071062035473153343668376567479794165486184472"}}, + {{"5.78125", "-0.5488180452487470465583585186996023704202388711137425402809495353782052794835324270116435144444853907"}}, + {{"5.8125", "-0.5088283340526268433264568968479225952416460593340160732760808861658301198202358775409378607410253813"}}, + {{"5.84375", "-0.4700908624280941936361204610007198415053847982327139590868905985009927783431252538270334618349713453"}}, + {{"5.875", "-0.4324754064907757695440115128522408464584984965503283137576460100497915888775090560945910034482914049"}}, + {{"5.90625", "-0.3958634500577715728387322802090283590444850041488349012771936138475077409268246305105488709941047507"}}, + {{"5.9375", "-0.3601465460097104261765989532960199175446047549989388477273964911510226366930877544365028188123550406"}}, + {{"5.96875", "-0.3252249079465421281971924062604461228563045080514509080291865924060718896122952297947720584304400305"}}, + {{"6", "-0.2910061913847491570536995888681755428311555709123391316088271933046559131122021519996248059475229616"}}, + {{"6.03125", "-0.2574044312501190948926553260844066507272665964422420930835303888833069876363053415593229084989769505"}}, + {{"6.0625", "-0.2243391083295019990486082083153394557139168759436924449745473819036543999446390847474833972561431122"}}, + {{"6.09375", "-0.1917343220126000636733861789852210342976612418141698349764104452472624060435608559813294673409175422"}}, + {{"6.125", "-0.1595180503486741129487427411798597329274963598657430717585348638114328150730071113710855848882228728"}}, + {{"6.15625", "-0.1276214813658537291522157530092700353508309312306960197241502999632222071779029887930485312029959035"}}, + {{"6.1875", "-0.09597840190639155007190320592294119000151190572960121328263061886000450929267149036536453259308092125"}}, + {{"6.21875", "-0.06452463203653075216342354397349405171379838323909874171208799994716724111404978040328803565744248937"}}, + {{"6.25", "-0.03319749448301144438419631194317525127766038457693080701966081495473675499225984399367237591921526005"}}, + {{"6.28125", "-0.001935309595765553843691829525274435788517976054625627169224279956186864996201309127614969112751901202"}}, + {{"6.3125", "0.02932309291350979792274199376680897224174579057648744678958323756547521586508413864276599103614351545"}}, + {{"6.34375", "0.06063885372047505801221326406404454670246033034497805406862823133882341608599003383282431176702261307"}}, + {{"6.375", "0.09207356314350050835492397132807778236841887606137324897895572241559097713132233298612222140840431269"}}, + {{"6.40625", "0.1236897479096077296070838372979705928368188283231838414804934929274025398571452124588393065510099759"}}, + {{"6.4375", "0.1555513736514298191439929689618245053471522825437403514671018199418895089031472964835239198291348668"}}, + {{"6.46875", "0.1877243718114725376401948692378642961122451437059168414418744613043681130520375192781612678122611322"}}, + {{"6.5", "0.220277200345896811825735903245910395013134783433298671312565971040207859095962733489570927809983752"}}, + {{"6.53125", "0.253281448628424489171015810263074415662213222146436493340123226398154356922736152388141063544543841"}}, + {{"6.5625", "0.2868124983022992902396435016696204994189572656467726352599962917225918966603261177449285587256173481"}}, + {{"6.59375", "0.3209502535782458942725336084114371332732723992168430541003499245591367871623197594684565991267905584"}}, + {{"6.625", "0.3557799567143647005420612267605866339037398845912245431900523492992941964222774204935357299525662811"}}, + {{"6.65625", "0.3913931072527633586303310805574337028074307951034635414359349547707586122479246892158861767238081689"}}, + {{"6.6875", "0.4278885071761893999613016206982314187458164558702387841850210320754507932238151571774989545334487634"}}, + {{"6.71875", "0.4653734586819128141559933341200671578345456984030117446615279672146457039797505409854792515433603876"}}, + {{"6.75", "0.5039651470083475548132524571742890116543823430974166616625221219450482100216791892806202009417424483"}}, + {{"6.78125", "0.5437922480355643338730870787135605883829637094412174029296025101763018004204025974330398781596165429"}}, + {{"6.8125", "0.5849968096716556782374159174641655681779685895667304240747256104820508784969531169383146463204412289"}}, + {{"6.84375", "0.6277364679474334892591612082171255002710958195004825881252644517358490289176441185242244713866378973"}}, + {{"6.875", "0.6721870741034611638659173114401257239025537597591200195749563598359978601937626091399638175089362186"}}, + {{"6.90625", "0.7185458288995548400076077740862700950460682676000352992576300205153430366069275776925317595307700138"}}, + {{"6.9375", "0.7670350464671162556530262845461572442649216262010355745804068537455730294466119988902478588983034749"}}, + {{"6.96875", "0.8179067044246350052260597321820256016080683284701549230268748786223049718597359248253027839270497755"}}, + {{"7", "0.8714479827243187364564508896003135663222034245984200644480154523301674476556679351044748556811165168"}}, + {{"7.03125", "0.927988055100702558366453168987743089267307369461721117972360539733706484657902890137954063374826404"}}, + {{"7.0625", "0.9879064802291251594676053789880311203133455080943572829265181459625625927973428370265184881799942024"}}, + {{"7.09375", "1.0516436537462216418830263449985522705286903110788757629051396054699693751826899237943523838887297"}}, + {{"7.125", "1.119713940340697920929231941973033073135897434271449197914919579212768620587877263960959541708252549"}}, + {{"7.15625", "1.192722326901007588684149485242155872646533354464514409876904886587006629927655098723914331692457874"}}, + {{"7.1875", "1.271385753083766195102512866837447084316821755807112034055075019301218550802923593730276046614253933"}}, + {{"7.21875", "1.356560730687106090381626490498188582130942795512557181635747233593968595718598671759051546605979157"}}, + {{"7.25", "1.449279530126825400966804908182545262594041927922324311633865090981669827371184783228521282728877249"}}, + {{"7.28125", "1.550798206734497978345598394969907597227586253061565831974177990152095709794984147425013361851865459"}}, + {{"7.3125", "1.662661250535958572647253880444919849918733690439628459569418630367100238120581497993662350014826086"}}, + {{"7.34375", "1.78678998697496418766617671089138013384203233815466866101103271149031802024685694556034074365409757"}}, + {{"7.375", "1.925605576103531021088436315604614476223254075602410795428544750301783382496712246458936951616523844"}}, + {{"7.40625", "2.082203514638078116771326575602059859463528643293617740928645387731580498162533103205305011512631601"}}, + {{"7.4375", "2.26060669237264261355866723509904048590096081733761353611694012356866351200745710198451308329107618"}}, + {{"7.46875", "2.466141609729379985621243345839389610788373993111041429799962056660510586368685947727836988290301937"}}, + {{"7.5", "2.706013866772690776762802272387995008883446304522264964682388787620940583840910641036913840080466461"}}, + {{"7.53125", "2.990217991868365275378986251269668199642886675694545360724616292050097614350992705530127905271866877"}}, + {{"7.5625", "3.333032524336291185691514966848310245587002670642998146766838315216031204958906362527023258344720302"}}, + {{"7.59375", "3.755592314437586774843968169016218401146579356484719112952387050721790775719524338750656820475167322"}}, + {{"7.625", "4.290567124941375634141691032410770755182292184491365711713765284134592087921445364428118108025228059"}}, + {{"7.65625", "4.991276730757292357917427430609014256293569739250152073504758948209194194425629988371488577185989884"}}, + {{"7.6875", "5.9510718925579227833281678276540391546652969268664831508775318977823975271243707799244732578159289"}}, + {{"7.71875", "7.349587230185289251288167334999299680627536804325241700547934306594013397091284138506685042660382893"}}, + {{"7.75", "9.582397403456211211397313849974932847186773522851876679318331037683816539880381009086487008735246101"}}, + {{"7.78125", "13.72492306901017608779850845108579464520662673186624419937919970195919428249551440291202224739747059"}}, + {{"7.8125", "24.09322543772519084215097143980037097594901385135011887012038200799428585198794379628997732285582328"}}, + {{"7.84375", "97.73268930511967729279698949083284985794762903146492273796908122393941623833579266193628175149777252"}}, + {{"7.875", "-47.57043136522765090736927872199715977332175052521738553413789183297556632881030788665564177584345509"}}, + {{"7.90625", "-19.11460505409424788533123395282424237931209756369617281068252559403871558997768678144456749005346186"}}, + {{"7.9375", "-11.94556191307435573940630678240021478719574633441063345522218692801937432207824662871635357235633214"}}, + {{"7.96875", "-8.674912622365588398920385347547421582720453172032529527100491584226967033946983107374195473719464544"}}, + {{"8", "-6.799711455220378699925262759608633364881412661473712848121891484119304982720857546088989511220313601"}}, + {{"8.03125", "-5.581950808689684669549294209348398629337304002995630540331278821921778288507014685935916701606576575"}}, + {{"8.0625", "-4.726032195156837427410372612416284237028321048638455837876262548466898310633589798461547191163836986"}}, + {{"8.09375", "-4.090461187975555242897409987452358342061343516721018283559611963305885456193756951211377465919516297"}}, + {{"8.125", "-3.599001897974260972151248247566727216299014591900000335282979733754229851045581086180509810930082767"}}, + {{"8.15625", "-3.206943184854794792051938572955176223102804950834430935020353335808782541779058955201736266932317623"}}, + {{"8.1875", "-2.886329592416760158849088002905458575851623094189615497250550481681316568867901585210424096370674517"}}, + {{"8.21875", "-2.618783945156319374614290552008768448544289531418583013216952580114253625700948540561589098351543348"}}, + {{"8.25", "-2.391728174447109499408796092049518207948088283366738019362364536579358984891061627461448588900266354"}}, + {{"8.28125", "-2.196262571237231366422169733787602194377870425422442983742466664711276453593062387209663908411122531"}}, + {{"8.3125", "-2.025912262702788461190762240682190168816613310552683831653429045356666462021227127736084042613847923"}}, + {{"8.34375", "-1.875853575963005310284960792984729880727224645450131943927210730483841090952411053279594957173517387"}}, + {{"8.375", "-1.74241880761627240539700340437602803932808901813845968268891377391077356174950266498464542879686652"}}, + {{"8.40625", "-1.622769124048113033597644536164719722449235338830292053581380926565132897863391794369515824501033615"}}, + {{"8.4375", "-1.514672563181530134110926429438194143845293739750523302549165608155316405124742878421871789886842147"}}, + {{"8.46875", "-1.416349739641873214089748540260482127074454913435673678582846741597865860350934848935327297727726336"}}, + {{"8.5", "-1.326364327785606923837177509628989183019847616858933039728626565320594601352898256466729337047543442"}}, + {{"8.53125", "-1.243543859514378322699255610900405730249411506966951588519354941299030591219071989214839064576899506"}}, + {{"8.5625", "-1.166921477042600182902656425322990210134485019242760863805503078706720819497128002394896106356209544"}}, + {{"8.59375", "-1.095692443843841888393214442111438580869887527193049760552789795233066505667689248095554577112371625"}}, + {{"8.625", "-1.029181226242794530622671562005776602295969084821805226400002870767989174122034536280082461534287795"}}, + {{"8.65625", "-0.9668162629797675117200288525867759956705289684684092618655305272884560415249588622588640534660859208"}}, + {{"8.6875", "-0.9081104046373177832576347663891532295331575111187881417687389316634049160994876797510769206182893432"}}, + {{"8.71875", "-0.8526455881926773939956486059670750827771160223765816890633669305249823793389660138647216198961396045"}}, + {{"8.75", "-0.8000607122131663748996935033554250873516322431753295881939448427095672520914736920285067785494755945"}}, + {{"8.78125", "-0.7500419570576314664068876238355166376078921127752475362685197014336164568978380363973382424380027378"}}, + {{"8.8125", "-0.7023149914660190721137439943663886714896255005161995584377885528996116609571672651781263426423264383"}}, + {{"8.84375", "-0.6566386479456336287953742502996364274330999062289317807304964691314686325574451710087769117377447232"}}, + {{"8.875", "-0.6127997515327654285376783646363991279819055057055158641281938301880811035156798875165049539694804864"}}, + {{"8.90625", "-0.5706088613603129182915651449940477497513792905530365057563881633464714239146849295760180740616051507"}}, + {{"8.9375", "-0.529896739873168003806242065594283411489762262385879653776325422716635759568492302090915293632301029"}}, + {{"8.96875", "-0.4905114059515517049978410600006085544703557897386518199219966407731976599471950962402695227799723485"}}, + {{"9", "-0.4523156594418098405903708757987855343087169256619843288072463344895615552699928891423222740611696987"}}, + {{"9.03125", "-0.4151849883541607117552210974950947708368354992200219503945689498048994961045141832240492234717107402"}}, + {{"9.0625", "-0.3790057881989822857530457874776947516302198077664862408128815699029163107706671425087481058924528226"}}, + {{"9.09375", "-0.3436738369929040836550521796260295565231979408984456062837271050291411394204206333260572683795806063"}}, + {{"9.125", "-0.3090929803907614767471346771315481283472474354946281905565967857578879461207205702332049986857635056"}}, + {{"9.15625", "-0.2751739899376987485248300510983424723605373451217689431344224438486165931202115441514245211478398115"}}, + {{"9.1875", "-0.2418335641420615678638155264698574025131647248333694816193249713183100110082265076470052022707012095"}}, + {{"9.21875", "-0.2089934473583106794872121428783074116994340488341375724854578952783525682316496422613143306038638671"}}, + {{"9.25", "-0.1765796456511299761112751840598406521389487242985432214413528930195762314982591148356765022144220392"}}, + {{"9.28125", "-0.144521722122150591814619269577170465800891448238859437753351534510505894724788264050561053752147101"}}, + {{"9.3125", "-0.1127521567973819422597203631074129348120757432615503831725905368424112610292538623181492998345439551"}}, + {{"9.34375", "-0.08120575823178342176032872038448411443172784451696952348584885928982452335749552547386985037617069992"}}, + {{"9.375", "-0.0498191155899860392003104787951054631853528180570175470879940653716436714322811615959161544657494618"}}, + {{"9.40625", "-0.01853008118625405320915271202115144102822290582324439033642733950763784110773883754760179758258022532"}}, + {{"9.4375", "0.01272272563027105977935573889462983744829956962204063464126832673322950722546841176709360279348538747"}}, + {{"9.46875", "0.04400040173584953885682440835958114627885199630660893827828903912727543614728912707303196060753625141"}}, + {{"9.5", "0.07536423875739405740654014205323665789342966267450384287846707728875924157814476147945907817392192786"}}, + {{"9.53125", "0.1068762048461025163674352287858142449224256724379234993543813605972685100190359293029737215855453465"}}, + {{"9.5625", "0.1385994377761661718602480104778901941178589868631124656851160671189176086579048746331765092114253163"}}, + {{"9.59375", "0.1705987577719601866335639057437200427987763331813918550294340474134857881430332967127222805799022305"}}, + {{"9.625", "0.2029412090417411123603662227278784038776298381618810811646084653751029723759416476460088872408054991"}}, + {{"9.65625", "0.2356966398441474632357392833080328068352054698543206659897268100728097017667724684606559049124154157"}}, + {{"9.6875", "0.268938332074403309291166325486527607211725274017137932139784676368590535825858340593417854926297648"}}, + {{"9.71875", "0.3027436928841933821970886411755473788376234496119460628913545818204169198969541686968930178216130025"}}, + {{"9.75", "0.3371950228159297335621484819773554194812863370480952763499236064163820830033268339692324715894157813"}}, + {{"9.78125", "0.3723803774359345699506506000690612357176932379964207743390433297005778841484733220050565284302113607"}}, + {{"9.8125", "0.4083945426204256871181400863951603330453056915705065091908373104020696107020950522244595815242992"}}, + {{"9.84375", "0.4453401476523343154827952361952568691359033281221121303793343966901885521315031273219697042193257942"}}, + {{"9.875", "0.4833289453490298299990038076226424305503958067355696981733291906588949898848660168661363237230401676"}}, + {{"9.90625", "0.5224832948561672053074357426518017813969502851835052528668887798173320745102979706674984553747785107"}}, + {{"9.9375", "0.5629378909036186388354128640753191217895638800506841967942363059454826038558876839732857927717227769"}}, + {{"9.96875", "0.6048417937509008993401606503437317082375426212574423350794174057182764889826011397690814642006452007"}}, + {{"10", "0.6483608274590866712591249330098086768168743429837249756336279673958556003746239008717172062971522862"}}, + {{"10.03125", "0.6936804314743542712398847790886887683057558913351293442530262309817850224201884209136086813403394689"}}, + {{"10.0625", "0.7410090731101333158449425961247175839017373828496178608167740610459452518219259199024083200316084101"}}, + {{"10.09375", "0.7905823581871925973468103245168030277845433796367670128316098222165598426689171297882306893568062531"}}, + {{"10.125", "0.8426680163689236497241316220032744251657095955743734411730267063148126128540903336099720150350195161"}}, + {{"10.15625", "0.8975719901861101829801016952033465293839624897512338971033212391126217276476390113488747550991133784"}}, + {{"10.1875", "0.9556459274758633915064588099748061258315512098776637126437164255246444193412583209025710708854064641"}}, + {{"10.21875", "1.017296473311965646505591388794303117791831049823203228782533350726187433458132860834038283268836837"}}, + {{"10.25", "1.082996890215945275135930985916637983213229101767681562664207604721345006616414244816945101012068962"}}, + {{"10.28125", "1.153301720414501166084164165377670663086784905305525053523750216145961391216299317767459210812275763"}}, + {{"10.3125", "1.228865465058231603544476514726969780448778330773071834149679410133713041325810373844792660869193974"}}, + {{"10.34375", "1.310466629156747359552320115718026861262813059499884349607868463460206624928464716803324337065850131"}}, + {{"10.375", "1.399039024262115717131604647733708995170160567832938194238903453989697561972061091597355404503662754"}}, + {{"10.40625", "1.49571302349195916111981867105861656396166182988283681852423319036111614206596318006249059781485835"}}, + {{"10.4375", "1.601870670512520509271426433671643695090231605946938642547694243879213679699085414650549829075718711"}}, + {{"10.46875", "1.719220395521651499721208794808194478968865549194510942718291121399341439043920644901884496910696737"}}, + {{"10.5", "1.849899993421927279907583573513910565419553685959044018741794327382830123593588324994882461965573398"}}, + {{"10.53125", "1.996621179417850643664093294309064624983038139124591902589207528735600835709855269195187933895652101"}}, + {{"10.5625", "2.162876723677546330469959787105963848827689014945066557592989408260164364548287694286197662196239537"}}, + {{"10.59375", "2.3532442330793790868766441879841993750130572630209439743618231460831573709883106394866434440837641"}}, + {{"10.625", "2.573843631271674362526537866893410697197766596999920083319154750577002457483161716337803596844925106"}}, + {{"10.65625", "2.833047421190427952095570132770964879184235914846751261896726812931990128759669900544999535061769791"}}, + {{"10.6875", "3.142623220176844496098570587446827716363816198180813628746017544330426339542323699691642256030772053"}}, + {{"10.71875", "3.519650155321593637030342256680131753850278370827948246193900683195030354927519452141570420409057437"}}, + {{"10.75", "3.989898450288877172272878730129464264004901452428968181149190336688176169073686050444717716156454253"}}, + {{"10.78125", "4.594165609870243515783279467995060486532380531283432068617070247011706442921648714627407953983920726"}}, + {{"10.8125", "5.401101953070107889048337369479695723086844105989269027204537226522869955593746957868263836003479647"}}, + {{"10.84375", "6.535875415517406207251199308597767679104658091064327476058394143828942638073632382427758536504917985"}}, + {{"10.875", "8.253411766339305537723460693388679535974907155823982004597806731192500887738499761977958603336992426"}}, + {{"10.90625", "11.16537284500979684723686544686940420453225367789354062936636940962591367864691678374577954865828186"}}, + {{"10.9375", "17.1999620041711094734838984205883317149769089588687370821690524219299315809266573264745104659869829"}}, + {{"10.96875", "37.27070620721793879698276661020742630154681506539144657714408230209752760393928366701053772541231071"}}, + {{"11", "-225.9508464541951420257954832034531539516575098851311946310945881123661134104031654779989090875181672"}}, + {{"11.03125", "-28.01838123473997016830887833476199550560697066011986939559933525309909705318537405182199378012840027"}}, + {{"11.0625", "-14.91962506867234581945151895985710289930225918712794589354339983163930894702818997439864076091931126"}}, + {{"11.09375", "-10.15307233756673521728139815893864848321827456537331024001764086854554203725293661816927668294489745"}}, + {{"11.125", "-7.683249828520493578856827081745572284486853920128557099054138395954224416767780846216824234128741871"}}, + {{"11.15625", "-6.170065007339837672004969274368706522165797321914087418607341946608032746141308987068347258026539261"}}, + {{"11.1875", "-5.146216397928971013498356330072590228022047015189051411856482418633925739244947714746552179251733944"}}, + {{"11.21875", "-4.406134215367990783634732996136714284665546485639321948525683144032506137127272195504713779988841399"}}, + {{"11.25", "-3.845243526046256589195292015214843119217023542577367989034898325348687250589462590349993156554307721"}}, + {{"11.28125", "-3.404725196340913894767892653680241020178288686778598191582702368768260415894176917496336011269246961"}}, + {{"11.3125", "-3.048957435167265586183006322737827462691340358802500561060757089057213237102895081676386924312658609"}}, + {{"11.34375", "-2.755105539085522466956356685286240136460553349428076133380205505661678601069631697225730693586354901"}}, + {{"11.375", "-2.507856046343293846165268336837981024254374791359792671451310995149841786950224129840033693800933455"}}, + {{"11.40625", "-2.296555085357014688557714000971300925194148838031073606034513705752180239656706450912207637184212202"}}, + {{"11.4375", "-2.113560858723099424307258719446955475134681339177645144130883477669849838830392714536871823793018366"}}, + {{"11.46875", "-1.953248965442351814769641861822757418968218808226145477990020040801933787597505710461744957513141637"}}, + {{"11.5", "-1.811387450326824859772397320474032833639713335926721521705076560469479148263546424971811321096648723"}}, + {{"11.53125", "-1.684730597525019137697751820797269016453098562968854704274935631922618587469362028272636692210544871"}}, + {{"11.5625", "-1.570747064811472615228088301480862011854346986220267355439332676174065617757164643849543074172144195"}}, + {{"11.59375", "-1.467433230574720919411941987695161181959171583863783447843463212366085434611122065381627004242638947"}}, + {{"11.625", "-1.373182138457896453349468046455100980035443259553659899722906361390876088856423969181083376455705666"}}, + {{"11.65625", "-1.286689630920366616376314221177221139006716016538511655589760746532540573609680625603641074608188434"}}, + {{"11.6875", "-1.206885914221201720054271911345572193315238450358663840449617121968073512366326525649980278803416278"}}, + {{"11.71875", "-1.132884861825656481798873135046969210301345541577298019300751660619960162890235612177970957925478595"}}, + {{"11.75", "-1.063945912486004409710559363045985530861938320222047288703751234746510874929602501339045816423036172"}}, + {{"11.78125", "-0.9994450559333915167440624304322053019403928948191033206551515159313846021422418864273459645373449009"}}, + {{"11.8125", "-0.9388524723222944773205643428254523492068640072627707382490811032852295370278108292005146916272238994"}}, + {{"11.84375", "-0.881715108900528303919177723946502416645736801861050134491985441499235913287446780705353461545417442"}}, + {{"11.875", "-0.8276429652929236471146892695710241706925495072977152657326004944101623406458452837545349486881138268"}}, + {{"11.90625", "-0.7762981960095720820932228114020179373213795483270746275212139165301756520252573166217954465331159458"}}, + {{"11.9375", "-0.7273863753138267917778418153001732955258816548283145725251801363629114248343367970028832122142992284"}}, + {{"11.96875", "-0.6806494377457210277597470928336025589584620324058462321470850608946457200573674297093242265437051282"}}, + {{"12", "-0.6358599286615807924609379429390076061509587586686860914514606814656551214484123291399643068894751555"}}, + {{"12.03125", "-0.5928162873294508906897144974924364212100987037074180867630829726623330818215300743873013630492129075"}}, + {{"12.0625", "-0.5513389500434250704976885869765975030435162971228425993732710884431519725994082993307502135366704687"}}, + {{"12.09375", "-0.5112671090040856778211886692327830312529713244160725823950417285454010972749346501560988873183882094"}}, + {{"12.125", "-0.472455998959126666328373026314261347130558625459848565935809588092219192527888607849005967299526205"}}, + {{"12.15625", "-0.4347746110466813389220145482909141465629503223075144609806539759358566301078783883593960376790796208"}}, + {{"12.1875", "-0.3981037542382981122358374348325646108510087325306228562334315140437947730049798142715674391074029588"}}, + {{"12.21875", "-0.3623344008952777173267729097645609415931859827734307762367947830110639831467043405387353622176899024"}}, + {{"12.25", "-0.3273662654331959909797507119051924955282853934206185144087221653583658953364484322496982215172064596"}}, + {{"12.28125", "-0.2931065748149348906573126400315634011327627839945547849105543140713203189089283254450491988430709458"}}, + {{"12.3125", "-0.2594689972120933396662267471796226223140842016040887149108653318448105627021634377488137220685751418"}}, + {{"12.34375", "-0.2263727011714726746425617255174464360665584672063083345910005855017649693977414015628137560181413471"}}, + {{"12.375", "-0.1937415223592955920421472499371716132396126974936842056246045191659136204224066400221303821918510103"}}, + {{"12.40625", "-0.1615032187034938758288345646836288312549849485871893783750506125037934982810946747034471565118071181"}}, + {{"12.4375", "-0.1295887977200466002615144930375243133915724779506460096421464176334192279649808190617654665646655393"}}, + {{"12.46875", "-0.09793190214949804406939767223801097423536917158984066549241688209747906679339832186909184479038423885"}}, + {{"12.5", "-0.06646824186327419610199266949441387194390610792357612079517505380578030434009894147743014400122005453"}}, + {{"12.53125", "-0.03513506141616282076636047393093268566965509833708523530838721391339373252314877573835767237228949322"}}, + {{"12.5625", "-0.003870633688692445796420680716701608075985971581256241161345780831826430572573689071744247468488929075"}}, + {{"12.59375", "0.02738622916941998236655243276631287278486472025157424329703232697741123275406245628528750156873296529"}}, + {{"12.625", "0.05869665578128338112635128913606850911677921227526205464651894469274626817414600063862113806671147531"}}, + {{"12.65625", "0.09012219459725165729474121609816933257302657281344601700769732387220992191083677289387048548334265912"}}, + {{"12.6875", "0.1217252999603408610668897042413571531127645503736599822403036205555496676066474076056000689949341066"}}, + {{"12.71875", "0.1535698333828775342772949638706552097777256705040011551078273258533143177119249497623834514512966756"}}, + {{"12.75", "0.1857215886751401902594186441708939448272141506734588329272148156845153012668419405756499880982943312"}}, + {{"12.78125", "0.2182488502657797346752690950871572837813792443000041521932413723748578742375061893600646885986149118"}}, + {{"12.8125", "0.2512229950428828425999138094132092852018197118941615412720196242900796512859843472371170313836583775"}}, + {{"12.84375", "0.2847191493692259054394416502657415422614131291273802036428533121457701035912610846112501083132620008"}}, + {{"12.875", "0.3188169146481101964165914224483354040480603343474688683709071564169780696806924149291320418944830542"}}, + {{"12.90625", "0.3536011770209831976646321735648611242564793780159081807119024532891168112397727872069370118132852613"}}, + {{"12.9375", "0.389163019575800390066324389631248715515481435421443727622672043630746566664120384677948936473787333"}}, + {{"12.96875", "0.4256007589819842824595519481972026675555296385735056063290277948532474177383987445148843331908874667"}}, + {{"13", "0.4630211329364895955117902835081206683532120959519440470950206693928302579327807145125758116501924079"}}, + {{"13.03125", "0.5015406704601738993466207755375547536965260852964643732753893793547109382261801451895601761930463122"}}, + {{"13.0625", "0.5412872842615681585626378992160244527886510964571032692368478641312818490839188830849928560962861538"}}, + {{"13.09375", "0.5824021335357886328662589223215248727421699777193264549116653046243519880397055116969487363618353957"}}, + {{"13.125", "0.6250418172930577232327055575810817395750497037126950514585195397519699819130820731538599564259401139"}}, + {{"13.15625", "0.6693809734298055686754246761212833674742679018564325405072602539903766997859347462285344333571366362"}}, + {{"13.1875", "0.7156153783773706463324211230116191534127258818669295732823217991324981875804470761472072117982861964"}}, + {{"13.21875", "0.7639656678174816067986696149135126827704120185065555912507382354963651332883430075609034401555571502"}}, + {{"13.25", "0.8146818327614344736464451806034453710444224291621571573625236805118070729970340362557654528804594448"}}, + {{"13.28125", "0.8680486902251570873258425734584921956065820604675624643643164481487468794096033758920520511975882962"}}, + {{"13.3125", "0.9243925880092635749600582006440809362226783655074073519865821148035556209179629462013383469424274175"}}, + {{"13.34375", "0.984089684751991735962930471741445607987192320278600727525448404432994693600540790050738561865588772"}}, + {{"13.375", "1.04757625822842897028900134354672689006793126569323519874122370449523706721491998653522405351511"}}, + {{"13.40625", "1.115361649708918497565229580465214098442269312226313131576538895853120727413355048723361997440716611"}}, + {{"13.4375", "1.188044669282090096413968423531415025467187597047077575491037309801518019505454161493737933958668965"}}, + {{"13.46875", "1.266334595496805761839284321117713547689424188079416196364317291844437171872585239983180116380091394"}}, + {{"13.5", "1.351078347287010480371085577712699470101212829099407611657174914155576868564657173832374341089513584"}}, + {{"13.53125", "1.443296057137394170028536177718664041051292527024487177527337760724543655637891131854085251072201818"}}, + {{"13.5625", "1.544228244055125768572769325179666059641117940456933228593668266762756226316757718141030898582889678"}}, + {{"13.59375", "1.65539925635608625536146268504299540984757874423396346584219270902415141849546774423536235044651061"}}, + {{"13.625", "1.778703933748487611100295794480392286774372855795510955005500225382241572963111907877924106343034439"}}, + {{"13.65625", "1.916528050760659646742064707886848214342582893475968412683323141359371632373241621750396872855231387"}}, + {{"13.6875", "2.071918975654530318165994049833557729201414960634819277207514404216213840009455116234485076356302166"}}, + {{"13.71875", "2.248832798150414958768559692131859458258869348641929756045263587943996112471489439485863476093034658"}}, + {{"13.75", "2.452501131436276534259505261160229408535827308333544989748716942417182101185885609613251793631088723"}}, + {{"13.78125", "2.689991141885544485574819071146851902487462547699495662222675009146133600868249015967786252574495347"}}, + {{"13.8125", "2.971088997454883061146937345921981294715821069297105784485484470539822403438727250351950923586461683"}}, + {{"13.84375", "3.309747852278236334086030022253642441335045150382837946015733966046635972988597769925369044448793434"}}, + {{"13.875", "3.726571412380592611642200928513525816649689030739311675986112325390668863787780356510815096395312152"}}, + {{"13.90625", "4.253314099623669334835259848593744934346239237141072606237802004691075608138259425654524049734148683"}}, + {{"13.9375", "4.941607147834976432334070015221138910450692007921150173618524899066416996751652602822476062787651509"}}, + {{"13.96875", "5.881399525150031955799636707531603412059246766703476508448423108137501182284498677930575806202198028"}}, + {{"14", "7.244606616094805116868776904419943839744730261240134752545587919443539234559937291680749763590851956"}}, + {{"14.03125", "9.406028188605279696133223875198323737712453281000019998207973537233195589286463672078393783342949057"}}, + {{"14.0625", "13.36790967265482265511197119971831749461310263946778620293662813338523575832270133240885318460296722"}}, + {{"14.09375", "23.0180098105772480411418077991835591801343058014965291845911306402355660736744079654039102037142972"}}, + {{"14.125", "82.18587088008837479889498738727608856213126524631858084352266182200806013924238364295643998983071042"}}, + {{"14.15625", "-52.39613928846073424250555787725052081495348867793023995281290229927733884543365803704289494278819236"}}, + {{"14.1875", "-19.85087749437963381473636677142019044036915990708056158011806608744982156130940528545579140382954901"}}, + {{"14.21875", "-12.23024032878110918179097238079573616977352169397336130087278904329232109578073694396971060087189843"}}, + {{"14.25", "-8.825007825823643194479070661167279551172813025945214108644920017576189426949178857879125100439566237"}}, + {{"14.28125", "-6.892346926954325909059194856822673062063097995636142714599547668355292064875194893124728097012275365"}}, + {{"14.3125", "-5.644866498825540128381929944705578552248933555730964244899773528736917184084590171390597212873718595"}}, + {{"14.34375", "-4.771610252795610046024685797665514766422880378783577882983742818079026166693261845053770481989424557"}}, + {{"14.375", "-4.125051680440956814255997242162117938555651270642110578618995113301257483035180159821309310658332941"}}, + {{"14.40625", "-3.626194314229776036712561256911661725676439848577743170654748551410882288678506147976699754338337632"}}, + {{"14.4375", "-3.228918544653384166822369480885301355908586468628448310353628937744136710166892378083809771029038072"}}, + {{"14.46875", "-2.904489208401961365438740405970863838028715766433251544998958231462070708355920879083964796103033733"}}, + {{"14.5", "-2.634069132503832833409607035052858278935807513368801311481801280408668028920599740332367971681453643"}}, + {{"14.53125", "-2.404794639925577553244012746285864594559572350297129379452932406519481483010765023196033751578709703"}}, + {{"14.5625", "-2.207581089523679545128355853946391835592464237094323506839360879131859583353800754571132350944473674"}}, + {{"14.59375", "-2.035829586659772321235017007716845648434117124540496962900856683971781311984497273615528750368081422"}}, + {{"14.625", "-1.884630768865435904935595378906947231717012177189752377379403964925875302521199447518722408719775981"}}, + {{"14.65625", "-1.750256190835124208623312849116061326812165846025415986783560739453729962659158203940996884358758139"}}, + {{"14.6875", "-1.629822991609989147184189043054819627629510818289435539398133590083260226275976603564527843030512624"}}, + {{"14.71875", "-1.521066667289361457373930052890176846963182405346389200320517277799503677666772192617687500257521097"}}, + {{"14.75", "-1.42218336083774197380789085745137021789867848279597800468450871698744869740438289092755542692570482"}}, + {{"14.78125", "-1.331718058572613129017722401996663023341875099157808098995252549045562547044521935057437210333349552"}}, + {{"14.8125", "-1.248483823169844883793467308858957913772012915051151771810074084965259104516379708093866536649015936"}}, + {{"14.84375", "-1.171502454280969620050113939757468091964527953537892858826299161314598145955301346129774398985079725"}}, + {{"14.875", "-1.09996022360423379094065298284739111500559223495806048377446355428125902586706149601540328954397664"}}, + {{"14.90625", "-1.033174396383465269461739738697259215672589493553897443441659340076220701053186730617856132398548093"}}, + {{"14.9375", "-0.9705675907155131163149460322607739770705545946870992276893226926978460501228871025636381103213358614"}}, + {{"14.96875", "-0.9116479124475490508064737825953723368462225788875404013990634500526165327350899245784037598875471869"}}, + {{"15", "-0.8559934009085187640261927782380296049897864414742962979687446281783012594486541122545103129259226012"}}, + {{"15.03125", "-0.8032397302332296612432159755337281904284459733163994877022298441144059785603187789136637043263789466"}}, + {{"15.0625", "-0.7530703960754939484978446924032015414437125508200990314934869704250553438069278960228507610120908637"}}, + {{"15.09375", "-0.7052088187318415299725928408540094093554358958059088325375638362095004704432693353838375709463129551"}}, + {{"15.125", "-0.659411937622644225218300893404169827076548649885412227383887901950221923526355502978543776575055119"}}, + {{"15.15625", "-0.6154649762727536414801474029122625793755198617269250343988631456453788448149731706979351529235579577"}}, + {{"15.1875", "-0.5731771332183040948793178896118867037269598773610412277642977614409075169432893108977656087532808068"}}, + {{"15.21875", "-0.5323780107028691176788965668440942781647156607765742951342412648358988559400799809724920990286528734"}}, + {{"15.25", "-0.4929146351866012621666401573415074523464609163340854530825224584649245974424596583470196176643838565"}}, + {{"15.28125", "-0.4546489554738299415350063572461193751006928326854122963028434583535719327916356408447934270192962049"}}, + {{"15.3125", "-0.4174557284251085623680148206370333657407709127949181945517726979253617292255491330234726669774559159"}}, + {{"15.34375", "-0.3812207207302419203446046603506711987787377766806738457878506795815713138223264722913354548269137032"}}, + {{"15.375", "-0.3458391695028422582485004568448026536356203654713446806415710694635885346246660520826948870993463705"}}, + {{"15.40625", "-0.311214455551825073642663079591570618837743590849903018274057606911872122304533000910107606645650336"}}, + {{"15.4375", "-0.2772569518534830079599506190692912755868921271423525814120233867695893487373304945292237740353757468"}}, + {{"15.46875", "-0.2438830165543173054192587099181568413614402066070223778896735213919894343566763962867244846621486138"}}, + {{"15.5", "-0.2110141052012553133863173741408514435037061655011970687100846880180438182550528565062101594891245018"}}, + {{"15.53125", "-0.1785759811388596991279739233477573236616687666102227187311862264495771634608666297275574790232136991"}}, + {{"15.5625", "-0.1464980063716879847555275878278898667317766571375499828106145375100216949704230935552550931052323183"}}, + {{"15.59375", "-0.1147124978452713735943481847220917786442201384229215777788278473922030662630912256721375261600875605"}}, + }}; + + unsigned max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + T val = tan(T(data[k][0])); + T e = relative_error(val, T(data[k][1])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + val = tan(-T(data[k][0])); + e = relative_error(val, T(-T(data[k][1]))); + err = e.template convert_to<unsigned>(); + if (err > max_err) + { + max_err = err; + } + } + std::cout << "Max error was: " << max_err << std::endl; + + if (has_poor_large_value_support<T>::value) + { + T bug_value = 12 / std::numeric_limits<T>::epsilon(); + for (unsigned i = 0; i < 20; ++i, bug_value *= 1.1) + { + BOOST_TEST(tan(bug_value) == 0); + } + } +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); + // Check low multiprecision digit counts. + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_tanh.cpp b/src/boost/libs/multiprecision/test/test_tanh.cpp new file mode 100644 index 00000000..85dd5449 --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_tanh.cpp @@ -0,0 +1,174 @@ +/////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2002 - 2011. +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt +// +// This work is based on an earlier work: +// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", +// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/detail/lightweight_test.hpp> +#include <boost/array.hpp> +#include "test.hpp" + +#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) +#define TEST_MPF_50 +#define TEST_MPFR_50 +#define TEST_MPFI_50 +#define TEST_BACKEND +#define TEST_CPP_DEC_FLOAT +#define TEST_FLOAT128 +#define TEST_CPP_BIN_FLOAT + +#ifdef _MSC_VER +#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") +#endif +#ifdef __GNUC__ +#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" +#endif + +#endif + +#if defined(TEST_MPF_50) +#include <boost/multiprecision/gmp.hpp> +#endif +#if defined(TEST_MPFR_50) +#include <boost/multiprecision/mpfr.hpp> +#endif +#if defined(TEST_MPFI_50) +#include <boost/multiprecision/mpfi.hpp> +#endif +#ifdef TEST_BACKEND +#include <boost/multiprecision/concepts/mp_number_archetypes.hpp> +#endif +#ifdef TEST_CPP_DEC_FLOAT +#include <boost/multiprecision/cpp_dec_float.hpp> +#endif +#ifdef TEST_FLOAT128 +#include <boost/multiprecision/float128.hpp> +#endif +#ifdef TEST_CPP_BIN_FLOAT +#include <boost/multiprecision/cpp_bin_float.hpp> +#endif + +template <class T> +void test() +{ + std::cout << "Testing type: " << typeid(T).name() << std::endl; + static const boost::array<const char*, 51u> data = + {{ + "0.32137338579537729992840434899278935725496267444911714908205287462634251052210833615032073534299473485492692600156322137421801432333125051088723502425037485776412801577568405892077585206768190530859883094571475323319480739773193974206966728764224286661945738178210577326172938196062277314761537881936346874075881338768208490193827960565412814349738654540520356903367084438822830345189856017860672463017", + "0.98628073997374759901559180515206275902189609982907214282364143439537215491113710345866034807991101303183938339561499559327886956280789743287824488269072297413440935381715378233031399015496124706604318545539544610760151756970229801074280545428642122005982857974921606264103186878499260552388713716032507770319550435738767597150644370033277228635793175246197730488375240713357827246166262087899961098648", + "0.99999659728082161113542951278514830809677661658635225532792520501703544628367875293677270218317428676793098034276042396396797568103263882451732810190507733063467333056356770774002596898762991629653041854653269824642873291146068535300466473399592751219449187768646625229500705182676930009096545254478199838990703077597971823456671241141900968900216742636822174010867343154474773040184900973368250708724", + "0.9999999999846483268200051609594321550129159997920576480976206867496512752486590660437091205989616108531910897733432934135954788151766561209164605337537937873588006552145390152387235783207736999759875845070169747521389728857476525437483543080651125798739562649414879487621858466223255239845627205850217328574865852922872737234283038190096982410137471391847466112651349436875974689271288261759782261321", + "0.9999999999999999987314527242099750648171958211319474558707792311593804963057878814487720997303512134007272111464990650500302215773762906820778949397525329109311974741708703536680512747226155618703318739024344621256722269608969415280035337052044425138281821760268269187377517243951584969175035549994883451471918693502477485385682884154959809285569290940740978684264145737164182111806308430952867505356", + "0.9999999999999999999999999980800953069847308586840237590563929855339557065536765765234844240789584487443451033349994294426525006157530320529970966048109743850154174651033567146346966529198814047607015842020039899630884318521543225160212193994911746894335846264878066530266737005606770102869237101848445559941638381625615207320468184414917265299980278164193202897754476112968080358662232635784904263624", + "0.9999999999999999999999999999999999999467800140220866754762922747687784133233134010432889959570821554455247528344437918197518545105332713456859236726383195243056599177018396579766073961540714510399202497404647103138524118065391185503678895059096790300665805648569647351935897874460587855127436472608470703384261586158923066272124216158518232588330799027603391275039552776308636189531809031683723259525", + "0.9999999999999999999999999999999999999999999999999729795912960133359928587562229512337339217831178574875626619226954752643039860388090399659478676726654102118545764943682017611574275691203710439707807193180604656837503862242700430179591666329131728631752773789406064618682879167351725013888294859467540832310795515139677375807407622028485242969471516812171475098378942187864794497220152019202351747432", + "0.9999999999999999999999999999999999999999999999999999999999999997487354938310440650220692519525261552411539996830587326435051159231522052011310872619940247463640019105467860778515384738650636054646551611609757125760437266415865214306396520500343113189907306851418957620080971645943305760132385139924583154317156560414548076370893360020924960120441059315311380109752919823616149973862196846266297710225", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999572050575304159358359221596743379014313563214857593401545331495211888415913558896516895286943572966865708195832339959764445194449615969154689769557903166971249521898883489362426386924297872088925852892350150865941427355319827260914834268754732102528105919811851193667193380541054520023003326858641189063542651960743457613", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999998665016733514821204959171836698281165918083005790816030823236096080522860514417075411055633676502699904415882389102672678124683084429720879962355892225321369091298491658349178472270952759208443767848312111069127329160464884932271685986610697222434145553035947750809388321614695213754318979469071722942883", + "0.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999992372516628147584832950728021842198359205201519966391076994594773600474674435473005118571751514446148292787696117866094991476340344341061706866751156257825144909115117822189019766805825304055482958970512463798453229341693148012213183553546720540880444569824125592343803193018989122964", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999920180539244323143459416025663362517256166793900312667214543096238752838226369161775531456005541374878274529461511286842988937830155704737448202558382612829022464635400289328916240002670783433827234852858267621807568393874737879853500598862298495727481132883728328", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999998470116425957155787153557938061034698436461173594805292722874130433614266475136267606498346730583487791266503943659174886554170377537630914770998114573340081594827150737005158607830579000912020838690230498119348251553312722575955142752845289", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999462931048083476382670449719737943481963930626760625326765703815392249622625483433043363664396638162612437367800102332819699131841317348173451308570776544874933173719394861336636728378134900422312720743996219523365098", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999996546783689748726752364896615532860288057097437452774779386074906915819380531729493071959232887620213723607155628959529584572083388979892309086717786559916703004365603135284141639480887703759", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999593332381019647939423999969519583099837564321056588766269967853479478603122899456262904869063959564274215899007623362296377022418464303752396325625838280378647335", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999122842714667567128203355585346559126606029196080721845292399104475997315344844970601651757832506169948906646054332493537761143729664", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999965347272050374435790597917065458623422102880662825928396981295898014081371503733411536311258910851858", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999974926240515037403282500845454464621558236030794140169313830052413917", + "0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999667705192725716176070161727364499", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + "1.", + }}; + + T eg = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1"); + + unsigned max_err = 0; + for (unsigned k = 0; k < data.size(); k++) + { + const T x = eg + k; + T val = boost::multiprecision::tanh(x * x); + T e = relative_error(val, T(data[k])); + unsigned err = e.template convert_to<unsigned>(); + if (err > max_err) + max_err = err; + } + std::cout << "Max error was: " << max_err << std::endl; + BOOST_TEST(max_err < 100); +} + +int main() +{ +#ifdef TEST_BACKEND + test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); +#endif +#ifdef TEST_MPF_50 + test<boost::multiprecision::mpf_float_50>(); + test<boost::multiprecision::mpf_float_100>(); +#endif +#ifdef TEST_MPFR_50 + test<boost::multiprecision::mpfr_float_50>(); + test<boost::multiprecision::mpfr_float_100>(); +#endif +#ifdef TEST_MPFI_50 + test<boost::multiprecision::mpfi_float_50>(); + test<boost::multiprecision::mpfi_float_100>(); +#endif +#ifdef TEST_CPP_DEC_FLOAT + test<boost::multiprecision::cpp_dec_float_50>(); + test<boost::multiprecision::cpp_dec_float_100>(); +#ifndef SLOW_COMPLER + // Some "peculiar" digit counts which stress our code: + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); + test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); +#endif +#endif +#ifdef TEST_FLOAT128 + test<boost::multiprecision::float128>(); +#endif +#ifdef TEST_CPP_BIN_FLOAT + test<boost::multiprecision::cpp_bin_float_50>(); + test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >(); +#endif + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_test.cpp b/src/boost/libs/multiprecision/test/test_test.cpp new file mode 100644 index 00000000..e61b289d --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_test.cpp @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2011 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include "test.hpp" +#include <boost/multiprecision/cpp_dec_float.hpp> + +void proc_that_throws() +{ + throw std::runtime_error(""); +} + +int main() +{ + boost::multiprecision::cpp_dec_float_50 a1(1), a2(1), b(3), c(-2); + + BOOST_WARN(a1); + BOOST_WARN(a1 == b); + BOOST_CHECK(a1); + BOOST_CHECK(a1 == b); + BOOST_CHECK(boost::detail::test_errors() == 1); + --boost::detail::test_errors(); + + boost::multiprecision::cpp_dec_float_50 a_tol = a1 + a1 * 100 * std::numeric_limits<boost::multiprecision::cpp_dec_float_50>::epsilon(); + boost::multiprecision::cpp_dec_float_50 tol = 100 * std::numeric_limits<boost::multiprecision::cpp_dec_float_50>::epsilon(); + + BOOST_CHECK_CLOSE(a1, a_tol, tol * 102); // Passes + BOOST_WARN_CLOSE(a1, a_tol, tol * 98); // fails + BOOST_CHECK_CLOSE(a1, a_tol, tol * 98); // fails + BOOST_CHECK(boost::detail::test_errors() == 1); + --boost::detail::test_errors(); + + BOOST_CHECK_CLOSE_FRACTION(a1, a_tol, tol * 1.02); // Passes + BOOST_WARN_CLOSE_FRACTION(a1, a_tol, tol * 0.98); // fails + BOOST_CHECK_CLOSE_FRACTION(a1, a_tol, tol * 0.98); // fails + BOOST_CHECK(boost::detail::test_errors() == 1); + --boost::detail::test_errors(); + + BOOST_CHECK_EQUAL(a1, a2); + BOOST_WARN_EQUAL(a1, b); + BOOST_CHECK_EQUAL(a1, b); + BOOST_CHECK(boost::detail::test_errors() == 1); + --boost::detail::test_errors(); + + BOOST_CHECK_NE(a1, b); + BOOST_WARN_NE(a1, a2); + BOOST_CHECK_NE(a1, a2); + BOOST_CHECK(boost::detail::test_errors() == 1); + --boost::detail::test_errors(); + + BOOST_CHECK_GT(a1, c); + BOOST_WARN_GT(a1, a2); + BOOST_CHECK_GT(a1, a2); + BOOST_CHECK(boost::detail::test_errors() == 1); + --boost::detail::test_errors(); + + BOOST_CHECK_LT(a1, b); + BOOST_WARN_LT(a1, a2); + BOOST_CHECK_LT(a1, a2); + BOOST_CHECK(boost::detail::test_errors() == 1); + --boost::detail::test_errors(); + + BOOST_CHECK_GE(a1, a2); + BOOST_CHECK_GE(a1, c); + BOOST_WARN_GE(a1, b); + BOOST_CHECK_GE(a1, b); + BOOST_CHECK(boost::detail::test_errors() == 1); + --boost::detail::test_errors(); + + BOOST_CHECK_LE(a1, a2); + BOOST_CHECK_LE(a1, b); + BOOST_WARN_LE(a1, c); + BOOST_CHECK_LE(a1, c); + BOOST_CHECK(boost::detail::test_errors() == 1); + --boost::detail::test_errors(); + +#ifndef BOOST_NO_EXCEPTIONS + BOOST_CHECK_THROW(proc_that_throws(), std::runtime_error); + BOOST_CHECK_THROW(a1 + b + c, std::runtime_error); +#endif + BOOST_CHECK(boost::detail::test_errors() == 1); + --boost::detail::test_errors(); + + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/test_unchecked_cpp_int.cpp b/src/boost/libs/multiprecision/test/test_unchecked_cpp_int.cpp new file mode 100644 index 00000000..addc0eaf --- /dev/null +++ b/src/boost/libs/multiprecision/test/test_unchecked_cpp_int.cpp @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2017 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt + +// +// Check results of truncated overflow. +// + +#ifdef _MSC_VER +#define _SCL_SECURE_NO_WARNINGS +#endif + +#include <boost/multiprecision/cpp_int.hpp> +#include "test.hpp" +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_int.hpp> + +template <class T> +T generate_random(unsigned bits_wanted) +{ + static boost::random::mt19937 gen; + typedef boost::random::mt19937::result_type random_type; + + T max_val; + unsigned digits; + if (std::numeric_limits<T>::is_bounded && (bits_wanted == (unsigned)std::numeric_limits<T>::digits)) + { + max_val = (std::numeric_limits<T>::max)(); + digits = std::numeric_limits<T>::digits; + } + else + { + max_val = T(1) << bits_wanted; + digits = bits_wanted; + } + + unsigned bits_per_r_val = std::numeric_limits<random_type>::digits - 1; + while ((random_type(1) << bits_per_r_val) > (gen.max)()) + --bits_per_r_val; + + unsigned terms_needed = digits / bits_per_r_val + 1; + + T val = 0; + for (unsigned i = 0; i < terms_needed; ++i) + { + val *= (gen.max)(); + val += gen(); + } + val %= max_val; + return val; +} + +template <class Number> +void test() +{ + using namespace boost::multiprecision; + typedef Number test_type; + + for (unsigned i = 30; i < std::numeric_limits<test_type>::digits; ++i) + { + for (unsigned j = std::numeric_limits<test_type>::digits - i - 1; j < std::numeric_limits<test_type>::digits; ++j) + { + for (unsigned k = 0; k < 10; ++k) + { + test_type a = static_cast<test_type>(generate_random<cpp_int>(i)); + test_type b = static_cast<test_type>(generate_random<cpp_int>(j)); + test_type c = static_cast<test_type>(cpp_int(a) * cpp_int(b)); + test_type d = a * b; + BOOST_CHECK_EQUAL(c, d); + + if ((k == 0) && (j == 0)) + { + for (unsigned s = 1; s < std::numeric_limits<test_type>::digits; ++s) + BOOST_CHECK_EQUAL(a << s, test_type(cpp_int(a) << s)); + } + } + } + } +} + +int main() +{ + using namespace boost::multiprecision; + + test<int512_t>(); + test<uint512_t>(); + + // + // We also need to test type with "odd" bit counts in order to ensure full code coverage: + // + test<number<cpp_int_backend<528, 528, signed_magnitude, unchecked, void> > >(); + test<number<cpp_int_backend<528, 528, unsigned_magnitude, unchecked, void> > >(); + test<number<cpp_int_backend<48, 48, signed_magnitude, unchecked, void> > >(); + test<number<cpp_int_backend<48, 48, unsigned_magnitude, unchecked, void> > >(); + return boost::report_errors(); +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/common/init.hpp b/src/boost/libs/multiprecision/test/ublas_interop/common/init.hpp new file mode 100644 index 00000000..8480e431 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/common/init.hpp @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2004 Michael Stevens + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file + * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ + +/* + * Default construct test when possible + */ + +template <class E> +struct default_construct +{ + static void test() {} +}; +template <class VC> +struct default_construct<boost::numeric::ublas::vector_container<VC> > +{ + static void test() + { + VC default_constuct; + initialize_vector(default_constuct); + std::cout << "default construct = " << default_constuct << std::endl; + } +}; +template <class MC> +struct default_construct<boost::numeric::ublas::matrix_container<MC> > +{ + static void test() + { + MC default_constuct; + initialize_vector(default_constuct); + std::cout << "default construct = " << default_constuct << std::endl; + } +}; + +/* + * Initialise test values in vector/matrix + */ + +template <class V> +void initialize_vector(V& v) +{ + typename V::size_type size = v.size(); + for (typename V::size_type i = 0; i < size; ++i) + v[i] = typename V::value_type(i + 1.f); +} + +template <class M> +void initialize_matrix_impl(M& m, ublas::packed_proxy_tag) +{ + typename M::size_type size1 = m.size1(); +#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION + for (typename M::iterator1 i = m.begin1(); i != m.end1(); ++i) + for (typename M::iterator2 j = i.begin(); j != i.end(); ++j) + *j = typename M::value_type(i.index1() * size1 + j.index2() + 1.f); +#else + for (typename M::iterator1 i = m.begin1(); i != m.end1(); ++i) + for (typename M::iterator2 j = ublas::begin(i, ublas::iterator1_tag()); j != ublas::end(i, ublas::iterator1_tag()); ++j) + *j = typename M::value_type(i.index1() * size1 + j.index2() + 1.f); +#endif +} + +template <class M> +void initialize_matrix_impl(M& m, ublas::sparse_proxy_tag) +{ + typename M::size_type size1 = m.size1(); + typename M::size_type size2 = m.size2(); + for (typename M::size_type i = 0; i < size1; ++i) + for (typename M::size_type j = 0; j < size2; ++j) + m(i, j) = typename M::value_type(i * size1 + j + 1.f); +} + +template <class M> +void initialize_matrix(M& m) +{ + initialize_matrix_impl(m, typename M::storage_category()); +} + +template <class M> +void initialize_matrix(M& m, ublas::lower_tag) +{ + typename M::size_type size1 = m.size1(); + typename M::size_type size2 = m.size2(); + for (typename M::size_type i = 0; i < size1; ++i) + { + typename M::size_type j = 0; + for (; j <= i; ++j) + m(i, j) = i * size1 + j + 1.f; + for (; j < size2; ++j) + m(i, j) = 0.f; + } +} +template <class M> +void initialize_matrix(M& m, ublas::upper_tag) +{ + typename M::size_type size1 = m.size1(); + typename M::size_type size2 = m.size2(); + for (typename M::size_type i = 0; i < size1; ++i) + { + typename M::size_type j = 0; + for (; j < i; ++j) + m(i, j) = 0.f; + for (; j < size2; ++j) + m(i, j) = i * size1 + j + 1.f; + } +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/common/testhelper.hpp b/src/boost/libs/multiprecision/test/ublas_interop/common/testhelper.hpp new file mode 100644 index 00000000..2b1d31d7 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/common/testhelper.hpp @@ -0,0 +1,87 @@ +// Copyright 2008 Gunter Winkler <guwi17@gmx.de> +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef _HPP_TESTHELPER_ +#define _HPP_TESTHELPER_ + +#include <utility> + +static unsigned _success_counter = 0; +static unsigned _fail_counter = 0; + +static inline void assertTrue(const char* message, bool condition) +{ +#ifndef NOMESSAGES + std::cout << message; +#endif + if (condition) + { + ++_success_counter; + std::cout << "1\n"; // success + } + else + { + ++_fail_counter; + std::cout << "0\n"; // failed + } +} + +template <class T> +void assertEquals(const char* message, T expected, T actual) +{ +#ifndef NOMESSAGES + std::cout << message; +#endif + if (expected == actual) + { + ++_success_counter; + std::cout << "1\n"; // success + } + else + { +#ifndef NOMESSAGES + std::cout << " expected " << expected << " actual " << actual << " "; +#endif + ++_fail_counter; + std::cout << "0\n"; // failed + } +} + +static std::pair<unsigned, unsigned> getResults() +{ + return std::make_pair(_success_counter, _fail_counter); +} + +template <class M1, class M2> +bool compare(const boost::numeric::ublas::matrix_expression<M1>& m1, + const boost::numeric::ublas::matrix_expression<M2>& m2) +{ + size_t size1 = (std::min)(m1().size1(), m2().size1()); + size_t size2 = (std::min)(m1().size2(), m2().size2()); + for (size_t i = 0; i < size1; ++i) + { + for (size_t j = 0; j < size2; ++j) + { + if (m1()(i, j) != m2()(i, j)) + return false; + } + } + return true; +} + +template <class M1, class M2> +bool compare(const boost::numeric::ublas::vector_expression<M1>& m1, + const boost::numeric::ublas::vector_expression<M2>& m2) +{ + size_t size = (std::min)(m1().size(), m2().size()); + for (size_t i = 0; i < size; ++i) + { + if (m1()(i) != m2()(i)) + return false; + } + return true; +} + +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test1.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test1.cpp new file mode 100644 index 00000000..1407851b --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test1.cpp @@ -0,0 +1,25 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test1.hpp" + +int main() +{ + test_vector(); + test_matrix_vector(); + test_matrix(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test1.hpp b/src/boost/libs/multiprecision/test/ublas_interop/test1.hpp new file mode 100644 index 00000000..db6044c3 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test1.hpp @@ -0,0 +1,61 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#ifndef TEST1_H +#define TEST1_H + +#ifdef _MSC_VER +#pragma warning(disable : 4800 4996 4127 4100) +#endif + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#ifdef TEST_ET +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type; +#else +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type; +#endif +//typedef double mp_test_type; + +#define USE_RANGE +#define USE_SLICE +#define USE_FLOAT +#define USE_UNBOUNDED_ARRAY +#define USE_STD_VECTOR +#define USE_BOUNDED_VECTOR USE_MATRIX +#define USE_UNBOUNDED_ARRAY +#define USE_MAP_ARRAY +#define USE_STD_MAP +#define USE_MAPPED_VECTOR +#define USE_COMPRESSED_VECTOR +#define USE_COORDINATE_VECTOR +#define USE_MAPPED_MATRIX +#define USE_COMPRESSED_MATRIX +#define USE_COORDINATE_MATRIX + +#include <iostream> + +#include <boost/numeric/ublas/vector.hpp> +#include <boost/numeric/ublas/vector_proxy.hpp> +#include <boost/numeric/ublas/matrix.hpp> +#include <boost/numeric/ublas/matrix_proxy.hpp> +#include <boost/numeric/ublas/io.hpp> + +namespace ublas = boost::numeric::ublas; + +#include "common/init.hpp" + +void test_vector(); +void test_matrix_vector(); +void test_matrix(); + +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test11.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test11.cpp new file mode 100644 index 00000000..2ce66da9 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test11.cpp @@ -0,0 +1,274 @@ +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test1.hpp" + +// Test vector expression templates +template <class V, int N> +struct test_my_vector +{ + typedef typename V::value_type value_type; + typedef typename V::size_type size_type; + typedef typename ublas::type_traits<value_type>::real_type real_type; + + template <class VP> + void test_container_with(VP& v1) const + { + // Container type tests in addition to expression types + // Insert and erase + v1.insert_element(0, 55); + v1.erase_element(1); + v1.clear(); + } + + template <class VP> + void test_expression_with(VP& v1, VP& v2, VP& v3) const + { + // Expression type tests + value_type t; + size_type i; + real_type n; + + // Default Construct + default_construct<VP>::test(); + + // Copy and swap + initialize_vector(v1); + initialize_vector(v2); + v1 = v2; + std::cout << "v1 = v2 = " << v1 << std::endl; + v1.assign_temporary(v2); + std::cout << "v1.assign_temporary (v2) = " << v1 << std::endl; + v1.swap(v2); + std::cout << "v1.swap (v2) = " << v1 << " " << v2 << std::endl; + + // Zero assignment + v1 = ublas::zero_vector<>(v1.size()); + std::cout << "v1.zero_vector = " << v1 << std::endl; + v1 = v2; + +#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING + // Project range and slice + initialize_vector(v1); + initialize_vector(v2); + project(v1, ublas::range(0, 1)) = project(v2, ublas::range(0, 1)); + project(v1, ublas::range(0, 1)) = project(v2, ublas::slice(0, 1, 1)); + project(v1, ublas::slice(2, -1, 2)) = project(v2, ublas::slice(0, 1, 2)); + project(v1, ublas::slice(2, -1, 2)) = project(v2, ublas::range(0, 2)); + std::cout << "v1 = range/slice " << v1 << std::endl; +#endif + + // Unary vector operations resulting in a vector + initialize_vector(v1); + v2 = -v1; + std::cout << "- v1 = " << v2 << std::endl; + v2 = ublas::conj(v1); + std::cout << "conj (v1) = " << v2 << std::endl; + + // Binary vector operations resulting in a vector + initialize_vector(v1); + initialize_vector(v2); + v3 = v1 + v2; + std::cout << "v1 + v2 = " << v3 << std::endl; + v3 = v1 - v2; + std::cout << "v1 - v2 = " << v3 << std::endl; + v3 = ublas::element_prod(v1, v2); + std::cout << "element_prod (v1, v2) = " << v3 << std::endl; + + // Scaling a vector + t = N; + initialize_vector(v1); + v2 = value_type(1.) * v1; + std::cout << "1. * v1 = " << v2 << std::endl; + v2 = t * v1; + std::cout << "N * v1 = " << v2 << std::endl; + initialize_vector(v1); + v2 = v1 * value_type(1.); + std::cout << "v1 * 1. = " << v2 << std::endl; + v2 = v1 * t; + std::cout << "v1 * value_type(N) = " << v2 << std::endl; + // test interop with integer + v2 = v1 * N; + + std::cout << "v1 * N = " << v2 << std::endl; + + // Some assignments + initialize_vector(v1); + initialize_vector(v2); + v2 += v1; + std::cout << "v2 += v1 = " << v2 << std::endl; + v2 -= v1; + std::cout << "v2 -= v1 = " << v2 << std::endl; + v2 = v2 + v1; + std::cout << "v2 = v2 + v1 = " << v2 << std::endl; + v2 = v2 - v1; + std::cout << "v2 = v2 - v1 = " << v2 << std::endl; + v1 *= value_type(1.); + std::cout << "v1 *= 1. = " << v1 << std::endl; + v1 *= t; + std::cout << "v1 *= value_type(N) = " << v1 << std::endl; + // test interop with integer + v1 *= N; + std::cout << "v1 *= N = " << v1 << std::endl; + + // Unary vector operations resulting in a scalar + initialize_vector(v1); + t = ublas::sum(v1); + std::cout << "sum (v1) = " << t << std::endl; + n = ublas::norm_1(v1); + std::cout << "norm_1 (v1) = " << n << std::endl; + n = ublas::norm_2(v1); + std::cout << "norm_2 (v1) = " << n << std::endl; + n = ublas::norm_inf(v1); + std::cout << "norm_inf (v1) = " << n << std::endl; + + i = ublas::index_norm_inf(v1); + std::cout << "index_norm_inf (v1) = " << i << std::endl; + + // Binary vector operations resulting in a scalar + initialize_vector(v1); + initialize_vector(v2); + t = ublas::inner_prod(v1, v2); + std::cout << "inner_prod (v1, v2) = " << t << std::endl; + + // Scalar and Binary vector expression resulting in a vector + initialize_vector(v1); + initialize_vector(v2); + v1 = v1 * ublas::inner_prod(v1, v2); + std::cout << "v1 * inner_prod (v1, v2) = " << v1 << std::endl; + } + + void operator()() const + { + V v1(N), v2(N), v3(N); + test_expression_with(v1, v2, v3); + test_container_with(v1); + +#ifdef USE_RANGE + ublas::vector_range<V> vr1(v1, ublas::range(0, N)), + vr2(v2, ublas::range(0, N)), + vr3(v3, ublas::range(0, N)); + test_expression_with(vr1, vr2, vr3); +#endif + +#ifdef USE_SLICE + ublas::vector_slice<V> vs1(v1, ublas::slice(0, 1, N)), + vs2(v2, ublas::slice(0, 1, N)), + vs3(v3, ublas::slice(0, 1, N)); + test_expression_with(vs1, vs2, vs3); +#endif + } +}; + +// Test vector +void test_vector() +{ + std::cout << "test_vector" << std::endl; + +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_vector<ublas::vector<double, ublas::unbounded_array<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_vector<ublas::vector<double, std::vector<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_BOUNDED_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded" << std::endl; + test_my_vector<ublas::bounded_vector<mp_test_type, 3>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded" << std::endl; + test_my_vector<ublas::bounded_vector<double, 3>, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded" << std::endl; + test_my_vector<ublas::bounded_vector<std::complex<mp_test_type>, 3>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded" << std::endl; + test_my_vector<ublas::bounded_vector<std::complex<double>, 3>, 3>()(); +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test12.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test12.cpp new file mode 100644 index 00000000..e6927e64 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test12.cpp @@ -0,0 +1,286 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test1.hpp" + +// Test matrix & vector expression templates +template <class V, class M, int N> +struct test_my_matrix_vector +{ + typedef typename V::value_type value_type; + + template <class VP, class MP> + void test_with(VP& v1, VP& v2, MP& m1) const + { + { + // Rows and columns + initialize_matrix(m1); + for (int i = 0; i < N; ++i) + { + v1 = ublas::row(m1, i); + std::cout << "row (m, " << i << ") = " << v1 << std::endl; + v1 = ublas::column(m1, i); + std::cout << "column (m, " << i << ") = " << v1 << std::endl; + } + + // Outer product + initialize_vector(v1); + initialize_vector(v2); + m1 = ublas::outer_prod(v1, v2); + std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; + + // Matrix vector product + initialize_matrix(m1); + initialize_vector(v1); + v2 = ublas::prod(m1, v1); + std::cout << "prod (m1, v1) = " << v2 << std::endl; + v2 = ublas::prod(v1, m1); + std::cout << "prod (v1, m1) = " << v2 << std::endl; + } + } + void operator()() const + { + { + V v1(N), v2(N); + M m1(N, N); + test_with(v1, v2, m1); + + ublas::matrix_row<M> mr1(m1, 0), mr2(m1, 1); + test_with(mr1, mr2, m1); + + ublas::matrix_column<M> mc1(m1, 0), mc2(m1, 1); + test_with(mc1, mc2, m1); + +#ifdef USE_RANGE + ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)), + mvr2(m1, ublas::range(0, N), ublas::range(0, N)); + test_with(mvr1, mvr2, m1); +#endif + +#ifdef USE_SLICE + ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(mvs1, mvs2, m1); +#endif + } + } +}; + +// Test matrix & vector +void test_matrix_vector() +{ + std::cout << "test_matrix_vector" << std::endl; + +#ifdef USE_MATRIX +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, + ublas::matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, + ublas::matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, + ublas::matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, + ublas::matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, + ublas::matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >, + ublas::matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, + ublas::matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, + ublas::matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, + ublas::matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<double, std::vector<double> >, + ublas::matrix<double, ublas::row_major, std::vector<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, + ublas::matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, + ublas::matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(); +#endif +#endif +#endif +#endif + +#ifdef USE_BOUNDED_MATRIX +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded" << std::endl; + test_my_matrix_vector<ublas::bounded_vector<mp_test_type, 3>, + ublas::bounded_matrix<mp_test_type, 3, 3>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded" << std::endl; + test_my_matrix_vector<ublas::bounded_vector<double, 3>, + ublas::bounded_matrix<double, 3, 3>, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded" << std::endl; + test_my_matrix_vector<ublas::bounded_vector<std::complex<mp_test_type>, 3>, + ublas::bounded_matrix<std::complex<mp_test_type>, 3, 3>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded" << std::endl; + test_my_matrix_vector<ublas::bounded_vector<std::complex<double>, 3>, + ublas::bounded_matrix<std::complex<double>, 3, 3>, 3>()(); +#endif +#endif +#endif + +#ifdef USE_VECTOR_OF_VECTOR +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, + ublas::vector_of_vector<mp_test_type, ublas::row_major, ublas::bounded_array<ublas::bounded_array<mp_test_type, 3>, 3 + 1> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, + ublas::vector_of_vector<double, ublas::row_major, ublas::bounded_array<ublas::bounded_array<double, 3>, 3 + 1> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, + ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<std::complex<mp_test_type>, 3>, 3 + 1> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, + ublas::vector_of_vector<std::complex<double>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<std::complex<double>, 3>, 3 + 1> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, + ublas::vector_of_vector<mp_test_type, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >, + ublas::vector_of_vector<double, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<double> > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, + ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<std::complex<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, + ublas::vector_of_vector<std::complex<double>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<std::complex<double> > > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, + ublas::vector_of_vector<mp_test_type, ublas::row_major, std::vector<std::vector<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<double, std::vector<double> >, + ublas::vector_of_vector<double, ublas::row_major, std::vector<std::vector<double> > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, + ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, std::vector<std::vector<std::complex<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, + ublas::vector_of_vector<std::complex<double>, ublas::row_major, std::vector<std::vector<std::complex<double> > > >, 3>()(); +#endif +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test13.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test13.cpp new file mode 100644 index 00000000..2988c535 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test13.cpp @@ -0,0 +1,330 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test1.hpp" + +// Test matrix expression templates +template <class M, int N> +struct test_my_matrix +{ + typedef typename M::value_type value_type; + + template <class VP> + void test_container_with(VP& v1) const + { + // Container type tests in addition to expression types + // Insert and erase + v1.insert_element(0, 0, 55); + v1.erase_element(1, 1); + v1.clear(); + } + + template <class MP> + void test_expression_with(MP& m1, MP& m2, MP& m3) const + { + value_type t; + + // Default Construct + default_construct<MP>::test(); + + // Copy and swap + initialize_matrix(m1); + initialize_matrix(m2); + m1 = m2; + std::cout << "m1 = m2 = " << m1 << std::endl; + m1.assign_temporary(m2); + std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; + m1.swap(m2); + std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; + + // Zero assignment + m1 = ublas::zero_matrix<>(m1.size1(), m1.size2()); + std::cout << "m1.zero_matrix = " << m1 << std::endl; + m1 = m2; + +#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING + // Project range and slice + initialize_matrix(m1); + initialize_matrix(m2); + project(m1, ublas::range(0, 1), ublas::range(0, 1)) = project(m2, ublas::range(0, 1), ublas::range(0, 1)); + project(m1, ublas::range(0, 1), ublas::range(0, 1)) = project(m2, ublas::slice(0, 1, 1), ublas::slice(0, 1, 1)); + project(m1, ublas::slice(2, -1, 2), ublas::slice(2, -1, 2)) = project(m2, ublas::slice(0, 1, 2), ublas::slice(0, 1, 2)); + project(m1, ublas::slice(2, -1, 2), ublas::slice(2, -1, 2)) = project(m2, ublas::range(0, 2), ublas::range(0, 2)); + std::cout << "m1 = range/slice " << m1 << std::endl; +#endif + + // Unary matrix operations resulting in a matrix + initialize_matrix(m1); + m2 = -m1; + std::cout << "- m1 = " << m2 << std::endl; + m2 = ublas::conj(m1); + std::cout << "conj (m1) = " << m2 << std::endl; + + // Binary matrix operations resulting in a matrix + initialize_matrix(m1); + initialize_matrix(m2); + m3 = m1 + m2; + std::cout << "m1 + m2 = " << m3 << std::endl; + m3 = m1 - m2; + std::cout << "m1 - m2 = " << m3 << std::endl; + m3 = ublas::element_prod(m1, m2); + std::cout << "element_prod (m1, m2) = " << m3 << std::endl; + + // Scaling a matrix + t = N; + initialize_matrix(m1); + m2 = value_type(1.) * m1; + std::cout << "1. * m1 = " << m2 << std::endl; + m2 = t * m1; + std::cout << "N * m1 = " << m2 << std::endl; + initialize_matrix(m1); + m2 = m1 * value_type(1.); + std::cout << "m1 * 1. = " << m2 << std::endl; + m2 = m1 * t; + std::cout << "m1 * N = " << m2 << std::endl; + + // Some assignments + initialize_matrix(m1); + initialize_matrix(m2); + m2 += m1; + std::cout << "m2 += m1 = " << m2 << std::endl; + m2 -= m1; + std::cout << "m2 -= m1 = " << m2 << std::endl; + m2 = m2 + m1; + std::cout << "m2 = m2 + m1 = " << m2 << std::endl; + m2 = m2 - m1; + std::cout << "m2 = m2 - m1 = " << m2 << std::endl; + m1 *= value_type(1.); + std::cout << "m1 *= 1. = " << m1 << std::endl; + m1 *= t; + std::cout << "m1 *= N = " << m1 << std::endl; + + // Transpose + initialize_matrix(m1); + m2 = ublas::trans(m1); + std::cout << "trans (m1) = " << m2 << std::endl; + + // Hermitean + initialize_matrix(m1); + m2 = ublas::herm(m1); + std::cout << "herm (m1) = " << m2 << std::endl; + + // Matrix multiplication + initialize_matrix(m1); + initialize_matrix(m2); + m3 = ublas::prod(m1, m2); + std::cout << "prod (m1, m2) = " << m3 << std::endl; + } + + void operator()() const + { + M m1(N, N), m2(N, N), m3(N, N); + test_expression_with(m1, m2, m3); + test_container_with(m1); + +#ifdef USE_RANGE + ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)), + mr2(m2, ublas::range(0, N), ublas::range(0, N)), + mr3(m3, ublas::range(0, N), ublas::range(0, N)); + test_expression_with(mr1, mr2, mr3); +#endif + +#ifdef USE_SLICE + ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_expression_with(ms1, ms2, ms3); +#endif + } +}; + +// Test matrix +void test_matrix() +{ + std::cout << "test_matrix" << std::endl; + +#ifdef USE_MATRIX +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix<ublas::matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix<ublas::matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix<ublas::matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix<ublas::matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix<ublas::matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix<ublas::matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix<ublas::matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix<ublas::matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix<ublas::matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix<ublas::matrix<double, ublas::row_major, std::vector<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix<ublas::matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix<ublas::matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(); +#endif +#endif +#endif +#endif + +#ifdef USE_BOUNDED_MATRIX +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded" << std::endl; + test_my_matrix<ublas::bounded_matrix<mp_test_type, 3, 3>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded" << std::endl; + test_my_matrix<ublas::bounded_matrix<double, 3, 3>, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded" << std::endl; + test_my_matrix<ublas::bounded_matrix<std::complex<mp_test_type>, 3, 3>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded" << std::endl; + test_my_matrix<ublas::bounded_matrix<std::complex<double>, 3, 3>, 3>()(); +#endif +#endif +#endif + +#ifdef USE_VECTOR_OF_VECTOR +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<mp_test_type, ublas::row_major, ublas::bounded_array<ublas::bounded_array<mp_test_type, 3>, 3 + 1> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<double, ublas::row_major, ublas::bounded_array<ublas::bounded_array<double, 3>, 3 + 1> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<std::complex<mp_test_type>, 3>, 3 + 1> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<std::complex<double>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<std::complex<double>, 3>, 3 + 1> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<mp_test_type, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<double, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<double> > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<std::complex<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<std::complex<double>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<std::complex<double> > > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix<ublas::vector_of_vector<mp_test_type, ublas::row_major, std::vector<std::vector<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix<ublas::vector_of_vector<double, ublas::row_major, std::vector<std::vector<double> > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix<ublas::vector_of_vector<std::complex<mp_test_type>, ublas::row_major, std::vector<std::vector<std::complex<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix<ublas::vector_of_vector<std::complex<double>, ublas::row_major, std::vector<std::vector<std::complex<double> > > >, 3>()(); +#endif +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test2.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test2.cpp new file mode 100644 index 00000000..7f21cd45 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test2.cpp @@ -0,0 +1,92 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test2.hpp" + +int main() +{ +#ifdef USE_FLOAT + std::cout << "mp_test_type" << std::endl; + test_blas_1<ublas::vector<mp_test_type>, 3>().test(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double" << std::endl; + test_blas_1<ublas::vector<double>, 3>().test(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>" << std::endl; + test_blas_1<ublas::vector<std::complex<mp_test_type> >, 3>().test(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>" << std::endl; + test_blas_1<ublas::vector<std::complex<double> >, 3>().test(); +#endif +#endif + + std::cout << "test_blas_2" << std::endl; + +#ifdef USE_FLOAT + std::cout << "mp_test_type" << std::endl; + test_blas_2<ublas::vector<mp_test_type>, ublas::matrix<mp_test_type>, 3>().test(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double" << std::endl; + test_blas_2<ublas::vector<double>, ublas::matrix<double>, 3>().test(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>" << std::endl; + test_blas_2<ublas::vector<std::complex<mp_test_type> >, ublas::matrix<std::complex<mp_test_type> >, 3>().test(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>" << std::endl; + test_blas_2<ublas::vector<std::complex<double> >, ublas::matrix<std::complex<double> >, 3>().test(); +#endif +#endif + + std::cout << "test_blas_3" << std::endl; + +#ifdef USE_FLOAT + std::cout << "mp_test_type" << std::endl; + test_blas_3<ublas::matrix<mp_test_type>, 3>().test(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double" << std::endl; + test_blas_3<ublas::matrix<double>, 3>().test(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>" << std::endl; + test_blas_3<ublas::matrix<std::complex<mp_test_type> >, 3>().test(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>" << std::endl; + test_blas_3<ublas::matrix<std::complex<double> >, 3>().test(); +#endif +#endif + + return 0; +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test2.hpp b/src/boost/libs/multiprecision/test/ublas_interop/test2.hpp new file mode 100644 index 00000000..fcfab679 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test2.hpp @@ -0,0 +1,81 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#ifndef TEST2_H +#define TEST2_H +#ifdef _MSC_VER +#pragma warning(disable : 4800 4996 4127 4100 4018) +#endif + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#ifdef TEST_ET +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type; +#else +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type; +#endif +//typedef double mp_test_type; + +#define USE_RANGE +#define USE_SLICE +#define USE_FLOAT +#define USE_UNBOUNDED_ARRAY +#define USE_STD_VECTOR +#define USE_BOUNDED_VECTOR USE_MATRIX +#define USE_UNBOUNDED_ARRAY +#define USE_MAP_ARRAY +#define USE_STD_MAP +#define USE_MAPPED_VECTOR +#define USE_COMPRESSED_VECTOR +#define USE_COORDINATE_VECTOR +#define USE_MAPPED_MATRIX +#define USE_COMPRESSED_MATRIX +#define USE_COORDINATE_MATRIX + +#include <iostream> + +#include <boost/numeric/ublas/vector.hpp> +#include <boost/numeric/ublas/matrix.hpp> +#include <boost/numeric/ublas/triangular.hpp> +#include <boost/numeric/ublas/io.hpp> +#include <boost/numeric/ublas/blas.hpp> + +namespace ublas = boost::numeric::ublas; + +#include "common/init.hpp" + +template <class V, int N> +struct test_blas_1 +{ + typedef typename V::value_type value_type; + typedef typename ublas::type_traits<value_type>::real_type real_type; + + void test(); +}; + +template <class V, class M, int N> +struct test_blas_2 +{ + typedef typename V::value_type value_type; + + void test(); +}; + +template <class M, int N> +struct test_blas_3 +{ + typedef typename M::value_type value_type; + + void test(); +}; + +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test21.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test21.cpp new file mode 100644 index 00000000..d6e9939a --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test21.cpp @@ -0,0 +1,100 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test2.hpp" + +template <class V, int N> +void test_blas_1<V, N>::test() +{ + { + value_type t; + real_type n; + V v1(N), v2(N); + + // _asum + initialize_vector(v1); + n = ublas::blas_1::asum(v1); + std::cout << "asum (v1) = " << n << std::endl; + + // _amax + initialize_vector(v1); + n = ublas::blas_1::amax(v1); + std::cout << "amax (v1) = " << n << std::endl; + + // _nrm2 + initialize_vector(v1); + n = ublas::blas_1::nrm2(v1); + std::cout << "nrm2 (v1) = " << n << std::endl; + + // _dot + // _dotu + // _dotc + initialize_vector(v1); + initialize_vector(v2); + t = ublas::blas_1::dot(v1, v2); + std::cout << "dot (v1, v2) = " << t << std::endl; + t = ublas::blas_1::dot(ublas::conj(v1), v2); + std::cout << "dot (conj (v1), v2) = " << t << std::endl; + + // _copy + initialize_vector(v2); + ublas::blas_1::copy(v1, v2); + std::cout << "copy (v1, v2) = " << v1 << std::endl; + + // _swap + initialize_vector(v1); + initialize_vector(v2); + ublas::blas_1::swap(v1, v2); + std::cout << "swap (v1, v2) = " << v1 << " " << v2 << std::endl; + + // _scal + // csscal + // zdscal + initialize_vector(v1); + ublas::blas_1::scal(v1, value_type(1)); + std::cout << "scal (v1, 1) = " << v1 << std::endl; + + // _axpy + initialize_vector(v1); + initialize_vector(v2); + ublas::blas_1::axpy(v1, value_type(1), v2); + std::cout << "axpy (v1, 1, v2) = " << v1 << std::endl; + + // _rot + initialize_vector(v1); + initialize_vector(v2); + ublas::blas_1::rot(value_type(1), v1, value_type(1), v2); + std::cout << "rot (1, v1, 1, v2) = " << v1 << " " << v2 << std::endl; + } +} + +#ifdef USE_FLOAT +template struct test_blas_1<ublas::vector<mp_test_type>, 3>; +#endif + +#ifdef USE_DOUBLE +template struct test_blas_1<ublas::vector<double>, 3>; +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT +template struct test_blas_1<ublas::vector<std::complex<mp_test_type> >, 3>; +#endif + +#ifdef USE_DOUBLE +template struct test_blas_1<ublas::vector<std::complex<double> >, 3>; +#endif +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test22.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test22.cpp new file mode 100644 index 00000000..ce3d8032 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test22.cpp @@ -0,0 +1,152 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test2.hpp" + +template <class V, class M, int N> +void test_blas_2<V, M, N>::test() +{ + { + V v1(N), v2(N); + M m(N, N); + + // _t_mv + initialize_vector(v1); + initialize_matrix(m); + ublas::blas_2::tmv(v1, m); + std::cout << "tmv (v1, m) = " << v1 << std::endl; + initialize_vector(v1); + initialize_matrix(m); + ublas::blas_2::tmv(v1, ublas::trans(m)); + std::cout << "tmv (v1, trans (m)) = " << v1 << std::endl; +#ifdef USE_STD_COMPLEX + initialize_vector(v1); + initialize_matrix(m); + ublas::blas_2::tmv(v1, ublas::herm(m)); + std::cout << "tmv (v1, herm (m)) = " << v1 << std::endl; +#endif + + // _t_sv + initialize_vector(v1); + initialize_vector(v2); + initialize_matrix(m, ublas::lower_tag()); + ublas::blas_2::tsv(v1, m, ublas::lower_tag()); + std::cout << "tsv (v1, m) = " << v1 << " " << ublas::prod(m, v1) - v2 << std::endl; + initialize_vector(v1); + initialize_vector(v2); + initialize_matrix(m, ublas::upper_tag()); + ublas::blas_2::tsv(v1, ublas::trans(m), ublas::lower_tag()); + std::cout << "tsv (v1, trans (m)) = " << v1 << " " << ublas::prod(ublas::trans(m), v1) - v2 << std::endl; +#ifdef USE_STD_COMPLEX + initialize_vector(v1); + initialize_vector(v2); + initialize_matrix(m, ublas::upper_tag()); + ublas::blas_2::tsv(v1, ublas::herm(m), ublas::lower_tag()); + std::cout << "tsv (v1, herm (m)) = " << v1 << " " << ublas::prod(ublas::herm(m), v1) - v2 << std::endl; +#endif + initialize_vector(v1); + initialize_vector(v2); + initialize_matrix(m, ublas::upper_tag()); + ublas::blas_2::tsv(v1, m, ublas::upper_tag()); + std::cout << "tsv (v1, m) = " << v1 << " " << ublas::prod(m, v1) - v2 << std::endl; + initialize_vector(v1); + initialize_vector(v2); + initialize_matrix(m, ublas::lower_tag()); + ublas::blas_2::tsv(v1, ublas::trans(m), ublas::upper_tag()); + std::cout << "tsv (v1, trans (m)) = " << v1 << " " << ublas::prod(ublas::trans(m), v1) - v2 << std::endl; +#ifdef USE_STD_COMPLEX + initialize_vector(v1); + initialize_vector(v2); + initialize_matrix(m, ublas::lower_tag()); + ublas::blas_2::tsv(v1, ublas::herm(m), ublas::upper_tag()); + std::cout << "tsv (v1, herm (m)) = " << v1 << " " << ublas::prod(ublas::herm(m), v1) - v2 << std::endl; +#endif + + // _g_mv + // _s_mv + // _h_mv + initialize_vector(v1); + initialize_vector(v2); + initialize_matrix(m); + ublas::blas_2::gmv(v1, value_type(1), value_type(1), m, v2); + std::cout << "gmv (v1, 1, 1, m, v2) = " << v1 << std::endl; + ublas::blas_2::gmv(v1, value_type(1), value_type(1), ublas::trans(m), v2); + std::cout << "gmv (v1, 1, 1, trans (m), v2) = " << v1 << std::endl; +#ifdef USE_STD_COMPLEX + ublas::blas_2::gmv(v1, value_type(1), value_type(1), ublas::herm(m), v2); + std::cout << "gmv (v1, 1, 1, herm (m), v2) = " << v1 << std::endl; +#endif + + // _g_r + // _g_ru + // _g_rc + initialize_vector(v1); + initialize_vector(v2); + initialize_matrix(m); + ublas::blas_2::gr(m, value_type(1), v1, v2); + std::cout << "gr (m, 1, v1, v2) = " << m << std::endl; + ublas::blas_2::gr(m, value_type(1), v1, ublas::conj(v2)); + std::cout << "gr (m, 1, v1, conj (v2)) = " << m << std::endl; + + // _s_r + initialize_vector(v1); + initialize_matrix(m); + ublas::blas_2::sr(m, value_type(1), v1); + std::cout << "sr (m, 1, v1) = " << m << std::endl; + +#ifdef USE_STD_COMPLEX + // _h_r + initialize_vector(v1); + initialize_matrix(m); + ublas::blas_2::hr(m, value_type(1), v1); + std::cout << "hr (m, 1, v1) = " << m << std::endl; +#endif + + // _s_r2 + initialize_vector(v1); + initialize_vector(v2); + initialize_matrix(m); + ublas::blas_2::sr2(m, value_type(1), v1, v2); + std::cout << "sr2 (m, 1, v1, v2) = " << m << std::endl; + +#ifdef USE_STD_COMPLEX + // _h_r2 + initialize_vector(v1); + initialize_vector(v2); + initialize_matrix(m); + ublas::blas_2::hr2(m, value_type(1), v1, v2); + std::cout << "hr2 (m, 1, v1, v2) = " << m << std::endl; +#endif + } +} + +#ifdef USE_FLOAT +template struct test_blas_2<ublas::vector<mp_test_type>, ublas::matrix<mp_test_type>, 3>; +#endif + +#ifdef USE_DOUBLE +template struct test_blas_2<ublas::vector<double>, ublas::matrix<double>, 3>; +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT +template struct test_blas_2<ublas::vector<std::complex<mp_test_type> >, ublas::matrix<std::complex<mp_test_type> >, 3>; +#endif + +#ifdef USE_DOUBLE +template struct test_blas_2<ublas::vector<std::complex<double> >, ublas::matrix<std::complex<double> >, 3>; +#endif +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test23.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test23.cpp new file mode 100644 index 00000000..0c5bef20 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test23.cpp @@ -0,0 +1,213 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test2.hpp" + +template <class M, int N> +void test_blas_3<M, N>::test() +{ + { + M m1(N, N), m2(N, N), m3(N, N); + + // _t_mm + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::tmm(m1, value_type(1), m2, m1); + std::cout << "tmm (m1, 1, m2, m1) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::tmm(m1, value_type(1), m2, ublas::trans(m1)); + std::cout << "tmm (m1, 1, m2, trans (m1)) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::tmm(m1, value_type(1), ublas::trans(m2), m1); + std::cout << "tmm (m1, 1, trans (m2), m1) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::tmm(m1, value_type(1), ublas::trans(m2), ublas::trans(m1)); + std::cout << "tmm (m1, 1, trans (m2), trans (m1)) = " << m1 << std::endl; +#ifdef USE_STD_COMPLEX + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::tmm(m1, value_type(1), m2, ublas::herm(m1)); + std::cout << "tmm (m1, 1, m2, herm (m1)) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::tmm(m1, value_type(1), ublas::herm(m2), m1); + std::cout << "tmm (m1, 1, herm (m2), m1) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::tmm(m1, value_type(1), ublas::trans(m2), ublas::herm(m1)); + std::cout << "tmm (m1, 1, trans (m2), herm (m1)) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::tmm(m1, value_type(1), ublas::herm(m2), ublas::trans(m1)); + std::cout << "tmm (m1, 1, herm (m2), trans (m1)) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::tmm(m1, value_type(1), ublas::herm(m2), ublas::herm(m1)); + std::cout << "tmm (m1, 1, herm (m2), herm (m1)) = " << m1 << std::endl; +#endif + + // _t_sm + initialize_matrix(m1); + initialize_matrix(m2, ublas::lower_tag()); + initialize_matrix(m3); + ublas::blas_3::tsm(m1, value_type(1), m2, ublas::lower_tag()); + std::cout << "tsm (m1, 1, m2) = " << m1 << " " << ublas::prod(m2, m1) - value_type(1) * m3 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2, ublas::upper_tag()); + ublas::blas_3::tsm(m1, value_type(1), ublas::trans(m2), ublas::lower_tag()); + std::cout << "tsm (m1, 1, trans (m2)) = " << m1 << " " << ublas::prod(ublas::trans(m2), m1) - value_type(1) * m3 << std::endl; +#ifdef USE_STD_COMPLEX + initialize_matrix(m1); + initialize_matrix(m2, ublas::upper_tag()); + ublas::blas_3::tsm(m1, value_type(1), ublas::herm(m2), ublas::lower_tag()); + std::cout << "tsm (m1, 1, herm (m2)) = " << m1 << " " << ublas::prod(ublas::herm(m2), m1) - value_type(1) * m3 << std::endl; +#endif + initialize_matrix(m1); + initialize_matrix(m2, ublas::upper_tag()); + ublas::blas_3::tsm(m1, value_type(1), m2, ublas::upper_tag()); + std::cout << "tsm (m1, 1, m2) = " << m1 << " " << ublas::prod(m2, m1) - value_type(1) * m3 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2, ublas::lower_tag()); + ublas::blas_3::tsm(m1, value_type(1), ublas::trans(m2), ublas::upper_tag()); + std::cout << "tsm (m1, 1, trans (m2)) = " << m1 << " " << ublas::prod(ublas::trans(m2), m1) - value_type(1) * m3 << std::endl; +#ifdef USE_STD_COMPLEX + initialize_matrix(m1); + initialize_matrix(m2, ublas::lower_tag()); + ublas::blas_3::tsm(m1, value_type(1), ublas::herm(m2), ublas::upper_tag()); + std::cout << "tsm (m1, 1, herm (m2)) = " << m1 << " " << ublas::prod(ublas::herm(m2), m1) - value_type(1) * m3 << std::endl; +#endif + + // _g_mm + // _s_mm + // _h_mm + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::gmm(m1, value_type(1), value_type(1), m2, m3); + std::cout << "gmm (m1, 1, 1, m2, m3) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::trans(m2), m3); + std::cout << "gmm (m1, 1, 1, trans (m2), m3) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::gmm(m1, value_type(1), value_type(1), m2, ublas::trans(m3)); + std::cout << "gmm (m1, 1, 1, m2, trans (m3)) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::trans(m2), ublas::trans(m3)); + std::cout << "gmm (m1, 1, 1, trans (m2), trans (m3)) = " << m1 << std::endl; +#ifdef USE_STD_COMPLEX + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::herm(m2), m3); + std::cout << "gmm (m1, 1, 1, herm (m2), m3) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::gmm(m1, value_type(1), value_type(1), m2, ublas::herm(m3)); + std::cout << "gmm (m1, 1, 1, m2, herm (m3)) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::herm(m2), ublas::trans(m3)); + std::cout << "gmm (m1, 1, 1, herm (m2), trans (m3)) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::trans(m2), ublas::herm(m3)); + std::cout << "gmm (m1, 1, 1, trans (m2), herm (m3)) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::gmm(m1, value_type(1), value_type(1), ublas::herm(m2), ublas::herm(m3)); + std::cout << "gmm (m1, 1, 1, herm (m2), herm (m3)) = " << m1 << std::endl; +#endif + + // s_rk + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::srk(m1, value_type(1), value_type(1), m2); + std::cout << "srk (m1, 1, 1, m2) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::srk(m1, value_type(1), value_type(1), ublas::trans(m2)); + std::cout << "srk (m1, 1, 1, trans (m2)) = " << m1 << std::endl; + +#ifdef USE_STD_COMPLEX + // h_rk + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::hrk(m1, value_type(1), value_type(1), m2); + std::cout << "hrk (m1, 1, 1, m2) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + ublas::blas_3::hrk(m1, value_type(1), value_type(1), ublas::herm(m2)); + std::cout << "hrk (m1, 1, 1, herm (m2)) = " << m1 << std::endl; +#endif + + // s_r2k + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::sr2k(m1, value_type(1), value_type(1), m2, m3); + std::cout << "sr2k (m1, 1, 1, m2, m3) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::sr2k(m1, value_type(1), value_type(1), ublas::trans(m2), ublas::trans(m3)); + std::cout << "sr2k (m1, 1, 1, trans (m2), trans (m3)) = " << m1 << std::endl; + +#ifdef USE_STD_COMPLEX + // h_r2k + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::hr2k(m1, value_type(1), value_type(1), m2, m3); + std::cout << "hr2k (m1, 1, 1, m2, m3) = " << m1 << std::endl; + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + ublas::blas_3::hr2k(m1, value_type(1), value_type(1), ublas::herm(m2), ublas::herm(m3)); + std::cout << "hr2k (m1, 1, 1, herm (m2), herm (m3)) = " << m1 << std::endl; +#endif + } +} + +#ifdef USE_FLOAT +template struct test_blas_3<ublas::matrix<mp_test_type>, 3>; +#endif + +#ifdef USE_DOUBLE +template struct test_blas_3<ublas::matrix<double>, 3>; +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT +template struct test_blas_3<ublas::matrix<std::complex<mp_test_type> >, 3>; +#endif + +#ifdef USE_DOUBLE +template struct test_blas_3<ublas::matrix<std::complex<double> >, 3>; +#endif +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test3.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test3.cpp new file mode 100644 index 00000000..d31fb465 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test3.cpp @@ -0,0 +1,25 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test3.hpp" + +int main() +{ + test_vector(); + test_matrix_vector(); + test_matrix(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test3.hpp b/src/boost/libs/multiprecision/test/ublas_interop/test3.hpp new file mode 100644 index 00000000..2e083b0a --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test3.hpp @@ -0,0 +1,67 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#ifndef TEST3_H +#define TEST3_H + +#ifdef _MSC_VER +#pragma warning(disable : 4800 4996 4127 4100) +#endif + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#ifdef TEST_ET +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type; +#else +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type; +#endif +//typedef double mp_test_type; + +#define USE_RANGE +#define USE_SLICE +#define USE_FLOAT +#define USE_UNBOUNDED_ARRAY +#define USE_STD_VECTOR +#define USE_BOUNDED_VECTOR USE_MATRIX +#define USE_UNBOUNDED_ARRAY +#define USE_MAP_ARRAY +#define USE_STD_MAP +#define USE_MAPPED_VECTOR +#define USE_COMPRESSED_VECTOR +#define USE_COORDINATE_VECTOR +#define USE_MAPPED_MATRIX +#define USE_COMPRESSED_MATRIX +#define USE_COORDINATE_MATRIX + +#include <iostream> + +#include <boost/numeric/ublas/vector.hpp> +#include <boost/numeric/ublas/vector_proxy.hpp> +#include <boost/numeric/ublas/vector_sparse.hpp> +#include <boost/numeric/ublas/matrix.hpp> +#include <boost/numeric/ublas/matrix_proxy.hpp> +#include <boost/numeric/ublas/matrix_sparse.hpp> +#include <boost/numeric/ublas/vector_sparse.hpp> +#ifdef USE_GENERALIZED_VECTOR_OF_VECTOR +#include <boost/numeric/ublas/vector_of_vector.hpp> +#endif +#include <boost/numeric/ublas/io.hpp> + +namespace ublas = boost::numeric::ublas; + +#include "common/init.hpp" + +void test_vector(); +void test_matrix_vector(); +void test_matrix(); + +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test31.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test31.cpp new file mode 100644 index 00000000..c9af4497 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test31.cpp @@ -0,0 +1,256 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test3.hpp" + +// Test vector expression templates +template <class V, int N> +struct test_my_vector +{ + typedef typename V::value_type value_type; + typedef typename V::size_type size_type; + typedef typename ublas::type_traits<value_type>::real_type real_type; + + template <class VP> + void test_with(VP& v1, VP& v2, VP& v3) const + { + { + value_type t; + size_type i; + real_type n; + + // Default Construct + default_construct<VP>::test(); + + // Copy and swap + initialize_vector(v1); + initialize_vector(v2); + v1 = v2; + std::cout << "v1 = v2 = " << v1 << std::endl; + v1.assign_temporary(v2); + std::cout << "v1.assign_temporary (v2) = " << v1 << std::endl; + v1.swap(v2); + std::cout << "v1.swap (v2) = " << v1 << " " << v2 << std::endl; + + // Zero assignment + v1 = ublas::zero_vector<>(v1.size()); + std::cout << "v1.zero_vector = " << v1 << std::endl; + v1 = v2; + +#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING + // Project range and slice + initialize_vector(v1); + initialize_vector(v2); + project(v1, ublas::range(0, 1)) = project(v2, ublas::range(0, 1)); + project(v1, ublas::range(0, 1)) = project(v2, ublas::slice(0, 1, 1)); + project(v1, ublas::slice(2, -1, 2)) = project(v2, ublas::slice(0, 1, 2)); + project(v1, ublas::slice(2, -1, 2)) = project(v2, ublas::range(0, 2)); + std::cout << "v1 = range/slice " << v1 << std::endl; +#endif + + // Unary vector operations resulting in a vector + initialize_vector(v1); + v2 = -v1; + std::cout << "- v1 = " << v2 << std::endl; + v2 = ublas::conj(v1); + std::cout << "conj (v1) = " << v2 << std::endl; + + // Binary vector operations resulting in a vector + initialize_vector(v1); + initialize_vector(v2); + initialize_vector(v3); + v3 = v1 + v2; + std::cout << "v1 + v2 = " << v3 << std::endl; + + v3 = v1 - v2; + std::cout << "v1 - v2 = " << v3 << std::endl; + + // Scaling a vector + t = N; + initialize_vector(v1); + v2 = value_type(1.) * v1; + std::cout << "1. * v1 = " << v2 << std::endl; + v2 = t * v1; + std::cout << "N * v1 = " << v2 << std::endl; + initialize_vector(v1); + v2 = v1 * value_type(1.); + std::cout << "v1 * 1. = " << v2 << std::endl; + v2 = v1 * t; + std::cout << "v1 * N = " << v2 << std::endl; + + // Some assignments + initialize_vector(v1); + initialize_vector(v2); + v2 += v1; + std::cout << "v2 += v1 = " << v2 << std::endl; + v2 -= v1; + std::cout << "v2 -= v1 = " << v2 << std::endl; + v2 = v2 + v1; + std::cout << "v2 = v2 + v1 = " << v2 << std::endl; + v2 = v2 - v1; + std::cout << "v2 = v2 - v1 = " << v2 << std::endl; + v1 *= value_type(1.); + std::cout << "v1 *= 1. = " << v1 << std::endl; + v1 *= t; + std::cout << "v1 *= N = " << v1 << std::endl; + + // Unary vector operations resulting in a scalar + initialize_vector(v1); + t = ublas::sum(v1); + std::cout << "sum (v1) = " << t << std::endl; + n = ublas::norm_1(v1); + std::cout << "norm_1 (v1) = " << n << std::endl; + n = ublas::norm_2(v1); + std::cout << "norm_2 (v1) = " << n << std::endl; + n = ublas::norm_inf(v1); + std::cout << "norm_inf (v1) = " << n << std::endl; + + i = ublas::index_norm_inf(v1); + std::cout << "index_norm_inf (v1) = " << i << std::endl; + + // Binary vector operations resulting in a scalar + initialize_vector(v1); + initialize_vector(v2); + t = ublas::inner_prod(v1, v2); + std::cout << "inner_prod (v1, v2) = " << t << std::endl; + } + } + void operator()() const + { + { + V v1(N, N), v2(N, N), v3(N, N); + test_with(v1, v2, v3); + +#ifdef USE_RANGE + ublas::vector_range<V> vr1(v1, ublas::range(0, N)), + vr2(v2, ublas::range(0, N)), + vr3(v3, ublas::range(0, N)); + test_with(vr1, vr2, vr3); +#endif + +#ifdef USE_SLICE + ublas::vector_slice<V> vs1(v1, ublas::slice(0, 1, N)), + vs2(v2, ublas::slice(0, 1, N)), + vs3(v3, ublas::slice(0, 1, N)); + test_with(vs1, vs2, vs3); +#endif + } + } +}; + +// Test vector +void test_vector() +{ + std::cout << "test_vector" << std::endl; + +#ifdef USE_SPARSE_VECTOR +#ifdef USE_MAP_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, map_array" << std::endl; + test_my_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, map_array" << std::endl; + test_my_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, map_array" << std::endl; + test_my_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, map_array" << std::endl; + test_my_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_MAP +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::map" << std::endl; + test_my_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::map" << std::endl; + test_my_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::map" << std::endl; + test_my_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::map" << std::endl; + test_my_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, 3>()(); +#endif +#endif +#endif +#endif + +#ifdef USE_COMPRESSED_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type compressed" << std::endl; + test_my_vector<ublas::compressed_vector<mp_test_type>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double compressed" << std::endl; + test_my_vector<ublas::compressed_vector<double>, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type> compressed" << std::endl; + test_my_vector<ublas::compressed_vector<std::complex<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double> compressed" << std::endl; + test_my_vector<ublas::compressed_vector<std::complex<double> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_COORDINATE_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type coordinate" << std::endl; + test_my_vector<ublas::coordinate_vector<mp_test_type>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double coordinate" << std::endl; + test_my_vector<ublas::coordinate_vector<double>, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type> coordinate" << std::endl; + test_my_vector<ublas::coordinate_vector<std::complex<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double> coordinate" << std::endl; + test_my_vector<ublas::coordinate_vector<std::complex<double> >, 3>()(); +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test32.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test32.cpp new file mode 100644 index 00000000..9d993275 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test32.cpp @@ -0,0 +1,333 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test3.hpp" + +// Test matrix & vector expression templates +template <class V, class M, int N> +struct test_my_matrix_vector +{ + typedef typename V::value_type value_type; + + template <class VP, class MP> + void test_with(VP& v1, VP& v2, MP& m1) const + { + { + // Rows and columns + initialize_matrix(m1); + for (int i = 0; i < N; ++i) + { + v1 = ublas::row(m1, i); + std::cout << "row (m, " << i << ") = " << v1 << std::endl; + v1 = ublas::column(m1, i); + std::cout << "column (m, " << i << ") = " << v1 << std::endl; + } + + // Outer product + initialize_vector(v1); + initialize_vector(v2); + m1 = ublas::outer_prod(v1, v2); + std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; + + // Matrix vector product + initialize_matrix(m1); + initialize_vector(v1); + v2 = ublas::prod(m1, v1); + std::cout << "prod (m1, v1) = " << v2 << std::endl; + v2 = ublas::prod(v1, m1); + std::cout << "prod (v1, m1) = " << v2 << std::endl; + } + } + void operator()() const + { + { + V v1(N, N), v2(N, N); + M m1(N, N, N * N); + + test_with(v1, v2, m1); + + ublas::matrix_row<M> mr1(m1, 0), mr2(m1, N - 1); + test_with(mr1, mr2, m1); + + ublas::matrix_column<M> mc1(m1, 0), mc2(m1, N - 1); + test_with(mc1, mc2, m1); + +#ifdef USE_RANGE + ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)), + mvr2(m1, ublas::range(0, N), ublas::range(0, N)); + test_with(mvr1, mvr2, m1); +#endif + +#ifdef USE_SLICE + ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(mvs1, mvs2, m1); +#endif + } + } +}; + +// Test matrix & vector +void test_matrix_vector() +{ + std::cout << "test_matrix_vector" << std::endl; + +#ifdef USE_SPARSE_MATRIX +#ifdef USE_MAP_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, + ublas::mapped_matrix<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, + ublas::mapped_matrix<double, ublas::row_major, ublas::map_array<std::size_t, double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, + ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, + ublas::mapped_matrix<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_MAP +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, + ublas::mapped_matrix<mp_test_type, ublas::row_major, std::map<std::size_t, mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, + ublas::mapped_matrix<double, ublas::row_major, std::map<std::size_t, double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, + ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, + ublas::mapped_matrix<std::complex<double>, ublas::row_major, std::map<std::size_t, std::complex<double> > >, 3>()(); +#endif +#endif +#endif +#endif + +#ifdef USE_SPARSE_VECTOR_OF_SPARSE_VECTOR +#ifdef USE_MAP_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, mapped_vector map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, + ublas::mapped_vector<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, mapped_vector map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, + ublas::mapped_vector<double, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, double> > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, mapped_vector map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, + ublas::mapped_vector<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>,mapped_vector map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, + ublas::mapped_vector<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<double> > > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_MAP +#ifdef USE_FLOAT + std::cout << "mp_test_type, mapped_vector std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, + ublas::mapped_vector<mp_test_type, ublas::row_major, std::map<std::size_t, std::map<std::size_t, mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, mapped_vector std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, + ublas::mapped_vector<double, ublas::row_major, std::map<std::size_t, std::map<std::size_t, double> > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, mapped_vector std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, + ublas::mapped_vector<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, mapped_vector std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, + ublas::mapped_vector<std::complex<double>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<double> > > >, 3>()(); +#endif +#endif +#endif +#endif + +#ifdef USE_GENERALIZED_VECTOR_OF_VECTOR +#ifdef USE_MAP_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, generalized_vector_of_vector map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, + ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> > > >, 3>()(); + test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, + ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, ublas::map_array<std::size_t, ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> > > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, generalized_vector_of_vector map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, + ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > >, 3>()(); + test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, + ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, ublas::map_array<std::size_t, ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, generalized_vector_of_vector map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, + ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > > > >, 3>()(); + test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, + ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > > > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, generalized_vector_of_vector map_array" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, + ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > > > >, 3>()(); + test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, + ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > > > > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_MAP +#ifdef USE_FLOAT + std::cout << "mp_test_type, generalized_vector_of_vector std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, + ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> > > >, 3>()(); + test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, + ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, std::map<std::size_t, ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> > > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, generalized_vector_of_vector std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, + ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, std::map<std::size_t, double> > > >, 3>()(); + test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, + ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, std::map<std::size_t, ublas::mapped_vector<double, std::map<std::size_t, double> > > > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, generalized_vector_of_vector std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, + ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > > > >, 3>()(); + test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, + ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > > > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, generalized_vector_of_vector std::map" << std::endl; + test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, + ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > > > >, 3>()(); + test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, + ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > > > > >, 3>()(); +#endif +#endif +#endif +#endif + +#ifdef USE_COMPRESSED_MATRIX +#ifdef USE_FLOAT + std::cout << "mp_test_type compressed" << std::endl; + test_my_matrix_vector<ublas::compressed_vector<mp_test_type>, + ublas::compressed_matrix<mp_test_type>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double compressed" << std::endl; + test_my_matrix_vector<ublas::compressed_vector<double>, + ublas::compressed_matrix<double>, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type> compressed" << std::endl; + test_my_matrix_vector<ublas::compressed_vector<std::complex<mp_test_type> >, + ublas::compressed_matrix<std::complex<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double> compressed" << std::endl; + test_my_matrix_vector<ublas::compressed_vector<std::complex<double> >, + ublas::compressed_matrix<std::complex<double> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_COORDINATE_MATRIX +#ifdef USE_FLOAT + std::cout << "mp_test_type coordinate" << std::endl; + test_my_matrix_vector<ublas::coordinate_vector<mp_test_type>, + ublas::coordinate_matrix<mp_test_type>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double coordinate" << std::endl; + test_my_matrix_vector<ublas::coordinate_vector<double>, + ublas::coordinate_matrix<double>, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type> coordinate" << std::endl; + test_my_matrix_vector<ublas::coordinate_vector<std::complex<mp_test_type> >, + ublas::coordinate_matrix<std::complex<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double> coordinate" << std::endl; + test_my_matrix_vector<ublas::coordinate_vector<std::complex<double> >, + ublas::coordinate_matrix<std::complex<double> >, 3>()(); +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test33.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test33.cpp new file mode 100644 index 00000000..e02f511f --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test33.cpp @@ -0,0 +1,355 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test3.hpp" + +// Test matrix expression templates +template <class M, int N> +struct test_my_matrix +{ + typedef typename M::value_type value_type; + + template <class MP> + void test_with(MP& m1, MP& m2, MP& m3) const + { + { + value_type t; + + // Default Construct + default_construct<MP>::test(); + + // Copy and swap + initialize_matrix(m1); + initialize_matrix(m2); + m1 = m2; + std::cout << "m1 = m2 = " << m1 << std::endl; + m1.assign_temporary(m2); + std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; + m1.swap(m2); + std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; + + // Zero assignment + m1 = ublas::zero_matrix<>(m1.size1(), m1.size2()); + std::cout << "m1.zero_matrix = " << m1 << std::endl; + m1 = m2; + +#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING + // Project range and slice + initialize_matrix(m1); + initialize_matrix(m2); + project(m1, ublas::range(0, 1), ublas::range(0, 1)) = project(m2, ublas::range(0, 1), ublas::range(0, 1)); + project(m1, ublas::range(0, 1), ublas::range(0, 1)) = project(m2, ublas::slice(0, 1, 1), ublas::slice(0, 1, 1)); + project(m1, ublas::slice(2, -1, 2), ublas::slice(2, -1, 2)) = project(m2, ublas::slice(0, 1, 2), ublas::slice(0, 1, 2)); + project(m1, ublas::slice(2, -1, 2), ublas::slice(2, -1, 2)) = project(m2, ublas::range(0, 2), ublas::range(0, 2)); + std::cout << "m1 = range/slice " << m1 << std::endl; +#endif + + // Unary matrix operations resulting in a matrix + initialize_matrix(m1); + m2 = -m1; + std::cout << "- m1 = " << m2 << std::endl; + m2 = ublas::conj(m1); + std::cout << "conj (m1) = " << m2 << std::endl; + + // Binary matrix operations resulting in a matrix + initialize_matrix(m1); + initialize_matrix(m2); + initialize_matrix(m3); + m3 = m1 + m2; + std::cout << "m1 + m2 = " << m3 << std::endl; + m3 = m1 - m2; + std::cout << "m1 - m2 = " << m3 << std::endl; + + // Scaling a matrix + t = N; + initialize_matrix(m1); + m2 = value_type(1.) * m1; + std::cout << "1. * m1 = " << m2 << std::endl; + m2 = t * m1; + std::cout << "N * m1 = " << m2 << std::endl; + initialize_matrix(m1); + m2 = m1 * value_type(1.); + std::cout << "m1 * 1. = " << m2 << std::endl; + m2 = m1 * t; + std::cout << "m1 * N = " << m2 << std::endl; + + // Some assignments + initialize_matrix(m1); + initialize_matrix(m2); + m2 += m1; + std::cout << "m2 += m1 = " << m2 << std::endl; + m2 -= m1; + std::cout << "m2 -= m1 = " << m2 << std::endl; + m2 = m2 + m1; + std::cout << "m2 = m2 + m1 = " << m2 << std::endl; + m2 = m2 - m1; + std::cout << "m2 = m2 - m1 = " << m2 << std::endl; + m1 *= value_type(1.); + std::cout << "m1 *= 1. = " << m1 << std::endl; + m1 *= t; + std::cout << "m1 *= N = " << m1 << std::endl; + + // Transpose + initialize_matrix(m1); + m2 = ublas::trans(m1); + std::cout << "trans (m1) = " << m2 << std::endl; + + // Hermitean + initialize_matrix(m1); + m2 = ublas::herm(m1); + std::cout << "herm (m1) = " << m2 << std::endl; + + // Matrix multiplication + initialize_matrix(m1); + initialize_matrix(m2); + m3 = ublas::prod(m1, m2); + std::cout << "prod (m1, m2) = " << m3 << std::endl; + } + } + void operator()() const + { + { + M m1(N, N, N * N), m2(N, N, N * N), m3(N, N, N * N); + test_with(m1, m2, m3); + +#ifdef USE_RANGE + ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)), + mr2(m2, ublas::range(0, N), ublas::range(0, N)), + mr3(m3, ublas::range(0, N), ublas::range(0, N)); + test_with(mr1, mr2, mr3); +#endif + +#ifdef USE_SLICE + ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(ms1, ms2, ms3); +#endif + } + } +}; + +// Test matrix +void test_matrix() +{ + std::cout << "test_matrix" << std::endl; + +#ifdef USE_SPARSE_MATRIX +#ifdef USE_MAP_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, mapped_matrix map_array" << std::endl; + test_my_matrix<ublas::mapped_matrix<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, mapped_matrix map_array" << std::endl; + test_my_matrix<ublas::mapped_matrix<double, ublas::row_major, ublas::map_array<std::size_t, double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, mapped_matrix map_array" << std::endl; + test_my_matrix<ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, mapped_matrix map_array" << std::endl; + test_my_matrix<ublas::mapped_matrix<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_MAP +#ifdef USE_FLOAT + std::cout << "mp_test_type, mapped_matrix std::map" << std::endl; + test_my_matrix<ublas::mapped_matrix<mp_test_type, ublas::row_major, std::map<std::size_t, mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, mapped_matrix std::map" << std::endl; + test_my_matrix<ublas::mapped_matrix<double, ublas::row_major, std::map<std::size_t, double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, mapped_matrix std::map" << std::endl; + test_my_matrix<ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, mapped_matrix std::map" << std::endl; + test_my_matrix<ublas::mapped_matrix<std::complex<double>, ublas::row_major, std::map<std::size_t, std::complex<double> > >, 3>()(); +#endif +#endif +#endif +#endif + +#ifdef USE_SPARSE_VECTOR_OF_SPARSE_VECTOR +#ifdef USE_MAP_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, mapped_vector_of_mapped_vector map_array" << std::endl; + test_my_matrix<ublas::mapped_vector_of_mapped_vector<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, mapped_vector_of_mapped_vector map_array" << std::endl; + test_my_matrix<ublas::mapped_vector_of_mapped_vector<double, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, double> > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, mapped_vector_of_mapped_vector map_array" << std::endl; + test_my_matrix<ublas::mapped_vector_of_mapped_vector<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, mapped_vector_of_mapped_vectormap_array" << std::endl; + test_my_matrix<ublas::mapped_vector_of_mapped_vector<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<double> > > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_MAP +#ifdef USE_FLOAT + std::cout << "mp_test_type, mapped_vector_of_mapped_vector std::map" << std::endl; + test_my_matrix<ublas::mapped_vector_of_mapped_vector<mp_test_type, ublas::row_major, std::map<std::size_t, std::map<std::size_t, mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, mapped_vector_of_mapped_vector std::map" << std::endl; + test_my_matrix<ublas::mapped_vector_of_mapped_vector<double, ublas::row_major, std::map<std::size_t, std::map<std::size_t, double> > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, mapped_vector_of_mapped_vector std::map" << std::endl; + test_my_matrix<ublas::mapped_vector_of_mapped_vector<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, mapped_vector_of_mapped_vector std::map" << std::endl; + test_my_matrix<ublas::mapped_vector_of_mapped_vector<std::complex<double>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<double> > > >, 3>()(); +#endif +#endif +#endif +#endif + +#ifdef USE_GENERALIZED_VECTOR_OF_VECTOR +#ifdef USE_MAP_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type,generalized_vector_of_vector map_array" << std::endl; + test_my_matrix<ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> > > >, 3>()(); + test_my_matrix<ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, ublas::map_array<std::size_t, ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> > > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, generalized_vector_of_vector map_array" << std::endl; + test_my_matrix<ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > >, 3>()(); + test_my_matrix<ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, ublas::map_array<std::size_t, ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, generalized_vector_of_vector map_array" << std::endl; + test_my_matrix<ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > > > >, 3>()(); + test_my_matrix<ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > > > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, generalized_vector_of_vector map_array" << std::endl; + test_my_matrix<ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > > > >, 3>()(); + test_my_matrix<ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > > > > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_MAP +#ifdef USE_FLOAT + std::cout << "mp_test_type, generalized_vector_of_vector std::map" << std::endl; + test_my_matrix<ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> > > >, 3>()(); + test_my_matrix<ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, std::map<std::size_t, ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> > > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, generalized_vector_of_vector std::map" << std::endl; + test_my_matrix<ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, std::map<std::size_t, double> > > >, 3>()(); + test_my_matrix<ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, std::map<std::size_t, ublas::mapped_vector<double, std::map<std::size_t, double> > > > >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, generalized_vector_of_vector std::map" << std::endl; + test_my_matrix<ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > > > >, 3>()(); + test_my_matrix<ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > > > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, generalized_vector_of_vector std::map" << std::endl; + test_my_matrix<ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > > > >, 3>()(); + test_my_matrix<ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > > > > >, 3>()(); +#endif +#endif +#endif +#endif + +#ifdef USE_COMPRESSED_MATRIX +#ifdef USE_FLOAT + std::cout << "mp_test_type compressed_matrix" << std::endl; + test_my_matrix<ublas::compressed_matrix<mp_test_type>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double compressed_matrix" << std::endl; + test_my_matrix<ublas::compressed_matrix<double>, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type> compressed_matrix" << std::endl; + test_my_matrix<ublas::compressed_matrix<std::complex<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double> compressed_matrix" << std::endl; + test_my_matrix<ublas::compressed_matrix<std::complex<double> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_COORDINATE_MATRIX +#ifdef USE_FLOAT + std::cout << "mp_test_type coordinate_matrix" << std::endl; + test_my_matrix<ublas::coordinate_matrix<mp_test_type>, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double coordinate_matrix" << std::endl; + test_my_matrix<ublas::coordinate_matrix<double>, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type> coordinate_matrix" << std::endl; + test_my_matrix<ublas::coordinate_matrix<std::complex<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double> coordinate_matrix" << std::endl; + test_my_matrix<ublas::coordinate_matrix<std::complex<double> >, 3>()(); +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test4.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test4.cpp new file mode 100644 index 00000000..d4870dac --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test4.cpp @@ -0,0 +1,24 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test4.hpp" + +int main() +{ + test_matrix_vector(); + test_matrix(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test4.hpp b/src/boost/libs/multiprecision/test/ublas_interop/test4.hpp new file mode 100644 index 00000000..2cb24485 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test4.hpp @@ -0,0 +1,66 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#ifndef TEST4_H +#define TEST4_H + +#ifdef _MSC_VER +#pragma warning(disable : 4800 4996 4127 4100) +#endif + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#ifdef TEST_ET +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type; +#else +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type; +#endif +//typedef double mp_test_type; + +#define USE_RANGE +#define USE_SLICE +#define USE_FLOAT +#define USE_UNBOUNDED_ARRAY +#define USE_STD_VECTOR +#define USE_BOUNDED_VECTOR USE_MATRIX +#define USE_UNBOUNDED_ARRAY +#define USE_MAP_ARRAY +#define USE_STD_MAP +#define USE_MAPPED_VECTOR +#define USE_COMPRESSED_VECTOR +#define USE_COORDINATE_VECTOR +#define USE_MAPPED_MATRIX +#define USE_COMPRESSED_MATRIX +#define USE_COORDINATE_MATRIX + +#include <iostream> + +#include <boost/numeric/ublas/vector.hpp> +#include <boost/numeric/ublas/matrix.hpp> +#include <boost/numeric/ublas/matrix_proxy.hpp> +#include <boost/numeric/ublas/banded.hpp> +#include <boost/numeric/ublas/io.hpp> + +namespace ublas = boost::numeric::ublas; + +#include "common/init.hpp" + +//#define USE_BANDED +#define USE_DIAGONAL + +void test_matrix_vector(); +void test_matrix(); + +// FIXME slice are failing in assignment to zero elements +#undef USE_SLICE + +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test42.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test42.cpp new file mode 100644 index 00000000..fbc3d81f --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test42.cpp @@ -0,0 +1,371 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test4.hpp" + +// Test matrix & vector expression templates +template <class V, class M, int N> +struct test_my_matrix_vector +{ + typedef typename V::value_type value_type; + + template <class VP, class MP> + void test_with(VP& v1, VP& v2, MP& m1) const + { + { +#ifndef USE_DIAGONAL + // Rows and columns + initialize_matrix(m1); + for (int i = 0; i < N; ++i) + { + v2 = ublas::row(m1, i); + std::cout << "row (m, " << i << ") = " << v2 << std::endl; + v2 = ublas::column(m1, i); + std::cout << "column (m, " << i << ") = " << v2 << std::endl; + } + + // Outer product + initialize_vector(v1); + initialize_vector(v2); + v1(0) = 0; + v1(N - 1) = 0; + m1 = ublas::outer_prod(v1, v2); + std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; + + // Matrix vector product + initialize_matrix(m1); + initialize_vector(v1); + v2 = ublas::prod(m1, v1); + std::cout << "prod (m1, v1) = " << v2 << std::endl; + v2 = ublas::prod(v1, m1); + std::cout << "prod (v1, m1) = " << v2 << std::endl; +#endif + } + } + void operator()() const + { + { + V v1(N), v2(N); +#ifdef USE_BANDED + M m1(N, N, 1, 1); +#endif +#ifdef USE_DIAGONAL + M m1(N, N); +#endif + test_with(v1, v2, m1); + + ublas::matrix_row<M> mr1(m1, 1), mr2(m1, 1); + test_with(mr1, mr2, m1); + + ublas::matrix_column<M> mc1(m1, 1), mc2(m1, 1); + test_with(mc1, mc2, m1); + +#ifdef USE_RANGE + ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)), + mvr2(m1, ublas::range(0, N), ublas::range(0, N)); + test_with(mvr1, mvr2, m1); +#endif + +#ifdef USE_SLICE + ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(mvs1, mvs2, m1); +#endif + } + } + + void operator()(int) const + { +#ifdef USE_ADAPTOR + { +#ifdef USE_BANDED + V v1(N), v2(N); + M m1(N, N, 1, 1); + ublas::banded_adaptor<M> bam1(m1, 1, 1); + test_with(v1, v2, bam1); + + ublas::matrix_row<ublas::banded_adaptor<M> > mr1(bam1, 1), mr2(bam1, 1); + test_with(mr1, mr2, bam1); + + ublas::matrix_column<ublas::banded_adaptor<M> > mc1(bam1, 1), mc2(bam1, 1); + test_with(mc1, mc2, bam1); + +#ifdef USE_RANGE + ublas::matrix_vector_range<ublas::banded_adaptor<M> > mvr1(bam1, ublas::range(0, N), ublas::range(0, N)), + mvr2(bam1, ublas::range(0, N), ublas::range(0, N)); + test_with(mvr1, mvr2, bam1); +#endif + +#ifdef USE_SLICE + ublas::matrix_vector_slice<ublas::banded_adaptor<M> > mvs1(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + mvs2(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(mvs1, mvs2, bam1); +#endif +#endif +#ifdef USE_DIAGONAL + V v1(N), v2(N); + M m1(N, N); + ublas::diagonal_adaptor<M> dam1(m1); + test_with(v1, v2, dam1); + + ublas::matrix_row<ublas::diagonal_adaptor<M> > mr1(dam1, 1), mr2(dam1, 1); + test_with(mr1, mr2, dam1); + + ublas::matrix_column<ublas::diagonal_adaptor<M> > mc1(dam1, 1), mc2(dam1, 1); + test_with(mc1, mc2, dam1); + +#ifdef USE_RANGE + ublas::matrix_vector_range<ublas::diagonal_adaptor<M> > mvr1(dam1, ublas::range(0, N), ublas::range(0, N)), + mvr2(dam1, ublas::range(0, N), ublas::range(0, N)); + test_with(mvr1, mvr2, dam1); +#endif + +#ifdef USE_SLICE + ublas::matrix_vector_slice<ublas::diagonal_adaptor<M> > mvs1(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + mvs2(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(mvs1, mvs2, dam1); +#endif +#endif + } +#endif + } +}; + +// Test matrix & vector +void test_matrix_vector() +{ + std::cout << "test_matrix_vector" << std::endl; + +#ifdef USE_BANDED +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, + ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, + ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, + ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, + ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, + ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, + ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, + ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, + ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, + ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, + ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >, + ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >, + ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, + ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, + ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, + ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, + ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, + ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, + ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<double, std::vector<double> >, + ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, std::vector<double> >, + ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, + ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, + ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, + ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, + ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0); +#endif +#endif +#endif +#endif + +#ifdef USE_DIAGONAL +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, + ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, + ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, + ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, + ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, + ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, + ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, + ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, + ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, + ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, + ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >, + ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >, + ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, + ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, + ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, + ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, + ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, + ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, + ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<double, std::vector<double> >, + ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, std::vector<double> >, + ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, + ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, + ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, + ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, + ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0); +#endif +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test43.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test43.cpp new file mode 100644 index 00000000..49d9fed3 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test43.cpp @@ -0,0 +1,333 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test4.hpp" + +// Test matrix expression templates +template <class M, int N> +struct test_my_matrix +{ + typedef typename M::value_type value_type; + + template <class MP> + void test_with(MP& m1, MP& m2, MP& m3) const + { + { + value_type t; + + // Default Construct + default_construct<MP>::test(); + + // Copy and swap + initialize_matrix(m1); + initialize_matrix(m2); + m1 = m2; + std::cout << "m1 = m2 = " << m1 << std::endl; + m1.assign_temporary(m2); + std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; + m1.swap(m2); + std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; + + // Zero assignment + m1 = ublas::zero_matrix<>(m1.size1(), m1.size2()); + std::cout << "m1.zero_matrix = " << m1 << std::endl; + m1 = m2; + + // Unary matrix operations resulting in a matrix + initialize_matrix(m1); + m2 = -m1; + std::cout << "- m1 = " << m2 << std::endl; + m2 = ublas::conj(m1); + std::cout << "conj (m1) = " << m2 << std::endl; + + // Binary matrix operations resulting in a matrix + initialize_matrix(m1); + initialize_matrix(m2); + m3 = m1 + m2; + std::cout << "m1 + m2 = " << m3 << std::endl; + m3 = m1 - m2; + std::cout << "m1 - m2 = " << m3 << std::endl; + + // Scaling a matrix + t = N; + initialize_matrix(m1); + m2 = value_type(1.) * m1; + std::cout << "1. * m1 = " << m2 << std::endl; + m2 = t * m1; + std::cout << "N * m1 = " << m2 << std::endl; + initialize_matrix(m1); + m2 = m1 * value_type(1.); + std::cout << "m1 * 1. = " << m2 << std::endl; + m2 = m1 * t; + std::cout << "m1 * N = " << m2 << std::endl; + + // Some assignments + initialize_matrix(m1); + initialize_matrix(m2); + m2 += m1; + std::cout << "m2 += m1 = " << m2 << std::endl; + m2 -= m1; + std::cout << "m2 -= m1 = " << m2 << std::endl; + m2 = m2 + m1; + std::cout << "m2 = m2 + m1 = " << m2 << std::endl; + m2 = m2 - m1; + std::cout << "m2 = m2 - m1 = " << m2 << std::endl; + m1 *= value_type(1.); + std::cout << "m1 *= 1. = " << m1 << std::endl; + m1 *= t; + std::cout << "m1 *= N = " << m1 << std::endl; + + // Transpose + initialize_matrix(m1); + m2 = ublas::trans(m1); + std::cout << "trans (m1) = " << m2 << std::endl; + + // Hermitean + initialize_matrix(m1); + m2 = ublas::herm(m1); + std::cout << "herm (m1) = " << m2 << std::endl; + + // Matrix multiplication + initialize_matrix(m1); + initialize_matrix(m2); + // Banded times banded isn't banded + std::cout << "prod (m1, m2) = " << ublas::prod(m1, m2) << std::endl; + } + } + void operator()() const + { + { +#ifdef USE_BANDED + M m1(N, N, 1, 1), m2(N, N, 1, 1), m3(N, N, 1, 1); +#endif +#ifdef USE_DIAGONAL + M m1(N, N), m2(N, N), m3(N, N); +#endif + test_with(m1, m2, m3); + +#ifdef USE_RANGE + ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)), + mr2(m2, ublas::range(0, N), ublas::range(0, N)), + mr3(m3, ublas::range(0, N), ublas::range(0, N)); + test_with(mr1, mr2, mr3); +#endif + +#ifdef USE_SLICE + ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(ms1, ms2, ms3); +#endif + } + +#ifdef USE_ADAPTOR + { +#ifdef USE_BANDED + M m1(N, N, 1, 1), m2(N, N, 1, 1), m3(N, N, 1, 1); + ublas::banded_adaptor<M> bam1(m1, 1, 1), bam2(m2, 1, 1), bam3(m3, 1, 1); + test_with(bam1, bam2, bam3); + +#ifdef USE_RANGE + ublas::matrix_range<ublas::banded_adaptor<M> > mr1(bam1, ublas::range(0, N), ublas::range(0, N)), + mr2(bam2, ublas::range(0, N), ublas::range(0, N)), + mr3(bam3, ublas::range(0, N), ublas::range(0, N)); + test_with(mr1, mr2, mr3); +#endif + +#ifdef USE_SLICE + ublas::matrix_slice<ublas::banded_adaptor<M> > ms1(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms2(bam2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms3(bam3, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(ms1, ms2, ms3); +#endif +#endif +#ifdef USE_DIAGONAL + M m1(N, N), m2(N, N), m3(N, N); + ublas::diagonal_adaptor<M> dam1(m1), dam2(m2), dam3(m3); + test_with(dam1, dam2, dam3); + +#ifdef USE_RANGE + ublas::matrix_range<ublas::diagonal_adaptor<M> > mr1(dam1, ublas::range(0, N), ublas::range(0, N)), + mr2(dam2, ublas::range(0, N), ublas::range(0, N)), + mr3(dam3, ublas::range(0, N), ublas::range(0, N)); + test_with(mr1, mr2, mr3); +#endif + +#ifdef USE_SLICE + ublas::matrix_slice<ublas::diagonal_adaptor<M> > ms1(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms2(dam2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms3(dam3, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(ms1, ms2, ms3); +#endif +#endif + } +#endif + } +}; + +// Test matrix +void test_matrix() +{ + std::cout << "test_matrix" << std::endl; + +#ifdef USE_BANDED +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix<ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix<ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix<ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix<ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix<ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix<ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix<ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix<ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix<ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix<ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix<ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix<ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(); +#endif +#endif +#endif +#endif + +#ifdef USE_DIAGONAL +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix<ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix<ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix<ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix<ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix<ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix<ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix<ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix<ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix<ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix<ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix<ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix<ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(); +#endif +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test5.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test5.cpp new file mode 100644 index 00000000..a0b511f5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test5.cpp @@ -0,0 +1,24 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test5.hpp" + +int main() +{ + test_matrix_vector(); + test_matrix(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test5.hpp b/src/boost/libs/multiprecision/test/ublas_interop/test5.hpp new file mode 100644 index 00000000..2f5e09d2 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test5.hpp @@ -0,0 +1,63 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#ifndef TEST5_H +#define TEST5_H + +#ifdef _MSC_VER +#pragma warning(disable : 4800 4996 4127 4100) +#endif + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#ifdef TEST_ET +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type; +#else +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type; +#endif +//typedef double mp_test_type; + +#define USE_RANGE +#define USE_SLICE +#define USE_FLOAT +#define USE_UNBOUNDED_ARRAY +#define USE_STD_VECTOR +#define USE_BOUNDED_VECTOR USE_MATRIX +#define USE_UNBOUNDED_ARRAY +#define USE_MAP_ARRAY +#define USE_STD_MAP +#define USE_MAPPED_VECTOR +#define USE_COMPRESSED_VECTOR +#define USE_COORDINATE_VECTOR +#define USE_MAPPED_MATRIX +#define USE_COMPRESSED_MATRIX +#define USE_COORDINATE_MATRIX + +#include <iostream> + +#include <boost/numeric/ublas/vector.hpp> +#include <boost/numeric/ublas/matrix.hpp> +#include <boost/numeric/ublas/matrix_proxy.hpp> +#include <boost/numeric/ublas/triangular.hpp> +#include <boost/numeric/ublas/io.hpp> + +namespace ublas = boost::numeric::ublas; + +#include "common/init.hpp" + +void test_matrix_vector(); +void test_matrix(); + +// FIXME slice are failing in assignment to zero elements +#undef USE_SLICE + +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test52.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test52.cpp new file mode 100644 index 00000000..bab54caa --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test52.cpp @@ -0,0 +1,224 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test5.hpp" + +// Test matrix & vector expression templates +template <class V, class M, int N> +struct test_my_matrix_vector +{ + typedef typename V::value_type value_type; + + template <class VP, class MP> + void test_with(VP& v1, VP& v2, MP& m1) const + { + { + // Rows and columns + initialize_matrix(m1); + for (int i = 0; i < N; ++i) + { + v2 = ublas::row(m1, i); + std::cout << "row (m, " << i << ") = " << v2 << std::endl; + v2 = ublas::column(m1, i); + std::cout << "column (m, " << i << ") = " << v2 << std::endl; + } + + // Outer product + initialize_vector(v1); + initialize_vector(v2); + v1(0) = 0; + v2(N - 1) = 0; + m1 = ublas::outer_prod(v1, v2); + std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; + + // Matrix vector product + initialize_matrix(m1); + initialize_vector(v1); + v2 = ublas::prod(m1, v1); + std::cout << "prod (m1, v1) = " << v2 << std::endl; + v2 = ublas::prod(v1, m1); + std::cout << "prod (v1, m1) = " << v2 << std::endl; + } + } + void operator()() const + { + { + V v1(N), v2(N); + M m1(N, N); + test_with(v1, v2, m1); + + ublas::matrix_row<M> mr1(m1, N - 1), mr2(m1, N - 1); + test_with(mr1, mr2, m1); + + ublas::matrix_column<M> mc1(m1, 0), mc2(m1, 0); + test_with(mc1, mc2, m1); + +#ifdef USE_RANGE + ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)), + mvr2(m1, ublas::range(0, N), ublas::range(0, N)); + test_with(mvr1, mvr2, m1); +#endif + +#ifdef USE_SLICE + ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(mvs1, mvs2, m1); +#endif + } + } + + void operator()(int) const + { +#ifdef USE_ADAPTOR + { + V v1(N), v2(N); + M m1(N, N); + ublas::triangular_adaptor<M> tam1(m1); + test_with(v1, v2, tam1); + + ublas::matrix_row<ublas::triangular_adaptor<M> > mr1(tam1, N - 1), mr2(tam1, N - 1); + test_with(mr1, mr2, tam1); + + ublas::matrix_column<ublas::triangular_adaptor<M> > mc1(tam1, 0), mc2(tam1, 0); + test_with(mc1, mc2, tam1); + +#ifdef USE_RANGE + ublas::matrix_vector_range<ublas::triangular_adaptor<M> > mvr1(tam1, ublas::range(0, N), ublas::range(0, N)), + mvr2(tam1, ublas::range(0, N), ublas::range(0, N)); + test_with(mvr1, mvr2, tam1); +#endif + +#ifdef USE_SLICE + ublas::matrix_vector_slice<ublas::triangular_adaptor<M> > mvs1(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + mvs2(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(mvs1, mvs2, tam1); +#endif + } +#endif + } +}; + +// Test matrix & vector +void test_matrix_vector() +{ + std::cout << "test_matrix_vector" << std::endl; + +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, + ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, + ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, + ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, + ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, + ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, + ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, + ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, + ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, + ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, + ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >, + ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >, + ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, + ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, + ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, + ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, + ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, + ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, + ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<double, std::vector<double> >, + ublas::triangular_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, std::vector<double> >, + ublas::triangular_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, + ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, + ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0); + + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, + ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, + ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0); +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test53.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test53.cpp new file mode 100644 index 00000000..84fe3b48 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test53.cpp @@ -0,0 +1,231 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test5.hpp" + +// Test matrix expression templates +template <class M, int N> +struct test_my_matrix +{ + typedef typename M::value_type value_type; + + template <class MP> + void test_with(MP& m1, MP& m2, MP& m3) const + { + { + value_type t; + + // Default Construct + default_construct<MP>::test(); + + // Copy and swap + initialize_matrix(m1); + initialize_matrix(m2); + m1 = m2; + std::cout << "m1 = m2 = " << m1 << std::endl; + m1.assign_temporary(m2); + std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; + m1.swap(m2); + std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; + + // Zero assignment + m1 = ublas::zero_matrix<>(m1.size1(), m1.size2()); + std::cout << "m1.zero_matrix = " << m1 << std::endl; + m1 = m2; + + // Unary matrix operations resulting in a matrix + initialize_matrix(m1); + m2 = -m1; + std::cout << "- m1 = " << m2 << std::endl; + m2 = ublas::conj(m1); + std::cout << "conj (m1) = " << m2 << std::endl; + + // Binary matrix operations resulting in a matrix + initialize_matrix(m1); + initialize_matrix(m2); + m3 = m1 + m2; + std::cout << "m1 + m2 = " << m3 << std::endl; + m3 = m1 - m2; + std::cout << "m1 - m2 = " << m3 << std::endl; + + // Scaling a matrix + t = N; + initialize_matrix(m1); + m2 = value_type(1.) * m1; + std::cout << "1. * m1 = " << m2 << std::endl; + m2 = t * m1; + std::cout << "N * m1 = " << m2 << std::endl; + initialize_matrix(m1); + m2 = m1 * value_type(1.); + std::cout << "m1 * 1. = " << m2 << std::endl; + m2 = m1 * t; + std::cout << "m1 * N = " << m2 << std::endl; + + // Some assignments + initialize_matrix(m1); + initialize_matrix(m2); + m2 += m1; + std::cout << "m2 += m1 = " << m2 << std::endl; + m2 -= m1; + std::cout << "m2 -= m1 = " << m2 << std::endl; + m2 = m2 + m1; + std::cout << "m2 = m2 + m1 = " << m2 << std::endl; + m2 = m2 - m1; + std::cout << "m2 = m2 - m1 = " << m2 << std::endl; + m1 *= value_type(1.); + std::cout << "m1 *= 1. = " << m1 << std::endl; + m1 *= t; + std::cout << "m1 *= N = " << m1 << std::endl; + + // Transpose + initialize_matrix(m1); + // Transpose of a triangular isn't triangular of the same kind + std::cout << "trans (m1) = " << ublas::trans(m1) << std::endl; + + // Hermitian + initialize_matrix(m1); + // Hermitian of a triangular isn't hermitian of the same kind + std::cout << "herm (m1) = " << ublas::herm(m1) << std::endl; + + // Matrix multiplication + initialize_matrix(m1); + initialize_matrix(m2); + m3 = ublas::prod(m1, m2); + std::cout << "prod (m1, m2) = " << m3 << std::endl; + } + } + void operator()() const + { + { + M m1(N, N), m2(N, N), m3(N, N); + test_with(m1, m2, m3); + +#ifdef USE_RANGE + ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)), + mr2(m2, ublas::range(0, N), ublas::range(0, N)), + mr3(m3, ublas::range(0, N), ublas::range(0, N)); + test_with(mr1, mr2, mr3); +#endif + +#ifdef USE_SLICE + ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(ms1, ms2, ms3); +#endif + } + +#ifdef USE_ADAPTOR + { + M m1(N, N), m2(N, N), m3(N, N); + ublas::triangular_adaptor<M> tam1(m1), tam2(m2), tam3(m3); + test_with(tam1, tam2, tam3); + +#ifdef USE_RANGE + ublas::matrix_range<ublas::triangular_adaptor<M> > mr1(tam1, ublas::range(0, N), ublas::range(0, N)), + mr2(tam2, ublas::range(0, N), ublas::range(0, N)), + mr3(tam3, ublas::range(0, N), ublas::range(0, N)); + test_with(mr1, mr2, mr3); +#endif + +#ifdef USE_SLICE + ublas::matrix_slice<ublas::triangular_adaptor<M> > ms1(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms2(tam2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms3(tam3, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(ms1, ms2, ms3); +#endif + } +#endif + } +}; + +// Test matrix +void test_matrix() +{ + std::cout << "test_matrix" << std::endl; + +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix<ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix<ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix<ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix<ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix<ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix<ublas::triangular_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix<ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix<ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix<ublas::triangular_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix<ublas::triangular_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix<ublas::triangular_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix<ublas::triangular_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()(); +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test6.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test6.cpp new file mode 100644 index 00000000..01786fc0 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test6.cpp @@ -0,0 +1,24 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test6.hpp" + +int main() +{ + test_matrix_vector(); + test_matrix(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test6.hpp b/src/boost/libs/multiprecision/test/ublas_interop/test6.hpp new file mode 100644 index 00000000..a636aa72 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test6.hpp @@ -0,0 +1,61 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#ifndef TEST6_H +#define TEST6_H + +#ifdef _MSC_VER +#pragma warning(disable : 4800 4996 4127 4100) +#endif + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#ifdef TEST_ET +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type; +#else +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type; +#endif +//typedef double mp_test_type; + +#define USE_RANGE +#define USE_SLICE +#define USE_FLOAT +#define USE_UNBOUNDED_ARRAY +#define USE_BOUNDED_ARRAY +#define USE_STD_VECTOR +#define USE_BOUNDED_VECTOR USE_MATRIX +#define USE_UNBOUNDED_ARRAY +#define USE_MAP_ARRAY +#define USE_STD_MAP +#define USE_MAPPED_VECTOR +#define USE_COMPRESSED_VECTOR +#define USE_COORDINATE_VECTOR +#define USE_MAPPED_MATRIX +#define USE_COMPRESSED_MATRIX +#define USE_COORDINATE_MATRIX + +#include <iostream> + +#include <boost/numeric/ublas/vector.hpp> +#include <boost/numeric/ublas/matrix.hpp> +#include <boost/numeric/ublas/matrix_proxy.hpp> +#include <boost/numeric/ublas/symmetric.hpp> +#include <boost/numeric/ublas/io.hpp> + +namespace ublas = boost::numeric::ublas; + +#include "common/init.hpp" + +void test_matrix_vector(); +void test_matrix(); + +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test62.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test62.cpp new file mode 100644 index 00000000..3cc71421 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test62.cpp @@ -0,0 +1,228 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test6.hpp" + +// Test matrix & vector expression templates +template <class V, class M, int N> +struct test_my_matrix_vector +{ + typedef typename V::value_type value_type; + + template <class VP, class MP> + void test_with(VP& v1, VP& v2, MP& m1) const + { + { + // Rows and columns + initialize_matrix(m1); + for (int i = 0; i < N; ++i) + { + v2 = ublas::row(m1, i); + std::cout << "row (m, " << i << ") = " << v2 << std::endl; + v2 = ublas::column(m1, i); + std::cout << "column (m, " << i << ") = " << v2 << std::endl; + } + + // Outer product + initialize_vector(v1); + initialize_vector(v2); + v1(0) = 0; + v1(N - 1) = 0; + v2(0) = 0; + v2(N - 1) = 0; + m1 = ublas::outer_prod(v1, v2); + std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; + + // Matrix vector product + initialize_matrix(m1); + initialize_vector(v1); + v2 = ublas::prod(m1, v1); + std::cout << "prod (m1, v1) = " << v2 << std::endl; + v2 = ublas::prod(v1, m1); + std::cout << "prod (v1, m1) = " << v2 << std::endl; + } + } + void operator()() const + { + { + V v1(N), v2(N); + M m1(N, N); + test_with(v1, v2, m1); + + ublas::matrix_row<M> mr1(m1, N - 1), mr2(m1, N - 1); + test_with(mr1, mr2, m1); + + ublas::matrix_column<M> mc1(m1, 0), mc2(m1, 0); + test_with(mc1, mc2, m1); + +#ifdef USE_RANGE + ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)), + mvr2(m1, ublas::range(0, N), ublas::range(0, N)); + test_with(mvr1, mvr2, m1); +#endif + +#ifdef USE_SLICE + ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(mvs1, mvs2, m1); +#endif + } + } + + void operator()(int) const + { +#ifdef USE_ADAPTOR + { + V v1(N), v2(N); + M m1(N, N); + ublas::symmetric_adaptor<M> tam1(m1); + test_with(v1, v2, tam1); + + ublas::matrix_row<ublas::symmetric_adaptor<M> > mr1(tam1, N - 1), mr2(tam1, N - 1); + test_with(mr1, mr2, tam1); + + ublas::matrix_column<ublas::symmetric_adaptor<M> > mc1(tam1, 0), mc2(tam1, 0); + test_with(mc1, mc2, tam1); + +#ifdef USE_RANGE + ublas::matrix_vector_range<ublas::symmetric_adaptor<M> > mvr1(tam1, ublas::range(0, N), ublas::range(0, N)), + mvr2(tam1, ublas::range(0, N), ublas::range(0, N)); + test_with(mvr1, mvr2, tam1); +#endif + +#ifdef USE_SLICE + ublas::matrix_vector_slice<ublas::symmetric_adaptor<M> > mvs1(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + mvs2(tam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(mvs1, mvs2, tam1); +#endif + } +#endif + } +}; + +// Test matrix & vector +void test_matrix_vector() +{ + std::cout << "test_matrix_vector" << std::endl; + +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, + ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >, + ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, + ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, + ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, + ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >, + ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, + ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, + ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, + ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >, + ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >, + ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >, + ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, + ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >, + ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, + ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, + ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, + ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()(); + test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >, + ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<double, std::vector<double> >, + ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()(); + test_my_matrix_vector<ublas::vector<double, std::vector<double> >, + ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()(0); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, + ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >, + ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, + ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()(); + test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, + ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0); +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test63.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test63.cpp new file mode 100644 index 00000000..ffbf6372 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test63.cpp @@ -0,0 +1,231 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test6.hpp" + +// Test matrix expression templates +template <class M, int N> +struct test_my_matrix +{ + typedef typename M::value_type value_type; + + template <class MP> + void test_with(MP& m1, MP& m2, MP& m3) const + { + { + value_type t; + + // Default Construct + default_construct<MP>::test(); + + // Copy and swap + initialize_matrix(m1); + initialize_matrix(m2); + m1 = m2; + std::cout << "m1 = m2 = " << m1 << std::endl; + m1.assign_temporary(m2); + std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; + m1.swap(m2); + std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; + + // Zero assignment + m1 = ublas::zero_matrix<>(m1.size1(), m1.size2()); + std::cout << "m1.zero_matrix = " << m1 << std::endl; + m1 = m2; + + // Unary matrix operations resulting in a matrix + initialize_matrix(m1); + m2 = -m1; + std::cout << "- m1 = " << m2 << std::endl; + m2 = ublas::conj(m1); + std::cout << "conj (m1) = " << m2 << std::endl; + + // Binary matrix operations resulting in a matrix + initialize_matrix(m1); + initialize_matrix(m2); + m3 = m1 + m2; + std::cout << "m1 + m2 = " << m3 << std::endl; + m3 = m1 - m2; + std::cout << "m1 - m2 = " << m3 << std::endl; + + // Scaling a matrix + t = N; + initialize_matrix(m1); + m2 = value_type(1.) * m1; + std::cout << "1. * m1 = " << m2 << std::endl; + m2 = t * m1; + std::cout << "N * m1 = " << m2 << std::endl; + initialize_matrix(m1); + m2 = m1 * value_type(1.); + std::cout << "m1 * 1. = " << m2 << std::endl; + m2 = m1 * t; + std::cout << "m1 * N = " << m2 << std::endl; + + // Some assignments + initialize_matrix(m1); + initialize_matrix(m2); + m2 += m1; + std::cout << "m2 += m1 = " << m2 << std::endl; + m2 -= m1; + std::cout << "m2 -= m1 = " << m2 << std::endl; + m2 = m2 + m1; + std::cout << "m2 = m2 + m1 = " << m2 << std::endl; + m2 = m2 - m1; + std::cout << "m2 = m1 - m1 = " << m2 << std::endl; + m1 *= value_type(1.); + std::cout << "m1 *= 1. = " << m1 << std::endl; + m1 *= t; + std::cout << "m1 *= N = " << m1 << std::endl; + + // Transpose + initialize_matrix(m1); + m2 = ublas::trans(m1); + std::cout << "trans (m1) = " << m2 << std::endl; + + // Hermitean + initialize_matrix(m1); + m2 = ublas::herm(m1); + std::cout << "herm (m1) = " << m2 << std::endl; + + // Matrix multiplication + initialize_matrix(m1); + initialize_matrix(m2); + m3 = ublas::prod(m1, m2); + std::cout << "prod (m1, m2) = " << m3 << std::endl; + } + } + void operator()() const + { + { + M m1(N, N), m2(N, N), m3(N, N); + test_with(m1, m2, m3); + +#ifdef USE_RANGE + ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)), + mr2(m2, ublas::range(0, N), ublas::range(0, N)), + mr3(m3, ublas::range(0, N), ublas::range(0, N)); + test_with(mr1, mr2, mr3); +#endif + +#ifdef USE_SLICE + ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(ms1, ms2, ms3); +#endif + } + +#ifdef USE_ADAPTOR + { + M m1(N, N), m2(N, N), m3(N, N); + ublas::symmetric_adaptor<M> sam1(m1), sam2(m2), sam3(m3); + test_with(sam1, sam2, sam3); + +#ifdef USE_RANGE + ublas::matrix_range<ublas::symmetric_adaptor<M> > mr1(sam1, ublas::range(0, N), ublas::range(0, N)), + mr2(sam2, ublas::range(0, N), ublas::range(0, N)), + mr3(sam3, ublas::range(0, N), ublas::range(0, N)); + test_with(mr1, mr2, mr3); +#endif + +#ifdef USE_SLICE + ublas::matrix_slice<ublas::symmetric_adaptor<M> > ms1(sam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms2(sam2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms3(sam3, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(ms1, ms2, ms3); +#endif + } +#endif + } +}; + +// Test matrix +void test_matrix() +{ + std::cout << "test_matrix" << std::endl; + +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, bounded_array" << std::endl; + test_my_matrix<ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, bounded_array" << std::endl; + test_my_matrix<ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl; + test_my_matrix<ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, bounded_array" << std::endl; + test_my_matrix<ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "mp_test_type, unbounded_array" << std::endl; + test_my_matrix<ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, unbounded_array" << std::endl; + test_my_matrix<ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, ublas::unbounded_array<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix<ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, unbounded_array" << std::endl; + test_my_matrix<ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "mp_test_type, std::vector" << std::endl; + test_my_matrix<ublas::symmetric_matrix<mp_test_type, ublas::lower, ublas::row_major, std::vector<mp_test_type> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "double, std::vector" << std::endl; + test_my_matrix<ublas::symmetric_matrix<double, ublas::lower, ublas::row_major, std::vector<double> >, 3>()(); +#endif + +#ifdef USE_STD_COMPLEX +#ifdef USE_FLOAT + std::cout << "std::complex<mp_test_type>, std::vector" << std::endl; + test_my_matrix<ublas::symmetric_matrix<std::complex<mp_test_type>, ublas::lower, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "std::complex<double>, std::vector" << std::endl; + test_my_matrix<ublas::symmetric_matrix<std::complex<double>, ublas::lower, ublas::row_major, std::vector<std::complex<double> > >, 3>()(); +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test7.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test7.cpp new file mode 100644 index 00000000..c15790d8 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test7.cpp @@ -0,0 +1,36 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include <iostream> + +#include <boost/numeric/interval.hpp> +#include <boost/numeric/interval/io.hpp> + +#include <boost/numeric/ublas/vector.hpp> +#include <boost/numeric/ublas/matrix.hpp> +#include <boost/numeric/ublas/io.hpp> + +#include "test7.hpp" + +// this testcase requires fix of task #2473 + +int main() +{ + test_vector(); + test_matrix_vector(); + test_matrix(); + return 0; +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test7.hpp b/src/boost/libs/multiprecision/test/ublas_interop/test7.hpp new file mode 100644 index 00000000..491956c5 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test7.hpp @@ -0,0 +1,65 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#ifndef TEST7_H +#define TEST7_H + +#ifdef _MSC_VER +#pragma warning(disable : 4800 4996) +#endif + +#include <boost/multiprecision/cpp_dec_float.hpp> + +#ifdef TEST_ET +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_on> mp_test_type; +#else +typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off> mp_test_type; +#endif +//typedef double mp_test_type; + +#define USE_RANGE +#define USE_SLICE +#define USE_FLOAT +#define USE_UNBOUNDED_ARRAY +#define USE_BOUNDED_ARRAY +#define USE_STD_VECTOR +#define USE_BOUNDED_VECTOR USE_MATRIX +#define USE_UNBOUNDED_ARRAY +#define USE_MAP_ARRAY +#define USE_STD_MAP +#define USE_MAPPED_VECTOR +#define USE_COMPRESSED_VECTOR +#define USE_COORDINATE_VECTOR +#define USE_MAPPED_MATRIX +#define USE_COMPRESSED_MATRIX +#define USE_COORDINATE_MATRIX + +#include <iostream> + +#include <boost/numeric/interval.hpp> +#include <boost/numeric/interval/io.hpp> + +#include <boost/numeric/ublas/vector.hpp> +#include <boost/numeric/ublas/vector_proxy.hpp> +#include <boost/numeric/ublas/matrix.hpp> +#include <boost/numeric/ublas/matrix_proxy.hpp> +#include <boost/numeric/ublas/io.hpp> + +namespace ublas = boost::numeric::ublas; + +#include "common/init.hpp" + +void test_vector(); +void test_matrix_vector(); +void test_matrix(); + +#endif diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test71.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test71.cpp new file mode 100644 index 00000000..483258d3 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test71.cpp @@ -0,0 +1,182 @@ +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +// +// This file fails to compile - appears to be a known uBlas issue :-( +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test7.hpp" + +// Test vector expression templates +template <class V, int N> +struct test_my_vector +{ + typedef typename V::value_type value_type; + typedef typename V::size_type size_type; + typedef typename ublas::type_traits<value_type>::real_type real_type; + + template <class VP> + void test_with(VP& v1, VP& v2, VP& v3) const + { + { + value_type t; + size_type i; + real_type n; + + // Copy and swap + initialize_vector(v1); + initialize_vector(v2); + v1 = v2; + std::cout << "v1 = v2 = " << v1 << std::endl; + v1.assign_temporary(v2); + std::cout << "v1.assign_temporary (v2) = " << v1 << std::endl; + v1.swap(v2); + std::cout << "v1.swap (v2) = " << v1 << " " << v2 << std::endl; + + // Zero assignment + v1 = ublas::zero_vector<value_type>(v1.size()); + std::cout << "v1.zero_vector = " << v1 << std::endl; + v1 = v2; + + // Unary vector operations resulting in a vector + initialize_vector(v1); + v2 = -v1; + std::cout << "- v1 = " << v2 << std::endl; + v2 = ublas::conj(v1); + std::cout << "conj (v1) = " << v2 << std::endl; + + // Binary vector operations resulting in a vector + initialize_vector(v1); + initialize_vector(v2); + v3 = v1 + v2; + std::cout << "v1 + v2 = " << v3 << std::endl; + + v3 = v1 - v2; + std::cout << "v1 - v2 = " << v3 << std::endl; + + // Scaling a vector + t = value_type(N); + initialize_vector(v1); + v2 = value_type(1.) * v1; + std::cout << "1. * v1 = " << v2 << std::endl; + // v2 = t * v1; + std::cout << "N * v1 = " << v2 << std::endl; + initialize_vector(v1); + // v2 = v1 * value_type (1.); + std::cout << "v1 * 1. = " << v2 << std::endl; + // v2 = v1 * t; + std::cout << "v1 * N = " << v2 << std::endl; + + // Some assignments + initialize_vector(v1); + initialize_vector(v2); + v2 += v1; + std::cout << "v2 += v1 = " << v2 << std::endl; + v2 -= v1; + std::cout << "v2 -= v1 = " << v2 << std::endl; + v2 = v2 + v1; + std::cout << "v2 = v2 + v1 = " << v2 << std::endl; + v2 = v2 - v1; + std::cout << "v2 = v2 - v1 = " << v2 << std::endl; + v1 *= value_type(1.); + std::cout << "v1 *= 1. = " << v1 << std::endl; + v1 *= t; + std::cout << "v1 *= N = " << v1 << std::endl; + + // Unary vector operations resulting in a scalar + initialize_vector(v1); + t = ublas::sum(v1); + std::cout << "sum (v1) = " << t << std::endl; + n = ublas::norm_1(v1); + std::cout << "norm_1 (v1) = " << n << std::endl; + n = ublas::norm_2(v1); + std::cout << "norm_2 (v1) = " << n << std::endl; + n = ublas::norm_inf(v1); + std::cout << "norm_inf (v1) = " << n << std::endl; + + i = ublas::index_norm_inf(v1); + std::cout << "index_norm_inf (v1) = " << i << std::endl; + + // Binary vector operations resulting in a scalar + initialize_vector(v1); + initialize_vector(v2); + t = ublas::inner_prod(v1, v2); + std::cout << "inner_prod (v1, v2) = " << t << std::endl; + } + } + void operator()() const + { + { + V v1(N), v2(N), v3(N); + test_with(v1, v2, v3); + +#ifdef USE_RANGE + ublas::vector_range<V> vr1(v1, ublas::range(0, N)), + vr2(v2, ublas::range(0, N)), + vr3(v3, ublas::range(0, N)); + test_with(vr1, vr2, vr3); +#endif + +#ifdef USE_SLICE + ublas::vector_slice<V> vs1(v1, ublas::slice(0, 1, N)), + vs2(v2, ublas::slice(0, 1, N)), + vs3(v3, ublas::slice(0, 1, N)); + test_with(vs1, vs2, vs3); +#endif + } + } +}; + +// Test vector +void test_vector() +{ + std::cout << "test_vector" << std::endl; + +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, bounded_array" << std::endl; + test_my_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, bounded_array" << std::endl; + test_my_vector<ublas::vector<boost::numeric::interval<double>, ublas::bounded_array<boost::numeric::interval<double>, 3> >, 3>()(); +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, unbounded_array" << std::endl; + test_my_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::unbounded_array<boost::numeric::interval<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, unbounded_array" << std::endl; + test_my_vector<ublas::vector<boost::numeric::interval<double>, ublas::unbounded_array<boost::numeric::interval<double> > >, 3>()(); +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, std::vector" << std::endl; + test_my_vector<ublas::vector<boost::numeric::interval<mp_test_type>, std::vector<boost::numeric::interval<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, std::vector" << std::endl; + test_my_vector<ublas::vector<boost::numeric::interval<double>, std::vector<boost::numeric::interval<double> > >, 3>()(); +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test72.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test72.cpp new file mode 100644 index 00000000..61f97107 --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test72.cpp @@ -0,0 +1,174 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test7.hpp" + +// Test matrix & vector expression templates +template <class V, class M, int N> +struct test_my_matrix_vector +{ + typedef typename V::value_type value_type; + + template <class VP, class MP> + void test_with(VP& v1, VP& v2, MP& m1) const + { + { + // Rows and columns + initialize_matrix(m1); + for (int i = 0; i < N; ++i) + { + v1 = ublas::row(m1, i); + std::cout << "row (m, " << i << ") = " << v1 << std::endl; + v1 = ublas::column(m1, i); + std::cout << "column (m, " << i << ") = " << v1 << std::endl; + } + + // Outer product + initialize_vector(v1); + initialize_vector(v2); + m1 = ublas::outer_prod(v1, v2); + std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; + + // Matrix vector product + initialize_matrix(m1); + initialize_vector(v1); + v2 = ublas::prod(m1, v1); + std::cout << "prod (m1, v1) = " << v2 << std::endl; + v2 = ublas::prod(v1, m1); + std::cout << "prod (v1, m1) = " << v2 << std::endl; + } + } + void operator()() const + { + { + V v1(N), v2(N); + M m1(N, N); + test_with(v1, v2, m1); + + ublas::matrix_row<M> mr1(m1, 0), mr2(m1, 1); + test_with(mr1, mr2, m1); + + ublas::matrix_column<M> mc1(m1, 0), mc2(m1, 1); + test_with(mc1, mc2, m1); + +#ifdef USE_RANGE + ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)), + mvr2(m1, ublas::range(0, N), ublas::range(0, N)); + test_with(mvr1, mvr2, m1); +#endif + +#ifdef USE_SLICE + ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(mvs1, mvs2, m1); +#endif + } + } +}; + +// Test matrix & vector +void test_matrix_vector() +{ + std::cout << "test_matrix_vector" << std::endl; + +#ifdef USE_MATRIX +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3> >, + ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, ublas::bounded_array<boost::numeric::interval<double>, 3> >, + ublas::matrix<boost::numeric::interval<double>, ublas::row_major, ublas::bounded_array<boost::numeric::interval<double>, 3 * 3> >, 3>()(); +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::unbounded_array<boost::numeric::interval<mp_test_type> > >, + ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::unbounded_array<boost::numeric::interval<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, ublas::unbounded_array<boost::numeric::interval<double> > >, + ublas::matrix<boost::numeric::interval<double>, ublas::row_major, ublas::unbounded_array<boost::numeric::interval<double> > >, 3>()(); +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, std::vector<boost::numeric::interval<mp_test_type> > >, + ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, std::vector<boost::numeric::interval<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, std::vector<boost::numeric::interval<double> > >, + ublas::matrix<boost::numeric::interval<double>, ublas::row_major, std::vector<boost::numeric::interval<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_VECTOR_OF_VECTOR +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3> >, + ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3>, 3 + 1> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, bounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, ublas::bounded_array<boost::numeric::interval<double>, 3> >, + ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<boost::numeric::interval<double>, 3>, 3 + 1> >, 3>()(); +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, ublas::unbounded_array<boost::numeric::interval<mp_test_type> > >, + ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<boost::numeric::interval<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, unbounded_array" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, ublas::unbounded_array<boost::numeric::interval<double> > >, + ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<boost::numeric::interval<double> > > >, 3>()(); +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<mp_test_type>, std::vector<boost::numeric::interval<mp_test_type> > >, + ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, std::vector<std::vector<boost::numeric::interval<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, std::vector" << std::endl; + test_my_matrix_vector<ublas::vector<boost::numeric::interval<double>, std::vector<boost::numeric::interval<double> > >, + ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, std::vector<std::vector<boost::numeric::interval<double> > > >, 3>()(); +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/test/ublas_interop/test73.cpp b/src/boost/libs/multiprecision/test/ublas_interop/test73.cpp new file mode 100644 index 00000000..62856bac --- /dev/null +++ b/src/boost/libs/multiprecision/test/ublas_interop/test73.cpp @@ -0,0 +1,210 @@ +// +// Copyright (c) 2000-2002 +// Joerg Walter, Mathias Koch +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The authors gratefully acknowledge the support of +// GeNeSys mbH & Co. KG in producing this work. +// + +#if defined(__GNUC__) && (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#endif + +#include "test7.hpp" + +// Test matrix expression templates +template <class M, int N> +struct test_my_matrix +{ + typedef typename M::value_type value_type; + + template <class MP> + void test_with(MP& m1, MP& m2, MP& m3) const + { + { + value_type t; + + // Copy and swap + initialize_matrix(m1); + initialize_matrix(m2); + m1 = m2; + std::cout << "m1 = m2 = " << m1 << std::endl; + m1.assign_temporary(m2); + std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; + m1.swap(m2); + std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; + + // Zero assignment + m1 = ublas::zero_matrix<value_type>(m1.size1(), m1.size2()); + std::cout << "m1.zero_matrix = " << m1 << std::endl; + m1 = m2; + + // Unary matrix operations resulting in a matrix + initialize_matrix(m1); + m2 = -m1; + std::cout << "- m1 = " << m2 << std::endl; + m2 = ublas::conj(m1); + std::cout << "conj (m1) = " << m2 << std::endl; + + // Binary matrix operations resulting in a matrix + initialize_matrix(m1); + initialize_matrix(m2); + m3 = m1 + m2; + std::cout << "m1 + m2 = " << m3 << std::endl; + m3 = m1 - m2; + std::cout << "m1 - m2 = " << m3 << std::endl; + + // Scaling a matrix + t = N; + initialize_matrix(m1); + m2 = value_type(1.) * m1; + std::cout << "1. * m1 = " << m2 << std::endl; + m2 = t * m1; + std::cout << "N * m1 = " << m2 << std::endl; + initialize_matrix(m1); + m2 = m1 * value_type(1.); + std::cout << "m1 * 1. = " << m2 << std::endl; + m2 = m1 * t; + std::cout << "m1 * N = " << m2 << std::endl; + + // Some assignments + initialize_matrix(m1); + initialize_matrix(m2); + m2 += m1; + std::cout << "m2 += m1 = " << m2 << std::endl; + m2 -= m1; + std::cout << "m2 -= m1 = " << m2 << std::endl; + m2 = m2 + m1; + std::cout << "m2 = m2 + m1 = " << m2 << std::endl; + m2 = m2 - m1; + std::cout << "m2 = m1 - m1 = " << m2 << std::endl; + m1 *= value_type(1.); + std::cout << "m1 *= 1. = " << m1 << std::endl; + m1 *= t; + std::cout << "m1 *= N = " << m1 << std::endl; + + // Transpose + initialize_matrix(m1); + m2 = ublas::trans(m1); + std::cout << "trans (m1) = " << m2 << std::endl; + + // Hermitean + initialize_matrix(m1); + m2 = ublas::herm(m1); + std::cout << "herm (m1) = " << m2 << std::endl; + + // Matrix multiplication + initialize_matrix(m1); + initialize_matrix(m2); + m3 = ublas::prod(m1, m2); + std::cout << "prod (m1, m2) = " << m3 << std::endl; + } + } + void operator()() const + { + { + M m1(N, N), m2(N, N), m3(N, N); + test_with(m1, m2, m3); + +#ifdef USE_RANGE + ublas::matrix_range<M> mr1(m1, ublas::range(0, N), ublas::range(0, N)), + mr2(m2, ublas::range(0, N), ublas::range(0, N)), + mr3(m3, ublas::range(0, N), ublas::range(0, N)); + test_with(mr1, mr2, mr3); +#endif + +#ifdef USE_SLICE + ublas::matrix_slice<M> ms1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms2(m2, ublas::slice(0, 1, N), ublas::slice(0, 1, N)), + ms3(m3, ublas::slice(0, 1, N), ublas::slice(0, 1, N)); + test_with(ms1, ms2, ms3); +#endif + } + } +}; + +// Test matrix +void test_matrix() +{ + std::cout << "test_matrix" << std::endl; + +#ifdef USE_MATRIX +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, bounded_array" << std::endl; + test_my_matrix<ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3 * 3> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, bounded_array" << std::endl; + test_my_matrix<ublas::matrix<boost::numeric::interval<double>, ublas::row_major, ublas::bounded_array<boost::numeric::interval<double>, 3 * 3> >, 3>()(); +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix<ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::unbounded_array<boost::numeric::interval<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, unbounded_array" << std::endl; + test_my_matrix<ublas::matrix<boost::numeric::interval<double>, ublas::row_major, ublas::unbounded_array<boost::numeric::interval<double> > >, 3>()(); +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, std::vector" << std::endl; + test_my_matrix<ublas::matrix<boost::numeric::interval<mp_test_type>, ublas::row_major, std::vector<boost::numeric::interval<mp_test_type> > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, std::vector" << std::endl; + test_my_matrix<ublas::matrix<boost::numeric::interval<double>, ublas::row_major, std::vector<boost::numeric::interval<double> > >, 3>()(); +#endif +#endif +#endif + +#ifdef USE_VECTOR_OF_VECTOR +#ifdef USE_BOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, bounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<boost::numeric::interval<mp_test_type>, 3>, 3 + 1> >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, bounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, ublas::bounded_array<ublas::bounded_array<boost::numeric::interval<double>, 3>, 3 + 1> >, 3>()(); +#endif +#endif + +#ifdef USE_UNBOUNDED_ARRAY +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, unbounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<boost::numeric::interval<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, unbounded_array" << std::endl; + test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, ublas::unbounded_array<ublas::unbounded_array<boost::numeric::interval<double> > > >, 3>()(); +#endif +#endif + +#ifdef USE_STD_VECTOR +#ifdef USE_FLOAT + std::cout << "boost::numeric::interval<mp_test_type>, std::vector" << std::endl; + test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<mp_test_type>, ublas::row_major, std::vector<std::vector<boost::numeric::interval<mp_test_type> > > >, 3>()(); +#endif + +#ifdef USE_DOUBLE + std::cout << "boost::numeric::interval<double>, std::vector" << std::endl; + test_my_matrix<ublas::vector_of_vector<boost::numeric::interval<double>, ublas::row_major, std::vector<std::vector<boost::numeric::interval<double> > > >, 3>()(); +#endif +#endif +#endif +} diff --git a/src/boost/libs/multiprecision/tools/sincos.cpp b/src/boost/libs/multiprecision/tools/sincos.cpp new file mode 100644 index 00000000..88dde742 --- /dev/null +++ b/src/boost/libs/multiprecision/tools/sincos.cpp @@ -0,0 +1,75 @@ +// Copyright John Maddock 2013. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +//[special_data_example + +#include <boost/multiprecision/mpfr.hpp> +#include <boost/math/tools/test_data.hpp> +#include <boost/test/included/prg_exec_monitor.hpp> +#include <boost/math/tools/tuple.hpp> +#include <fstream> + +using namespace boost::math::tools; +using namespace boost::math; +using namespace std; +using namespace boost::multiprecision; + +typedef number<mpfr_float_backend<1000> > mp_type; + + +boost::math::tuple<mp_type, mp_type, mp_type> generate(mp_type a) +{ + mp_type ts, tc; + ts = sin(a); + tc = cos(a); + return boost::math::make_tuple(a, ts, tc); +} + +int cpp_main(int argc, char*argv []) +{ + parameter_info<mp_type> arg1, arg2; + test_data<mp_type> data; + + bool cont; + std::string line; + + if(argc < 1) + return 1; + + do{ + // + // User interface which prompts for + // range of input parameters: + // + if(0 == get_user_parameter_info(arg1, "a")) + return 1; + arg1.type |= dummy_param; + + data.insert(&generate, arg1); + + std::cout << "Any more data [y/n]?"; + std::getline(std::cin, line); + boost::algorithm::trim(line); + cont = (line == "y"); + }while(cont); + // + // Just need to write the results to a file: + // + std::cout << "Enter name of test data file [default=sincos.ipp]"; + std::getline(std::cin, line); + boost::algorithm::trim(line); + if(line == "") + line = "sincos.ipp"; + std::ofstream ofs(line.c_str()); + line.erase(line.find('.')); + ofs << std::scientific << std::setprecision(500); + write_code(ofs, data, line.c_str()); + + return 0; +} + +//] + |