diff --git a/doc/html/index.html b/doc/html/index.html index 213ebbef0..ab4cb0b7d 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -120,7 +120,7 @@ This manual is also available in -

Last revised: October 03, 2017 at 12:08:08 GMT

+

Last revised: October 10, 2017 at 14:01:12 GMT


diff --git a/doc/html/indexes/s01.html b/doc/html/indexes/s01.html index 21c7d2b8a..bb0d7a41a 100644 --- a/doc/html/indexes/s01.html +++ b/doc/html/indexes/s01.html @@ -24,7 +24,7 @@

-Function Index

+Function Index

2 4 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

diff --git a/doc/html/indexes/s02.html b/doc/html/indexes/s02.html index 223aba7a5..d3fa7c973 100644 --- a/doc/html/indexes/s02.html +++ b/doc/html/indexes/s02.html @@ -24,7 +24,7 @@

-Class Index

+Class Index

A B C D E F G H I L M N O P Q R S T U W

diff --git a/doc/html/indexes/s03.html b/doc/html/indexes/s03.html index d0b4075cd..90073b6f9 100644 --- a/doc/html/indexes/s03.html +++ b/doc/html/indexes/s03.html @@ -24,7 +24,7 @@

-Typedef Index

+Typedef Index

A B C D E F G H I L N O P R S T U V W

diff --git a/doc/html/indexes/s04.html b/doc/html/indexes/s04.html index e9ab43d03..1b76863d8 100644 --- a/doc/html/indexes/s04.html +++ b/doc/html/indexes/s04.html @@ -24,7 +24,7 @@

-Macro Index

+Macro Index

B F

diff --git a/doc/html/indexes/s05.html b/doc/html/indexes/s05.html index 1518a165d..b84430d40 100644 --- a/doc/html/indexes/s05.html +++ b/doc/html/indexes/s05.html @@ -23,7 +23,7 @@

-Index

+Index

2 4 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

diff --git a/doc/html/math_toolkit/conventions.html b/doc/html/math_toolkit/conventions.html index 67528cb82..b63b41239 100644 --- a/doc/html/math_toolkit/conventions.html +++ b/doc/html/math_toolkit/conventions.html @@ -27,7 +27,7 @@ Document Conventions

- +

This documentation aims to use of the following naming and formatting conventions. diff --git a/doc/html/math_toolkit/navigation.html b/doc/html/math_toolkit/navigation.html index 7821e5f82..fa6234915 100644 --- a/doc/html/math_toolkit/navigation.html +++ b/doc/html/math_toolkit/navigation.html @@ -27,7 +27,7 @@ Navigation

- +

Boost.Math documentation is provided in both HTML and PDF formats. diff --git a/doc/sf/lambert_w.qbk b/doc/sf/lambert_w.qbk index e208840c9..bf4824bf1 100644 --- a/doc/sf/lambert_w.qbk +++ b/doc/sf/lambert_w.qbk @@ -377,6 +377,36 @@ only provides the precision of the built-in type, like `double`, only 17 decimal Fukushima used 20 series terms and it was confirmed that using more terms does not usefully increase accuracy. +[h4:testing Testing] + +Initial testing of the algorithm was done using a small number of spot tests. + +After it was established that the underlying algorithm (including unlimited Halley refinements with a tight terminating criterion) was correct, +some tables of Lambert W values were computed using a 100 decimal digit precision __multiprecision `cpp_dec_float_100` type and saved as +a C++ program that will initialise arrays of values of z arguments and lambert_W0 (`lambert_w_mp_high_values.ipp` and `lambert_w_mp_low_values.ipp` ). + +(A few of these pairs were checked against values computed by Wolfram Alpha to try to guard against mistakes; +all those tested agreed to the penultimate decimal place, so they can be considered reliable to at least 98 decimal digits precision). + +A macro `BOOST_MATH_TEST_VALUE` was used to allow tests with any real type, both __fundamental_types and __multiprecision. +(This is necessary because __fundamental_types have a constructor from floating-point literals like 3.1459F, 3.1459 or 3.1459L +whereas __multiprecision types may lose precision unless constructed from decimal digits strings like "3.1459"). + +The 100-decimal digits precision pairs were then used to assess the precision of less-precise types, including +__multiprecision `cpp_bin_float_quad` and `cpp_bin_float_50`. `static_cast`ing from the high precision types should +give the closest representable value of the less-precise type; this is then be used to assess the precision of +the Lambert W algorithm. For __fundamental_types, the precision requirement set by the __Policy mean that the algorithm +may stop refinement after bisection, or Schroeder or Halley refinements. + +With the default __Policy, that includes iterative Halley refinement, tests confirm that over nearly all the range of z arguments, +nearly all estimates are the nearest __representable value, a minority are within 1 __ulp and only a very few 2 ULP. + +For the range of z arguments over the range -0.35 to 0.5, a different algorithm is used, but the same +technique of evaluating reference values using a __multiprecision `cpp_dec_float_100` was used. +For extremely small z arguments, near zero, and those extremely near the singularity at the branch point, +precision can be much lower, as might be expected. + + [h5 Other implementations] The Lambert W has also been discussed in a [@http://lists.boost.org/Archives/boost/2016/09/230819.php Boost thread]. diff --git a/example/lambert_w_precision_example.cpp b/example/lambert_w_precision_example.cpp new file mode 100644 index 000000000..58a0ddf37 --- /dev/null +++ b/example/lambert_w_precision_example.cpp @@ -0,0 +1,1009 @@ +// Copyright Paul A. Bristow 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). + +//! Lambert W examples of controlling precision using Boost.Math policies +//! (and thus also trading less precision for shorter run time). + +// #define BOOST_MATH_INSTRUMENT_LAMBERT_W // #define only for (much) diagnostic output. + +#include // for BOOST_PLATFORM, BOOST_COMPILER, BOOST_STDLIB ... +#include // for BOOST_MSVC versions. +#include +#include // boost::exception +#include // For exp_minus_one == 3.67879441171442321595523770161460867e-01. +#include + +// Built-in/fundamental GCC float128 or Intel Quad 128-bit type, if available. +#ifdef __GNUC__ +#include // Not available for MSVC. +// sets BOOST_MP_USE_FLOAT128 for GCC +using boost::multiprecision::float128; +#endif //# NOT _MSC_VER + +#include // boost::multiprecision::cpp_dec_float_50 +using boost::multiprecision::cpp_dec_float_50; // 50 decimal digits type. +using boost::multiprecision::cpp_dec_float_100; // 100 decimal digits type. + +#include +using boost::multiprecision::cpp_bin_float_double_extended; +using boost::multiprecision::cpp_bin_float_double; +using boost::multiprecision::cpp_bin_float_quad; + + +// For lambert_w function. +#include + +#include +// using std::cout; +// using std::endl; +#include +#include +#include +#include // For std::numeric_limits. + +int main() +{ + try + { + std::cout << "Lambert W examples of precision control." << std::endl; + std::cout.precision(std::numeric_limits::max_digits10); + std::cout << std::showpoint << std::endl; // Show any trailing zeros. + + using boost::math::constants::exp_minus_one; + + using boost::math::lambert_w0; + using boost::math::lambert_wm1; + + // Error handling policy examples. + using namespace boost::math::policies; + + using boost::math::policies::make_policy; + using boost::math::policies::policy; + using boost::math::policies::evaluation_error; + using boost::math::policies::domain_error; + using boost::math::policies::overflow_error; + using boost::math::policies::domain_error; + using boost::math::policies::throw_on_error; + + // Define an error handling policy: + // typedef policy< + // domain_error, + // overflow_error + // > throw_policy; + + //float x = 0.3F; + // std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.00990147 + // std::cout << "\nLambert W (" << x << ") = " << lambert_w0(x, throw_policy()) << std::endl; + // std::cout << "Lambert W (" << x << ") = " << lambert_w(x, throw_policy()) << std::endl; + + // Examples of controlling precision using policies. + using boost::math::policies::policy; + using boost::math::policies::precision; + using boost::math::policies::digits10; + using boost::math::policies::digits2; + + // Creating a policy using an integer literal. + // typedef policy > my_pol_3_dec; // Define a new, non-default, policy to calculate to accuracy of approximately 3 decimal digits. + + // Creating a policy using an integer variable (must be const integral, usually const int !). + // "a variable with non-static storage duration cannot be used as a non-type argument" + + // typedef policy > my_pol_3_dec; + // Define a new, non-default, policy to calculate to accuracy of approximately 3 decimal digits. + const int decimal_digits = 3; + typedef policy > my_pol_3_dec; // Define a custom, non-default, policy to calculate to accuracy of approximately 3 decimal digits. + + std::cout << std::setprecision(3) << "std::numeric_limits::epsilon() = " << std::numeric_limits::epsilon() << std::endl; + + std::cout.precision(std::numeric_limits::max_digits10); + double x = 1.; + std::cout << "lambert_w0(x, my_pol_3_dec()) = " << lambert_w0(x, my_pol_3_dec()) <<"\n" << std::endl; // = 0.56714329040978395 + + // Can also specify precision using bits, for example: + typedef policy > my_prec_11_bits; // Policy to require only approximately 11 bits of precision. + + std::cout << "lambert_w0(x, my_prec_11_bits()) = " << lambert_w0(x, my_prec_11_bits()) <<"\n" << std::endl; // 0.56714329040978395 + + { // Show various precisions that show varying improvements. + // Specify precision as n bits, base-2, policy >() + + std::cout << std::setprecision(3) + << "\nstd::numeric_limits::epsilon() = " << std::numeric_limits::epsilon() + << "\nstd::numeric_limits::digits = " << std::numeric_limits::digits + << "\nstd::numeric_limits::digits10 = " << std::numeric_limits::digits10 + << "\nstd::numeric_limits::max_digits10 = " << std::numeric_limits::max_digits10 + << std::endl; + +////[lambert_w_precision_0 +// float z(10.F); +// float r = 0; +// std::cout.precision(std::numeric_limits::max_digits10); // Show all possibly significant decimal digits. +// std::cout << std::showpoint << std::endl; // Show any trailing zeros. +// +// r = lambert_w0(z, policy >()); // +// std::cout << "lambert_w0(z, policy >()) = " << r << std::endl; // 0.000000000 (nearest using lookup). +// +// r = lambert_w0(z, policy >()); // // Just using bisection. +// std::cout << "lambert_w0(z, policy >()) = " << r << std::endl; // 0.566406250 (nearest using bisection). +// +// r = lambert_w0(z, policy >()); // digits10 = 6, digits2 = 22 - so just using Schroeder refinement. +// std::cout << "lambert_w0(z, policy >()) = " << r << std::endl; // 0.567143261 +// +// // Can also specify precision as decimal base-10 digits using policy >(). +// r = lambert_w0(z, policy >()); // digits10 = 5, digits2 = 22 Using Schroeder. +// std::cout << "lambert_w0(z, policy >()) = " << r << std::endl; // 0.567143261 +// +// r = lambert_w0(z, policy >()); // digits10 = 7, digits2 = 23 - so using Halley as well (but no improvement). +// std::cout << "lambert_w0(z, policy >()) = " << r << std::endl; // 0.567143261 +// +// r = lambert_w0(z, policy<>()); // Default policy (using lookup, bisection, Schroeder, and Halley). +// std::cout << "lambert_w0(z, policy<>()) = " << r << std::endl; // 0.567143261 +// +////] [/lambert_w_precision_0] + +/* +//[lambert_w_precision_output_0 + lambert_w0(z, policy >()) = 0.000000000 // Nearby integer is zero from lookup table. + lambert_w0(z, policy >()) = 0.566406250 // Just using bisection from lookup integral values. + lambert_w0(z, policy >()) = 0.567143261 // digits10 = 6, digits2 = 22 - so using Schroeder refinement. + lambert_w0(z, policy >()) = 0.567143261 // digits10 = 5, digits2 = 19 Using Schroeder. + lambert_w0(z, policy >()) = 0.567143261 // digits10 = 7, digits2 = 23 - so using Halley as well (but no improvement). + lambert_w0(z, policy<>()) = 0.567143261 +//] [/lambert_w_precision_output_0] +*/ + + } + + { +//[lambert_w_precision_1 + // Test evaluation of Lambert W at varying precisions specified using a policy with digits10 increasing from 1 to 9. + // For float this covers the full precision range as max_digits10 = 9. + float z = 10.F; + std::cout << "\nTest evaluation of float Lambert W (" << z << ") at varying precisions" + "\nspecified using a policy with digits10 increasing from 1 to 9. " + << std::endl; + std::cout << std::setprecision(3) << "std::numeric_limits::epsilon() = " << std::numeric_limits::epsilon() << std::endl; + std::cout.precision(std::numeric_limits::max_digits10); + + std::cout << "Lambert W (" << z << ", digits10<0>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits10<1>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits10<2>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits10<3>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits10<4>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits10<5>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits10<6>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits10<7>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits10<8>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits10<9>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ") default = " << lambert_w0(z) << std::endl; +//] [/lambert_w_precision_1] + + /* +//[lambert_w_precision_output_1 + Test evaluation of float Lambert W at varying precisions + specified using a policy with digits10 increasing from 1 to 9. + std::numeric_limits::epsilon() = 1.19e-07 + z = 1.F - note that gets to 'exact' result immediately using Schroeder refinement, + so no advantage using Halley. + + Lambert W (1.00000000, digits10<1>) = 0.000000000 << using lookup. + Lambert W (1.00000000, digits10<2>) = 0.000000000 << using lookup and bisection. + Lambert W (1.00000000, digits10<3>) = 0.567143261 << Schroeder refinement, and is sufficient. + Lambert W (1.00000000, digits10<4>) = 0.567143261 + Lambert W (1.00000000, digits10<5>) = 0.567143261 << Halley refinement, but no improvement. + Lambert W (1.00000000, digits10<6>) = 0.567143261 + Lambert W (1.00000000, digits10<7>) = 0.567143261 + Lambert W (1.00000000, digits10<8>) = 0.567143261 + Lambert W (1.00000000, digits10<9>) = 0.567143261 + Lambert W (1.00000000) = 0.567143261 + + z = 10.F needs Halley to get the last bit or two correct. + Lambert W (10.0000000, digits10<1>) = 1.35914087 << bisection. + Lambert W (10.0000000, digits10<2>) = 1.35914087 + Lambert W (10.0000000, digits10<3>) = 1.74552798 << Schroeder refinement. + Lambert W (10.0000000, digits10<4>) = 1.74552798 + Lambert W (10.0000000, digits10<5>) = 1.74552798 + Lambert W (10.0000000, digits10<6>) = 1.74552810 << Halley refinement. + Lambert W (10.0000000, digits10<7>) = 1.74552810 + Lambert W (10.0000000, digits10<8>) = 1.74552810 + Lambert W (10.0000000, digits10<9>) = 1.74552810 + Lambert W (10.0000000) = 1.74552810 +//] [/lambert_w_precision_output_1] + */ + } + { // similar example using float but specifying with digits2 + + float z = 10.; + std::cout << "\nTest evaluation of float Lambert W (" << z << ") at varying precisions" + "\nspecified using a policy with (base_2) digits increasing from 1 to 24. " + << std::endl; + std::cout << std::setprecision(3) << "std::numeric_limits::digits = " << std::numeric_limits::digits << std::endl; + std::cout << std::setprecision(3) << "std::numeric_limits::epsilon() = " << std::numeric_limits::epsilon() << std::endl; + std::cout.precision(std::numeric_limits::max_digits10); + std::cout << "Lambert W (" << z << ", digits2<0> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<1> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<2> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<3> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<4> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<5> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<6> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<7> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<8> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<9> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<10>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<11>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<12>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<13>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<14>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<15>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<16>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<17>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<18>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<19>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<20>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<21>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<22>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<23>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<24>) = " << lambert_w0(z, policy >()) << std::endl; + + std::cout << "Lambert W (" << z << ") default = " << lambert_w0(z) << std::endl; // Default policy. + + /* This example shows a tiny improvement using Halley after Schroeder. + Lambert W (10.0000000, digits2<1>) = 1.35914087 + Lambert W (10.0000000, digits2<2>) = 1.35914087 + Lambert W (10.0000000, digits2<3>) = 1.35914087 + Lambert W (10.0000000, digits2<4>) = 1.35914087 + Lambert W (10.0000000, digits2<5>) = 1.35914087 + Lambert W (10.0000000, digits2<6>) = 1.35914087 + Lambert W (10.0000000, digits2<7>) = 1.35914087 + Lambert W (10.0000000, digits2<8>) = 1.35914087 + Lambert W (10.0000000, digits2<9>) = 1.35914087 + Lambert W (10.0000000, digits2<10>) = 1.74414063 << Schroeder + Lambert W (10.0000000, digits2<11>) = 1.74552798 + Lambert W (10.0000000, digits2<12>) = 1.74552798 + Lambert W (10.0000000, digits2<13>) = 1.74552798 + Lambert W (10.0000000, digits2<14>) = 1.74552798 + Lambert W (10.0000000, digits2<15>) = 1.74552798 + Lambert W (10.0000000, digits2<16>) = 1.74552798 + Lambert W (10.0000000, digits2<17>) = 1.74552798 + Lambert W (10.0000000, digits2<18>) = 1.74552798 + Lambert W (10.0000000, digits2<19>) = 1.74552798 + Lambert W (10.0000000, digits2<20>) = 1.74552798 + Lambert W (10.0000000, digits2<21>) = 1.74552798 + Lambert W (10.0000000, digits2<22>) = 1.74552810 << Halley + Lambert W (10.0000000, digits2<23>) = 1.74552810 + Lambert W (10.0000000, digits2<24>) = 1.74552810 + Lambert W (10.0000000) = 1.74552810 << default policy precision. + */ + } + + { // Similar example using double but specifying with digits2. + double z = 10.; + std::cout << "\nTest evaluation of double Lambert W (" << z << ") at varying precisions" + "\nspecified using a policy with (base_2) digits increasing from 1 to 54. " + << std::endl; + std::cout << std::setprecision(3) << "std::numeric_limits::epsilon() = " << std::numeric_limits::epsilon() << std::endl; + std::cout << std::setprecision(3) << "std::numeric_limits::digits = " << std::numeric_limits::digits << std::endl; + + std::cout.precision(std::numeric_limits::max_digits10); + std::cout << "Lambert W (" << z << ", digits2<1> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<2> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<3> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<4> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<5> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<6> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<7> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<8> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<9> ) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<10>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<11>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<12>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<13>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<14>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<15>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<16>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<17>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<18>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<19>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<20>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<21>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<22>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<23>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<24>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<25>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<26>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<27>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<28>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<29>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<30>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<31>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<32>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<33>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<34>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<35>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<36>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<37>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<38>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<39>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<40>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<41>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<42>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<43>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<44>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<45>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<46>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<47>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<48>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<49>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<50>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<51>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<52>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<53>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<54>) = " << lambert_w0(z, policy >()) << std::endl; + + std::cout << "Lambert W (" << z << ") default = " << lambert_w0(z) << std::endl; // Default policy. + + /* + Test evaluation of double Lambert W at varying precisions + specified using a policy with (base_2) digits increasing from 1 to 54. + std::numeric_limits::epsilon() = 2.22e-16 + Lambert W (10.000000000000000, digits2<1>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<2>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<3>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<4>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<5>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<6>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<7>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<8>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<9>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<10>) = 1.7441406250000000 + Lambert W (10.000000000000000, digits2<11>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<12>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<13>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<14>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<15>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<16>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<17>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<18>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<19>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<20>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<21>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<22>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<23>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<24>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<25>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<26>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<27>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<28>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<29>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<30>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<31>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<32>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<33>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<34>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<35>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<36>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<37>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<38>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<39>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<40>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<41>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<42>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<43>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<44>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<45>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<46>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<47>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<48>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<49>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<50>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<51>) = 1.7455280027406992 + Lambert W (10.000000000000000, digits2<52>) = 1.7455280027406992 + Lambert W (10.000000000000000, digits2<53>) = 1.7455280027406992 + Lambert W (10.000000000000000, digits2<54>) = 1.7455280027406992 + Lambert W (10.000000000000000) default = 1.7455280027406992 + + // cpp_dec_float_50 reference value: + lambert_w0(10.000000000000000) = 1.7455280027406993830743012648753899115352881290809 + + */ + } + { // Similar example using cpp_bin_float_quad (128-bit floating-point types). + // multiprecision type to show use of Schroeder double approximation before Halley refinement. + // Specifying precision with digits2 not digits10. + + cpp_bin_float_quad z = 10.; + std::cout << "\nTest evaluation of cpp_bin_float_quad Lambert W(" << z << ") at varying precisions" + "\nspecified using a policy with (base_2) digits increasing from 1 to 54. " + << std::endl; + std::cout << std::setprecision(3) << "std::numeric_limits::digits = " << std::numeric_limits::digits << std::endl; + std::cout << std::setprecision(3) << "std::numeric_limits::epsilon() = " << std::numeric_limits::epsilon() << std::endl; + std::cout << std::setprecision(3) << "std::numeric_limits::max_digits10 = " << std::numeric_limits::max_digits10 << std::endl; + std::cout << std::setprecision(3) << "std::numeric_limits::digits10 = " << std::numeric_limits::digits10 << std::endl; + std::cout.precision(std::numeric_limits::max_digits10); + std::cout << "Lambert W (" << z << ", digits2<1>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<2>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "..." << std::endl; + std::cout << "Lambert W (" << z << ", digits2<52>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<53>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ", digits2<54>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "..." << std::endl; + std::cout << "Lambert W (" << z << ", digits2<113>) = " << lambert_w0(z, policy >()) << std::endl; + std::cout << "Lambert W (" << z << ") default = " << lambert_w0(z) << std::endl; // Default policy. + // All are same precision because double precision first approximation used before Halley. + + /* + + Test evaluation of cpp_bin_float_quad Lambert W at varying precisions + specified using a policy with (base_2) digits increasing from 1 to 113. + std::numeric_limits::epsilon() = 1.93e-34 + Lambert W (10.00000000000000000000000000000000000, digits2<1>) = 1.745528002740699383074301264875390030 + Lambert W (10.00000000000000000000000000000000000, digits2<2>) = 1.745528002740699383074301264875390030 + ... + Lambert W (10.00000000000000000000000000000000000) default = 1.745528002740699383074301264875390030 + lambert_w0(z) cpp_dec_float_50 = 1.7455280027406993830743012648753899115352881290809 // For comparison. + + */ + } + + { // Reference value for lambert_w(1) + cpp_dec_float_50 z("10"); + cpp_dec_float_50 r; + std::cout.precision(std::numeric_limits::digits10); + r = lambert_w0(z); // Default policy. + std::cout << "lambert_w0(z) cpp_dec_float_50 = " << r << std::endl; // 0.56714329040978387299996866221035554975381578718651 + std::cout.precision(std::numeric_limits::max_digits10); + + std::cout << "lambert_w0(z) cpp_dec_float_50 cast to quad (max_digits10(" << std::numeric_limits::max_digits10 << + " ) = " << static_cast(r) << std::endl; // 1.7455280027406993830743012648753899115352881290809 + std::cout.precision(std::numeric_limits::digits10); // 1.745528002740699383074301264875389837 + std::cout << "lambert_w0(z) cpp_dec_float_50 cast to quad (digits10(" << std::numeric_limits::digits10 << + " ) = " << static_cast(r) << std::endl; // 1.74552800274069938307430126487539 + std::cout.precision(std::numeric_limits::digits10 +1); // + + std::cout << "lambert_w0(z) cpp_dec_float_50 cast to quad (digits10(" << std::numeric_limits::digits10 << + " ) = " << static_cast(r) << std::endl; // 1.74552800274069938307430126487539 + + // [N[productlog[10], 50]] == 1.7455280027406993830743012648753899115352881290809 + + // [N[productlog[10], 37]] == 1.745528002740699383074301264875389912 + // [N[productlog[10], 34]] == 1.745528002740699383074301264875390 + // [N[productlog[10], 33]] == 1.74552800274069938307430126487539 + + // lambert_w0(z) cpp_dec_float_50 cast to quad = 1.745528002740699383074301264875389837 + + // lambert_w0(z) cpp_dec_float_50 = 1.7455280027406993830743012648753899115352881290809 + // lambert_w0(z) cpp_dec_float_50 cast to quad = 1.745528002740699383074301264875389837 + // lambert_w0(z) cpp_dec_float_50 cast to quad = 1.74552800274069938307430126487539 + + + } + + + // Examples of values near singularity when only a final Halley refinement is available. + + //using boost::math::detail::lambert_w_singularity_series; + //std::cout << series(z) << std::endl; + + //std::cout << lambert_w_singularity_series(z) << std::endl; + + /* + 1> Lambert W example single spot tests! + 1> epsilon 2.2204460492503131e-16 + 1> digits2 53 + 1> digits10 15 + 1> digits () 53 + 1> Lambert W (0.29999999999999999) = 0.23675531078855933 + 1> epsilon 3.814697265625e-06 + 1> digits2 19 + 1> digits10 5 + 1> digits () 53 + 1> Lambert W (0.29999999999999999) = 0.2367553107885593 + + + for (double xd = 0.001; xd < 1e20; xd *= 10) + { + + // 1. 0.56714329040978387 + // 0.56714329040978384 + + // 10 1.7455280027406994 + // 1.7455280027406994 + + // 100 3.3856301402900502 + // 3.3856301402900502 + // 1000 5.2496028524015959 + // 5.249602852401596227126056319697306282521472386059592844451465483991362228320942832739693150854347718 + + // 1e19 40.058769161984308 + // 40.05876916198431163898797971203180915622644925765346546858291325452428038208071849105889199253335063 + std::cout << "Lambert W (" << xd << ") = " << lambert_w(xd) << std::endl; // + + + 1> Iteration #0, w0 0.0099072820916067030, w1 = 0.0099014738435951096, difference = -5.8082480115934088e-06, relative 0.00058660438873459064, float distance = 3415046080725.0000 + 1> f'(x) = 5.8082144415180436e-06, f''(x) = -5.8082480115936214e-06 + 1> Iteration #1, w0 0.0099014738435951096, w1 = 0.0099014738435950107, difference = -9.8879238130678004e-17, relative 9.9920072216264089e-15, float distance = 58.000000000000000 + 1> f'(x) = 9.8645911007260505e-17, f''(x) = -9.8645911007260505e-17 + 1> Iteration #2, w0 0.0099014738435950107, w1 = 0.0099014738435950125, difference = 1.7347234759768071e-18, relative -2.2204460492503131e-16, float distance = 1.0000000000000000 + 1> f'(x) = -1.7007915690906991e-18, f''(x) = 1.7007915690906991e-18 + 1> + 1> Return refined 0.0099014738435950125 after 3 iterations, difference = -2.2204460492503131e-16, Float distance = 1.0000000000000000 + 1> Lambert W (0.010000000000000000) = 0.0099014738435950125 + + + 1> Iteration #0, w0 0.091722597168998055, w1 = 0.091276527200431806, difference = -0.00044606996856624836, relative 0.0048870173115453941, float distance = 38445375960087.000 + 1> f'(x) = 0.00044587943029702348, f''(x) = -0.00044606996856624685 + 1> Iteration #1, w0 0.091276527200431806, w1 = 0.091276527160862264, difference = -3.9569542087392051e-11, relative 4.3351278122827352e-10, float distance = 3408918.0000000000 + 1> f'(x) = 3.9569548190331561e-11, f''(x) = -3.9569548191831827e-11 + 1> Iteration #2, w0 0.091276527160862264, w1 = 0.091276527160862264, exact. + 1> f'(x) = 0.00000000000000000, f''(x) = -0.00000000000000000 + 1> + + + 1> Iteration #0, w0 0.87095897919507137, w1 = 0.85260701286390628, difference = -0.018351966331165093, relative 0.021524531295515459, float distance = 182161642476426.00 + 1> f'(x) = 0.018097151008287501, f''(x) = -0.018351966331165141 + 1> Iteration #1, w0 0.85260701286390628, w1 = 0.85260550201372554, difference = -1.5108501807414854e-06, relative 1.7720389760000899e-06, float distance = 14784835581.000000 + 1> f'(x) = 1.5108484233744529e-06, f''(x) = -1.5108501807757508e-06 + 1> Iteration #2, w0 0.85260550201372554, w1 = 0.85260550201372554, exact. + 1> f'(x) = 0.00000000000000000, f''(x) = -0.00000000000000000 + 1> + 1> Return refined 0.85260550201372554 after 3 iterations, exact. + 1> Lambert W (2.0000000000000000) = 0.85260550201372554 + + 1> Iteration #0, w0 0.87095897919507137, w1 = 0.85260701286390628, difference = -0.018351966331165093, relative 0.021524531295515459, float distance = 182161642476426.00 + 1> f'(x) = 0.018097151008287501, f''(x) = -0.018351966331165141 + 1> Iteration #1, w0 0.85260701286390628, w1 = 0.85260550201372554, difference = -1.5108501807414854e-06, relative 1.7720389760000899e-06, float distance = 14784835581.000000 + 1> f'(x) = 1.5108484233744529e-06, f''(x) = -1.5108501807757508e-06 + 1> Iteration #2, w0 0.85260550201372554, w1 = 0.85260550201372554, exact. + 1> f'(x) = 0.00000000000000000, f''(x) = -0.00000000000000000 + 1> + 1> Return refined 0.85260550201372554 after 3 iterations, exact. + 1> Lambert W (2.0000000000000000) = 0.85260550201372554 + + } + */ + + } + catch (std::exception& ex) + { + std::cout << ex.what() << std::endl; + } +} // int main() + + /* + BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 0.01)), + BOOST_MATH_TEST_VALUE(RealType, 0.0099014738435950118853363268165701079536277464949174), + // Output from https://www.wolframalpha.com/input/ N[lambert_w[0.01],50]) + tolerance * 25); // <<< Needs a much bigger tolerance??? + // 0.0099014738435951096 this test max_digits10 + // 0.00990147384359511 digits10 + // 0.0099014738435950118 wolfram + // 0.00990147384359501 wolfram digits10 + // 0.0099014738435950119 N[lambert_w[0.01],17] + // 0.00990147384359501 N[lambert_w[0.01],15] which really is more different than expected. + + // 0.00990728209160670 approx + // 0.00990147384359511 previous + + after allowing iterations, get the Wolfram result + + x = 0.0100000000000000, 1st approximation = 0.00990728209160670 + 1> Iteration #0, w0 0.00990728209160670, w1 = 0.00990147384359511, difference = 0.000586604388734591, relative 0.000586604388734591 + 1> f'(x) = 5.80821444151804e-06, f''(x) = -5.80824801159362e-06 + 1> Iteration #1, w0 0.00990147384359511, w1 = 0.00990147384359501, difference = 9.99200722162641e-15, relative 9.99200722162641e-15 + 1> f'(x) = 9.86459110072605e-17, f''(x) = -9.86459110072605e-17 + 1> Iteration #2, w0 0.00990147384359501, w1 = 0.00990147384359501, difference = -2.22044604925031e-16, relative -2.22044604925031e-16 + 1> f'(x) = -1.70079156909070e-18, f''(x) = 1.70079156909070e-18 + 1> Estimate 0.00990147384359501 refined after 2 iterations. + 1> Exact. + 1> Lambert W (0.0100000000000000) = 0.00990147384359501 + + + using float_distance < 2 + + x = 0.0100000000000000, 1st approximation = 0.00990728209160670 + 1> Iteration #0, w0 0.00990728209160670, w1 = 0.00990147384359511, difference = 0.000586604388734591, relative 0.000586604388734591 + 1> f'(x) = 5.80821444151804e-06, f''(x) = -5.80824801159362e-06 + 1> Iteration #1, w0 0.00990147384359511, w1 = 0.00990147384359501, difference = 9.99200722162641e-15, relative 9.99200722162641e-15 + 1> f'(x) = 9.86459110072605e-17, f''(x) = -9.86459110072605e-17 + 1> Estimate 0.00990147384359501 refined after 1 iterations. + 1> diff = -1.73472347597681e-18, relative 0.000000000000000 + 1> Lambert W (0.0100000000000000) = 0.00990147384359501 + */ + + /* + + Output: + + 1> Lambert W example single spot tests! + 1> epsilon 0.03125 + 1> Lambert W (0.300000012, digits10<1>) = 0.239290372 + + 1> epsilon 0.00390625 + 1> Iteration #1, w0 0.239290372, w1 = 0.236755311, difference = -0.00253506005, relative 0.0107074976, float distance = 133610 + 1> f'(x) = 0.00252926024, f''(x) = -0.00253505306 + + 1> Lambert W (0.300000012, digits10<2>) = 0.236755311 + 1> epsilon 0.000244140625 + 1> Iteration #1, w0 0.239290372, w1 = 0.236755311, difference = -0.00253506005, relative 0.0107074976, float distance = 133610 + 1> f'(x) = 0.00252926024, f''(x) = -0.00253505306 + + 1> Lambert W (0.300000012, digits10<3>) = 0.236755311 + 1> epsilon 3.05175781e-05 + 1> Iteration #1, w0 0.239290372, w1 = 0.236755311, difference = -0.00253506005, relative 0.0107074976, float distance = 133610 + 1> f'(x) = 0.00252926024, f''(x) = -0.00253505306 + + 1> Lambert W (0.300000012, digits10<4>) = 0.236755311 + 1> epsilon 3.81469727e-06 + 1> Iteration #1, w0 0.239290372, w1 = 0.236755311, difference = -0.00253506005, relative 0.0107074976, float distance = 133610 + 1> f'(x) = 0.00252926024, f''(x) = -0.00253505306 + 1> Iteration #2, w0 0.236755311, w1 = 0.236755326, difference = 1.49011612e-08, relative -5.96046448e-08, float distance = 1 + 1> f'(x) = -1.90171221e-08, f''(x) = 1.90171221e-08 + 1> + 1> Return refined 0.236755326 after 2 iterations, difference = -5.96046448e-08, Float distance = 1 + + 1> Lambert W (0.300000012, digits10<5>) = 0.236755326 + 1> epsilon 2.38418579e-07 + 1> Iteration #1, w0 0.239290372, w1 = 0.236755311, difference = -0.00253506005, relative 0.0107074976, float distance = 133610 + 1> f'(x) = 0.00252926024, f''(x) = -0.00253505306 + 1> Iteration #2, w0 0.236755311, w1 = 0.236755326, difference = 1.49011612e-08, relative -5.96046448e-08, float distance = 1 + 1> f'(x) = -1.90171221e-08, f''(x) = 1.90171221e-08 + 1> + 1> Return refined 0.236755326 after 2 iterations, difference = -5.96046448e-08, Float distance = 1 + + 1> Lambert W (0.300000012, digits10<6>) = 0.236755326 + 1> epsilon 1.1920929e-07 + + 1> Lambert W (0.300000012, digits10<7>) = 0.239290372 + 1> epsilon 1.1920929e-07 + + 1> Lambert W (0.300000012, digits10<8>) = 0.239290372 + 1> epsilon 1.1920929e-07 + + 1> Lambert W (0.300000012, digits10<9>) = 0.239290372 + */ + + + /* + 1> std::numeric_limits::epsilon() = 1.19209290e-07 + 1> Lambert_w argument = 10.0000000 + 1> Argument Type = float + 1> digits10 = 1, digits2 = 5 + 1> Result Integer W between g[0] = 0.000000000 < 10.0000000 < 2.71828175 = g[1], bisect 1.35914087 + 1> + 1> Lambert_w argument = 10.0000000 + 1> Argument Type = float + 1> digits10 = 3, digits2 = 10 + 1> Result Bisection = 1.74414063 + 1> + 1> Lambert_w argument = 10.0000000 + 1> Argument Type = float + 1> digits10 = 6, digits2 = 22 + 1> Result Schroeder refinement = 1.74552798 + 1> + 1> Lambert_w argument = 10.0000000 + 1> Argument Type = float + 1> digits10 = 6, digits2 = 23 + 1> Result Halley refinement = 1.74552810 + 1> + 1> Lambert_w argument = 10.0000000 + 1> Argument Type = float + 1> digits10 = 7, digits2 = 24 + 1> Result Halley refinement = 1.74552810 + + 1> + 1> std::numeric_limits::epsilon() = 1.19209290e-07 + 1> Lambert_w argument = 10.000000000000000 + 1> Argument Type = double + 1> digits10 = 1, digits2 = 5 + 1> Result Integer W bisection between g[0] = 0.00000000000000000 < 10.000000000000000 < 2.7182818284590451 = g[1], bisect 1.3591409142295225 + 1> + 1> Lambert_w argument = 10.000000000000000 + 1> Argument Type = double + 1> digits10 = 3, digits2 = 10 + 1> Result Bisection = 1.7441406250000000 + 1> + 1> Lambert_w argument = 10.000000000000000 + 1> Argument Type = double + 1> digits10 = 6, digits2 = 22 + 1> Result Schroeder refinement = 1.7455280027406996 + 1> + 1> Lambert_w argument = 10.000000000000000 + 1> Argument Type = double + 1> digits10 = 6, digits2 = 23 + 1> Result Halley refinement = 1.7455280027406994 + 1> + 1> Lambert_w argument = 10.000000000000000 + 1> Argument Type = double + 1> digits10 = 15, digits2 = 53 + 1> Result Halley refinement = 1.7455280027406994 + + Codeblocks long double + + Lambert W example single spot tests! + + std::numeric_limits::epsilon() = 1.19209290e-007 + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 1, digits2 = 5 + Result Integer W bisection between g[0] = 0.00000000000000000000 < 10.0000000000000000000 < 2.71828182845904523543 = g[1], + bisect = 1.35914091422952261771 + + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 3, digits2 = 10 + Result Bisection = 1.74414062500000000000 + + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 6, digits2 = 22 + Result Schroeder refinement = 1.74552800274069937864 + + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 6, digits2 = 23 + Result Halley refinement = 1.74552800274069938309 + + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 19, digits2 = 64 + Result Halley refinement = 1.74552800274069938309 + + + Process returned 0 (0x0) execution time : 0.079 s + Press any key to continue. + + + After Halley reordering + + Lambert W example single spot tests! + + std::numeric_limits::epsilon() = 1.19209290e-007 + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 2, digits2 = 9 + Result Integer W bisection between g[0] = 0.00000000000000000000 < 10.0000000000000000000 < 2.71828182845904523543 = g[1], + bisect mean = 1.35914091422952261771 + + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 3, digits2 = 10 + Result Bisection = 1.74414062500000000000 + + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 6, digits2 = 21 + Result Schroeder refinement = 1.74552800274069937864 + + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 5, digits2 = 19 + Result Schroeder refinement = 1.74552800274069937864 + + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 6, digits2 = 23 + Result Schroeder refinement = 1.74552800274069937864 + + Lambert_w argument = 10.0000000000000000000 + Argument Type = e, max_digits10 = 21, epsilon = 1.08420217248550443401e-019 + digits10 = 19, digits2 = 64 + w = 1.74552800274069937864, z = 10.0000000000000000000, exp(w) = 5.72892556538694148333, diff = -6.93889390390722837765e-017 + 1 Halley iterations. + Distance = 41 + Result Halley refinement = 1.74552800274069938309 + + + Process returned 0 (0x0) execution time : 0.070 s + Press any key to continue. + + + 14 Aug 2017 using merged #include + + lambert_w_pb_precision.vcxproj -> J:\Cpp\Misc\x64\Release\lambert_w_pb_precision.exe + + lambert_w_pb_precision.vcxproj -> J:\Cpp\Misc\x64\Release\lambert_w_pb_precision.exe + lambert_w_pb_precision.vcxproj -> J:\Cpp\Misc\x64\Release\lambert_w_pb_precision.pdb (Full PDB) + Lambert W examples of precision control. + + std::numeric_limits::epsilon() = 2.22e-16 + lambert_w0(x, my_pol_3_dec()) = 0.567 + + lambert_w0(x, my_prec_10_bits()) = 0.566 + + lambert_w0(z, policy >()) = 0.000 + lambert_w0(z, policy >()) = 0.566 + lambert_w0(z, policy >()) = 0.567 + lambert_w0(z, policy >()) = 0.567 + lambert_w0(z, policy >()) = 0.567 + + Test evaluation of float Lambert W at varying precisions specified using a policy with digits10 increasing from 1 to 9. + std::numeric_limits::epsilon() = 1.19e-07 + Lambert W (10.0000000, digits10<1>) = 1.35914087 + Lambert W (10.0000000, digits10<2>) = 1.35914087 + Lambert W (10.0000000, digits10<3>) = 1.74552798 + Lambert W (10.0000000, digits10<4>) = 1.74552798 + Lambert W (10.0000000, digits10<5>) = 1.74552798 + Lambert W (10.0000000, digits10<6>) = 1.74552810 + Lambert W (10.0000000, digits10<7>) = 1.74552810 + Lambert W (10.0000000, digits10<8>) = 1.74552810 + Lambert W (10.0000000, digits10<9>) = 1.74552810 + Lambert W (10.0000000) = 1.74552810 + + Test evaluation of double Lambert W at varying precisions specified using a policy with digits10 increasing from 1 to 24. + std::numeric_limits::epsilon() = 2.22e-16 + Lambert W (10.000000000000000, digits2<1>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<2>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<3>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<4>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<5>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<6>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<7>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<8>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<9>) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<10>) = 1.7441406250000000 + Lambert W (10.000000000000000, digits2<11>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<12>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<13>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<14>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<15>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<16>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<17>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<18>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<19>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<20>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<21>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<22>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<23>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<24>) = 1.7455280027406996 + Lambert W (10.000000000000000) = 1.7455280027406992 + lambert_w0(z) = 1.7455280027406993830743012648753899115352881290809 + + + 30 Aug 2017 + + lambert_w_pb_precision.cpp + lambert_w_pb_precision.vcxproj -> J:\Cpp\Misc\x64\Debug\lambert_w_pb_precision.exe + lambert_w_pb_precision.vcxproj -> J:\Cpp\Misc\x64\Debug\lambert_w_pb_precision.pdb (Partial PDB) + Lambert W examples of precision control. + + std::numeric_limits::epsilon() = 2.22e-16 + lambert_w0(x, my_pol_3_dec()) = 0.56714329040978395 + + lambert_w0(x, my_prec_11_bits()) = 0.56714329040978395 + + + std::numeric_limits::epsilon() = 1.19e-07 + std::numeric_limits::digits = 24 + std::numeric_limits::digits10 = 6 + std::numeric_limits::max_digits10 = 9 + lambert_w0(z, policy >()) = 0.000000000 + lambert_w0(z, policy >()) = 0.566406250 + lambert_w0(z, policy >()) = 0.567143261 + lambert_w0(z, policy >()) = 0.567143261 + lambert_w0(z, policy >()) = 0.567143261 + lambert_w0(z, policy<>()) = 0.567143261 + + Test evaluation of float Lambert W at varying precisions + specified using a policy with digits10 increasing from 1 to 9. + std::numeric_limits::epsilon() = 1.19e-07 + Lambert W (1.00000000, digits10<1>) = 0.000000000 + Lambert W (1.00000000, digits10<2>) = 0.000000000 + Lambert W (1.00000000, digits10<3>) = 0.567143261 + Lambert W (1.00000000, digits10<4>) = 0.567143261 + Lambert W (1.00000000, digits10<5>) = 0.567143261 + Lambert W (1.00000000, digits10<6>) = 0.567143261 + Lambert W (1.00000000, digits10<7>) = 0.567143261 + Lambert W (1.00000000, digits10<8>) = 0.567143261 + Lambert W (1.00000000, digits10<9>) = 0.567143261 + Lambert W (1.00000000) default = 0.567143261 + + Test evaluation of float Lambert W at varying precisions + specified using a policy with (base_2) digits increasing from 1 to 24. + std::numeric_limits::epsilon() = 1.19e-07 + Lambert W (10.0000000, digits2<1> ) = 1.35914087 + Lambert W (10.0000000, digits2<2> ) = 1.35914087 + Lambert W (10.0000000, digits2<3> ) = 1.35914087 + Lambert W (10.0000000, digits2<4> ) = 1.35914087 + Lambert W (10.0000000, digits2<5> ) = 1.35914087 + Lambert W (10.0000000, digits2<6> ) = 1.35914087 + Lambert W (10.0000000, digits2<7> ) = 1.35914087 + Lambert W (10.0000000, digits2<8> ) = 1.35914087 + Lambert W (10.0000000, digits2<9> ) = 1.35914087 + Lambert W (10.0000000, digits2<10>) = 1.74414063 + Lambert W (10.0000000, digits2<11>) = 1.74552798 + Lambert W (10.0000000, digits2<12>) = 1.74552798 + Lambert W (10.0000000, digits2<13>) = 1.74552798 + Lambert W (10.0000000, digits2<14>) = 1.74552798 + Lambert W (10.0000000, digits2<15>) = 1.74552798 + Lambert W (10.0000000, digits2<16>) = 1.74552798 + Lambert W (10.0000000, digits2<17>) = 1.74552798 + Lambert W (10.0000000, digits2<18>) = 1.74552798 + Lambert W (10.0000000, digits2<19>) = 1.74552798 + Lambert W (10.0000000, digits2<20>) = 1.74552798 + Lambert W (10.0000000, digits2<21>) = 1.74552798 + Lambert W (10.0000000, digits2<22>) = 1.74552810 + Lambert W (10.0000000, digits2<23>) = 1.74552810 + Lambert W (10.0000000, digits2<24>) = 1.74552810 + Lambert W (10.0000000) default = 1.74552810 + + Test evaluation of double Lambert W at varying precisions + specified using a policy with (base_2) digits increasing from 1 to 54. + std::numeric_limits::epsilon() = 2.22e-16 + Lambert W (10.000000000000000, digits2<1> ) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<2> ) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<3> ) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<4> ) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<5> ) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<6> ) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<7> ) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<8> ) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<9> ) = 1.3591409142295225 + Lambert W (10.000000000000000, digits2<10>) = 1.7441406250000000 + Lambert W (10.000000000000000, digits2<11>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<12>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<13>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<14>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<15>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<16>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<17>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<18>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<19>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<20>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<21>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<22>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<23>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<24>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<25>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<26>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<27>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<28>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<29>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<30>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<31>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<32>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<33>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<34>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<35>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<36>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<37>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<38>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<39>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<40>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<41>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<42>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<43>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<44>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<45>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<46>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<47>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<48>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<49>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<50>) = 1.7455280027406996 + Lambert W (10.000000000000000, digits2<51>) = 1.7455280027406994 + Lambert W (10.000000000000000, digits2<52>) = 1.7455280027406994 + Lambert W (10.000000000000000, digits2<53>) = 1.7455280027406992 + Lambert W (10.000000000000000, digits2<54>) = 1.7455280027406992 + Lambert W (10.000000000000000) default = 1.7455280027406992 + + Test evaluation of cpp_bin_float_quad Lambert W at varying precisions + specified using a policy with (base_2) digits increasing from 1 to 54. + std::numeric_limits::epsilon() = 1.93e-34 + Lambert W (10.00000000000000000000000000000000000, digits2<1> ) = 1.745528002740699383074301264875389837 + Lambert W (10.00000000000000000000000000000000000, digits2<2> ) = 1.745528002740699383074301264875389837 + ... + Lambert W (10.00000000000000000000000000000000000, digits2<52>) = 1.745528002740699383074301264875389837 + Lambert W (10.00000000000000000000000000000000000, digits2<53>) = 1.745528002740699383074301264875389837 + Lambert W (10.00000000000000000000000000000000000, digits2<54>) = 1.745528002740699383074301264875390030 + Lambert W (10.00000000000000000000000000000000000) default = 1.745528002740699383074301264875390030 + lambert_w0(z) cpp_dec_float_50 = 1.7455280027406993830743012648753899115352881290809 + + + + + */ + + diff --git a/example/lambert_w_simple_examples.cpp b/example/lambert_w_simple_examples.cpp new file mode 100644 index 000000000..1d4b345f0 --- /dev/null +++ b/example/lambert_w_simple_examples.cpp @@ -0,0 +1,232 @@ +// Copyright Paul A. Bristow 2016, 2017. + +// 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). + +// Build and run a simple examples of Lambert W function. + +// Some macros that will show some(or much) diagnostic values if #defined. +//#define-able macros +//#define BOOST_MATH_INSTRUMENT_LAMBERT_W0 // W0 branch diagnostics. +//#define BOOST_MATH_INSTRUMENT_LAMBERT_Wm1 // W1 branch diagnostics. +//#define BOOST_MATH_INSTRUMENT_LAMBERT_W_HALLEY // Halley refinement diagnostics. +//#define BOOST_MATH_INSTRUMENT_LAMBERT_W_SCHROEDER // Schroeder refinement diagnostics. +//#define BOOST_MATH_INSTRUMENT_LAMBERT_W_TERMS // Number of terms used for near-singularity series. +//#define BOOST_MATH_INSTRUMENT_LAMBERT_W0_NOT_BUILTIN // higher than built-in precision types approximation and refinement. +//#define BOOST_MATH_INSTRUMENT_LAMBERT_W0_BISECTION // Show bisection only estimate. +//#define BOOST_MATH_INSTRUMENT_LAMBERT_W_SINGULARITY_SERIES // Show evaluation of series near branch singularity. +//#define BOOST_MATH_INSTRUMENT_LAMBERT_W_SMALL_Z_SERIES_ITERATIONS // Show evaluation of series for small z. +//#define BOOST_MATH_INSTRUMENT_LAMBERT_W0_LOOKUP // Show results from lookup table. + +#include // for BOOST_PLATFORM, BOOST_COMPILER, BOOST_STDLIB ... +#include // for BOOST_MSVC versions. +#include + +#include // boost::exception +#include // For exp_minus_one == 3.67879441171442321595523770161460867e-01. +#include + +// Built-in/fundamental GCC float128 or Intel Quad 128-bit type, if available. +#ifdef __GNUC__ +#include // Not available for MSVC. +// sets BOOST_MP_USE_FLOAT128 for GCC +using boost::multiprecision::float128; +#endif //# __GNUC__ and NOT _MSC_VER + +#include // boost::multiprecision::cpp_dec_float_50 +using boost::multiprecision::cpp_dec_float_50; // 50 decimal digits type. +using boost::multiprecision::cpp_dec_float_100; // 100 decimal digits type. + +#include +using boost::multiprecision::cpp_bin_float_double; // == double +using boost::multiprecision::cpp_bin_float_double_extended; // 80-bit long double emulation. +using boost::multiprecision::cpp_bin_float_quad; // 128-bit quad precision. + +//[lambert_w_simple_examples_includes +#include // For lambert_w function. + +using boost::math::lambert_w0; +using boost::math::lambert_wm1; +//] //[/lambert_w_simple_examples_includes] + +#include +// using std::cout; +// using std::endl; +#include +#include +#include +#include // For std::numeric_limits. + +//! Show value of z to the full possibly-significant max_digits10 precision of type T. +template +void show_value(T z) +{ + std::streamsize precision = std::cout.precision(std::numeric_limits::max_digits10); // Save. + std::cout.precision(std::numeric_limits::max_digits10); // Show all posssibly significant digits. + std::ios::fmtflags flags(std::cout.flags()); + std::cout.setf(std::ios_base::showpoint); // Include any trailing zeros. + std::cout << z; + // Restore: + std::cout.precision(precision); + std::cout.flags(flags); +} // template void show_value(T z) + +int main() +{ + try + { + std::cout << "Lambert W simple examples." << std::endl; + + using boost::math::constants::exp_minus_one; // The branch point, a singularity. + + // using statements needed to change precision policy. + using boost::math::policies::policy; + using boost::math::policies::make_policy; + using boost::math::policies::precision; + using boost::math::policies::digits2; + using boost::math::policies::digits10; + + // using statements needed for changing error handling policy. + using boost::math::policies::evaluation_error; + using boost::math::policies::domain_error; + using boost::math::policies::overflow_error; + using boost::math::policies::ignore_error; + using boost::math::policies::throw_on_error; + + //[lambert_w_simple_examples_0 + std::cout.precision(std::numeric_limits::max_digits10); // Show all potentially significant decimal digits. + std::cout << std::showpoint << std::endl; // Show trailing zeros too. + { + double z = 10.; + double r; + r = lambert_w0(z); // Default policy digits10 = 17, digits2 = 53 + std::cout << "lambert_w0(z) = " << r << std::endl; // lambert_w0(z) = 1.7455280027406992 + //] [/lambert_w_simple_examples_0] + + } + { + //[lambert_w_simple_examples_1 + // Other floating-point types can be used too. + // It is convenient to use function `show_value` + // to display all potentially significant decimal digits for the type. + float z = 10.F; + float r; + r = lambert_w0(z); // Default policy digits10 = 7, digits2 = 24 + std::cout << "lambert_w0("; + show_value(z); + std::cout << ") = "; show_value(r); + std::cout << std::endl; // lambert_w0(10.0000000) = 1.74552810 + //] //[/lambert_w_simple_examples_1] + } + { +//[lambert_w_simple_examples_2 + // Example of an integer argument to lambert_w, + // showing that an integer is correctly promoted to a double. + std::cout.precision(std::numeric_limits::max_digits10); + double r = lambert_w0(10); // int argument "10" that should be promoted to double argument. + std::cout << "lambert_w0(10) = " << r << std::endl; // lambert_w0(10) = 1.7455280027406992 + double rp = lambert_w0(10, policy<>()); // int argument "10" that should be promoted to double argument, + // for simplicity using (default policy. + std::cout << "lambert_w0(10, policy<>()) = " << rp << std::endl; + // lambert_w0(10) = 1.7455280027406992 +//] //[/lambert_w_simple_examples_2] + } + { + //[lambert_w_simple_examples_3 + // Using multiprecision types to get much higher precision is painless. + cpp_dec_float_50 z("10"); // Note construction using a decimal digit string, not a double literal. + cpp_dec_float_50 r; + r = lambert_w0(z); + std::cout << "lambert_w0("; + show_value(z); + std::cout << ") = "; show_value(r); + std::cout << std::endl; + // lambert_w0(10.000000000000000000000000000000000000000000000000000000000000000000000000000000) = + // 1.7455280027406993830743012648753899115352881290809413313533156788409111570000000 + //] //[/lambert_w_simple_examples_3] + } + { + //[lambert_w_simple_examples_4 + // Using multiprecision types to get multiprecision precision wrong! + cpp_dec_float_50 z(0.9); // Will convert to double, losing precision beyond decimal place 17! + cpp_dec_float_50 r; + r = lambert_w0(z); + std::cout << "lambert_w0("; + show_value(z); + std::cout << ") = "; show_value(r); + std::cout << std::endl; + // lambert_w0(0.90000000000000002220446049250313080847263336181640625000000000000000000000000000) + // = 0.52983296563343442067798493880332411646762461354815017917592839379740431483218821 + std::cout << "lambert_w0(0.9) = " << lambert_w0(static_cast(z)) // 0.52983296563343441 + << std::endl; + //] //[/lambert_w_simple_examples_4] + } + { + //[lambert_w_simple_examples_4a + // Using multiprecision types to get multiprecision precision right! + cpp_dec_float_50 z("0.9"); // Construct from decimal digit string. + cpp_dec_float_50 r; + r = lambert_w0(z); + std::cout << "lambert_w0("; + show_value(z); + std::cout << ") = "; show_value(r); + std::cout << std::endl; + // 0.90000000000000000000000000000000000000000000000000000000000000000000000000000000) + // = 0.52983296563343441213336643954546304857788132269804249284012528304239956432480864 + //] //[/lambert_w_simple_examples_4a] + } + { +//[lambert_w_simple_examples_precision_policies + double z = 5.; + // Define a new, non-default, policy to calculate to precision of approximately 3 decimal digits. + std::cout << "lambert_w0(" << z << ", policy>()) = " << lambert_w0(z, policy>()) + << std::endl; // lambert_w0(0.29999999999999999, policy>()) = 0.23675531078855935 +//] //[/lambert_w_simple_examples_precision_policies] + +//[lambert_w_simple_examples_error_policies + // Define an error handling policy: + typedef policy< + domain_error, + overflow_error + > throw_policy; + + std::cout << "Lambert W (" << z << ") = " << lambert_w0(z) << std::endl; // 0.23675531078855930 + std::cout << "\nLambert W (" << z << ", throw_policy()) = " << lambert_w0(z, throw_policy()) << std::endl; + //] //[/lambert_w_simple_example_error_policies] + } + { + //[lambert_w_simple_examples_out_of_range + // Show error reporting if pass a value to lambert_w0 that is out of range, + // and probably was meant to be passed to lambert_m1 instead. + double z = -1.; + double r = lambert_w0(z); + std::cout << "lambert_w0(-1.) = " << r << std::endl; + // Error in function boost::math::lambert_w0(): + // Argument z = %1 out of range (-1/e <= z < (std::numeric_limits::max)()) + // for Lambert W0 branch (use W-1 branch?). +//] [/lambert_w_simple_examples_out_of_range] + } + } + catch (std::exception& ex) + { + std::cout << ex.what() << std::endl; + } +} // int main() + + /* + + Output: +//[lambert_w_simple_examples_error_message_1 + Error in function boost::math::lambert_w0(): + Argument z = %1 out of range (-1/e <= z < (std::numeric_limits::max)()) + for Lambert W0 branch + (use W-1 branch?). +//] [/lambert_w_simple_examples_error_message_1] + + /* + + + */ + + diff --git a/include/boost/math/special_functions/lambert_w.hpp b/include/boost/math/special_functions/lambert_w.hpp index 178e35c45..085c9ca2b 100644 --- a/include/boost/math/special_functions/lambert_w.hpp +++ b/include/boost/math/special_functions/lambert_w.hpp @@ -31,8 +31,8 @@ BOOST_MATH_INSTRUMENT_LAMBERT_W_SMALL_Z_SERIES_ITERATIONS // Show evaluation of #define BOOST_MATH_INSTRUMENT_LAMBERT_W0_LOOKUP // Show results from lookup table. */ -//#ifndef BOOST_MATH_SF_LAMBERT_W_HPP -//#define BOOST_MATH_SF_LAMBERT_W_HPP +#ifndef BOOST_MATH_SF_LAMBERT_W_HPP +#define BOOST_MATH_SF_LAMBERT_W_HPP #ifdef _MSC_VER # pragma warning (disable: 4127) // warning C4127: conditional expression is constant @@ -1406,4 +1406,4 @@ if (diff == 0) // Exact result - common. } // namespace math } // namespace boost -//#endif // #ifndef BOOST_MATH_SF_LAMBERT_W_HPP +#endif // #ifndef BOOST_MATH_SF_LAMBERT_W_HPP diff --git a/test/lambert_w_high_reference_values.cpp b/test/lambert_w_high_reference_values.cpp new file mode 100644 index 000000000..5085a2dac --- /dev/null +++ b/test/lambert_w_high_reference_values.cpp @@ -0,0 +1,182 @@ +// \modular-boost\libs\math\test\lambert_w_high_reference_values.cpp + +// Copyright Paul A. Bristow 2017. +// 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) + +// Write a C++ file \lambert_w_mp_hi_values.ipp +// containing arrays of z arguments and 100 decimal digit precision lambert_w0(z) reference values. +// These can be used in tests of precision of less-precise types like +// built-in float, double, long double and quad and cpp_dec_float_50. + +// These cover the range from 0.5 to (std::numeric_limits<>::max)(); +// The Fukushima algorithm changes from a series function for all z > 0.5. + +// Multiprecision types: +//#include +#include // boost::multiprecision::cpp_dec_float_100 +using boost::multiprecision::cpp_dec_float_100; + +#include // +using boost::math::lambert_w0; +using boost::math::lambert_wm1; + +#include +// using std::cout; using std::std::endl; using std::ios; using std::std::cerr; +#include +using std::setprecision; +using std::showpoint; +#include +using std::ofstream; +#include +#include // for DBL_EPS etc +#include // for numeric limits. +//#include +#include + +const long double eps = std::numeric_limits::epsilon(); + +// Creates if no file exists, & uses default overwrite/ ios::replace. +const char filename[] = "lambert_w_high_reference_values.ipp"; // +std::ofstream fout(filename, std::ios::out); + +typedef cpp_dec_float_100 RealType; // 100 decimal digits for the value fed to macro BOOST_MATH_TEST_VALUE. +// Could also use cpp_dec_float_50 or cpp_bin_float types. + +const int no_of_tests = 450; // 500 overflows float. + +static const float min_z = 0.5F; // for element[0] + +int main() +{ // Make C++ file containing Lambert W test values. + std::cout << filename << " "; + std::cout << std::endl; + std::cout << "Lambert W0 decimal digit precision values for high z argument values." << std::endl; + + if (!fout.is_open()) + { // File failed to open OK. + std::cerr << "Open file " << filename << " failed!" << std::endl; + std::cerr << "errno " << errno << std::endl; + return -1; + } + try + { + int output_precision = std::numeric_limits::digits10; + // cpp_dec_float_100 is ample precision and + // has several extra bits internally so max_digits10 are not needed. + fout.precision(output_precision); + fout << std::showpoint << std::endl; // Don't show trailing zeros. + + // Intro for RealType values. + std::cout << "Lambert W test values written to file " << filename << std::endl; + fout << + "\n" + "// A collection of big Lambert W test values computed using " + << output_precision << " decimal digits precision.\n" + "// C++ floating-point type is " << "RealType." "\n" + "\n" + "// Written by " << __FILE__ << " " << __TIMESTAMP__ << "\n" + + "\n" + "// Copyright Paul A. Bristow 2017." "\n" + "// Distributed under the Boost Software License, Version 1.0." "\n" + "// (See accompanying file LICENSE_1_0.txt" "\n" + "// or copy at http://www.boost.org/LICENSE_1_0.txt)" "\n" + << std::endl; + + fout << "// Size of arrays of arguments z and Lambert W" << std::endl; + fout << "static const unsigned int noof_tests = " << no_of_tests << ";" << std::endl; + + // Declare arrays of z and Lambert W. + fout << "\n// Declare arrays of arguments z and Lambert W(z)" << std::endl; + fout << + "\n" + "template ""\n" + "static RealType zs[" << no_of_tests << "];" + << std::endl; + + fout << + "\n" + "template ""\n" + "static RealType ws[" << no_of_tests << "];" + << std::endl; + + fout << "// The values are defined using the macro BOOST_MATH_TEST_VALUE to ensure\n" + "// that both built-in and multiprecision types are correctly initialiased with full precision.\n" + "// built-in types like float, double require a floating-point literal like 3.14,\n" + "// but multiprecision types require a decimal digit string like \"3.14\".\n" + "// Numerical values are chosen to avoid exactly representable values." + << std::endl; + + static const RealType min_z = 0.6; // for element[0] + + const RealType max_z = (std::numeric_limits::max)() / 10; // (std::numeric_limits::max)() to make sure is OK for all floating-point types. + // Less a bit as lambert_w0(max) may be inaccurate. + const RealType step_size = 0.5F; // Increment step size. + const RealType step_factor = 2.f; // Multiple factor, typically 2, 5 or 10. + const int step_modulo = 5; + + RealType z = min_z; + + // Output function to initialize array of arguments z and Lambert W. + fout << + "\n" + << "template \n" + "void init_zws()\n" + "{\n"; + + for (size_t index = 0; (index != no_of_tests); index++) + { + fout + << " zs[" << index << "] = BOOST_MATH_TEST_VALUE(RealType, " + << z // Since start with converting a float may get lots of usefully random digits. + << ");" + << std::endl; + + fout + << " ws[" << index << "] = BOOST_MATH_TEST_VALUE(RealType, " + << lambert_w0(z) + << ");" + << std::endl; + + if ((index % step_modulo) == 0) + { + z *= step_factor; // + } + z += step_size; + if (z >= max_z) + { // Don't go over max for float. + std::cout << "too big z" << std::endl; + break; + } + } // for index + fout << "};" << std::endl; + + fout << "// End of lambert_w_mp_high_values.ipp " << std::endl; + } + catch (std::exception& ex) + { + std::cout << "Exception " << ex.what() << std::endl; + } + + fout.close(); + + std::cout << no_of_tests << " Lambert_w0 values written to files " << __TIMESTAMP__ << std::endl; + return 0; +} // main + + +/* +A few spot checks again Wolfram: + + zs[1] = BOOST_MATH_TEST_VALUE(RealType, 1.6999999999999999555910790149937383830547332763671875); + ws[1] = BOOST_MATH_TEST_VALUE(RealType, 0.7796011225311008662356536916883580556792500749037209859530390902424444585607630246126725241921761054); + Wolfram 0.7796011225311008662356536916883580556792500749037209859530390902424444585607630246126725241921761054 + + zs[99] = BOOST_MATH_TEST_VALUE(RealType, 3250582.599999999976716935634613037109375); + ws[99] = BOOST_MATH_TEST_VALUE(RealType, 12.47094339016839065212822905567651460418204106065566910956134121802725695306834966790193342511971825); + Wolfram 12.47094339016839065212822905567651460418204106065566910956134121802725695306834966790193342511971825 + +*/ + diff --git a/test/lambert_w_high_reference_values.ipp b/test/lambert_w_high_reference_values.ipp new file mode 100644 index 000000000..bcbd824ba --- /dev/null +++ b/test/lambert_w_high_reference_values.ipp @@ -0,0 +1,933 @@ + + +// A collection of big Lambert W test values computed using 100 decimal digits precision. +// C++ floating-point type is RealType. + +// Written by I:\modular-boost\libs\math\test\lambert_w_high_reference_values.cpp Tue Oct 10 14:32:47 2017 + +// Copyright Paul A. Bristow 2017. +// 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) + +// Size of arrays of arguments z and Lambert W +static const unsigned int noof_tests = 450; + +// Declare arrays of arguments z and Lambert W(z) + +template +static RealType zs[450]; + +template +static RealType ws[450]; +// The values are defined using the macro BOOST_MATH_TEST_VALUE to ensure +// that both built-in and multiprecision types are correctly initialiased with full precision. +// built-in types like float, double require a floating-point literal like 3.14, +// but multiprecision types require a decimal digit string like "3.14". +// Numerical values are chosen to avoid exactly representable values. + +template +void init_zws() +{ + zs[0] = BOOST_MATH_TEST_VALUE(RealType, 0.5999999999999999777955395074968691915273666381835937500000000000000000000000000000000000000000000000); + ws[0] = BOOST_MATH_TEST_VALUE(RealType, 0.4015636367870725840596232119093618401250821463765781307144089819032551434525179709162089487011544152); + zs[1] = BOOST_MATH_TEST_VALUE(RealType, 1.699999999999999955591079014993738383054733276367187500000000000000000000000000000000000000000000000); + ws[1] = BOOST_MATH_TEST_VALUE(RealType, 0.7796011225311008662356536916883580556792500749037209859530390902424444585607630246126725241921761054); + zs[2] = BOOST_MATH_TEST_VALUE(RealType, 2.199999999999999955591079014993738383054733276367187500000000000000000000000000000000000000000000000); + ws[2] = BOOST_MATH_TEST_VALUE(RealType, 0.8970741340486472832529094012483877796469756302241005331449133504770916140694317158875490176641388180); + zs[3] = BOOST_MATH_TEST_VALUE(RealType, 2.699999999999999955591079014993738383054733276367187500000000000000000000000000000000000000000000000); + ws[3] = BOOST_MATH_TEST_VALUE(RealType, 0.9966287342654774578203091807272871494846015619689842252588224928604557045580020903399140826514419525); + zs[4] = BOOST_MATH_TEST_VALUE(RealType, 3.199999999999999955591079014993738383054733276367187500000000000000000000000000000000000000000000000); + ws[4] = BOOST_MATH_TEST_VALUE(RealType, 1.083216216147652072726562700563454011684986526601600660806443834509711499483389930134543612892458143); + zs[5] = BOOST_MATH_TEST_VALUE(RealType, 3.699999999999999955591079014993738383054733276367187500000000000000000000000000000000000000000000000); + ws[5] = BOOST_MATH_TEST_VALUE(RealType, 1.159953178612022143701086341067113318247085320992117266262618001908576504625710753138135645536760705); + zs[6] = BOOST_MATH_TEST_VALUE(RealType, 7.899999999999999911182158029987476766109466552734375000000000000000000000000000000000000000000000000); + ws[6] = BOOST_MATH_TEST_VALUE(RealType, 1.598067606240196984785534680781403865575242180069554020841247076138095065416648450279328891063284787); + zs[7] = BOOST_MATH_TEST_VALUE(RealType, 8.399999999999999911182158029987476766109466552734375000000000000000000000000000000000000000000000000); + ws[7] = BOOST_MATH_TEST_VALUE(RealType, 1.635986015616761306128656680352102711658504330413761752847915150776296724715125185878789170353595843); + zs[8] = BOOST_MATH_TEST_VALUE(RealType, 8.899999999999999911182158029987476766109466552734375000000000000000000000000000000000000000000000000); + ws[8] = BOOST_MATH_TEST_VALUE(RealType, 1.672019249364215143714449427934723990551745560176619694762404483433765553308432498126823728454150807); + zs[9] = BOOST_MATH_TEST_VALUE(RealType, 9.399999999999999911182158029987476766109466552734375000000000000000000000000000000000000000000000000); + ws[9] = BOOST_MATH_TEST_VALUE(RealType, 1.706351956427362203924265356724807963736463682858697517135613748929048683757986880699421428246987716); + zs[10] = BOOST_MATH_TEST_VALUE(RealType, 9.899999999999999911182158029987476766109466552734375000000000000000000000000000000000000000000000000); + ws[10] = BOOST_MATH_TEST_VALUE(RealType, 1.739142551733351601404562031720166836256093578556407891184787967858395290655747464534386031726054901); + zs[11] = BOOST_MATH_TEST_VALUE(RealType, 20.29999999999999982236431605997495353221893310546875000000000000000000000000000000000000000000000000); + ws[11] = BOOST_MATH_TEST_VALUE(RealType, 2.215253873529547121281024099654049024258898512352506053956048219674735189566735605935868519028886428); + zs[12] = BOOST_MATH_TEST_VALUE(RealType, 20.79999999999999982236431605997495353221893310546875000000000000000000000000000000000000000000000000); + ws[12] = BOOST_MATH_TEST_VALUE(RealType, 2.232037942848570707824689153745947970289311384094147352193787995777039984911477501437729555943891179); + zs[13] = BOOST_MATH_TEST_VALUE(RealType, 21.29999999999999982236431605997495353221893310546875000000000000000000000000000000000000000000000000); + ws[13] = BOOST_MATH_TEST_VALUE(RealType, 2.248461062664032810797682669829614177334474567497410976269795770382256291948680343286055598456930946); + zs[14] = BOOST_MATH_TEST_VALUE(RealType, 21.79999999999999982236431605997495353221893310546875000000000000000000000000000000000000000000000000); + ws[14] = BOOST_MATH_TEST_VALUE(RealType, 2.264538836003641674575766487227130628592151315874095763183468118573707558576164351416415105283538250); + zs[15] = BOOST_MATH_TEST_VALUE(RealType, 22.29999999999999982236431605997495353221893310546875000000000000000000000000000000000000000000000000); + ws[15] = BOOST_MATH_TEST_VALUE(RealType, 2.280285864286149926152034464925849817265625703056626970221292432804223262557041139245862876595960246); + zs[16] = BOOST_MATH_TEST_VALUE(RealType, 45.09999999999999964472863211994990706443786621093750000000000000000000000000000000000000000000000000); + ws[16] = BOOST_MATH_TEST_VALUE(RealType, 2.784730975471531592298228296023808374578957621993717936291403085791375505867336041880555203144734624); + zs[17] = BOOST_MATH_TEST_VALUE(RealType, 45.59999999999999964472863211994990706443786621093750000000000000000000000000000000000000000000000000); + ws[17] = BOOST_MATH_TEST_VALUE(RealType, 2.792846418923343663453351656549736190861671652329623509279809945695836105896108078166742811990549890); + zs[18] = BOOST_MATH_TEST_VALUE(RealType, 46.09999999999999964472863211994990706443786621093750000000000000000000000000000000000000000000000000); + ws[18] = BOOST_MATH_TEST_VALUE(RealType, 2.800879481577357402817907432620737944445117856442267934361375865486347844977822691465905776042660153); + zs[19] = BOOST_MATH_TEST_VALUE(RealType, 46.59999999999999964472863211994990706443786621093750000000000000000000000000000000000000000000000000); + ws[19] = BOOST_MATH_TEST_VALUE(RealType, 2.808831854396542967901795549912651228215931108039763441789870364477609029775521508274395566200250327); + zs[20] = BOOST_MATH_TEST_VALUE(RealType, 47.09999999999999964472863211994990706443786621093750000000000000000000000000000000000000000000000000); + ws[20] = BOOST_MATH_TEST_VALUE(RealType, 2.816705176341098453894950633365766251645928038203952811501285665902169257597881259137118085186909385); + zs[21] = BOOST_MATH_TEST_VALUE(RealType, 94.69999999999999928945726423989981412887573242187500000000000000000000000000000000000000000000000000); + ws[21] = BOOST_MATH_TEST_VALUE(RealType, 3.343650750934026694453868349588423323594970057683998463032955783031328100668795635364027627344237744); + zs[22] = BOOST_MATH_TEST_VALUE(RealType, 95.19999999999999928945726423989981412887573242187500000000000000000000000000000000000000000000000000); + ws[22] = BOOST_MATH_TEST_VALUE(RealType, 3.347704927126314354014952127881909800322435946123852141764728005964807369865451182872647651261526300); + zs[23] = BOOST_MATH_TEST_VALUE(RealType, 95.69999999999999928945726423989981412887573242187500000000000000000000000000000000000000000000000000); + ws[23] = BOOST_MATH_TEST_VALUE(RealType, 3.351738986777429550093016062864573016038852034507491269297237351947364962103400790753443005963042748); + zs[24] = BOOST_MATH_TEST_VALUE(RealType, 96.19999999999999928945726423989981412887573242187500000000000000000000000000000000000000000000000000); + ws[24] = BOOST_MATH_TEST_VALUE(RealType, 3.355753131971562146591617562968067128167583310591520027232903513337163599725129242852363808925517286); + zs[25] = BOOST_MATH_TEST_VALUE(RealType, 96.69999999999999928945726423989981412887573242187500000000000000000000000000000000000000000000000000); + ws[25] = BOOST_MATH_TEST_VALUE(RealType, 3.359747561740841558826391853676861600267695314122615815793967179881207925371616384184099572300595115); + zs[26] = BOOST_MATH_TEST_VALUE(RealType, 193.8999999999999985789145284797996282577514648437500000000000000000000000000000000000000000000000000); + ws[26] = BOOST_MATH_TEST_VALUE(RealType, 3.905067494884853812892253268046191881524005958444131697564696414502793024379297479024372424749155738); + zs[27] = BOOST_MATH_TEST_VALUE(RealType, 194.3999999999999985789145284797996282577514648437500000000000000000000000000000000000000000000000000); + ws[27] = BOOST_MATH_TEST_VALUE(RealType, 3.907117899842841728838668195110205529083454921828289550856799078486258603076095983089478749398791291); + zs[28] = BOOST_MATH_TEST_VALUE(RealType, 194.8999999999999985789145284797996282577514648437500000000000000000000000000000000000000000000000000); + ws[28] = BOOST_MATH_TEST_VALUE(RealType, 3.909163256350964853423766659493861241213806026764267552120249985812650869611378163906691630909022161); + zs[29] = BOOST_MATH_TEST_VALUE(RealType, 195.3999999999999985789145284797996282577514648437500000000000000000000000000000000000000000000000000); + ws[29] = BOOST_MATH_TEST_VALUE(RealType, 3.911203589561939804120818106435026078510094046010650488053868908640181610985462139185885264355418070); + zs[30] = BOOST_MATH_TEST_VALUE(RealType, 195.8999999999999985789145284797996282577514648437500000000000000000000000000000000000000000000000000); + ws[30] = BOOST_MATH_TEST_VALUE(RealType, 3.913238924439855435510247090467540747905833384629853846395096935851013937767959235773727554750691716); + zs[31] = BOOST_MATH_TEST_VALUE(RealType, 392.2999999999999971578290569595992565155029296875000000000000000000000000000000000000000000000000000); + ws[31] = BOOST_MATH_TEST_VALUE(RealType, 4.473790759373999449370836932900380698603499930598355812583693103082314531706325269694063530407295371); + zs[32] = BOOST_MATH_TEST_VALUE(RealType, 392.7999999999999971578290569595992565155029296875000000000000000000000000000000000000000000000000000); + ws[32] = BOOST_MATH_TEST_VALUE(RealType, 4.474831809850706594148527116907834093420614735070734923094248837531977152944616462128228522597237267); + zs[33] = BOOST_MATH_TEST_VALUE(RealType, 393.2999999999999971578290569595992565155029296875000000000000000000000000000000000000000000000000000); + ws[33] = BOOST_MATH_TEST_VALUE(RealType, 4.475871580159411118557716684955449097432917202595361508172914971791116938813457453917365177551691682); + zs[34] = BOOST_MATH_TEST_VALUE(RealType, 393.7999999999999971578290569595992565155029296875000000000000000000000000000000000000000000000000000); + ws[34] = BOOST_MATH_TEST_VALUE(RealType, 4.476910073482067128895548362807270116617425992201334451790294796151311859601136186866422234634474300); + zs[35] = BOOST_MATH_TEST_VALUE(RealType, 394.2999999999999971578290569595992565155029296875000000000000000000000000000000000000000000000000000); + ws[35] = BOOST_MATH_TEST_VALUE(RealType, 4.477947292988721649990662195165267393745885698851422229805500000725367834662498733709056508177586635); + zs[36] = BOOST_MATH_TEST_VALUE(RealType, 789.0999999999999943156581139191985130310058593750000000000000000000000000000000000000000000000000000); + ws[36] = BOOST_MATH_TEST_VALUE(RealType, 5.051256108760896701894497014701900464234767080894666089938550993707446937559086016796794249885331870); + zs[37] = BOOST_MATH_TEST_VALUE(RealType, 789.5999999999999943156581139191985130310058593750000000000000000000000000000000000000000000000000000); + ws[37] = BOOST_MATH_TEST_VALUE(RealType, 5.051784868057603576951613257575983601901987808830448747962646970040648657993520282283444052127887316); + zs[38] = BOOST_MATH_TEST_VALUE(RealType, 790.0999999999999943156581139191985130310058593750000000000000000000000000000000000000000000000000000); + ws[38] = BOOST_MATH_TEST_VALUE(RealType, 5.052313301769511279751645919401950992205691275454166720959640667514665636089541176437079485020106302); + zs[39] = BOOST_MATH_TEST_VALUE(RealType, 790.5999999999999943156581139191985130310058593750000000000000000000000000000000000000000000000000000); + ws[39] = BOOST_MATH_TEST_VALUE(RealType, 5.052841410301356078567942312344300154667895407100576839086958094315459736887113324816418833061471414); + zs[40] = BOOST_MATH_TEST_VALUE(RealType, 791.0999999999999943156581139191985130310058593750000000000000000000000000000000000000000000000000000); + ws[40] = BOOST_MATH_TEST_VALUE(RealType, 5.053369194057116916125095352093384287199494222654442252497641737159855576046108292479434106853949424); + zs[41] = BOOST_MATH_TEST_VALUE(RealType, 1582.699999999999988631316227838397026062011718750000000000000000000000000000000000000000000000000000); + ws[41] = BOOST_MATH_TEST_VALUE(RealType, 5.637454835061548840266762838608075961241621341710147974330149448636747596037634477093772466715414237); + zs[42] = BOOST_MATH_TEST_VALUE(RealType, 1583.199999999999988631316227838397026062011718750000000000000000000000000000000000000000000000000000); + ws[42] = BOOST_MATH_TEST_VALUE(RealType, 5.637723113558296965227371679987485292172631743514584329014143690566703873701821724552724491259434917); + zs[43] = BOOST_MATH_TEST_VALUE(RealType, 1583.699999999999988631316227838397026062011718750000000000000000000000000000000000000000000000000000); + ws[43] = BOOST_MATH_TEST_VALUE(RealType, 5.637991309264171414360659662528863849150184273111159470910102371892495978961903358821307687677635837); + zs[44] = BOOST_MATH_TEST_VALUE(RealType, 1584.199999999999988631316227838397026062011718750000000000000000000000000000000000000000000000000000); + ws[44] = BOOST_MATH_TEST_VALUE(RealType, 5.638259422230692585112176850810679719906543165397130936013277468573934642794738015313302920143170105); + zs[45] = BOOST_MATH_TEST_VALUE(RealType, 1584.699999999999988631316227838397026062011718750000000000000000000000000000000000000000000000000000); + ws[45] = BOOST_MATH_TEST_VALUE(RealType, 5.638527452509332631758526797455952459448323578747282813479742362912515476029842704193513987433394644); + zs[46] = BOOST_MATH_TEST_VALUE(RealType, 3169.899999999999977262632455676794052124023437500000000000000000000000000000000000000000000000000000); + ws[46] = BOOST_MATH_TEST_VALUE(RealType, 6.231791473267630119617879242959215790063493036893226016268939602113573649847295482162112707750032205); + zs[47] = BOOST_MATH_TEST_VALUE(RealType, 3170.399999999999977262632455676794052124023437500000000000000000000000000000000000000000000000000000); + ws[47] = BOOST_MATH_TEST_VALUE(RealType, 6.231927385287213295870608336780291881793156334477048126729390997875392137109426481813143445559537548); + zs[48] = BOOST_MATH_TEST_VALUE(RealType, 3170.899999999999977262632455676794052124023437500000000000000000000000000000000000000000000000000000); + ws[48] = BOOST_MATH_TEST_VALUE(RealType, 6.232063276283731898910298571907046320310117335045161587714712693774590117520030116772150624981197754); + zs[49] = BOOST_MATH_TEST_VALUE(RealType, 3171.399999999999977262632455676794052124023437500000000000000000000000000000000000000000000000000000); + ws[49] = BOOST_MATH_TEST_VALUE(RealType, 6.232199146263736642645449823754129665166787360756180379390602947566154676495717638352300033758537319); + zs[50] = BOOST_MATH_TEST_VALUE(RealType, 3171.899999999999977262632455676794052124023437500000000000000000000000000000000000000000000000000000); + ws[50] = BOOST_MATH_TEST_VALUE(RealType, 6.232334995233775170638824027293638315162522524016381054824777727129130712726670908695639061242466679); + zs[51] = BOOST_MATH_TEST_VALUE(RealType, 6344.299999999999954525264911353588104248046875000000000000000000000000000000000000000000000000000000); + ws[51] = BOOST_MATH_TEST_VALUE(RealType, 6.833478246863882246641726870717734354293613258312600642204509694006101911629409462573891987188902394); + zs[52] = BOOST_MATH_TEST_VALUE(RealType, 6344.799999999999954525264911353588104248046875000000000000000000000000000000000000000000000000000000); + ws[52] = BOOST_MATH_TEST_VALUE(RealType, 6.833546994320183648585668463184962739224514055009742694319567301283431438840148992714833003589320204); + zs[53] = BOOST_MATH_TEST_VALUE(RealType, 6345.299999999999954525264911353588104248046875000000000000000000000000000000000000000000000000000000); + ws[53] = BOOST_MATH_TEST_VALUE(RealType, 6.833615736447355580644330241871199203480309206612453771835338393474744796397760691906867357518286300); + zs[54] = BOOST_MATH_TEST_VALUE(RealType, 6345.799999999999954525264911353588104248046875000000000000000000000000000000000000000000000000000000); + ws[54] = BOOST_MATH_TEST_VALUE(RealType, 6.833684473246229472880513750644790479773339419112019177698673979527062571403548057152859520971070532); + zs[55] = BOOST_MATH_TEST_VALUE(RealType, 6346.299999999999954525264911353588104248046875000000000000000000000000000000000000000000000000000000); + ws[55] = BOOST_MATH_TEST_VALUE(RealType, 6.833753204717636560302304979968870884092145760178319785601850619423465965447586003582575169154068642); + zs[56] = BOOST_MATH_TEST_VALUE(RealType, 12693.09999999999990905052982270717620849609375000000000000000000000000000000000000000000000000000000); + ws[56] = BOOST_MATH_TEST_VALUE(RealType, 7.441712782644182656362567954733218054310136462342348107691598780010100425506115311857309428345451583); + zs[57] = BOOST_MATH_TEST_VALUE(RealType, 12693.59999999999990905052982270717620849609375000000000000000000000000000000000000000000000000000000); + ws[57] = BOOST_MATH_TEST_VALUE(RealType, 7.441747507160214264985418199644937473985616288224663570878672057496608603535012780430207292902251849); + zs[58] = BOOST_MATH_TEST_VALUE(RealType, 12694.09999999999990905052982270717620849609375000000000000000000000000000000000000000000000000000000); + ws[58] = BOOST_MATH_TEST_VALUE(RealType, 7.441782230327669457854270012077867036991216446419568353636383337201042455550854674638301527917381460); + zs[59] = BOOST_MATH_TEST_VALUE(RealType, 12694.59999999999990905052982270717620849609375000000000000000000000000000000000000000000000000000000); + ws[59] = BOOST_MATH_TEST_VALUE(RealType, 7.441816952146653566134582734750438863756337927374408689634478920961001428844890048307273438220285103); + zs[60] = BOOST_MATH_TEST_VALUE(RealType, 12695.09999999999990905052982270717620849609375000000000000000000000000000000000000000000000000000000); + ws[60] = BOOST_MATH_TEST_VALUE(RealType, 7.441851672617271908624631672809964354572668086864496527202255560220860635169893350319392062176172956); + zs[61] = BOOST_MATH_TEST_VALUE(RealType, 25390.69999999999981810105964541435241699218750000000000000000000000000000000000000000000000000000000); + ws[61] = BOOST_MATH_TEST_VALUE(RealType, 8.055751887730669404078767770906158058132806188168812278807914210510560983286915475256358360988722249); + zs[62] = BOOST_MATH_TEST_VALUE(RealType, 25391.19999999999981810105964541435241699218750000000000000000000000000000000000000000000000000000000); + ws[62] = BOOST_MATH_TEST_VALUE(RealType, 8.055769405252722224984585767512155671001638813031160420183226603705765994004819084590112882738598672); + zs[63] = BOOST_MATH_TEST_VALUE(RealType, 25391.69999999999981810105964541435241699218750000000000000000000000000000000000000000000000000000000); + ws[63] = BOOST_MATH_TEST_VALUE(RealType, 8.055786922434032119761416627590837471869427434519755833207927697913643222261584517182449368833198187); + zs[64] = BOOST_MATH_TEST_VALUE(RealType, 25392.19999999999981810105964541435241699218750000000000000000000000000000000000000000000000000000000); + ws[64] = BOOST_MATH_TEST_VALUE(RealType, 8.055804439274612409649066171031328348764224415259811919589560542548689157122598047317682477881428519); + zs[65] = BOOST_MATH_TEST_VALUE(RealType, 25392.69999999999981810105964541435241699218750000000000000000000000000000000000000000000000000000000); + ws[65] = BOOST_MATH_TEST_VALUE(RealType, 8.055821955774476415104661363464701307020928082642356236080373490396966544402792637267897239283500728); + zs[66] = BOOST_MATH_TEST_VALUE(RealType, 50785.89999999999963620211929082870483398437500000000000000000000000000000000000000000000000000000000); + ws[66] = BOOST_MATH_TEST_VALUE(RealType, 8.674936078635983017984123951954366186973716699495736629864279614242284857757227515949355498579742855); + zs[67] = BOOST_MATH_TEST_VALUE(RealType, 50786.39999999999963620211929082870483398437500000000000000000000000000000000000000000000000000000000); + ws[67] = BOOST_MATH_TEST_VALUE(RealType, 8.674944906241453706059825549964349902974004039927040359264744515026031399261972506772892769382818801); + zs[68] = BOOST_MATH_TEST_VALUE(RealType, 50786.89999999999963620211929082870483398437500000000000000000000000000000000000000000000000000000000); + ws[68] = BOOST_MATH_TEST_VALUE(RealType, 8.674953733760944136535950689333928914142360745655931032041490757092023706394578714640748394257288035); + zs[69] = BOOST_MATH_TEST_VALUE(RealType, 50787.39999999999963620211929082870483398437500000000000000000000000000000000000000000000000000000000); + ws[69] = BOOST_MATH_TEST_VALUE(RealType, 8.674962561194455991628227539852952953077017660325256919933499525371091080399080487843972214866128384); + zs[70] = BOOST_MATH_TEST_VALUE(RealType, 50787.89999999999963620211929082870483398437500000000000000000000000000000000000000000000000000000000); + ws[70] = BOOST_MATH_TEST_VALUE(RealType, 8.674971388541990953502931535257895802702731784533955912147060505216027254503478909260086842672435376); + zs[71] = BOOST_MATH_TEST_VALUE(RealType, 101576.2999999999992724042385816574096679687500000000000000000000000000000000000000000000000000000000); + ws[71] = BOOST_MATH_TEST_VALUE(RealType, 9.298691796027940703796635264110043143787629375260023629778966472817740701497549236671005785312535137); + zs[72] = BOOST_MATH_TEST_VALUE(RealType, 101576.7999999999992724042385816574096679687500000000000000000000000000000000000000000000000000000000); + ws[72] = BOOST_MATH_TEST_VALUE(RealType, 9.298696240460783074349599408079465706595862952879886273836096426172349132276424038993850275528909958); + zs[73] = BOOST_MATH_TEST_VALUE(RealType, 101577.2999999999992724042385816574096679687500000000000000000000000000000000000000000000000000000000); + ws[73] = BOOST_MATH_TEST_VALUE(RealType, 9.298700684871954559132336105768526810554925567844384854912235341295989207897852971537611849804454104); + zs[74] = BOOST_MATH_TEST_VALUE(RealType, 101577.7999999999992724042385816574096679687500000000000000000000000000000000000000000000000000000000); + ws[74] = BOOST_MATH_TEST_VALUE(RealType, 9.298705129261455370304348674457005008539407510001142864340543902043967324875967473097043636378431136); + zs[75] = BOOST_MATH_TEST_VALUE(RealType, 101578.2999999999992724042385816574096679687500000000000000000000000000000000000000000000000000000000); + ws[75] = BOOST_MATH_TEST_VALUE(RealType, 9.298709573629285720022020159137488905547397121761906103664298171650800509043504137427221381746219971); + zs[76] = BOOST_MATH_TEST_VALUE(RealType, 203157.0999999999985448084771633148193359375000000000000000000000000000000000000000000000000000000000); + ws[76] = BOOST_MATH_TEST_VALUE(RealType, 9.926524439637924502814640096432844232405010548632138451412344878257773957471037720806722776924379539); + zs[77] = BOOST_MATH_TEST_VALUE(RealType, 203157.5999999999985448084771633148193359375000000000000000000000000000000000000000000000000000000000); + ws[77] = BOOST_MATH_TEST_VALUE(RealType, 9.926526675539305999408212665862555525393765588240345090590079743764108100617622492751979808963302929); + zs[78] = BOOST_MATH_TEST_VALUE(RealType, 203158.0999999999985448084771633148193359375000000000000000000000000000000000000000000000000000000000); + ws[78] = BOOST_MATH_TEST_VALUE(RealType, 9.926528911435230720557328431324006644047736665798752128461117587165401958858923779103702189649205849); + zs[79] = BOOST_MATH_TEST_VALUE(RealType, 203158.5999999999985448084771633148193359375000000000000000000000000000000000000000000000000000000000); + ws[79] = BOOST_MATH_TEST_VALUE(RealType, 9.926531147325698692990351270769682423599587366983008197322280565618502972980495987784743296088232692); + zs[80] = BOOST_MATH_TEST_VALUE(RealType, 203159.0999999999985448084771633148193359375000000000000000000000000000000000000000000000000000000000); + ws[80] = BOOST_MATH_TEST_VALUE(RealType, 9.926533383210709943435448417027560593313394713874207050608325275972416603539435687443617960861779968); + zs[81] = BOOST_MATH_TEST_VALUE(RealType, 406318.6999999999970896169543266296386718750000000000000000000000000000000000000000000000000000000000); + ws[81] = BOOST_MATH_TEST_VALUE(RealType, 10.55800844020678300858930169345380918056498196515847559789815847210932705985905912177836375627483410); + zs[82] = BOOST_MATH_TEST_VALUE(RealType, 406319.1999999999970896169543266296386718750000000000000000000000000000000000000000000000000000000000); + ws[82] = BOOST_MATH_TEST_VALUE(RealType, 10.55800956429896255310197650482898317196991260081559124902272662470413320348092630336068243562420612); + zs[83] = BOOST_MATH_TEST_VALUE(RealType, 406319.6999999999970896169543266296386718750000000000000000000000000000000000000000000000000000000000); + ws[83] = BOOST_MATH_TEST_VALUE(RealType, 10.55801068838976919073174818917086439876248092007955187694896892558084843931726958729264479171526918); + zs[84] = BOOST_MATH_TEST_VALUE(RealType, 406320.1999999999970896169543266296386718750000000000000000000000000000000000000000000000000000000000); + ws[84] = BOOST_MATH_TEST_VALUE(RealType, 10.55801181247920292484283725870748463023358051483533901203380901404123382789184489956279108152225757); + zs[85] = BOOST_MATH_TEST_VALUE(RealType, 406320.6999999999970896169543266296386718750000000000000000000000000000000000000000000000000000000000); + ws[85] = BOOST_MATH_TEST_VALUE(RealType, 10.55801293656726375879945184504060224737500313478807503007007909767698116683614226527139047633989602); + zs[86] = BOOST_MATH_TEST_VALUE(RealType, 812641.8999999999941792339086532592773437500000000000000000000000000000000000000000000000000000000000); + ws[86] = BOOST_MATH_TEST_VALUE(RealType, 11.19277715105303335957380751089185510982783382888615163475399731608447432939046539739780186010205819); + zs[87] = BOOST_MATH_TEST_VALUE(RealType, 812642.3999999999941792339086532592773437500000000000000000000000000000000000000000000000000000000000); + ws[87] = BOOST_MATH_TEST_VALUE(RealType, 11.19277771586759068427927907791232978730718798905802091714667366555094578546313245757715733663116681); + zs[88] = BOOST_MATH_TEST_VALUE(RealType, 812642.8999999999941792339086532592773437500000000000000000000000000000000000000000000000000000000000); + ws[88] = BOOST_MATH_TEST_VALUE(RealType, 11.19277828068180282941234300813602678219028255437023366225732009891673392268727353365317316060216307); + zs[89] = BOOST_MATH_TEST_VALUE(RealType, 812643.3999999999941792339086532592773437500000000000000000000000000000000000000000000000000000000000); + ws[89] = BOOST_MATH_TEST_VALUE(RealType, 11.19277884549566979539611569279587635086022997209586259427933274111486838234969448101548392041897529); + zs[90] = BOOST_MATH_TEST_VALUE(RealType, 812643.8999999999941792339086532592773437500000000000000000000000000000000000000000000000000000000000); + ws[90] = BOOST_MATH_TEST_VALUE(RealType, 11.19277941030919158265371274430325256214137887195738215091099754333691681726015244339566835725917388); + zs[91] = BOOST_MATH_TEST_VALUE(RealType, 1625288.299999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000); + ws[91] = BOOST_MATH_TEST_VALUE(RealType, 11.83051367496350653298055098412234220179378826002120373759410524883137483448021534372309124250280047); + zs[92] = BOOST_MATH_TEST_VALUE(RealType, 1625288.799999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000); + ws[92] = BOOST_MATH_TEST_VALUE(RealType, 11.83051395862415209457082318977971516657969184941726425523617075901029866766828046681793457310563883); + zs[93] = BOOST_MATH_TEST_VALUE(RealType, 1625289.299999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000); + ws[93] = BOOST_MATH_TEST_VALUE(RealType, 11.83051424228471092157568395260197960555928287686416745291625975894259102434581858031780382895984480); + zs[94] = BOOST_MATH_TEST_VALUE(RealType, 1625289.799999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000); + ws[94] = BOOST_MATH_TEST_VALUE(RealType, 11.83051452594518301404831336917713066668156156528094910312372347647232811359765848597839160347350790); + zs[95] = BOOST_MATH_TEST_VALUE(RealType, 1625290.299999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000); + ws[95] = BOOST_MATH_TEST_VALUE(RealType, 11.83051480960556837204189148713503938528677530351797077101569714537002853052165595070586086051268476); + zs[96] = BOOST_MATH_TEST_VALUE(RealType, 3250581.099999999976716935634613037109375000000000000000000000000000000000000000000000000000000000000); + ws[96] = BOOST_MATH_TEST_VALUE(RealType, 12.47094296296818886963926120402441135953658337315101944303084986533714570937576415675358344893956724); + zs[97] = BOOST_MATH_TEST_VALUE(RealType, 3250581.599999999976716935634613037109375000000000000000000000000000000000000000000000000000000000000); + ws[97] = BOOST_MATH_TEST_VALUE(RealType, 12.47094310536827791354684005276581162972597260940308218544073416384666193653508004167640448380153389); + zs[98] = BOOST_MATH_TEST_VALUE(RealType, 3250582.099999999976716935634613037109375000000000000000000000000000000000000000000000000000000000000); + ws[98] = BOOST_MATH_TEST_VALUE(RealType, 12.47094324776834517437426924689730750513918775389042001111365883776867938003401942562632403665303867); + zs[99] = BOOST_MATH_TEST_VALUE(RealType, 3250582.599999999976716935634613037109375000000000000000000000000000000000000000000000000000000000000); + ws[99] = BOOST_MATH_TEST_VALUE(RealType, 12.47094339016839065212822905567651460418204106065566910956134121802725695306834966790193342511971825); + zs[100] = BOOST_MATH_TEST_VALUE(RealType, 3250583.099999999976716935634613037109375000000000000000000000000000000000000000000000000000000000000); + ws[100] = BOOST_MATH_TEST_VALUE(RealType, 12.47094353256841434681539974528531469757660901993281429423438578866652694560046559516127568892277702); + zs[101] = BOOST_MATH_TEST_VALUE(RealType, 6501166.699999999953433871269226074218750000000000000000000000000000000000000000000000000000000000000); + ws[101] = BOOST_MATH_TEST_VALUE(RealType, 13.11382518009820116753812472043031659983277915902361747977758246698818963218870351102587174635468138); + zs[102] = BOOST_MATH_TEST_VALUE(RealType, 6501167.199999999953433871269226074218750000000000000000000000000000000000000000000000000000000000000); + ws[102] = BOOST_MATH_TEST_VALUE(RealType, 13.11382525155825542039438232302300244148043560690215658478061719482590950005701713995387903749679862); + zs[103] = BOOST_MATH_TEST_VALUE(RealType, 6501167.699999999953433871269226074218750000000000000000000000000000000000000000000000000000000000000); + ws[103] = BOOST_MATH_TEST_VALUE(RealType, 13.11382532301830420490055394669714665225378812412907655382308789130810346826183238238494205026247934); + zs[104] = BOOST_MATH_TEST_VALUE(RealType, 6501168.199999999953433871269226074218750000000000000000000000000000000000000000000000000000000000000); + ws[104] = BOOST_MATH_TEST_VALUE(RealType, 13.11382539447834752105747833428094533284492363009218919720913636223924531666313533113069940376003390); + zs[105] = BOOST_MATH_TEST_VALUE(RealType, 6501168.699999999953433871269226074218750000000000000000000000000000000000000000000000000000000000000); + ws[105] = BOOST_MATH_TEST_VALUE(RealType, 13.11382546593838536886599422840946554656689837543146085874754543863703505630372640720269904462657597); + zs[106] = BOOST_MATH_TEST_VALUE(RealType, 13002337.89999999990686774253845214843750000000000000000000000000000000000000000000000000000000000000); + ws[106] = BOOST_MATH_TEST_VALUE(RealType, 13.75895020161120780671931348674820949097896740529525960699598966308825998645623474235280989608207426); + zs[107] = BOOST_MATH_TEST_VALUE(RealType, 13002338.39999999990686774253845214843750000000000000000000000000000000000000000000000000000000000000); + ws[107] = BOOST_MATH_TEST_VALUE(RealType, 13.75895023746031789528316024226987524061812679192459530422102497447151229457148397431817422821296573); + zs[108] = BOOST_MATH_TEST_VALUE(RealType, 13002338.89999999990686774253845214843750000000000000000000000000000000000000000000000000000000000000); + ws[108] = BOOST_MATH_TEST_VALUE(RealType, 13.75895027330942661161180008030275959022186764318551714315248259172940117391346074981407903526666876); + zs[109] = BOOST_MATH_TEST_VALUE(RealType, 13002339.39999999990686774253845214843750000000000000000000000000000000000000000000000000000000000000); + ws[109] = BOOST_MATH_TEST_VALUE(RealType, 13.75895030915853395570533826541548036105186387000942779022045956615233350302797407587096919814230872); + zs[110] = BOOST_MATH_TEST_VALUE(RealType, 13002339.89999999990686774253845214843750000000000000000000000000000000000000000000000000000000000000); + ws[110] = BOOST_MATH_TEST_VALUE(RealType, 13.75895034500763992756388006216453398588380356491793568993934227427809822610433476168943506890083264); + zs[111] = BOOST_MATH_TEST_VALUE(RealType, 26004680.29999999981373548507690429687500000000000000000000000000000000000000000000000000000000000000); + ws[111] = BOOST_MATH_TEST_VALUE(RealType, 14.40613306792050284417781173963237397180782490395810703112834440216893801894568593170935318229410890); + zs[112] = BOOST_MATH_TEST_VALUE(RealType, 26004680.79999999981373548507690429687500000000000000000000000000000000000000000000000000000000000000); + ws[112] = BOOST_MATH_TEST_VALUE(RealType, 14.40613308589978129513196522846261186416164678471600282263899627087138088581441641199768735966026721); + zs[113] = BOOST_MATH_TEST_VALUE(RealType, 26004681.29999999981373548507690429687500000000000000000000000000000000000000000000000000000000000000); + ws[113] = BOOST_MATH_TEST_VALUE(RealType, 14.40613310387905940184947896220802688669394773806882218972392634458869861468933663343960564575146049); + zs[114] = BOOST_MATH_TEST_VALUE(RealType, 26004681.79999999981373548507690429687500000000000000000000000000000000000000000000000000000000000000); + ws[114] = BOOST_MATH_TEST_VALUE(RealType, 14.40613312185833716433036614707023490965167453502978925783310059180078511451175950772072935073580417); + zs[115] = BOOST_MATH_TEST_VALUE(RealType, 26004682.29999999981373548507690429687500000000000000000000000000000000000000000000000000000000000000); + ws[115] = BOOST_MATH_TEST_VALUE(RealType, 14.40613313983761458257463998925009132119130606601627537868443064669880766892972378195587657468067971); + zs[116] = BOOST_MATH_TEST_VALUE(RealType, 52009365.09999999962747097015380859375000000000000000000000000000000000000000000000000000000000000000); + ws[116] = BOOST_MATH_TEST_VALUE(RealType, 15.05521023228726997012482201156518637282193264830919527945406914876568997920242700346221079695380120); + zs[117] = BOOST_MATH_TEST_VALUE(RealType, 52009365.59999999962747097015380859375000000000000000000000000000000000000000000000000000000000000000); + ws[117] = BOOST_MATH_TEST_VALUE(RealType, 15.05521024130213601448008511719004686304317399587148372739532783438679535880037848363163034299000680); + zs[118] = BOOST_MATH_TEST_VALUE(RealType, 52009366.09999999962747097015380859375000000000000000000000000000000000000000000000000000000000000000); + ws[118] = BOOST_MATH_TEST_VALUE(RealType, 15.05521025031700197250576749203130491372164140425152090159289103953022449076855552216703380049236381); + zs[119] = BOOST_MATH_TEST_VALUE(RealType, 52009366.59999999962747097015380859375000000000000000000000000000000000000000000000000000000000000000); + ws[119] = BOOST_MATH_TEST_VALUE(RealType, 15.05521025933186784420187079237695573264884951878394949291027777307830551044730470942903907859985247); + zs[120] = BOOST_MATH_TEST_VALUE(RealType, 52009367.09999999962747097015380859375000000000000000000000000000000000000000000000000000000000000000); + ws[120] = BOOST_MATH_TEST_VALUE(RealType, 15.05521026834673362956839667451494683193779819588967935304969871800597790007309597120010839282494067); + zs[121] = BOOST_MATH_TEST_VALUE(RealType, 104018734.6999999992549419403076171875000000000000000000000000000000000000000000000000000000000000000); + ws[121] = BOOST_MATH_TEST_VALUE(RealType, 15.70603645611954384988565703849374122026373428508755081783343271665282590664826044624943527766443724); + zs[122] = BOOST_MATH_TEST_VALUE(RealType, 104018735.1999999992549419403076171875000000000000000000000000000000000000000000000000000000000000000); + ws[122] = BOOST_MATH_TEST_VALUE(RealType, 15.70603646063864032656975241668975461127107196165116494804371210729046808944447344810561150619338235); + zs[123] = BOOST_MATH_TEST_VALUE(RealType, 104018735.6999999992549419403076171875000000000000000000000000000000000000000000000000000000000000000); + ws[123] = BOOST_MATH_TEST_VALUE(RealType, 15.70603646515773678160916860265187423935628996612114399500020977395299556819648453302891654761783891); + zs[124] = BOOST_MATH_TEST_VALUE(RealType, 104018736.1999999992549419403076171875000000000000000000000000000000000000000000000000000000000000000); + ws[124] = BOOST_MATH_TEST_VALUE(RealType, 15.70603646967683321500390580404963095388245044851589624040628425347772179453119739096056755672581358); + zs[125] = BOOST_MATH_TEST_VALUE(RealType, 104018736.6999999992549419403076171875000000000000000000000000000000000000000000000000000000000000000); + ws[125] = BOOST_MATH_TEST_VALUE(RealType, 15.70603647419592962675396422855255261373445463144900248624737121930916887983366690742461452872492017); + zs[126] = BOOST_MATH_TEST_VALUE(RealType, 208037473.8999999985098838806152343750000000000000000000000000000000000000000000000000000000000000000); + ws[126] = BOOST_MATH_TEST_VALUE(RealType, 16.35848223073077299062251727505489121683259009838940921798588655999804611259258002812224135777088225); + zs[127] = BOOST_MATH_TEST_VALUE(RealType, 208037474.3999999985098838806152343750000000000000000000000000000000000000000000000000000000000000000); + ws[127] = BOOST_MATH_TEST_VALUE(RealType, 16.35848223299572857263748180340545017346327532474491820120184954137107185953921166019993001720173076); + zs[128] = BOOST_MATH_TEST_VALUE(RealType, 208037474.8999999985098838806152343750000000000000000000000000000000000000000000000000000000000000000); + ws[128] = BOOST_MATH_TEST_VALUE(RealType, 16.35848223526068414922688843525885798316030222323873469187325647317943052465221773791004107044449214); + zs[129] = BOOST_MATH_TEST_VALUE(RealType, 208037475.3999999985098838806152343750000000000000000000000000000000000000000000000000000000000000000); + ws[129] = BOOST_MATH_TEST_VALUE(RealType, 16.35848223752563972039073719664683805774368875669934675288398977599557153297961083834670781371769393); + zs[130] = BOOST_MATH_TEST_VALUE(RealType, 208037475.8999999985098838806152343750000000000000000000000000000000000000000000000000000000000000000); + ws[130] = BOOST_MATH_TEST_VALUE(RealType, 16.35848223979059528612902811360111362158185991940560941697071272367978154194499902342370856607708754); + zs[131] = BOOST_MATH_TEST_VALUE(RealType, 416074952.2999999970197677612304687500000000000000000000000000000000000000000000000000000000000000000); + ws[131] = BOOST_MATH_TEST_VALUE(RealType, 17.01243162682130034575873110256608416240774650633244657569787078893008324146198524461655542099298038); + zs[132] = BOOST_MATH_TEST_VALUE(RealType, 416074952.7999999970197677612304687500000000000000000000000000000000000000000000000000000000000000000); + ws[132] = BOOST_MATH_TEST_VALUE(RealType, 17.01243162795629150708082853641104106051019632512982699681254455598867301594442867945136512864263362); + zs[133] = BOOST_MATH_TEST_VALUE(RealType, 416074953.2999999970197677612304687500000000000000000000000000000000000000000000000000000000000000000); + ws[133] = BOOST_MATH_TEST_VALUE(RealType, 17.01243162909128266704320348800926473937585791237790855606445141461836852095077452961626092636714582); + zs[134] = BOOST_MATH_TEST_VALUE(RealType, 416074953.7999999970197677612304687500000000000000000000000000000000000000000000000000000000000000000); + ws[134] = BOOST_MATH_TEST_VALUE(RealType, 17.01243163022627382564585596062316405185836375654028401358545369509940490853717120734831332950839378); + zs[135] = BOOST_MATH_TEST_VALUE(RealType, 416074954.2999999970197677612304687500000000000000000000000000000000000000000000000000000000000000000); + ws[135] = BOOST_MATH_TEST_VALUE(RealType, 17.01243163136126498288878595751514783906405969399381198927824453551799680870112429531524827406849599); + zs[136] = BOOST_MATH_TEST_VALUE(RealType, 832149909.0999999940395355224609375000000000000000000000000000000000000000000000000000000000000000000); + ws[136] = BOOST_MATH_TEST_VALUE(RealType, 17.66778049214031531812887566464334167360339296689778348663603985291368769599603595003791335301847127); + zs[137] = BOOST_MATH_TEST_VALUE(RealType, 832149909.5999999940395355224609375000000000000000000000000000000000000000000000000000000000000000000); + ws[137] = BOOST_MATH_TEST_VALUE(RealType, 17.66778049270898194728430180770507660352501688482825963526508387721596470881802640086432444438183220); + zs[138] = BOOST_MATH_TEST_VALUE(RealType, 832149910.0999999940395355224609375000000000000000000000000000000000000000000000000000000000000000000); + ws[138] = BOOST_MATH_TEST_VALUE(RealType, 17.66778049327764857609902322798165858268194375878492382051153135096018706001421025620618302837247343); + zs[139] = BOOST_MATH_TEST_VALUE(RealType, 832149910.5999999940395355224609375000000000000000000000000000000000000000000000000000000000000000000); + ws[139] = BOOST_MATH_TEST_VALUE(RealType, 17.66778049384631520457303992588186753608991034689224716778630078855718157314806355505907287211879952); + zs[140] = BOOST_MATH_TEST_VALUE(RealType, 832149911.0999999940395355224609375000000000000000000000000000000000000000000000000000000000000000000); + ws[140] = BOOST_MATH_TEST_VALUE(RealType, 17.66778049441498183270635190181448338802862077472029294388350982070482138347224074032285443619695132); + zs[141] = BOOST_MATH_TEST_VALUE(RealType, 1664299822.699999988079071044921875000000000000000000000000000000000000000000000000000000000000000000); + ws[141] = BOOST_MATH_TEST_VALUE(RealType, 18.32443493355098619384682217293063408860906200997313752841900524481309067580120995737616551816092439); + zs[142] = BOOST_MATH_TEST_VALUE(RealType, 1664299823.199999988079071044921875000000000000000000000000000000000000000000000000000000000000000000); + ws[142] = BOOST_MATH_TEST_VALUE(RealType, 18.32443493383586636729058593564510700968056859723407482295764411091295912034128445270765389474245827); + zs[143] = BOOST_MATH_TEST_VALUE(RealType, 1664299823.699999988079071044921875000000000000000000000000000000000000000000000000000000000000000000); + ws[143] = BOOST_MATH_TEST_VALUE(RealType, 18.32443493412074654064899329117538024263559388031556198852503241876369903917896474239140595505063322); + zs[144] = BOOST_MATH_TEST_VALUE(RealType, 1664299824.199999988079071044921875000000000000000000000000000000000000000000000000000000000000000000); + ws[144] = BOOST_MATH_TEST_VALUE(RealType, 18.32443493440562671392204423957266503795757499599462266552348787036107193130165331139452279532396827); + zs[145] = BOOST_MATH_TEST_VALUE(RealType, 1664299824.699999988079071044921875000000000000000000000000000000000000000000000000000000000000000000); + ws[145] = BOOST_MATH_TEST_VALUE(RealType, 18.32443493469050688710973878088817264608384098178071957390837672366993756271957964256600743216105241); + zs[146] = BOOST_MATH_TEST_VALUE(RealType, 3328599649.899999976158142089843750000000000000000000000000000000000000000000000000000000000000000000); + ws[146] = BOOST_MATH_TEST_VALUE(RealType, 18.98231003239481891260092191504387611307556374245363459040509191182476364522292852639675828304549626); + zs[147] = BOOST_MATH_TEST_VALUE(RealType, 3328599650.399999976158142089843750000000000000000000000000000000000000000000000000000000000000000000); + ws[147] = BOOST_MATH_TEST_VALUE(RealType, 18.98231003253751491629227276099735868489913807533078209230206170806009818301507483588395812018180071); + zs[148] = BOOST_MATH_TEST_VALUE(RealType, 3328599650.899999976158142089843750000000000000000000000000000000000000000000000000000000000000000000); + ws[148] = BOOST_MATH_TEST_VALUE(RealType, 18.98231003268021091996224244869947622441697585814089764491702992369913535253679093973930949506347048); + zs[149] = BOOST_MATH_TEST_VALUE(RealType, 3328599651.399999976158142089843750000000000000000000000000000000000000000000000000000000000000000000); + ws[149] = BOOST_MATH_TEST_VALUE(RealType, 18.98231003282290692361083097815664339084466388779045270504033488281798754360146784756669433227860478); + zs[150] = BOOST_MATH_TEST_VALUE(RealType, 3328599651.899999976158142089843750000000000000000000000000000000000000000000000000000000000000000000); + ws[150] = BOOST_MATH_TEST_VALUE(RealType, 18.98231003296560292723803834937527484339490103369072191109295056853780039115858285449484374166727442); + zs[151] = BOOST_MATH_TEST_VALUE(RealType, 6657199304.299999952316284179687500000000000000000000000000000000000000000000000000000000000000000000); + ws[151] = BOOST_MATH_TEST_VALUE(RealType, 19.64132875213179003616975291758951989874401990433758371552185122694920942525627888352145273462707829); + zs[152] = BOOST_MATH_TEST_VALUE(RealType, 6657199304.799999952316284179687500000000000000000000000000000000000000000000000000000000000000000000); + ws[152] = BOOST_MATH_TEST_VALUE(RealType, 19.64132875220325804117690436378168767212426802746287406741611709213764258286377104459764498688864645); + zs[153] = BOOST_MATH_TEST_VALUE(RealType, 6657199305.299999952316284179687500000000000000000000000000000000000000000000000000000000000000000000); + ws[153] = BOOST_MATH_TEST_VALUE(RealType, 19.64132875227472604617870068525483911300930564165365547681598983747537164183343994434536282821758671); + zs[154] = BOOST_MATH_TEST_VALUE(RealType, 6657199305.799999952316284179687500000000000000000000000000000000000000000000000000000000000000000000); + ws[154] = BOOST_MATH_TEST_VALUE(RealType, 19.64132875234619405117514188200977760121223842398566254787219879319150457646967224084449244020129346); + zs[155] = BOOST_MATH_TEST_VALUE(RealType, 6657199306.299999952316284179687500000000000000000000000000000000000000000000000000000000000000000000); + ws[155] = BOOST_MATH_TEST_VALUE(RealType, 19.64132875241766205616622795404730651654599119614988454540132958996734683240549999645255105620924194); + zs[156] = BOOST_MATH_TEST_VALUE(RealType, 13314398613.09999990463256835937500000000000000000000000000000000000000000000000000000000000000000000); + ws[156] = BOOST_MATH_TEST_VALUE(RealType, 20.30142100521655914391255442878301089651369196196103134174539854119020213383927831733183603430177342); + zs[157] = BOOST_MATH_TEST_VALUE(RealType, 13314398613.59999990463256835937500000000000000000000000000000000000000000000000000000000000000000000); + ws[157] = BOOST_MATH_TEST_VALUE(RealType, 20.30142100525234952404035395706360529741527156245298468796715007831095483401537550300887615324478886); + zs[158] = BOOST_MATH_TEST_VALUE(RealType, 13314398614.09999990463256835937500000000000000000000000000000000000000000000000000000000000000000000); + ws[158] = BOOST_MATH_TEST_VALUE(RealType, 20.30142100528813990416681239948722494340433727853716710673987742922492342629617928698493424484032660); + zs[159] = BOOST_MATH_TEST_VALUE(RealType, 13314398614.59999990463256835937500000000000000000000000000000000000000000000000000000000000000000000); + ws[159] = BOOST_MATH_TEST_VALUE(RealType, 20.30142100532393028429192975605397043801464163741054316603439612006945607064743419379856370010506017); + zs[160] = BOOST_MATH_TEST_VALUE(RealType, 13314398615.09999990463256835937500000000000000000000000000000000000000000000000000000000000000000000); + ws[160] = BOOST_MATH_TEST_VALUE(RealType, 20.30142100535972066441570602676394238477992584177232532005791683216204582260476049842371709123221255); + zs[161] = BOOST_MATH_TEST_VALUE(RealType, 26628797230.69999980926513671875000000000000000000000000000000000000000000000000000000000000000000000); + ws[161] = BOOST_MATH_TEST_VALUE(RealType, 20.96252285249100030290397518601237584604981130278135272151318314970663709603528431386852754379112730); + zs[162] = BOOST_MATH_TEST_VALUE(RealType, 26628797231.19999980926513671875000000000000000000000000000000000000000000000000000000000000000000000); + ws[162] = BOOST_MATH_TEST_VALUE(RealType, 20.96252285250892202655550269280724503656839238502424605070290458403293889858635506895301235328962628); + zs[163] = BOOST_MATH_TEST_VALUE(RealType, 26628797231.69999980926513671875000000000000000000000000000000000000000000000000000000000000000000000); + ws[163] = BOOST_MATH_TEST_VALUE(RealType, 20.96252285252684375020669438704809175058008607738171622380516384350651954854873527952764745960194675); + zs[164] = BOOST_MATH_TEST_VALUE(RealType, 26628797232.19999980926513671875000000000000000000000000000000000000000000000000000000000000000000000); + ws[164] = BOOST_MATH_TEST_VALUE(RealType, 20.96252285254476547385755026873492858475358446577888309438244123935827841754860782205245677270931493); + zs[165] = BOOST_MATH_TEST_VALUE(RealType, 26628797232.69999980926513671875000000000000000000000000000000000000000000000000000000000000000000000); + ws[165] = BOOST_MATH_TEST_VALUE(RealType, 20.96252285256268719750807033786776813575757892712773332275219858225617530315647886304839621190128467); + zs[166] = BOOST_MATH_TEST_VALUE(RealType, 53257594465.89999961853027343750000000000000000000000000000000000000000000000000000000000000000000000); + ws[166] = BOOST_MATH_TEST_VALUE(RealType, 21.62457581338519341205251851678920458391270655214844894715960888032707282421057623183584027330480633); + zs[167] = BOOST_MATH_TEST_VALUE(RealType, 53257594466.39999961853027343750000000000000000000000000000000000000000000000000000000000000000000000); + ws[167] = BOOST_MATH_TEST_VALUE(RealType, 21.62457581339416678276021956345172476031736610096020431411495093672867810851785199503170153825356689); + zs[168] = BOOST_MATH_TEST_VALUE(RealType, 53257594466.89999961853027343750000000000000000000000000000000000000000000000000000000000000000000000); + ws[168] = BOOST_MATH_TEST_VALUE(RealType, 21.62457581340314015346783652970955706237153204994825959199820337645288096708677451415833137778699486); + zs[169] = BOOST_MATH_TEST_VALUE(RealType, 53257594467.39999961853027343750000000000000000000000000000000000000000000000000000000000000000000000); + ws[169] = BOOST_MATH_TEST_VALUE(RealType, 21.62457581341211352417536941556270306715209214940104899493615505349319261368609864010882236880736924); + zs[170] = BOOST_MATH_TEST_VALUE(RealType, 53257594467.89999961853027343750000000000000000000000000000000000000000000000000000000000000000000000); + ws[170] = BOOST_MATH_TEST_VALUE(RealType, 21.62457581342108689488281822101116435173593410522139124663366619300728455522058827136186640157150006); + zs[171] = BOOST_MATH_TEST_VALUE(RealType, 106515188936.2999992370605468750000000000000000000000000000000000000000000000000000000000000000000000); + ws[171] = BOOST_MATH_TEST_VALUE(RealType, 22.28752626920637793567947968920002916518604504482941952960611736969307899126632949710731838314939535); + zs[172] = BOOST_MATH_TEST_VALUE(RealType, 106515188936.7999992370605468750000000000000000000000000000000000000000000000000000000000000000000000); + ws[172] = BOOST_MATH_TEST_VALUE(RealType, 22.28752626921087052760828375602269251105477904207815836374209426134525952488796027799984818720270105); + zs[173] = BOOST_MATH_TEST_VALUE(RealType, 106515188937.2999992370605468750000000000000000000000000000000000000000000000000000000000000000000000); + ws[173] = BOOST_MATH_TEST_VALUE(RealType, 22.28752626921536311953706677275954356032288516798309826935596847224545105365234647336923162745148650); + zs[174] = BOOST_MATH_TEST_VALUE(RealType, 106515188937.7999992370605468750000000000000000000000000000000000000000000000000000000000000000000000); + ws[174] = BOOST_MATH_TEST_VALUE(RealType, 22.28752626921985571146582873941058251041835477955178166028729368533877454281235062918122417686844554); + zs[175] = BOOST_MATH_TEST_VALUE(RealType, 106515188938.2999992370605468750000000000000000000000000000000000000000000000000000000000000000000000); + ws[175] = BOOST_MATH_TEST_VALUE(RealType, 22.28752626922434830339456965597580955876917923101340004236523230885349136854795158825395309771408668); + zs[176] = BOOST_MATH_TEST_VALUE(RealType, 213030377877.0999984741210937500000000000000000000000000000000000000000000000000000000000000000000000); + ws[176] = BOOST_MATH_TEST_VALUE(RealType, 22.95132494498044370189057193061229322652798069141485425830911821689634860387911575520267236257752886); + zs[177] = BOOST_MATH_TEST_VALUE(RealType, 213030377877.5999984741210937500000000000000000000000000000000000000000000000000000000000000000000000); + ws[177] = BOOST_MATH_TEST_VALUE(RealType, 22.95132494498269279111869452328160161214112251666554529993600600683165630516488115832469896181046045); + zs[178] = BOOST_MATH_TEST_VALUE(RealType, 213030377878.0999984741210937500000000000000000000000000000000000000000000000000000000000000000000000); + ws[178] = BOOST_MATH_TEST_VALUE(RealType, 22.95132494498494188034681184635345858036581911693953330207290531058251991996389235617064799550256701); + zs[179] = BOOST_MATH_TEST_VALUE(RealType, 213030377878.5999984741210937500000000000000000000000000000000000000000000000000000000000000000000000); + ws[179] = BOOST_MATH_TEST_VALUE(RealType, 22.95132494498719096957492389982786415591514868991446226878757600605585200116652511909077437303220322); + zs[180] = BOOST_MATH_TEST_VALUE(RealType, 213030377879.0999984741210937500000000000000000000000000000000000000000000000000000000000000000000000); + ws[180] = BOOST_MATH_TEST_VALUE(RealType, 22.95132494498944005880303068370481836350218943309407900398512057690019248825245765368449728229683978); + zs[181] = BOOST_MATH_TEST_VALUE(RealType, 426060755758.6999969482421875000000000000000000000000000000000000000000000000000000000000000000000000); + ws[181] = BOOST_MATH_TEST_VALUE(RealType, 23.61592645786617198666287725520753845230512592375445890316693635014712570198963226722376898746719788); + zs[182] = BOOST_MATH_TEST_VALUE(RealType, 426060755759.1999969482421875000000000000000000000000000000000000000000000000000000000000000000000000); + ws[182] = BOOST_MATH_TEST_VALUE(RealType, 23.61592645786729785413748555882136649105347335405111452573107829620408251494572350634646372518383704); + zs[183] = BOOST_MATH_TEST_VALUE(RealType, 426060755759.6999969482421875000000000000000000000000000000000000000000000000000000000000000000000000); + ws[183] = BOOST_MATH_TEST_VALUE(RealType, 23.61592645786842372161209254336341886225886040142987940947830085760720112665756558438930745003988259); + zs[184] = BOOST_MATH_TEST_VALUE(RealType, 426060755760.1999969482421875000000000000000000000000000000000000000000000000000000000000000000000000); + ws[184] = BOOST_MATH_TEST_VALUE(RealType, 23.61592645786954958908669820883369556901450401232685427846511608592597720877347644103130699500020980); + zs[185] = BOOST_MATH_TEST_VALUE(RealType, 426060755760.6999969482421875000000000000000000000000000000000000000000000000000000000000000000000000); + ws[185] = BOOST_MATH_TEST_VALUE(RealType, 23.61592645787067545656130255523219661441362113316725652002816962722163580709685521423287347532232663); + zs[186] = BOOST_MATH_TEST_VALUE(RealType, 852121511521.8999938964843750000000000000000000000000000000000000000000000000000000000000000000000000); + ws[186] = BOOST_MATH_TEST_VALUE(RealType, 24.28128892222268328128985001144764937331876138884560895942339750264590092000743925470556345687342935); + zs[187] = BOOST_MATH_TEST_VALUE(RealType, 852121511522.3999938964843750000000000000000000000000000000000000000000000000000000000000000000000000); + ws[187] = BOOST_MATH_TEST_VALUE(RealType, 24.28128892222324684237927811409049669410007439237129556446372910358198486719174460302964062617263997); + zs[188] = BOOST_MATH_TEST_VALUE(RealType, 852121511522.8999938964843750000000000000000000000000000000000000000000000000000000000000000000000000); + ws[188] = BOOST_MATH_TEST_VALUE(RealType, 24.28128892222381040346870588656954830537234790758650044870333521914480895767426200215549894604462944); + zs[189] = BOOST_MATH_TEST_VALUE(RealType, 852121511523.3999938964843750000000000000000000000000000000000000000000000000000000000000000000000000); + ws[189] = BOOST_MATH_TEST_VALUE(RealType, 24.28128892222437396455813332888480420752271669125958665876145325130479060260809395708493929658437074); + zs[190] = BOOST_MATH_TEST_VALUE(RealType, 852121511523.8999938964843750000000000000000000000000000000000000000000000000000000000000000000000000); + ws[190] = BOOST_MATH_TEST_VALUE(RealType, 24.28128892222493752564756044103626440093831550015823616066865071071416085939189362440560522437633662); + zs[191] = BOOST_MATH_TEST_VALUE(RealType, 1704243023048.299987792968750000000000000000000000000000000000000000000000000000000000000000000000000); + ws[191] = BOOST_MATH_TEST_VALUE(RealType, 24.94737360307934242599198887438952878908310927656184464570761925753018240286868931047379101991192915); + zs[192] = BOOST_MATH_TEST_VALUE(RealType, 1704243023048.799987792968750000000000000000000000000000000000000000000000000000000000000000000000000); + ws[192] = BOOST_MATH_TEST_VALUE(RealType, 24.94737360307962450443999814141844483539218897580562586948087460916859526796854661158129821949554554); + zs[193] = BOOST_MATH_TEST_VALUE(RealType, 1704243023049.299987792968750000000000000000000000000000000000000000000000000000000000000000000000000); + ws[193] = BOOST_MATH_TEST_VALUE(RealType, 24.94737360307990658288800732581258578292473970863909517564631259029126397702972526621236324413898654); + zs[194] = BOOST_MATH_TEST_VALUE(RealType, 1704243023049.799987792968750000000000000000000000000000000000000000000000000000000000000000000000000); + ws[194] = BOOST_MATH_TEST_VALUE(RealType, 24.94737360308018866133601642757195163172921046426642186059476077116782502974396487792107071563852968); + zs[195] = BOOST_MATH_TEST_VALUE(RealType, 1704243023050.299987792968750000000000000000000000000000000000000000000000000000000000000000000000000); + ws[195] = BOOST_MATH_TEST_VALUE(RealType, 24.94737360308047073978402544669654238185405023189173260158888945690205253434326923773189194023738864); + zs[196] = BOOST_MATH_TEST_VALUE(RealType, 3408486046101.099975585937500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[196] = BOOST_MATH_TEST_VALUE(RealType, 25.61414461111548947260493867878972043152010342814420318471604738869697286844100478961752318507519036); + zs[197] = BOOST_MATH_TEST_VALUE(RealType, 3408486046101.599975585937500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[197] = BOOST_MATH_TEST_VALUE(RealType, 25.61414461111563065346677642310736687968026218525976239525273457263820521539063299775063487387395491); + zs[198] = BOOST_MATH_TEST_VALUE(RealType, 3408486046102.099975585937500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[198] = BOOST_MATH_TEST_VALUE(RealType, 25.61414461111577183432861414674405116970646776101208949311878694889082271860331380169436692589290008); + zs[199] = BOOST_MATH_TEST_VALUE(RealType, 3408486046102.599975585937500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[199] = BOOST_MATH_TEST_VALUE(RealType, 25.61414461111591301519045184969977330160478305423319389187668123911964696321646253276250725578473047); + zs[200] = BOOST_MATH_TEST_VALUE(RealType, 3408486046103.099975585937500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[200] = BOOST_MATH_TEST_VALUE(RealType, 25.61414461111605419605228953197453327538127096375508233833690347792194785120108760652931053928666785); + zs[201] = BOOST_MATH_TEST_VALUE(RealType, 6816972092206.699951171875000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[201] = BOOST_MATH_TEST_VALUE(RealType, 26.28156863336777149103602875189240858590017172273907420428241974657782598001971183829692697893931030); + zs[202] = BOOST_MATH_TEST_VALUE(RealType, 6816972092207.199951171875000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[202] = BOOST_MATH_TEST_VALUE(RealType, 26.28156863336784214888845714766036358708919247411311945160997461946071687776487761293647943181961882); + zs[203] = BOOST_MATH_TEST_VALUE(RealType, 6816972092207.699951171875000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[203] = BOOST_MATH_TEST_VALUE(RealType, 26.28156863336791280674088553825278629338313564287800253072882363885000489322789589683564459399860775); + zs[204] = BOOST_MATH_TEST_VALUE(RealType, 6816972092208.199951171875000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[204] = BOOST_MATH_TEST_VALUE(RealType, 26.28156863336798346459331392366967670478275989571118963232699709422043712865525671390927105068828991); + zs[205] = BOOST_MATH_TEST_VALUE(RealType, 6816972092208.699951171875000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[205] = BOOST_MATH_TEST_VALUE(RealType, 26.28156863336805412244574230391103482128882389929014678023920695547828528484685657699485259769208741); + zs[206] = BOOST_MATH_TEST_VALUE(RealType, 13633944184417.89990234375000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[206] = BOOST_MATH_TEST_VALUE(RealType, 26.94961469479482406519801256975073261795345435020419867463744516732345674294492529228061805959732327); + zs[207] = BOOST_MATH_TEST_VALUE(RealType, 13633944184418.39990234375000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[207] = BOOST_MATH_TEST_VALUE(RealType, 26.94961469479485942625415366326146401152634296784764225669862897123975110273521017330868675363150448); + zs[208] = BOOST_MATH_TEST_VALUE(RealType, 13633944184418.89990234375000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[208] = BOOST_MATH_TEST_VALUE(RealType, 26.94961469479489478731029475547705331300159611152098923590641458690234001429707091782045185453438171); + zs[209] = BOOST_MATH_TEST_VALUE(RealType, 13633944184419.39990234375000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[209] = BOOST_MATH_TEST_VALUE(RealType, 26.94961469479493014836643584639750052237930871016343368359473040533580595453533790563068986805724019); + zs[210] = BOOST_MATH_TEST_VALUE(RealType, 13633944184419.89990234375000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[210] = BOOST_MATH_TEST_VALUE(RealType, 26.94961469479496550942257693602280563965957569271416966065840246264353271487273203593602827136860754); + zs[211] = BOOST_MATH_TEST_VALUE(RealType, 27267888368840.29980468750000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[211] = BOOST_MATH_TEST_VALUE(RealType, 27.61825394658132365321120256576467284757880630504909781214698429280000692432972722344046738139460516); + zs[212] = BOOST_MATH_TEST_VALUE(RealType, 27267888368840.79980468750000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[212] = BOOST_MATH_TEST_VALUE(RealType, 27.61825394658134134906748186542924183870772699960645627424489223278978300139646551878816289033156892); + zs[213] = BOOST_MATH_TEST_VALUE(RealType, 27267888368841.29980468750000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[213] = BOOST_MATH_TEST_VALUE(RealType, 27.61825394658135904492376116476972541669907157102168356799570843777496579434166012376207829201011287); + zs[214] = BOOST_MATH_TEST_VALUE(RealType, 27267888368841.79980468750000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[214] = BOOST_MATH_TEST_VALUE(RealType, 27.61825394658137674078004046378612358155285189678948212439453829367032310042341489097274555293104964); + zs[215] = BOOST_MATH_TEST_VALUE(RealType, 27267888368842.29980468750000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[215] = BOOST_MATH_TEST_VALUE(RealType, 27.61825394658139443663631976247843633326907985440455437378340280356184152787821056110486626668344188); + zs[216] = BOOST_MATH_TEST_VALUE(RealType, 54535776737685.09960937500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[216] = BOOST_MATH_TEST_VALUE(RealType, 28.28745947768658520727223095526336163825405277084208702812195528505679434221769385747727596125338626); + zs[217] = BOOST_MATH_TEST_VALUE(RealType, 54535776737685.59960937500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[217] = BOOST_MATH_TEST_VALUE(RealType, 28.28745947768659406252057469058839388454672293394318546730557386127002114050381424035876354103192624); + zs[218] = BOOST_MATH_TEST_VALUE(RealType, 54535776737686.09960937500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[218] = BOOST_MATH_TEST_VALUE(RealType, 28.28745947768660291776891842583233326734639195028174391562886488418853280961627679416432912568037643); + zs[219] = BOOST_MATH_TEST_VALUE(RealType, 54535776737686.59960937500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[219] = BOOST_MATH_TEST_VALUE(RealType, 28.28745947768661177301726216099517978665306130590007248679624798101760603565428399982488746458503134); + zs[220] = BOOST_MATH_TEST_VALUE(RealType, 54535776737687.09960937500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[220] = BOOST_MATH_TEST_VALUE(RealType, 28.28745947768662062826560589607693344246673248684048129447128687164847423418296378412381527867603611); + zs[221] = BOOST_MATH_TEST_VALUE(RealType, 109071553475374.6992187500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[221] = BOOST_MATH_TEST_VALUE(RealType, 28.95720614666117150245004622760057983418314410522200232704276775862146736266761022246497551058785007); + zs[222] = BOOST_MATH_TEST_VALUE(RealType, 109071553475375.1992187500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[222] = BOOST_MATH_TEST_VALUE(RealType, 28.95720614666117593357355743548739761689791124679984859813361369105181180764744313352061153147051630); + zs[223] = BOOST_MATH_TEST_VALUE(RealType, 109071553475375.6992187500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[223] = BOOST_MATH_TEST_VALUE(RealType, 28.95720614666118036469706864335392511390934879372874136387705864492100434790697368864211343956938842); + zs[224] = BOOST_MATH_TEST_VALUE(RealType, 109071553475376.1992187500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[224] = BOOST_MATH_TEST_VALUE(RealType, 28.95720614666118479582057985120016232521745693192563248069260165217440327859683071396461341530343065); + zs[225] = BOOST_MATH_TEST_VALUE(RealType, 109071553475376.6992187500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[225] = BOOST_MATH_TEST_VALUE(RealType, 28.95720614666118922694409105902610925082223584730747380499718597765232850574002390696473010380772407); + zs[226] = BOOST_MATH_TEST_VALUE(RealType, 218143106950753.8984375000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[226] = BOOST_MATH_TEST_VALUE(RealType, 29.62747043118774188445791042660254784305836995418567274505820949514291909017768623167600827442630858); + zs[227] = BOOST_MATH_TEST_VALUE(RealType, 218143106950754.3984375000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[227] = BOOST_MATH_TEST_VALUE(RealType, 29.62747043118774410169407734916144601996690190995667210727468326746331358762853812415838063247614151); + zs[228] = BOOST_MATH_TEST_VALUE(RealType, 218143106950754.8984375000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[228] = BOOST_MATH_TEST_VALUE(RealType, 29.62747043118774631893024427171526754670674911118564686113352807043233143508066106374847716587931185); + zs[229] = BOOST_MATH_TEST_VALUE(RealType, 218143106950755.3984375000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[229] = BOOST_MATH_TEST_VALUE(RealType, 29.62747043118774853616641119426401242327791158113151699337805013921071479703774514043229472570138003); + zs[230] = BOOST_MATH_TEST_VALUE(RealType, 218143106950755.8984375000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[230] = BOOST_MATH_TEST_VALUE(RealType, 29.62747043118775075340257811680768064968038934305320249075139583789870247295334960013555124352240919); + zs[231] = BOOST_MATH_TEST_VALUE(RealType, 436286213901512.2968750000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[231] = BOOST_MATH_TEST_VALUE(RealType, 30.29823029316507210180178060183512748657385641403633979025174401415202721913219462712200443246592017); + zs[232] = BOOST_MATH_TEST_VALUE(RealType, 436286213901512.7968750000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[232] = BOOST_MATH_TEST_VALUE(RealType, 30.29823029316507321122179075661323950744341840810124864190846957886463039301370908060223378776053761); + zs[233] = BOOST_MATH_TEST_VALUE(RealType, 436286213901513.2968750000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[233] = BOOST_MATH_TEST_VALUE(RealType, 30.29823029316507432064180091139008139023924952729670215908087118481612362461688278748768609693129214); + zs[234] = BOOST_MATH_TEST_VALUE(RealType, 436286213901513.7968750000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[234] = BOOST_MATH_TEST_VALUE(RealType, 30.29823029316507543006181106616565313496134977453237197516164536262012622641950793744512740976903471); + zs[235] = BOOST_MATH_TEST_VALUE(RealType, 436286213901514.2968750000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[235] = BOOST_MATH_TEST_VALUE(RealType, 30.29823029316507653948182122093995474160971915271792972354347864284901025700020408100899889264653839); + zs[236] = BOOST_MATH_TEST_VALUE(RealType, 872572427803029.0937500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[236] = BOOST_MATH_TEST_VALUE(RealType, 30.96946505745926454870573870105381204121080031682700579571979417608023815834802026646642551756529303); + zs[237] = BOOST_MATH_TEST_VALUE(RealType, 872572427803029.5937500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[237] = BOOST_MATH_TEST_VALUE(RealType, 30.96946505745926510380014769927740975753101903356685400661074674057071774744000291503524870439239858); + zs[238] = BOOST_MATH_TEST_VALUE(RealType, 872572427803030.0937500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[238] = BOOST_MATH_TEST_VALUE(RealType, 30.96946505745926565889455669750068970579501127050404305753044873046035266500692837850798788777465676); + zs[239] = BOOST_MATH_TEST_VALUE(RealType, 872572427803030.5937500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[239] = BOOST_MATH_TEST_VALUE(RealType, 30.96946505745926621398896569572365188600277702800255782702903047591596266870263378125202082655252570); + zs[240] = BOOST_MATH_TEST_VALUE(RealType, 872572427803031.0937500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[240] = BOOST_MATH_TEST_VALUE(RealType, 30.96946505745926676908337469394629629815431630642638319365662168161753441065238424482444892944732090); + zs[241] = BOOST_MATH_TEST_VALUE(RealType, 1745144855606062.687500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[241] = BOOST_MATH_TEST_VALUE(RealType, 31.64115530270368555045568380920065773046212688909377117164466588005747217968807471779219205518025563); + zs[242] = BOOST_MATH_TEST_VALUE(RealType, 1745144855606063.187500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[242] = BOOST_MATH_TEST_VALUE(RealType, 31.64115530270368582818730773733152774326033355552322481669720170248660524963440150598888428761058290); + zs[243] = BOOST_MATH_TEST_VALUE(RealType, 1745144855606063.687500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[243] = BOOST_MATH_TEST_VALUE(RealType, 31.64115530270368610591893166546231825808704138452046802967409474774871621840817874673003149159950917); + zs[244] = BOOST_MATH_TEST_VALUE(RealType, 1745144855606064.187500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[244] = BOOST_MATH_TEST_VALUE(RealType, 31.64115530270368638365055559359302927494225037613103195710423753246607554009944184530654853462065205); + zs[245] = BOOST_MATH_TEST_VALUE(RealType, 1745144855606064.687500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[245] = BOOST_MATH_TEST_VALUE(RealType, 31.64115530270368666138217952172366079382596053040044774551652253413904860066772832705321064573507936); + zs[246] = BOOST_MATH_TEST_VALUE(RealType, 3490289711212129.875000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[246] = BOOST_MATH_TEST_VALUE(RealType, 32.31328276274725912255296233554695621993095527834620867411002883617418802445848848920754168937963900); + zs[247] = BOOST_MATH_TEST_VALUE(RealType, 3490289711212130.375000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[247] = BOOST_MATH_TEST_VALUE(RealType, 32.31328276274725926150732198502036790376252498771483422694718006966861906633408209207371317438042436); + zs[248] = BOOST_MATH_TEST_VALUE(RealType, 3490289711212130.875000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[248] = BOOST_MATH_TEST_VALUE(RealType, 32.31328276274725940046168163449375969968196897954449339669242357827673003495386979661882340839494652); + zs[249] = BOOST_MATH_TEST_VALUE(RealType, 3490289711212131.375000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[249] = BOOST_MATH_TEST_VALUE(RealType, 32.31328276274725953941604128396713160768928725384088153564235657069057463593847925585888659769685682); + zs[250] = BOOST_MATH_TEST_VALUE(RealType, 3490289711212131.875000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[250] = BOOST_MATH_TEST_VALUE(RealType, 32.31328276274725967837040093344048362778447981060969399609357625315535190876608557675610677996463049); + zs[251] = BOOST_MATH_TEST_VALUE(RealType, 6980579422424264.250000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[251] = BOOST_MATH_TEST_VALUE(RealType, 32.98583023753604679088719826542088155377570542413337629407446260913838808164256711555296996403852860); + zs[252] = BOOST_MATH_TEST_VALUE(RealType, 6980579422424264.750000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[252] = BOOST_MATH_TEST_VALUE(RealType, 32.98583023753604686040692677719047881106035406644182281598485405113601440205771668223737335876041818); + zs[253] = BOOST_MATH_TEST_VALUE(RealType, 6980579422424265.250000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[253] = BOOST_MATH_TEST_VALUE(RealType, 32.98583023753604692992665528896007109314624214905869648472859408505262279189002691227175712262681487); + zs[254] = BOOST_MATH_TEST_VALUE(RealType, 6980579422424265.750000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[254] = BOOST_MATH_TEST_VALUE(RealType, 32.98583023753604699944638380072965840003336967198470969416928902364624408970718516308377862696183264); + zs[255] = BOOST_MATH_TEST_VALUE(RealType, 6980579422424266.250000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[255] = BOOST_MATH_TEST_VALUE(RealType, 32.98583023753604706896611231249924073172173663522057483817054517952187667696583584412183600018203736); + zs[256] = BOOST_MATH_TEST_VALUE(RealType, 13961158844848533.00000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[256] = BOOST_MATH_TEST_VALUE(RealType, 33.65878151237097095124298518143702077667858405885409410230992311053881919684167704487215990113228857); + zs[257] = BOOST_MATH_TEST_VALUE(RealType, 13961158844848533.50000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[257] = BOOST_MATH_TEST_VALUE(RealType, 33.65878151237097098602331016061647350048233624732159922625861798362865689925616857240391773797386011); + zs[258] = BOOST_MATH_TEST_VALUE(RealType, 13961158844848534.00000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[258] = BOOST_MATH_TEST_VALUE(RealType, 33.65878151237097102080363513979592497971278809664223503486445169932919366667254889157695575939580298); + zs[259] = BOOST_MATH_TEST_VALUE(RealType, 13961158844848534.50000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[259] = BOOST_MATH_TEST_VALUE(RealType, 33.65878151237097105558396011897537521436993960681609063435549611864140613496327710388308960838614952); + zs[260] = BOOST_MATH_TEST_VALUE(RealType, 13961158844848535.00000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[260] = BOOST_MATH_TEST_VALUE(RealType, 33.65878151237097109036428509815482420445379077784325513095982310255670016959177612483326392564338403); + zs[261] = BOOST_MATH_TEST_VALUE(RealType, 27922317689697070.50000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[261] = BOOST_MATH_TEST_VALUE(RealType, 34.33212128461954182192055400546316699688336088176596379963232567718408755304304153654131361648983188); + zs[262] = BOOST_MATH_TEST_VALUE(RealType, 27922317689697071.00000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[262] = BOOST_MATH_TEST_VALUE(RealType, 34.33212128461954183932056272117319130023138040040443817185436738411951668715588692235416442685371045); + zs[263] = BOOST_MATH_TEST_VALUE(RealType, 27922317689697071.50000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[263] = BOOST_MATH_TEST_VALUE(RealType, 34.33212128461954185672057143688321529225011483876409341147922608312437009263576524224673465664622416); + zs[264] = BOOST_MATH_TEST_VALUE(RealType, 27922317689697072.00000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[264] = BOOST_MATH_TEST_VALUE(RealType, 34.33212128461954187412058015259323897293956419684494066363206316215367067849034858025290827895879418); + zs[265] = BOOST_MATH_TEST_VALUE(RealType, 27922317689697072.50000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[265] = BOOST_MATH_TEST_VALUE(RealType, 34.33212128461954189152058886830326234229972847464699107343804000916184280580506932042040723667339789); + zs[266] = BOOST_MATH_TEST_VALUE(RealType, 55844635379394145.50000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[266] = BOOST_MATH_TEST_VALUE(RealType, 35.00583509707518695935331739482145723160151536139963974678105921205914075721658873691195091665811270); + zs[267] = BOOST_MATH_TEST_VALUE(RealType, 55844635379394146.00000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[267] = BOOST_MATH_TEST_VALUE(RealType, 35.00583509707518696805806331425691633367772960837479285214203859766210400707178436995199558318407295); + zs[268] = BOOST_MATH_TEST_VALUE(RealType, 55844635379394146.50000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[268] = BOOST_MATH_TEST_VALUE(RealType, 35.00583509707518697676280923369237535787688894919552843836080956969078417834382970920191457114876432); + zs[269] = BOOST_MATH_TEST_VALUE(RealType, 55844635379394147.00000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[269] = BOOST_MATH_TEST_VALUE(RealType, 35.00583509707518698546755515312783430419899338386184789940110157674808234768343577335618132616959765); + zs[270] = BOOST_MATH_TEST_VALUE(RealType, 55844635379394147.50000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[270] = BOOST_MATH_TEST_VALUE(RealType, 35.00583509707518699417230107256329317264404291237375262922664406743686215997702269925047177260404215); + zs[271] = BOOST_MATH_TEST_VALUE(RealType, 111689270758788295.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[271] = BOOST_MATH_TEST_VALUE(RealType, 35.67990927725728324006370419405415632798743326857723995400791753575138185111578870305633556551072352); + zs[272] = BOOST_MATH_TEST_VALUE(RealType, 111689270758788296.0000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[272] = BOOST_MATH_TEST_VALUE(RealType, 35.67990927725728324441836204273681992689740132873188907673425746295594512007334247458414132014763631); + zs[273] = BOOST_MATH_TEST_VALUE(RealType, 111689270758788296.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[273] = BOOST_MATH_TEST_VALUE(RealType, 35.67990927725728324877301989141948350632733717201783214881466640664746188099504650620747906266396850); + zs[274] = BOOST_MATH_TEST_VALUE(RealType, 111689270758788297.0000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[274] = BOOST_MATH_TEST_VALUE(RealType, 35.67990927725728325312767774010214706627724079843506934459363078248730870402916016710439865808348504); + zs[275] = BOOST_MATH_TEST_VALUE(RealType, 111689270758788297.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[275] = BOOST_MATH_TEST_VALUE(RealType, 35.67990927725728325748233558878481060674711220798360083841563700613685981848455744088126373390197417); + zs[276] = BOOST_MATH_TEST_VALUE(RealType, 223378541517576595.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[276] = BOOST_MATH_TEST_VALUE(RealType, 36.35433088203076284552001564306302504927318242547212268948185919007001226970738285875013148048139909); + zs[277] = BOOST_MATH_TEST_VALUE(RealType, 223378541517576596.0000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[277] = BOOST_MATH_TEST_VALUE(RealType, 36.35433088203076284769844633707581493482388002617376992599930776877134475450868721982023076025880187); + zs[278] = BOOST_MATH_TEST_VALUE(RealType, 223378541517576596.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[278] = BOOST_MATH_TEST_VALUE(RealType, 36.35433088203076284987687703108860481550197556889556172047264008790594215563414633410406449425201228); + zs[279] = BOOST_MATH_TEST_VALUE(RealType, 223378541517576597.0000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[279] = BOOST_MATH_TEST_VALUE(RealType, 36.35433088203076285205530772510139469130746905363749809470683776684452160660198665349883658913823376); + zs[280] = BOOST_MATH_TEST_VALUE(RealType, 223378541517576597.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[280] = BOOST_MATH_TEST_VALUE(RealType, 36.35433088203076285423373841911418456224036048039957907050688242495780009454648985107688288289511577); + zs[281] = BOOST_MATH_TEST_VALUE(RealType, 446757083035153195.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[281] = BOOST_MATH_TEST_VALUE(RealType, 37.02908764699829400134712267319905290193660562118300513507830516933879565438304668183143470276536696); + zs[282] = BOOST_MATH_TEST_VALUE(RealType, 446757083035153196.0000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[282] = BOOST_MATH_TEST_VALUE(RealType, 37.02908764699829400243686962505878682539242575730874103256160022984465712010716817361916571773853546); + zs[283] = BOOST_MATH_TEST_VALUE(RealType, 446757083035153196.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[283] = BOOST_MATH_TEST_VALUE(RealType, 37.02908764699829400352661657691852074762947010360082635121697561514628341391528501142658520743630365); + zs[284] = BOOST_MATH_TEST_VALUE(RealType, 446757083035153197.0000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[284] = BOOST_MATH_TEST_VALUE(RealType, 37.02908764699829400461636352877825466864773866005926109377149011203944059666845076630112677861392210); + zs[285] = BOOST_MATH_TEST_VALUE(RealType, 446757083035153197.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[285] = BOOST_MATH_TEST_VALUE(RealType, 37.02908764699829400570611048063798858844723142668404526295220250731989472007381590773195282652560254); + zs[286] = BOOST_MATH_TEST_VALUE(RealType, 893514166070306395.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[286] = BOOST_MATH_TEST_VALUE(RealType, 37.70416794018226555320136342385675657230684506000440195815556999407621228993843426869578896616407720); + zs[287] = BOOST_MATH_TEST_VALUE(RealType, 893514166070306396.0000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[287] = BOOST_MATH_TEST_VALUE(RealType, 37.70416794018226555374649355515368083078169249852645520316613216452931331516160499635557395351284563); + zs[288] = BOOST_MATH_TEST_VALUE(RealType, 893514166070306396.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[288] = BOOST_MATH_TEST_VALUE(RealType, 37.70416794018226555429162368645060508895169517366721864271816097307727758099155612982661657855356471); + zs[289] = BOOST_MATH_TEST_VALUE(RealType, 893514166070306397.0000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[289] = BOOST_MATH_TEST_VALUE(RealType, 37.70416794018226555483675381774752934681685308542669227715271188344812250649110477219885655515210238); + zs[290] = BOOST_MATH_TEST_VALUE(RealType, 893514166070306397.5000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[290] = BOOST_MATH_TEST_VALUE(RealType, 37.70416794018226555538188394904445360437716623380487610681084035936986551015065343719767859121005169); + zs[291] = BOOST_MATH_TEST_VALUE(RealType, 1787028332140612795.500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[291] = BOOST_MATH_TEST_VALUE(RealType, 38.37956071956958972598482293827813436342029687218073991385854219392107138609564999755336816382782882); + zs[292] = BOOST_MATH_TEST_VALUE(RealType, 1787028332140612796.000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[292] = BOOST_MATH_TEST_VALUE(RealType, 38.37956071956958972625751198813595667063367232609526061670475810039080545891532051379509177129548620); + zs[293] = BOOST_MATH_TEST_VALUE(RealType, 1787028332140612796.500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[293] = BOOST_MATH_TEST_VALUE(RealType, 38.37956071956958972653020103799377897777080019019814937016569594146159440469991463659659940941732350); + zs[294] = BOOST_MATH_TEST_VALUE(RealType, 1787028332140612797.000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[294] = BOOST_MATH_TEST_VALUE(RealType, 38.37956071956958972680289008785160128483168046448940617428400853168904877026810016036680752500851451); + zs[295] = BOOST_MATH_TEST_VALUE(RealType, 1787028332140612797.500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[295] = BOOST_MATH_TEST_VALUE(RealType, 38.37956071956958972707557913770942359181631314896903102910234868562877910240275114213945213826099662); + zs[296] = BOOST_MATH_TEST_VALUE(RealType, 3574056664281225595.500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[296] = BOOST_MATH_TEST_VALUE(RealType, 39.05525549414090357397288405889113661262090376242531189140228166174913957175516846453031303867939318); + zs[297] = BOOST_MATH_TEST_VALUE(RealType, 3574056664281225596.000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[297] = BOOST_MATH_TEST_VALUE(RealType, 39.05525549414090357410928851167839535330306428730324674240848562357412341096307490721136888569495897); + zs[298] = BOOST_MATH_TEST_VALUE(RealType, 3574056664281225596.500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[298] = BOOST_MATH_TEST_VALUE(RealType, 39.05525549414090357424569296446565409396615412474444985847532731674289519382422208292858248536499652); + zs[299] = BOOST_MATH_TEST_VALUE(RealType, 3574056664281225597.000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[299] = BOOST_MATH_TEST_VALUE(RealType, 39.05525549414090357438209741725291283461017327474892123960814086338854298164097945903007554014878729); + zs[300] = BOOST_MATH_TEST_VALUE(RealType, 3574056664281225597.500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[300] = BOOST_MATH_TEST_VALUE(RealType, 39.05525549414090357451850187004017157523512173731666088581226038564415483571347831884995089329885967); + zs[301] = BOOST_MATH_TEST_VALUE(RealType, 7148113328562451195.500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[301] = BOOST_MATH_TEST_VALUE(RealType, 39.73124228804812727783498401939051909927376255844770721021129458386841998457593172268879366938255929); + zs[302] = BOOST_MATH_TEST_VALUE(RealType, 7148113328562451196.000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[302] = BOOST_MATH_TEST_VALUE(RealType, 39.73124228804812727790321522786904454299244826066833347409818515980037701571602976213801388272915974); + zs[303] = BOOST_MATH_TEST_VALUE(RealType, 7148113328562451196.500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[303] = BOOST_MATH_TEST_VALUE(RealType, 39.73124228804812727797144643634756998670636416712076247668418626969651461616512047870718042117101998); + zs[304] = BOOST_MATH_TEST_VALUE(RealType, 7148113328562451197.000000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[304] = BOOST_MATH_TEST_VALUE(RealType, 39.73124228804812727803967764482609543041551027780499421796996498319224892410706675338130329932555167); + zs[305] = BOOST_MATH_TEST_VALUE(RealType, 7148113328562451197.500000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[305] = BOOST_MATH_TEST_VALUE(RealType, 39.73124228804812727810790885330462087411988659272102869795618836992299607772559151572452093096440915); + zs[306] = BOOST_MATH_TEST_VALUE(RealType, 14296226657124902395.50000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[306] = BOOST_MATH_TEST_VALUE(RealType, 40.40751160764139677831479038829047423830224736434558035742829431520714244678484344822558100019565300); + zs[307] = BOOST_MATH_TEST_VALUE(RealType, 14296226657124902396.00000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[307] = BOOST_MATH_TEST_VALUE(RealType, 40.40751160764139677834892001619303911408381392078589832744493031890002310138573922908458466967872121); + zs[308] = BOOST_MATH_TEST_VALUE(RealType, 14296226657124902396.50000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[308] = BOOST_MATH_TEST_VALUE(RealType, 40.40751160764139677838304964409560398986418751480292907711652892277321787302547236270065870054677767); + zs[309] = BOOST_MATH_TEST_VALUE(RealType, 14296226657124902397.00000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[309] = BOOST_MATH_TEST_VALUE(RealType, 40.40751160764139677841717927199816886564336814639667260644317354730947215019219733421649211897790576); + zs[310] = BOOST_MATH_TEST_VALUE(RealType, 14296226657124902397.50000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[310] = BOOST_MATH_TEST_VALUE(RealType, 40.40751160764139677845130889990073374142135581556712891542494761299153132137405987788970971812438268); + zs[311] = BOOST_MATH_TEST_VALUE(RealType, 28592453314249804795.50000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[311] = BOOST_MATH_TEST_VALUE(RealType, 41.08405441107886601512650396438190311342038447614710861375772179966198427428166270594434592188846742); + zs[312] = BOOST_MATH_TEST_VALUE(RealType, 28592453314249804796.00000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[312] = BOOST_MATH_TEST_VALUE(RealType, 41.08405441107886601514357556751058240524595848620754197445685531919168072376579651061145028382528801); + zs[313] = BOOST_MATH_TEST_VALUE(RealType, 28592453314249804796.50000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[313] = BOOST_MATH_TEST_VALUE(RealType, 41.08405441107886601516064717063926169707123413145503282985377893953090450589428836799851249587190162); + zs[314] = BOOST_MATH_TEST_VALUE(RealType, 28592453314249804797.00000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[314] = BOOST_MATH_TEST_VALUE(RealType, 41.08405441107886601517771877376794098889621141188958117994850309268653710559007455198782311971328872); + zs[315] = BOOST_MATH_TEST_VALUE(RealType, 28592453314249804797.50000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[315] = BOOST_MATH_TEST_VALUE(RealType, 41.08405441107886601519479037689662028072089032751118702474103821066546000777609078929437453810254475); + zs[316] = BOOST_MATH_TEST_VALUE(RealType, 57184906628499609595.50000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[316] = BOOST_MATH_TEST_VALUE(RealType, 41.76086208028139568641375217383589970289192285524027455320442791145685452599382947676049441268469929); + zs[317] = BOOST_MATH_TEST_VALUE(RealType, 57184906628499609596.00000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[317] = BOOST_MATH_TEST_VALUE(RealType, 41.76086208028139568642229126383956807166540537938630285140147251930665093550545985675206920712567685); + zs[318] = BOOST_MATH_TEST_VALUE(RealType, 57184906628499609596.50000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[318] = BOOST_MATH_TEST_VALUE(RealType, 41.76086208028139568643083035384323644043881328226871966400896425186789096638830671067070738275427294); + zs[319] = BOOST_MATH_TEST_VALUE(RealType, 57184906628499609597.00000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[319] = BOOST_MATH_TEST_VALUE(RealType, 41.76086208028139568643936944384690480921214656388752499102690441367931200542104387248813871592477758); + zs[320] = BOOST_MATH_TEST_VALUE(RealType, 57184906628499609597.50000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[320] = BOOST_MATH_TEST_VALUE(RealType, 41.76086208028139568644790853385057317798540522424271883245529430927965143938234514196380710928511911); + zs[321] = BOOST_MATH_TEST_VALUE(RealType, 114369813256999219195.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[321] = BOOST_MATH_TEST_VALUE(RealType, 42.43792639501924322372868984974754605356116106151045232696170539516224623515519078402644518190519926); + zs[322] = BOOST_MATH_TEST_VALUE(RealType, 114369813256999219196.0000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[322] = BOOST_MATH_TEST_VALUE(RealType, 42.43792639501924322373296098832611092973985577032241411056103015380922288812869321261489035558578068); + zs[323] = BOOST_MATH_TEST_VALUE(RealType, 114369813256999219196.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[323] = BOOST_MATH_TEST_VALUE(RealType, 42.43792639501924322373723212690467580591853181653964600305518073422329365062099792146842039711851587); + zs[324] = BOOST_MATH_TEST_VALUE(RealType, 114369813256999219197.0000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[324] = BOOST_MATH_TEST_VALUE(RealType, 42.43792639501924322374150326548324068209718920016214800444415729953689875272821439439139550720636184); + zs[325] = BOOST_MATH_TEST_VALUE(RealType, 114369813256999219197.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[325] = BOOST_MATH_TEST_VALUE(RealType, 42.43792639501924322374577440406180555827582792118992011472796001288247842454645211304904107994414835); + zs[326] = BOOST_MATH_TEST_VALUE(RealType, 228739626513998438395.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[326] = BOOST_MATH_TEST_VALUE(RealType, 43.11523950893999669327806140448370484701263856771509543516859403088443747042918192039960542776140113); + zs[327] = BOOST_MATH_TEST_VALUE(RealType, 228739626513998438396.0000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[327] = BOOST_MATH_TEST_VALUE(RealType, 43.11523950893999669328019774638303987145009950720434908964235203327796824314750703851313533491796197); + zs[328] = BOOST_MATH_TEST_VALUE(RealType, 228739626513998438396.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[328] = BOOST_MATH_TEST_VALUE(RealType, 43.11523950893999669328233408828237489588755577928156076930831411008263669948642260552727690669574065); + zs[329] = BOOST_MATH_TEST_VALUE(RealType, 228739626513998438397.0000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[329] = BOOST_MATH_TEST_VALUE(RealType, 43.11523950893999669328447043018170992032500738394673047416648028169788047545599558661614805384499252); + zs[330] = BOOST_MATH_TEST_VALUE(RealType, 228739626513998438397.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[330] = BOOST_MATH_TEST_VALUE(RealType, 43.11523950893999669328660677208104494476245432119985820421685056852313720706629294682011828585641323); + zs[331] = BOOST_MATH_TEST_VALUE(RealType, 457479253027996876795.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[331] = BOOST_MATH_TEST_VALUE(RealType, 43.79279392736654193606989766502723445979048572229231465829706451573324407857444527395822448178986007); + zs[332] = BOOST_MATH_TEST_VALUE(RealType, 457479253027996876796.0000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[332] = BOOST_MATH_TEST_VALUE(RealType, 43.79279392736654193607096621073065351333846093585545869129269708118665210449739974464793810457198837); + zs[333] = BOOST_MATH_TEST_VALUE(RealType, 457479253027996876796.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[333] = BOOST_MATH_TEST_VALUE(RealType, 43.79279392736654193607203475643407256688643498213820013963448351011348495071834636284671248086199837); + zs[334] = BOOST_MATH_TEST_VALUE(RealType, 457479253027996876797.0000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[334] = BOOST_MATH_TEST_VALUE(RealType, 43.79279392736654193607310330213749162043440786114053900332242380506462727521879656021426226958496105); + zs[335] = BOOST_MATH_TEST_VALUE(RealType, 457479253027996876797.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[335] = BOOST_MATH_TEST_VALUE(RealType, 43.79279392736654193607417184784091067398237957286247528235651796859096373598026176840193967666274999); + zs[336] = BOOST_MATH_TEST_VALUE(RealType, 914958506055993753595.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[336] = BOOST_MATH_TEST_VALUE(RealType, 44.47058248671115033941120173207718823699817102786625650029939710664855583164086060137262356501253929); + zs[337] = BOOST_MATH_TEST_VALUE(RealType, 914958506055993753596.0000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[337] = BOOST_MATH_TEST_VALUE(RealType, 44.47058248671115033941173618678344688398957490049536600533594487394087848036718134980749301722731352); + zs[338] = BOOST_MATH_TEST_VALUE(RealType, 914958506055993753596.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[338] = BOOST_MATH_TEST_VALUE(RealType, 44.47058248671115033941227064148970553098097848120073848954722626642651975773633390627303626978835838); + zs[339] = BOOST_MATH_TEST_VALUE(RealType, 914958506055993753597.0000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[339] = BOOST_MATH_TEST_VALUE(RealType, 44.47058248671115033941280509619596417797238176998237395293324128442445599007428498582436405251992611); + zs[340] = BOOST_MATH_TEST_VALUE(RealType, 914958506055993753597.5000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[340] = BOOST_MATH_TEST_VALUE(RealType, 44.47058248671115033941333955090222282496378476684027239549398992825366350370700130351606424938744046); + zs[341] = BOOST_MATH_TEST_VALUE(RealType, 1829917012111987507195.500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[341] = BOOST_MATH_TEST_VALUE(RealType, 45.14859833536711018965056513946129162668050892446138815518047627051292293694179480812556619549313064); + zs[342] = BOOST_MATH_TEST_VALUE(RealType, 1829917012111987507196.000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[342] = BOOST_MATH_TEST_VALUE(RealType, 45.14859833536711018965083245509992947480958471611883906387208610588018636449042232643595158517689720); + zs[343] = BOOST_MATH_TEST_VALUE(RealType, 1829917012111987507196.500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[343] = BOOST_MATH_TEST_VALUE(RealType, 45.14859833536711018965109977073856732293866043477021415438855308555056542965567216193304047624510243); + zs[344] = BOOST_MATH_TEST_VALUE(RealType, 1829917012111987507197.000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[344] = BOOST_MATH_TEST_VALUE(RealType, 45.14859833536711018965136708637720517106773608041551342672987720956394620826737050999033807936751171); + zs[345] = BOOST_MATH_TEST_VALUE(RealType, 1829917012111987507197.500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[345] = BOOST_MATH_TEST_VALUE(RealType, 45.14859833536711018965163440201584301919681165305473688089605847796021477615534356598131691567620401); + zs[346] = BOOST_MATH_TEST_VALUE(RealType, 3659834024223975014395.500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[346] = BOOST_MATH_TEST_VALUE(RealType, 45.82683491595294384485628384441561575887407603040339098125590070863967384748247436205190625734118932); + zs[347] = BOOST_MATH_TEST_VALUE(RealType, 3659834024223975014396.000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[347] = BOOST_MATH_TEST_VALUE(RealType, 45.82683491595294384485641754511313063272748535532950445484624262655288217284652009573499125927466059); + zs[348] = BOOST_MATH_TEST_VALUE(RealType, 3659834024223975014396.500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[348] = BOOST_MATH_TEST_VALUE(RealType, 45.82683491595294384485655124581064550658089466199799712956218289431848176597105298416189805067325255); + zs[349] = BOOST_MATH_TEST_VALUE(RealType, 3659834024223975014397.000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[349] = BOOST_MATH_TEST_VALUE(RealType, 45.82683491595294384485668494650816038043430395040886900540372151194146008896781208120907682446939362); + zs[350] = BOOST_MATH_TEST_VALUE(RealType, 3659834024223975014397.500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[350] = BOOST_MATH_TEST_VALUE(RealType, 45.82683491595294384485681864720567525428771322056212008237085847942680460394853644075297572979160046); + zs[351] = BOOST_MATH_TEST_VALUE(RealType, 7319668048447950028795.500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[351] = BOOST_MATH_TEST_VALUE(RealType, 46.50528594879636847126393241245457792327323285439769210757132628000124992150426204283421914567175062); + zs[352] = BOOST_MATH_TEST_VALUE(RealType, 7319668048447950028796.000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[352] = BOOST_MATH_TEST_VALUE(RealType, 46.50528594879636847126399928363674654174459322702292762434851831465004062253014895509105956594317070); + zs[353] = BOOST_MATH_TEST_VALUE(RealType, 7319668048447950028796.500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[353] = BOOST_MATH_TEST_VALUE(RealType, 46.50528594879636847126406615481891516021595359508227640114777678096555406499545632733378131414467863); + zs[354] = BOOST_MATH_TEST_VALUE(RealType, 7319668048447950028797.000000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[354] = BOOST_MATH_TEST_VALUE(RealType, 46.50528594879636847126413302600108377868731395857573843796910167894841388830471951540349934300433290); + zs[355] = BOOST_MATH_TEST_VALUE(RealType, 7319668048447950028797.500000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[355] = BOOST_MATH_TEST_VALUE(RealType, 46.50528594879636847126419989718325239715867431750331373481249300859924373186247387514132847746950458); + zs[356] = BOOST_MATH_TEST_VALUE(RealType, 14639336096895900057595.50000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[356] = BOOST_MATH_TEST_VALUE(RealType, 47.18394541655595353726859251633008985542795093110678176543525265373739682696782954566791223497853278); + zs[357] = BOOST_MATH_TEST_VALUE(RealType, 14639336096895900057596.00000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[357] = BOOST_MATH_TEST_VALUE(RealType, 47.18394541655595353726862596204760125343156619941158006313108818081160492017518779133670783309629777); + zs[358] = BOOST_MATH_TEST_VALUE(RealType, 14639336096895900057596.50000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[358] = BOOST_MATH_TEST_VALUE(RealType, 47.18394541655595353726865940776511265143518146657454680704151512746306706865464848189500564360309989); + zs[359] = BOOST_MATH_TEST_VALUE(RealType, 14639336096895900057597.00000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[359] = BOOST_MATH_TEST_VALUE(RealType, 47.18394541655595353726869285348262404943879673259568199716653349369186125242127832914687715856217447); + zs[360] = BOOST_MATH_TEST_VALUE(RealType, 14639336096895900057597.50000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[360] = BOOST_MATH_TEST_VALUE(RealType, 47.18394541655595353726872629920013544744241199747498563350614327949806545149014404489639386204785740); + zs[361] = BOOST_MATH_TEST_VALUE(RealType, 29278672193791800115195.50000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[361] = BOOST_MATH_TEST_VALUE(RealType, 47.86280754988806283869898641897124874506124538863135227082696257498669984107495807372390982964298765); + zs[362] = BOOST_MATH_TEST_VALUE(RealType, 29278672193791800115196.00000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[362] = BOOST_MATH_TEST_VALUE(RealType, 47.86280754988806283869900314675402022865409817077027470411443725892317844329022583627504362168195643); + zs[363] = BOOST_MATH_TEST_VALUE(RealType, 29278672193791800115196.50000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[363] = BOOST_MATH_TEST_VALUE(RealType, 47.86280754988806283869901987453679171224695095262365180124915574419262646462548365901592461409111822); + zs[364] = BOOST_MATH_TEST_VALUE(RealType, 29278672193791800115197.00000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[364] = BOOST_MATH_TEST_VALUE(RealType, 47.86280754988806283869903660231956319583980373419148356223111803079505365563012583778554165327574562); + zs[365] = BOOST_MATH_TEST_VALUE(RealType, 29278672193791800115197.50000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[365] = BOOST_MATH_TEST_VALUE(RealType, 47.86280754988806283869905333010233467943265651547376998706032411873046976685354666842288358514164676); + zs[366] = BOOST_MATH_TEST_VALUE(RealType, 58557344387583600230395.50000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[366] = BOOST_MATH_TEST_VALUE(RealType, 48.54186681407528073135559278566008113536709515501428437696966434378641333376283319594991159197529021); + zs[367] = BOOST_MATH_TEST_VALUE(RealType, 58557344387583600230396.00000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[367] = BOOST_MATH_TEST_VALUE(RealType, 48.54186681407528073135560115194668751765523308763717061100258732052320085375724211692206634017417835); + zs[368] = BOOST_MATH_TEST_VALUE(RealType, 58557344387583600230396.50000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[368] = BOOST_MATH_TEST_VALUE(RealType, 48.54186681407528073135560951823329389994337102018864925304218198091079593677878710603131163142362874); + zs[369] = BOOST_MATH_TEST_VALUE(RealType, 58557344387583600230397.00000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[369] = BOOST_MATH_TEST_VALUE(RealType, 48.54186681407528073135561788451990028223150895266872030308844832494919980201645683875988736222168974); + zs[370] = BOOST_MATH_TEST_VALUE(RealType, 58557344387583600230397.50000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[370] = BOOST_MATH_TEST_VALUE(RealType, 48.54186681407528073135562625080650666451964688507738376114138635263841366865923999059003342903518356); + zs[371] = BOOST_MATH_TEST_VALUE(RealType, 117114688775167200460795.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[371] = BOOST_MATH_TEST_VALUE(RealType, 49.22111789654023166917393998803300413713566990752077661423207867413014717692257524895032484088002638); + zs[372] = BOOST_MATH_TEST_VALUE(RealType, 117114688775167200460796.0000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[372] = BOOST_MATH_TEST_VALUE(RealType, 49.22111789654023166917394417234185551157598495411034248495095320790548697334562191650844059041476016); + zs[373] = BOOST_MATH_TEST_VALUE(RealType, 117114688775167200460796.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[373] = BOOST_MATH_TEST_VALUE(RealType, 49.22111789654023166917394835665070688601630000068205128804849669368418438086966818342794853392747975); + zs[374] = BOOST_MATH_TEST_VALUE(RealType, 117114688775167200460797.0000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[374] = BOOST_MATH_TEST_VALUE(RealType, 49.22111789654023166917395254095955826045661504723590302352470913146623955193835326180329431243220210); + zs[375] = BOOST_MATH_TEST_VALUE(RealType, 117114688775167200460797.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[375] = BOOST_MATH_TEST_VALUE(RealType, 49.22111789654023166917395672526840963489693009377189769137959052125165263899531636372892356694099191); + zs[376] = BOOST_MATH_TEST_VALUE(RealType, 234229377550334400921595.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[376] = BOOST_MATH_TEST_VALUE(RealType, 49.90055569517561383066060297122022964231700635525977853025814596096151371140753421576539605970700861); + zs[377] = BOOST_MATH_TEST_VALUE(RealType, 234229377550334400921596.0000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[377] = BOOST_MATH_TEST_VALUE(RealType, 49.90055569517561383066060506394202934831808914814125072797602761455168951650504013758145865501313880); + zs[378] = BOOST_MATH_TEST_VALUE(RealType, 234229377550334400921596.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[378] = BOOST_MATH_TEST_VALUE(RealType, 49.90055569517561383066060715666382905431917194101825740114881990816754906595137018341539085351050643); + zs[379] = BOOST_MATH_TEST_VALUE(RealType, 234229377550334400921597.0000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[379] = BOOST_MATH_TEST_VALUE(RealType, 49.90055569517561383066060924938562876032025473389079854977652284180909237880745343386717050876814609); + zs[380] = BOOST_MATH_TEST_VALUE(RealType, 234229377550334400921597.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[380] = BOOST_MATH_TEST_VALUE(RealType, 49.90055569517561383066061134210742846632133752675887417385913641547631947413421896953677547435497030); + zs[381] = BOOST_MATH_TEST_VALUE(RealType, 468458755100668801843195.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[381] = BOOST_MATH_TEST_VALUE(RealType, 50.58017530742747300164561317487206707303802427632079894747824628285067346330316982070607470750276538); + zs[382] = BOOST_MATH_TEST_VALUE(RealType, 468458755100668801843196.0000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[382] = BOOST_MATH_TEST_VALUE(RealType, 50.58017530742747300164561422150925313668179339445554345979082699726978571301972512528171705027852141); + zs[383] = BOOST_MATH_TEST_VALUE(RealType, 468458755100668801843196.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[383] = BOOST_MATH_TEST_VALUE(RealType, 50.58017530742747300164561526814643920032556251258917128490508500217173303906663500224210793499988710); + zs[384] = BOOST_MATH_TEST_VALUE(RealType, 468458755100668801843197.0000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[384] = BOOST_MATH_TEST_VALUE(RealType, 50.58017530742747300164561631478362526396933163072168242282102029755651544382718152403729363436471691); + zs[385] = BOOST_MATH_TEST_VALUE(RealType, 468458755100668801843197.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[385] = BOOST_MATH_TEST_VALUE(RealType, 50.58017530742747300164561736142081132761310074885307687353863288342413292968464676311732042107085768); + zs[386] = BOOST_MATH_TEST_VALUE(RealType, 936917510201337603686395.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[386] = BOOST_MATH_TEST_VALUE(RealType, 51.25997202007432193650352849612123815153250964411406464644865827787863050268704653756510450468474031); + zs[387] = BOOST_MATH_TEST_VALUE(RealType, 936917510201337603686396.0000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[387] = BOOST_MATH_TEST_VALUE(RealType, 51.25997202007432193650352901957441589305691661161083072884708823213628905949128284896989478240192251); + zs[388] = BOOST_MATH_TEST_VALUE(RealType, 936917510201337603686396.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[388] = BOOST_MATH_TEST_VALUE(RealType, 51.25997202007432193650352954302759363458132357910731756493593984931372662548695557807862606879386793); + zs[389] = BOOST_MATH_TEST_VALUE(RealType, 936917510201337603686397.0000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[389] = BOOST_MATH_TEST_VALUE(RealType, 51.25997202007432193650353006648077137610573054660352515471521312941094320097205602449555540058022069); + zs[390] = BOOST_MATH_TEST_VALUE(RealType, 936917510201337603686397.5000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[390] = BOOST_MATH_TEST_VALUE(RealType, 51.25997202007432193650353058993394911763013751409945349818490807242793878624457548782493981448062444); + zs[391] = BOOST_MATH_TEST_VALUE(RealType, 1873835020402675207372795.500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[391] = BOOST_MATH_TEST_VALUE(RealType, 51.93994129964973319883394011661732720227488151829956542922851698538021522622862634588975916535124465); + zs[392] = BOOST_MATH_TEST_VALUE(RealType, 1873835020402675207372796.000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[392] = BOOST_MATH_TEST_VALUE(RealType, 51.93994129964973319883394037840949666263721928778536979472743471765062641780884974428552475054902084); + zs[393] = BOOST_MATH_TEST_VALUE(RealType, 1873835020402675207372796.500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[393] = BOOST_MATH_TEST_VALUE(RealType, 51.93994129964973319883394064020166612299955705727110433050351349588454562078192850302725642051437996); + zs[394] = BOOST_MATH_TEST_VALUE(RealType, 1873835020402675207372797.000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[394] = BOOST_MATH_TEST_VALUE(RealType, 51.93994129964973319883394090199383558336189482675676903655675332008197283518512140013107034885992383); + zs[395] = BOOST_MATH_TEST_VALUE(RealType, 1873835020402675207372797.500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[395] = BOOST_MATH_TEST_VALUE(RealType, 51.93994129964973319883394116378600504372423259624236391288715419024290806105568721361308270919825427); + zs[396] = BOOST_MATH_TEST_VALUE(RealType, 3747670040805350414745595.500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[396] = BOOST_MATH_TEST_VALUE(RealType, 52.62007878346056146247780063098329226609433897361719442410811576805026853884099017649824976199940727); + zs[397] = BOOST_MATH_TEST_VALUE(RealType, 3747670040805350414745596.000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[397] = BOOST_MATH_TEST_VALUE(RealType, 52.62007878346056146247780076191134345038026463351561571010291457420668319272155773248903735412098606); + zs[398] = BOOST_MATH_TEST_VALUE(RealType, 3747670040805350414745596.500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[398] = BOOST_MATH_TEST_VALUE(RealType, 52.62007878346056146247780089283939463466619029341401953424656920848830320946683691731827935418315374); + zs[399] = BOOST_MATH_TEST_VALUE(RealType, 3747670040805350414745597.000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[399] = BOOST_MATH_TEST_VALUE(RealType, 52.62007878346056146247780102376744581895211595331240589653907967089512858908148627964024886502244786); + zs[400] = BOOST_MATH_TEST_VALUE(RealType, 3747670040805350414745597.500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[400] = BOOST_MATH_TEST_VALUE(RealType, 52.62007878346056146247780115469549700323804161321077479698044596142715933157016436810921898947540595); + zs[401] = BOOST_MATH_TEST_VALUE(RealType, 7495340081610700829491195.500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[401] = BOOST_MATH_TEST_VALUE(RealType, 53.30038027115703847068472014163526750381732629683760414977652728398062761064036427478928134573151026); + zs[402] = BOOST_MATH_TEST_VALUE(RealType, 7495340081610700829491196.000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[402] = BOOST_MATH_TEST_VALUE(RealType, 53.30038027115703847068472020711487963758347144588443668839144673170417842073148009181357862290045625); + zs[403] = BOOST_MATH_TEST_VALUE(RealType, 7495340081610700829491196.500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[403] = BOOST_MATH_TEST_VALUE(RealType, 53.30038027115703847068472027259449177134961659493126486046636359084837495933357183600363141237458038); + zs[404] = BOOST_MATH_TEST_VALUE(RealType, 7495340081610700829491197.000000000000000000000000000000000000000000000000000000000000000000000000000); + ws[404] = BOOST_MATH_TEST_VALUE(RealType, 53.30038027115703847068472033807410390511576174397808866600127786141321722644722197229302630959626241); + zs[405] = BOOST_MATH_TEST_VALUE(RealType, 7495340081610700829491197.500000000000000000000000000000000000000000000000000000000000000000000000000); + ws[405] = BOOST_MATH_TEST_VALUE(RealType, 53.30038027115703847068472040355371603888190689302490810499618954339870522207301296561534991000788215); + zs[406] = BOOST_MATH_TEST_VALUE(RealType, 14990680163221401658982395.50000000000000000000000000000000000000000000000000000000000000000000000000); + ws[406] = BOOST_MATH_TEST_VALUE(RealType, 53.98084171681467787755159106988030207256464803953686021292403364974364396941211684129467560225025844); + zs[407] = BOOST_MATH_TEST_VALUE(RealType, 14990680163221401658982396.00000000000000000000000000000000000000000000000000000000000000000000000000); + ws[407] = BOOST_MATH_TEST_VALUE(RealType, 53.98084171681467787755159110262771031569979287106207337111164630527719599256075269757642116173324604); + zs[408] = BOOST_MATH_TEST_VALUE(RealType, 14990680163221401658982396.50000000000000000000000000000000000000000000000000000000000000000000000000); + ws[408] = BOOST_MATH_TEST_VALUE(RealType, 53.98084171681467787755159113537511855883493770258728543740166820971925093788175661756375535881272212); + zs[409] = BOOST_MATH_TEST_VALUE(RealType, 14990680163221401658982397.00000000000000000000000000000000000000000000000000000000000000000000000000); + ws[409] = BOOST_MATH_TEST_VALUE(RealType, 53.98084171681467787755159116812252680197008253411249641179409936306980880537520142720731872132566761); + zs[410] = BOOST_MATH_TEST_VALUE(RealType, 14990680163221401658982397.50000000000000000000000000000000000000000000000000000000000000000000000000); + ws[410] = BOOST_MATH_TEST_VALUE(RealType, 53.98084171681467787755159120086993504510522736563770629428893976532886959504115995245775177710906343); + zs[411] = BOOST_MATH_TEST_VALUE(RealType, 29981360326442803317964795.50000000000000000000000000000000000000000000000000000000000000000000000000); + ws[411] = BOOST_MATH_TEST_VALUE(RealType, 54.66145922149126997883966829050076057809819624810698856060190684715860519885138243117049542515690575); + zs[412] = BOOST_MATH_TEST_VALUE(RealType, 29981360326442803317964796.00000000000000000000000000000000000000000000000000000000000000000000000000); + ws[412] = BOOST_MATH_TEST_VALUE(RealType, 54.66145922149126997883966830687817369095124791690640312773832665397033630245360990420711923237519040); + zs[413] = BOOST_MATH_TEST_VALUE(RealType, 29981360326442803317964796.50000000000000000000000000000000000000000000000000000000000000000000000000); + ws[413] = BOOST_MATH_TEST_VALUE(RealType, 54.66145922149126997883966832325558680380429958570581742183631816048451505614209676496718115749779207); + zs[414] = BOOST_MATH_TEST_VALUE(RealType, 29981360326442803317964797.00000000000000000000000000000000000000000000000000000000000000000000000000); + ws[414] = BOOST_MATH_TEST_VALUE(RealType, 54.66145922149126997883966833963299991665735125450523144289588136670114145991685211886837782686269634); + zs[415] = BOOST_MATH_TEST_VALUE(RealType, 29981360326442803317964797.50000000000000000000000000000000000000000000000000000000000000000000000000); + ws[415] = BOOST_MATH_TEST_VALUE(RealType, 54.66145922149126997883966835601041302951040292330464519091701627262021551377788507132840586680788883); + zs[416] = BOOST_MATH_TEST_VALUE(RealType, 59962720652885606635929595.50000000000000000000000000000000000000000000000000000000000000000000000000); + ws[416] = BOOST_MATH_TEST_VALUE(RealType, 55.34222902622527492285082008163468252474529527756164189713179328516307078639643598839828067574841328); + zs[417] = BOOST_MATH_TEST_VALUE(RealType, 59962720652885606635929596.00000000000000000000000000000000000000000000000000000000000000000000000000); + ws[417] = BOOST_MATH_TEST_VALUE(RealType, 55.34222902622527492285082008982519917191333658353569747274840211384876036940931564577326778739937441); + zs[418] = BOOST_MATH_TEST_VALUE(RealType, 59962720652885606635929596.50000000000000000000000000000000000000000000000000000000000000000000000000); + ws[418] = BOOST_MATH_TEST_VALUE(RealType, 55.34222902622527492285082009801571581908137788950975298008978578466315835299634785170757312736330548); + zs[419] = BOOST_MATH_TEST_VALUE(RealType, 59962720652885606635929597.00000000000000000000000000000000000000000000000000000000000000000000000000); + ws[419] = BOOST_MATH_TEST_VALUE(RealType, 55.34222902622527492285082010620623246624941919548380841915594429760626473715753374464347315926011244); + zs[420] = BOOST_MATH_TEST_VALUE(RealType, 59962720652885606635929597.50000000000000000000000000000000000000000000000000000000000000000000000000); + ws[420] = BOOST_MATH_TEST_VALUE(RealType, 55.34222902622527492285082011439674911341746050145786378994687765267807952189287446302324434670970122); + zs[421] = BOOST_MATH_TEST_VALUE(RealType, 119925441305771213271859195.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[421] = BOOST_MATH_TEST_VALUE(RealType, 56.02314750544467013866005744109529240544406880337828236840721418957676877238000505091488001795651201); + zs[422] = BOOST_MATH_TEST_VALUE(RealType, 119925441305771213271859196.0000000000000000000000000000000000000000000000000000000000000000000000000); + ws[422] = BOOST_MATH_TEST_VALUE(RealType, 56.02314750544467013866005744519143435523841317719330604019896557212385538515430219236320724445839119); + zs[423] = BOOST_MATH_TEST_VALUE(RealType, 119925441305771213271859196.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[423] = BOOST_MATH_TEST_VALUE(RealType, 56.02314750544467013866005744928757630503275755100832969491810004678229237746659550758636675578428967); + zs[424] = BOOST_MATH_TEST_VALUE(RealType, 119925441305771213271859197.0000000000000000000000000000000000000000000000000000000000000000000000000); + ws[424] = BOOST_MATH_TEST_VALUE(RealType, 56.02314750544467013866005745338371825482710192482335333256461761355207974931688513892197266161560978); + zs[425] = BOOST_MATH_TEST_VALUE(RealType, 119925441305771213271859197.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[425] = BOOST_MATH_TEST_VALUE(RealType, 56.02314750544467013866005745747986020462144629863837695313851827243321750070517122870763907163375388); + zs[426] = BOOST_MATH_TEST_VALUE(RealType, 239850882611542426543718395.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[426] = BOOST_MATH_TEST_VALUE(RealType, 56.70421116075780244670574964727179808543930859767697217112818536350797368921774672172293682473225055); + zs[427] = BOOST_MATH_TEST_VALUE(RealType, 239850882611542426543718396.0000000000000000000000000000000000000000000000000000000000000000000000000); + ws[427] = BOOST_MATH_TEST_VALUE(RealType, 56.70421116075780244670574964932030053738025902058853016475070045198068571647010983824313512015423280); + zs[428] = BOOST_MATH_TEST_VALUE(RealType, 239850882611542426543718396.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[428] = BOOST_MATH_TEST_VALUE(RealType, 56.70421116075780244670574965136880298932120944350008815410413130287269798806862098501994253827046627); + zs[429] = BOOST_MATH_TEST_VALUE(RealType, 239850882611542426543718397.0000000000000000000000000000000000000000000000000000000000000000000000000); + ws[429] = BOOST_MATH_TEST_VALUE(RealType, 56.70421116075780244670574965341730544126215986641164613918847791618401050401328017984950518641062487); + zs[430] = BOOST_MATH_TEST_VALUE(RealType, 239850882611542426543718397.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[430] = BOOST_MATH_TEST_VALUE(RealType, 56.70421116075780244670574965546580789320311028932320412000374029191462326430408744052796917190438247); + zs[431] = BOOST_MATH_TEST_VALUE(RealType, 479701765223084853087436795.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[431] = BOOST_MATH_TEST_VALUE(RealType, 57.38541661510006336367991531277886245290205731446363101869106286487064764410271386990754234755642855); + zs[432] = BOOST_MATH_TEST_VALUE(RealType, 479701765223084853087436796.0000000000000000000000000000000000000000000000000000000000000000000000000); + ws[432] = BOOST_MATH_TEST_VALUE(RealType, 57.38541661510006336367991531380332442757645839844021552846525681769285188952591218983091633569244771); + zs[433] = BOOST_MATH_TEST_VALUE(RealType, 479701765223084853087436796.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[433] = BOOST_MATH_TEST_VALUE(RealType, 57.38541661510006336367991531482778640225085948241680003717195267123172907693535943393631252233528007); + zs[434] = BOOST_MATH_TEST_VALUE(RealType, 479701765223084853087436797.0000000000000000000000000000000000000000000000000000000000000000000000000); + ws[434] = BOOST_MATH_TEST_VALUE(RealType, 57.38541661510006336367991531585224837692526056639338454481115042548727920633105560444873053490520850); + zs[435] = BOOST_MATH_TEST_VALUE(RealType, 479701765223084853087436797.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[435] = BOOST_MATH_TEST_VALUE(RealType, 57.38541661510006336367991531687671035159966165036996905138285008045950227771300070359317000082251587); + zs[436] = BOOST_MATH_TEST_VALUE(RealType, 959403530446169706174873595.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[436] = BOOST_MATH_TEST_VALUE(RealType, 58.06676060721227034055554057973484251633179872231742522867479304887734423959008177810507929372980502); + zs[437] = BOOST_MATH_TEST_VALUE(RealType, 959403530446169706174873596.0000000000000000000000000000000000000000000000000000000000000000000000000); + ws[437] = BOOST_MATH_TEST_VALUE(RealType, 58.06676060721227034055554058024717646818581642633527555088229229848978856650264562082058837873668151); + zs[438] = BOOST_MATH_TEST_VALUE(RealType, 959403530446169706174873596.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[438] = BOOST_MATH_TEST_VALUE(RealType, 58.06676060721227034055554058075951042003983413035312587282286158171800872330936800027595921615283052); + zs[439] = BOOST_MATH_TEST_VALUE(RealType, 959403530446169706174873597.0000000000000000000000000000000000000000000000000000000000000000000000000); + ws[439] = BOOST_MATH_TEST_VALUE(RealType, 58.06676060721227034055554058127184437189385183437097619449650089856200471001024891674937552098289649); + zs[440] = BOOST_MATH_TEST_VALUE(RealType, 959403530446169706174873597.5000000000000000000000000000000000000000000000000000000000000000000000000); + ws[440] = BOOST_MATH_TEST_VALUE(RealType, 58.06676060721227034055554058178417832374786953838882651590321024902177652660528837051902100823152388); + zs[441] = BOOST_MATH_TEST_VALUE(RealType, 1918807060892339412349747195.500000000000000000000000000000000000000000000000000000000000000000000000); + ws[441] = BOOST_MATH_TEST_VALUE(RealType, 58.74823998642851741200079363299726206609746705489474024632685397908027036826962303868666955918111538); + zs[442] = BOOST_MATH_TEST_VALUE(RealType, 1918807060892339412349747196.000000000000000000000000000000000000000000000000000000000000000000000000); + ws[442] = BOOST_MATH_TEST_VALUE(RealType, 58.74823998642851741200079363325347935999834589083288276642972035197649807101708168936227006895175343); + zs[443] = BOOST_MATH_TEST_VALUE(RealType, 1918807060892339412349747196.500000000000000000000000000000000000000000000000000000000000000000000000); + ws[443] = BOOST_MATH_TEST_VALUE(RealType, 58.74823998642851741200079363350969665389922472677102528646584069120432472031910137509227273894302196); + zs[444] = BOOST_MATH_TEST_VALUE(RealType, 1918807060892339412349747197.000000000000000000000000000000000000000000000000000000000000000000000000); + ws[444] = BOOST_MATH_TEST_VALUE(RealType, 58.74823998642851741200079363376591394780010356270916780643521499676375031617568209591145770868885078); + zs[445] = BOOST_MATH_TEST_VALUE(RealType, 1918807060892339412349747197.500000000000000000000000000000000000000000000000000000000000000000000000); + ws[445] = BOOST_MATH_TEST_VALUE(RealType, 58.74823998642851741200079363402213124170098239864731032633784326865477485858682385185460511772316968); + zs[446] = BOOST_MATH_TEST_VALUE(RealType, 3837614121784678824699494395.500000000000000000000000000000000000000000000000000000000000000000000000); + ws[446] = BOOST_MATH_TEST_VALUE(RealType, 59.42985170775297409538727174934638672334406646723725983740951105026349221807009071850919012663041550); + zs[447] = BOOST_MATH_TEST_VALUE(RealType, 3837614121784678824699494396.000000000000000000000000000000000000000000000000000000000000000000000000); + ws[447] = BOOST_MATH_TEST_VALUE(RealType, 59.42985170775297409538727174947451996655623151231730299282486521387670139214046503255303771865999613); + zs[448] = BOOST_MATH_TEST_VALUE(RealType, 3837614121784678824699494396.500000000000000000000000000000000000000000000000000000000000000000000000); + ws[448] = BOOST_MATH_TEST_VALUE(RealType, 59.42985170775297409538727174960265320976839655739734614822352956044016003363242954851814317386540390); + zs[449] = BOOST_MATH_TEST_VALUE(RealType, 3837614121784678824699494397.000000000000000000000000000000000000000000000000000000000000000000000000); + ws[449] = BOOST_MATH_TEST_VALUE(RealType, 59.42985170775297409538727174973078645298056160247738930360550408995386814254598426640885488605351946); +}; +// End of lambert_w_mp_high_values.ipp diff --git a/test/lambert_w_low_reference_values.cpp b/test/lambert_w_low_reference_values.cpp new file mode 100644 index 000000000..0c0a0f72d --- /dev/null +++ b/test/lambert_w_low_reference_values.cpp @@ -0,0 +1,237 @@ +// lambert_w_test_values.cpp + +// Copyright Paul A. Bristow 2017. +// 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) + +// Write a C++ file J:\Cpp\Misc\lambert_w_1000_test_values\lambert_w_mp_values.ipp +// containing arrays of z arguments and 100 decimal digit precision lambert_w0(z) reference values. +// These can be used in tests of precision of less-precise types like +// built-in float, double, long double and quad and cpp_dec_float_50. + +// Multiprecision types: +//#include +#include // boost::multiprecision::cpp_dec_float_100 +using boost::multiprecision::cpp_dec_float_100; + +#include // +using boost::math::lambert_w0; + +#include +// using std::cout; using std::std::endl; using std::ios; using std::std::cerr; +#include +using std::setprecision; +using std::showpoint; +#include +using std::ofstream; +#include +#include // for DBL_EPS etc +#include // for numeric limits. +//#include +#include +#include +using std::transform; + +const char* prefix = "static "; // "static const" or "static constexpr" or just "const "" or "" even? +// But problems with VS2017 and GCC not accepting same format mean only static at present. + +const long double eps = std::numeric_limits::epsilon(); + +/* + +// Sample test values from Wolfram. +template +static RealType zs[noof_tests]; + +template +void init_zs() +{ + zs[0] = BOOST_MATH_TEST_VALUE(RealType, -0.35); + zs[1] = BOOST_MATH_TEST_VALUE(RealType, -0.3); + zs[2] = BOOST_MATH_TEST_VALUE(RealType, -0.01); + zs[3] = BOOST_MATH_TEST_VALUE(RealType, +0.01); + zs[4] = BOOST_MATH_TEST_VALUE(RealType, 0.1); + zs[5] = BOOST_MATH_TEST_VALUE(RealType, 0.5); + zs[6] = BOOST_MATH_TEST_VALUE(RealType, 1.); + zs[7] = BOOST_MATH_TEST_VALUE(RealType, 2.); + zs[8] = BOOST_MATH_TEST_VALUE(RealType, 5.); + zs[9] = BOOST_MATH_TEST_VALUE(RealType, 10.); + zs[10] = BOOST_MATH_TEST_VALUE(RealType, 100.); + zs[11] = BOOST_MATH_TEST_VALUE(RealType, 1e+6); +}; + +// 'Known good' Lambert w values using N[productlog(-0.3), 50] +// evaluated to full precision of RealType (up to 50 decimal digits). +template +static RealType ws[noof_tests]; + +template +void init_ws() +{ + ws[0] = BOOST_MATH_TEST_VALUE(RealType, -0.7166388164560738505881698000038650406110575701385055261614344530078353170171071547711151137001759321); + ws[1] = BOOST_MATH_TEST_VALUE(RealType, -0.4894022271802149690362312519962933689234100060163590345114659679736814083816206187318524147462752111); + ws[2] = BOOST_MATH_TEST_VALUE(RealType, -0.01010152719853875327292018767138623973670903993475235877290726369225412969738704722202330440072213641); + ws[3] = BOOST_MATH_TEST_VALUE(RealType, 0.009901473843595011885336326816570107953627746494917415482611387085655068978243229360100010886171970918); + ws[4] = BOOST_MATH_TEST_VALUE(RealType, 0.09127652716086226429989572142317956865311922405147203264830839460717224625441755165020664592995606710); + ws[5] = BOOST_MATH_TEST_VALUE(RealType, 0.3517337112491958260249093009299510651714642155171118040466438461099606107203387108968323038321915693); + ws[6] = BOOST_MATH_TEST_VALUE(RealType, 0.5671432904097838729999686622103555497538157871865125081351310792230457930866845666932194469617522946); // Output from https://www.wolframalpha.com/input/?i=lambert_w0(1) + ws[7] = BOOST_MATH_TEST_VALUE(RealType, 0.8526055020137254913464724146953174668984533001514035087721073946525150656742630448965773783502494847); + ws[8] = BOOST_MATH_TEST_VALUE(RealType, 1.326724665242200223635099297758079660128793554638047479789290393025342679920536226774469916608426789); // https://www.wolframalpha.com/input/?i=N%5Bproductlog(5),+100%5D + ws[9] = BOOST_MATH_TEST_VALUE(RealType, 1.745528002740699383074301264875389911535288129080941331322206048555557259941551704989523510778883075); + ws[10] = BOOST_MATH_TEST_VALUE(RealType, 3.385630140290050184888244364529726867491694170157806680386174654885206544913039277686735236213650781); + ws[11] = BOOST_MATH_TEST_VALUE(RealType, 11.38335808614005262200015678158500428903377470601886512143238610626898610768018867797709315493717650); + ////W(1e35) = 76.256377207295812974093508663841808129811690961764 too big for float. +}; + +*/ + +// Global so accessible from output_value. +// Creates if no file exists, & uses default overwrite/ ios::replace. +const char filename[] = "lambert_w_low_reference values.ipp"; // +std::ofstream fout(filename, std::ios::out); ; // + +// 100 decimal digits for the value fed to macro BOOST_MATH_TEST_VALUE +typedef cpp_dec_float_100 RealType; + +void output_value(size_t index, RealType value) +{ + fout + << " zs[" << index << "] = BOOST_MATH_TEST_VALUE(RealType, " + << value + << ");" + << std::endl; + return; +} + +void output_lambert_w0(size_t index, RealType value) +{ + fout + << " ws[" << index << "] = BOOST_MATH_TEST_VALUE(RealType, " + << lambert_w0(value) + << ");" + << std::endl; + return; +} + +int main() +{ // Make C++ file containing Lambert W test values. + std::cout << filename << " "; +#ifdef __TIMESTAMP__ + std::cout << __TIMESTAMP__; +#endif + std::cout << std::endl; + std::cout << "Lambert W0 decimal digit precision values." << std::endl; + + // Note __FILE__ & __TIMESTAMP__ are ANSI standard C & thus Std C++? + + if (!fout.is_open()) + { // File failed to open OK. + std::cerr << "Open file " << filename << " failed!" << std::endl; + std::cerr << "errno " << errno << std::endl; + return -1; + } + + int output_precision = std::numeric_limits::digits10; + // cpp_dec_float_100 is ample precision and + // has several extra bits internally so max_digits10 are not needed. + fout.precision(output_precision); + + int no_of_tests = 100; + + // Intro for RealType values. + std::cout << "Lambert W test values written to file " << filename << std::endl; + fout << + "\n" + "// A collection of Lambert W test values computed using " + << output_precision << " decimal digits precision.\n" + "// C++ floating-point type is " << "RealType." "\n" + "\n" + "// Written by " << __FILE__ << " " << __TIMESTAMP__ << "\n" + + "\n" + "// Copyright Paul A. Bristow 2017." "\n" + "// Distributed under the Boost Software License, Version 1.0." "\n" + "// (See accompanying file LICENSE_1_0.txt" "\n" + "// or copy at http://www.boost.org/LICENSE_1_0.txt)" "\n" + << std::endl; + + fout << "// Size of arrays of arguments z and Lambert W" << std::endl; + fout << "static const unsigned int noof_tests = " << no_of_tests << ";" << std::endl; + + // Declare arrays of z and Lambert W. + + fout << "// Declare arrays of arguments z and Lambert W(z)" << std::endl; + fout << "// The values are defined using the macro BOOST_MATH_TEST_VALUE to ensure\n" + "// that both built-in and multiprecision types are correctly initialiased with full precision.\n" + "// built-in types like double require a floating-point literal like 3.14,\n" + "// but multiprecision types require a decimal digit string like \"3.14\".\n" + << std::endl; + fout << + "\n" + "template ""\n" + "static RealType zs[" << no_of_tests << "];" + << std::endl; + + fout << + "\n" + "template ""\n" + "static RealType ws[" << no_of_tests << "];" + << std::endl; + + RealType max_z("10"); + RealType min_z("-0.35"); + RealType step_size("0.01"); + size_t step_count = no_of_tests; + + // Output to initialize array of arguments z for Lambert W. + fout << + "\n" + << "template \n" + "void init_zs()\n" + "{\n"; + + RealType z = min_z; + for (size_t i = 0; (i < no_of_tests); i++) + { + output_value(i, z); + z += step_size; + } + fout << "};" << std::endl; + + // Output array of Lambert W values. + fout << + "\n" + << "template \n" + "void init_ws()\n" + "{\n"; + + z = min_z; + for (size_t i = 0; (i < step_count); i++) + { + output_lambert_w0(i, z); + z += step_size; + } + fout << "};" << std::endl; + + fout << "// End of lambert_w_mp_values.ipp " << std::endl; + fout.close(); + + std::cout << "Lambert_w0 values written to files " << __TIMESTAMP__ << std::endl; + return 0; +} // main + + +/* + +start and finish checks again Wolfram Alpha: +ws[0] = BOOST_MATH_TEST_VALUE(RealType, -0.7166388164560738505881698000038650406110575701385055261614344530078353170171071547711151137001759321); +Wolfram N[productlog(-0.35), 100] -0.7166388164560738505881698000038650406110575701385055261614344530078353170171071547711151137001759321 + + +ws[19] = BOOST_MATH_TEST_VALUE(RealType, 0.7397278549447991214587608743391115983469848985053641692586810406118264600667862543570373167046626221); +Wolfram N[productlog(1.55), 100] 0.7397278549447991214587608743391115983469848985053641692586810406118264600667862543570373167046626221 + + +*/ + diff --git a/test/lambert_w_low_reference_values.ipp b/test/lambert_w_low_reference_values.ipp new file mode 100644 index 000000000..f4466e4c2 --- /dev/null +++ b/test/lambert_w_low_reference_values.ipp @@ -0,0 +1,236 @@ + +// A collection of Lambert W test values computed using 100 decimal digits precision. +// C++ floating-point type is RealType. + +// Written by lambert_w_mp_test_values.cpp Tue Oct 10 14:35:08 2017 + +// Copyright Paul A. Bristow 2017. +// 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) + +// Size of arrays of arguments z and Lambert W +static const unsigned int noof_tests = 100; +// Declare arrays of arguments z and Lambert W(z) +// The values are defined using the macro BOOST_MATH_TEST_VALUE to ensure +// that both built-in and multiprecision types are correctly initialiased with full precision. +// built-in types like double require a floating-point literal like 3.14, +// but multiprecision types require a decimal digit string like "3.14". + + +template +static RealType zs[100]; + +template +static RealType ws[100]; + +template +void init_zs() +{ + zs[0] = BOOST_MATH_TEST_VALUE(RealType, -0.35); + zs[1] = BOOST_MATH_TEST_VALUE(RealType, -0.34); + zs[2] = BOOST_MATH_TEST_VALUE(RealType, -0.33); + zs[3] = BOOST_MATH_TEST_VALUE(RealType, -0.32); + zs[4] = BOOST_MATH_TEST_VALUE(RealType, -0.31); + zs[5] = BOOST_MATH_TEST_VALUE(RealType, -0.3); + zs[6] = BOOST_MATH_TEST_VALUE(RealType, -0.29); + zs[7] = BOOST_MATH_TEST_VALUE(RealType, -0.28); + zs[8] = BOOST_MATH_TEST_VALUE(RealType, -0.27); + zs[9] = BOOST_MATH_TEST_VALUE(RealType, -0.26); + zs[10] = BOOST_MATH_TEST_VALUE(RealType, -0.25); + zs[11] = BOOST_MATH_TEST_VALUE(RealType, -0.24); + zs[12] = BOOST_MATH_TEST_VALUE(RealType, -0.23); + zs[13] = BOOST_MATH_TEST_VALUE(RealType, -0.22); + zs[14] = BOOST_MATH_TEST_VALUE(RealType, -0.21); + zs[15] = BOOST_MATH_TEST_VALUE(RealType, -0.2); + zs[16] = BOOST_MATH_TEST_VALUE(RealType, -0.19); + zs[17] = BOOST_MATH_TEST_VALUE(RealType, -0.18); + zs[18] = BOOST_MATH_TEST_VALUE(RealType, -0.17); + zs[19] = BOOST_MATH_TEST_VALUE(RealType, -0.16); + zs[20] = BOOST_MATH_TEST_VALUE(RealType, -0.15); + zs[21] = BOOST_MATH_TEST_VALUE(RealType, -0.14); + zs[22] = BOOST_MATH_TEST_VALUE(RealType, -0.13); + zs[23] = BOOST_MATH_TEST_VALUE(RealType, -0.12); + zs[24] = BOOST_MATH_TEST_VALUE(RealType, -0.11); + zs[25] = BOOST_MATH_TEST_VALUE(RealType, -0.1); + zs[26] = BOOST_MATH_TEST_VALUE(RealType, -0.09); + zs[27] = BOOST_MATH_TEST_VALUE(RealType, -0.08); + zs[28] = BOOST_MATH_TEST_VALUE(RealType, -0.07); + zs[29] = BOOST_MATH_TEST_VALUE(RealType, -0.06); + zs[30] = BOOST_MATH_TEST_VALUE(RealType, -0.05); + zs[31] = BOOST_MATH_TEST_VALUE(RealType, -0.04); + zs[32] = BOOST_MATH_TEST_VALUE(RealType, -0.03); + zs[33] = BOOST_MATH_TEST_VALUE(RealType, -0.02); + zs[34] = BOOST_MATH_TEST_VALUE(RealType, -0.01); + zs[35] = BOOST_MATH_TEST_VALUE(RealType, 0); + zs[36] = BOOST_MATH_TEST_VALUE(RealType, 0.01); + zs[37] = BOOST_MATH_TEST_VALUE(RealType, 0.02); + zs[38] = BOOST_MATH_TEST_VALUE(RealType, 0.03); + zs[39] = BOOST_MATH_TEST_VALUE(RealType, 0.04); + zs[40] = BOOST_MATH_TEST_VALUE(RealType, 0.05); + zs[41] = BOOST_MATH_TEST_VALUE(RealType, 0.06); + zs[42] = BOOST_MATH_TEST_VALUE(RealType, 0.07); + zs[43] = BOOST_MATH_TEST_VALUE(RealType, 0.08); + zs[44] = BOOST_MATH_TEST_VALUE(RealType, 0.09); + zs[45] = BOOST_MATH_TEST_VALUE(RealType, 0.1); + zs[46] = BOOST_MATH_TEST_VALUE(RealType, 0.11); + zs[47] = BOOST_MATH_TEST_VALUE(RealType, 0.12); + zs[48] = BOOST_MATH_TEST_VALUE(RealType, 0.13); + zs[49] = BOOST_MATH_TEST_VALUE(RealType, 0.14); + zs[50] = BOOST_MATH_TEST_VALUE(RealType, 0.15); + zs[51] = BOOST_MATH_TEST_VALUE(RealType, 0.16); + zs[52] = BOOST_MATH_TEST_VALUE(RealType, 0.17); + zs[53] = BOOST_MATH_TEST_VALUE(RealType, 0.18); + zs[54] = BOOST_MATH_TEST_VALUE(RealType, 0.19); + zs[55] = BOOST_MATH_TEST_VALUE(RealType, 0.2); + zs[56] = BOOST_MATH_TEST_VALUE(RealType, 0.21); + zs[57] = BOOST_MATH_TEST_VALUE(RealType, 0.22); + zs[58] = BOOST_MATH_TEST_VALUE(RealType, 0.23); + zs[59] = BOOST_MATH_TEST_VALUE(RealType, 0.24); + zs[60] = BOOST_MATH_TEST_VALUE(RealType, 0.25); + zs[61] = BOOST_MATH_TEST_VALUE(RealType, 0.26); + zs[62] = BOOST_MATH_TEST_VALUE(RealType, 0.27); + zs[63] = BOOST_MATH_TEST_VALUE(RealType, 0.28); + zs[64] = BOOST_MATH_TEST_VALUE(RealType, 0.29); + zs[65] = BOOST_MATH_TEST_VALUE(RealType, 0.3); + zs[66] = BOOST_MATH_TEST_VALUE(RealType, 0.31); + zs[67] = BOOST_MATH_TEST_VALUE(RealType, 0.32); + zs[68] = BOOST_MATH_TEST_VALUE(RealType, 0.33); + zs[69] = BOOST_MATH_TEST_VALUE(RealType, 0.34); + zs[70] = BOOST_MATH_TEST_VALUE(RealType, 0.35); + zs[71] = BOOST_MATH_TEST_VALUE(RealType, 0.36); + zs[72] = BOOST_MATH_TEST_VALUE(RealType, 0.37); + zs[73] = BOOST_MATH_TEST_VALUE(RealType, 0.38); + zs[74] = BOOST_MATH_TEST_VALUE(RealType, 0.39); + zs[75] = BOOST_MATH_TEST_VALUE(RealType, 0.4); + zs[76] = BOOST_MATH_TEST_VALUE(RealType, 0.41); + zs[77] = BOOST_MATH_TEST_VALUE(RealType, 0.42); + zs[78] = BOOST_MATH_TEST_VALUE(RealType, 0.43); + zs[79] = BOOST_MATH_TEST_VALUE(RealType, 0.44); + zs[80] = BOOST_MATH_TEST_VALUE(RealType, 0.45); + zs[81] = BOOST_MATH_TEST_VALUE(RealType, 0.46); + zs[82] = BOOST_MATH_TEST_VALUE(RealType, 0.47); + zs[83] = BOOST_MATH_TEST_VALUE(RealType, 0.48); + zs[84] = BOOST_MATH_TEST_VALUE(RealType, 0.49); + zs[85] = BOOST_MATH_TEST_VALUE(RealType, 0.5); + zs[86] = BOOST_MATH_TEST_VALUE(RealType, 0.51); + zs[87] = BOOST_MATH_TEST_VALUE(RealType, 0.52); + zs[88] = BOOST_MATH_TEST_VALUE(RealType, 0.53); + zs[89] = BOOST_MATH_TEST_VALUE(RealType, 0.54); + zs[90] = BOOST_MATH_TEST_VALUE(RealType, 0.55); + zs[91] = BOOST_MATH_TEST_VALUE(RealType, 0.56); + zs[92] = BOOST_MATH_TEST_VALUE(RealType, 0.57); + zs[93] = BOOST_MATH_TEST_VALUE(RealType, 0.58); + zs[94] = BOOST_MATH_TEST_VALUE(RealType, 0.59); + zs[95] = BOOST_MATH_TEST_VALUE(RealType, 0.6); + zs[96] = BOOST_MATH_TEST_VALUE(RealType, 0.61); + zs[97] = BOOST_MATH_TEST_VALUE(RealType, 0.62); + zs[98] = BOOST_MATH_TEST_VALUE(RealType, 0.63); + zs[99] = BOOST_MATH_TEST_VALUE(RealType, 0.64); +}; + +template +void init_ws() +{ + ws[0] = BOOST_MATH_TEST_VALUE(RealType, -0.7166388164560746087024558456707254694384568520557269136746931098892793788395047380759438025387884858); + ws[1] = BOOST_MATH_TEST_VALUE(RealType, -0.6536945012690894831597997531138338843162464994103594824433758069038214520742337992347211610550053984); + ws[2] = BOOST_MATH_TEST_VALUE(RealType, -0.6032666497551330505290050177510626805198672833479939253720127109209527349195161224268802996274136747); + ws[3] = BOOST_MATH_TEST_VALUE(RealType, -0.5604894830784555743634840504116545657018790664887527536558909385182231717303278501957297352008893216); + ws[4] = BOOST_MATH_TEST_VALUE(RealType, -0.5229899496273203531021836240814670901286300106249589336522580913925382314180343142582930298688973328); + ws[5] = BOOST_MATH_TEST_VALUE(RealType, -0.4894022271802149690362312519962933689234100060163590345114659679736814083816206187318524147462752111); + ws[6] = BOOST_MATH_TEST_VALUE(RealType, -0.4588564134818020881945707413259267147702798410198651247860751590059996177594865393191440343561489497); + ws[7] = BOOST_MATH_TEST_VALUE(RealType, -0.430758874527112757916530656841372138819645982270515538512158436501726397121990576271580205308878207); + ws[8] = BOOST_MATH_TEST_VALUE(RealType, -0.4046836216050718653643250056478665857931866093242449366197023952738694255086107304901218425119878285); + ws[9] = BOOST_MATH_TEST_VALUE(RealType, -0.3803130203301711158303965355878156301369877394562403253806911002545713191362049178479001390543005669); + ws[10] = BOOST_MATH_TEST_VALUE(RealType, -0.3574029561813889030688111040559047533165905550760120436276204485896714025961457962896168513444411851); + ws[11] = BOOST_MATH_TEST_VALUE(RealType, -0.3357611647889027517286807582305262236620547459507665934563718789670705154001183482511605249232725262); + ws[12] = BOOST_MATH_TEST_VALUE(RealType, -0.3152331201461386435765969738874032981030054464637097661705367708887648429131963353376761780892891198); + ws[13] = BOOST_MATH_TEST_VALUE(RealType, -0.2956924930138396731882414803341009766267402363327831485839773479792571341845506001421908939342687003); + ws[14] = BOOST_MATH_TEST_VALUE(RealType, -0.2770344936961942277405408649408688233196542455843784252217943010706466317584602777484953020015260171); + ws[15] = BOOST_MATH_TEST_VALUE(RealType, -0.2591711018190737450566519502154067057135883397008937032218391275127128217957580326598838960236799743); + ws[16] = BOOST_MATH_TEST_VALUE(RealType, -0.2420275690015187377858338945726638068700099098394765251572836145818480355482127963663852628850474365); + ws[17] = BOOST_MATH_TEST_VALUE(RealType, -0.2255398031589208520522477564458058214947250100630471825833168970061295445194143654537283079293631882); + ws[18] = BOOST_MATH_TEST_VALUE(RealType, -0.2096523776773757526854110454922591821172341338912795099236642246474810661153254626268152915502654464); + ws[19] = BOOST_MATH_TEST_VALUE(RealType, -0.1943169925501295306267806518866699513042867279514786976609290465447683131164947042462416733465191705); + ws[20] = BOOST_MATH_TEST_VALUE(RealType, -0.1794912683479847336169956193772297997551233686606176679348345166799006378410748708389238307302596092); + ws[21] = BOOST_MATH_TEST_VALUE(RealType, -0.1651377892669526609846674769813353453533631060975171667664202096550705187268670901310309631101894252); + ws[22] = BOOST_MATH_TEST_VALUE(RealType, -0.1512233352864070831284495817823327538270829682666487244093315171463780635423561100568377622135186516); + ws[23] = BOOST_MATH_TEST_VALUE(RealType, -0.1377182597958957974485081647284122921614575977782346246206306428239556449434198032928042029722138321); + ws[24] = BOOST_MATH_TEST_VALUE(RealType, -0.1245959804557266577566667196210790531357931527107938915216224185712652948438844608688497767379885997); + ws[25] = BOOST_MATH_TEST_VALUE(RealType, -0.1118325591589629648335694568202658422726453622912658633296897727621943319600088273854870109175450158); + ws[26] = BOOST_MATH_TEST_VALUE(RealType, -0.09940635280454481474353567186786621057820625354936552021878311951478746295439312235429098520600693655); + ws[27] = BOOST_MATH_TEST_VALUE(RealType, -0.0872977208615799240409197586602731399264877335001009828544494658243661146551788411188719365040631665); + ws[28] = BOOST_MATH_TEST_VALUE(RealType, -0.07548877886579220591933915955796681153524932228333916508394604171275936228487984352484617277876166196); + ws[29] = BOOST_MATH_TEST_VALUE(RealType, -0.06396318935617251019529498180168867456392641049371161867095248726275828927462089387234209569688498636); + ws[30] = BOOST_MATH_TEST_VALUE(RealType, -0.05270598355154634795995650617915721289427674396592395159861151190218069285705994080638064249535030165); + ws[31] = BOOST_MATH_TEST_VALUE(RealType, -0.0417034084364844738987273381255397678625601003793974576012640697941798897037109744906565096871084505); + ws[32] = BOOST_MATH_TEST_VALUE(RealType, -0.03094279498284817939791038065611524917275896960162863310717850085820789123932160879579380708946724763); + ws[33] = BOOST_MATH_TEST_VALUE(RealType, -0.02041244405580766725973605390749548004158612495647388221129868845283704895545337928376001388096747673); + ws[34] = BOOST_MATH_TEST_VALUE(RealType, -0.01010152719853875327292018767138623973670903993475235877290726369225412969738704722202330440072213641); + ws[35] = BOOST_MATH_TEST_VALUE(RealType, 0); + ws[36] = BOOST_MATH_TEST_VALUE(RealType, 0.009901473843595011885336326816570107953627746494917415482611387085655068978243229360100010886171970918); + ws[37] = BOOST_MATH_TEST_VALUE(RealType, 0.01961158933740562729168248268298370977812129423409093067066057185151403434315590894008191205649296367); + ws[38] = BOOST_MATH_TEST_VALUE(RealType, 0.02913845916787001265458568152535395243296458501852019787733534716701300947181963767753439648797667795); + ws[39] = BOOST_MATH_TEST_VALUE(RealType, 0.03848966594197856933287598180923987047561124099417969473653441752849562865576161248185402614815991005); + ws[40] = BOOST_MATH_TEST_VALUE(RealType, 0.04767230860012937472638890051416087074706296593389050213640962398757901310991378849253401839554247932); + ws[41] = BOOST_MATH_TEST_VALUE(RealType, 0.05669304377414432493107872588796066666126335321712197451058496819855703149168243802045469883952188552); + ws[42] = BOOST_MATH_TEST_VALUE(RealType, 0.06555812274442272075701853672870305774479404911034476570035450491724937359575494857058381868464932454); + ws[43] = BOOST_MATH_TEST_VALUE(RealType, 0.07427342455278083997072135190143718509109109085324108067398934333182382982634706320903236612485848405); + ws[44] = BOOST_MATH_TEST_VALUE(RealType, 0.08284448574644162210327285639805993759142367414790119841318433362329213386156887296335560991622282284); + ws[45] = BOOST_MATH_TEST_VALUE(RealType, 0.0912765271608622642998957214231795686531192240514720326483083946071722462544175516502066459299560671); + ws[46] = BOOST_MATH_TEST_VALUE(RealType, 0.09957447809219979168181062315832233980460887841902355310769435168948823854831388504977465633939682845); + ws[47] = BOOST_MATH_TEST_VALUE(RealType, 0.1077429981622769541092028233904076346257727607117049788632909974125087436037688769621472372382338589); + ws[48] = BOOST_MATH_TEST_VALUE(RealType, 0.1157864971383620420455904585908175984070719832012079215609230219591260309061070611295890797209058613); + ws[49] = BOOST_MATH_TEST_VALUE(RealType, 0.123709152935653268637225082319130933018353939077412845800247462273779701933149651969922416814563643); + ws[50] = BOOST_MATH_TEST_VALUE(RealType, 0.1315149280010344580474416667366241780127651069693569916108339146599686985542850094826506230355645206); + ws[51] = BOOST_MATH_TEST_VALUE(RealType, 0.1392075842516055911219563262364716100580324132271864711438857091601938661529783118284822918918762012); + ws[52] = BOOST_MATH_TEST_VALUE(RealType, 0.1467906967200019429098356045334600022599041243103780089713630524471411698742480890410424556292186252); + ws[53] = BOOST_MATH_TEST_VALUE(RealType, 0.1542676660400332595939671017213220881360827710416946348345860549372631184130438485651715394816551156); + ws[54] = BOOST_MATH_TEST_VALUE(RealType, 0.1616417298902320361099923668622409534689583622433205732144762283241135493479959458637574220609547663); + ws[55] = BOOST_MATH_TEST_VALUE(RealType, 0.1689159734991095651164749037058183987284469135107297553319388783258832067427865597883933228919370041); + ws[56] = BOOST_MATH_TEST_VALUE(RealType, 0.176093339303957105084240207040480028792877878787501699026158171529756555902997254667356047116441788); + ws[57] = BOOST_MATH_TEST_VALUE(RealType, 0.1831766358446274967063002214815526159126266889851598585852904605011653998837614409160807673866997377); + ws[58] = BOOST_MATH_TEST_VALUE(RealType, 0.1901685459646637418459898415362480836632528245228542609994635862866965513625128722227696305198415266); + ws[59] = BOOST_MATH_TEST_VALUE(RealType, 0.1970716343842153356374997203517126469395880032764377549805749691269132085609349859323881542196582345); + ws[60] = BOOST_MATH_TEST_VALUE(RealType, 0.2038883547022401644431818313271398701493524772101596349734062600818193640670940526181645713107956088); + ws[61] = BOOST_MATH_TEST_VALUE(RealType, 0.2106210558793939073502149913441295543358575322967676769367700683562463350885767192666542957075712751); + ws[62] = BOOST_MATH_TEST_VALUE(RealType, 0.2172719882476450310112829333455034301692311490231843772189917487700633677693451679449281229277444); + ws[63] = BOOST_MATH_TEST_VALUE(RealType, 0.2238433090879237484082608989533539628744637740613473368794338628306680030796510487992807280960350863); + ws[64] = BOOST_MATH_TEST_VALUE(RealType, 0.230337087812934212569787581174413102713202565273940246146535096101718965948694383449116272546328387); + ws[65] = BOOST_MATH_TEST_VALUE(RealType, 0.2367553107885593168713669913131022529850076068942822776500825494062035956449035725319106127888967252); + ws[66] = BOOST_MATH_TEST_VALUE(RealType, 0.2430998858240055404991486201117080426760827615791233989777935602839590601547710113790997280209616842); + ws[67] = BOOST_MATH_TEST_VALUE(RealType, 0.2493726463579186824703694885450067240777490681347030220353778714445393581714407422015446216089384764); + ws[68] = BOOST_MATH_TEST_VALUE(RealType, 0.255575355365104731122377747221405406075211883935782315620283025379607560268766005462481341306785098); + ws[69] = BOOST_MATH_TEST_VALUE(RealType, 0.2617097090061743695408970492873886795528577990555646770473973759567281587373896180370074675102853899); + ws[70] = BOOST_MATH_TEST_VALUE(RealType, 0.2677773400403608426926161268075028522173112518463765933864820650709836250445193581155036917009299903); + ws[71] = BOOST_MATH_TEST_VALUE(RealType, 0.2737798210199097285877692071254930326690991310905656381739509847292712940678493744834592887738653624); + ws[72] = BOOST_MATH_TEST_VALUE(RealType, 0.279718667282780030688985330053563938014151152536888220220066424808617200267097125397004630221318648); + ws[73] = BOOST_MATH_TEST_VALUE(RealType, 0.2855953397589067078034135225526038434573251024673070045734211311120835242005964286865861813715576376); + ws[74] = BOOST_MATH_TEST_VALUE(RealType, 0.2914112476039358811079401653518892721830457004248980213382598417991951999360380881350324421536041991); + ws[75] = BOOST_MATH_TEST_VALUE(RealType, 0.2971677506731385467797269622470213419044581015501274519083671027242648030351552074110959032585686367); + ws[76] = BOOST_MATH_TEST_VALUE(RealType, 0.3028661618471218240709788492447379933660682925225029587250796959940885465093714030223793579774677182); + ws[77] = BOOST_MATH_TEST_VALUE(RealType, 0.3085077492199755507560853270193391876750205224915338763730055720866605941218639559241097041425718389); + ws[78] = BOOST_MATH_TEST_VALUE(RealType, 0.3140937381596049465307653625755662577673424859113972924301418900103932566506643308363685842713510345); + ws[79] = BOOST_MATH_TEST_VALUE(RealType, 0.3196253132491970154264844863020982117371468405067770401175599100299218378827848337045090472924417639); + ws[80] = BOOST_MATH_TEST_VALUE(RealType, 0.3251036201180404567925882149866539513803608104758008850889564944127408970111984388784259876569696298); + ws[81] = BOOST_MATH_TEST_VALUE(RealType, 0.3305297671692582446013104792754623176896333299898173620545327652833709938789531370957735854140619173); + ws[82] = BOOST_MATH_TEST_VALUE(RealType, 0.3359048272114117659741549735010360281170238179628782075568249283432891398635686044147614597227718316); + ws[83] = BOOST_MATH_TEST_VALUE(RealType, 0.3412298390003893228052121236143338755316388573531939840892239102731223392510954828680280968924289841); + ws[84] = BOOST_MATH_TEST_VALUE(RealType, 0.3465058086974944293540338951489158955895910665452626949454054191729967933634547552073491283786892473); + ws[85] = BOOST_MATH_TEST_VALUE(RealType, 0.3517337112491958260249093009299510651714642155171118040466438461099606107203387108968323038321915693); + ws[86] = BOOST_MATH_TEST_VALUE(RealType, 0.356914491693587151869424246256045038549439930737927770357941686970717473161840668532896372614750844); + ws[87] = BOOST_MATH_TEST_VALUE(RealType, 0.3620490663982259224347136211795537282192272992052648623722265772196673697387836128745005565051134501); + ws[88] = BOOST_MATH_TEST_VALUE(RealType, 0.3671383242336754065717073384163048245222026534654156361188807018443753849870522240862625069431927886); + ws[89] = BOOST_MATH_TEST_VALUE(RealType, 0.3721831276867561125667772461128588424710274544378039645877124572815833807252348818205119412993474916); + ws[90] = BOOST_MATH_TEST_VALUE(RealType, 0.3771843139172231305654429202753334704233212269643890432815783280355585518582574589199227373679397234); + ws[91] = BOOST_MATH_TEST_VALUE(RealType, 0.3821426957613190709393551341272838157890329391308789323327108090412283903082231991030667000296469447); + ws[92] = BOOST_MATH_TEST_VALUE(RealType, 0.3870590626854075768406867666899001946809584949146574272916930955076684732166306691825829034241158645); + ws[93] = BOOST_MATH_TEST_VALUE(RealType, 0.3919341816926673886247930427095007681691393368820432019135743979557612444151495005378394686508979365); + ws[94] = BOOST_MATH_TEST_VALUE(RealType, 0.3967687981856199130952904028742195107327166899059243534847812692294320278426834780185947685265825165); + ws[95] = BOOST_MATH_TEST_VALUE(RealType, 0.4015636367870725946626664537946836866230027160063511402379921560604975325206585381386527082762303647); + ws[96] = BOOST_MATH_TEST_VALUE(RealType, 0.4063194021218846501705479426913810870863608030934864938423596576756863248859417057476841165663966806); + ws[97] = BOOST_MATH_TEST_VALUE(RealType, 0.4110367795617996075205416204209832162005305795083946929235957810141140813392726029732502982435129093); + ws[98] = BOOST_MATH_TEST_VALUE(RealType, 0.4157164359354393999190647189307900734531788488207389484153095921329397217223528187979110265697876198); + ws[99] = BOOST_MATH_TEST_VALUE(RealType, 0.4203590202054164452305419772022302902943227646223432518640399730485379665439298245520857153666787776); +}; +// End of lambert_w_mp_values.ipp diff --git a/test/test_lambert_w.cpp b/test/test_lambert_w.cpp index 899589956..3909c97ea 100644 --- a/test/test_lambert_w.cpp +++ b/test/test_lambert_w.cpp @@ -7,7 +7,8 @@ // or copy at http://www.boost.org/LICENSE_1_0.txt) // test_lambertw.cpp -//! \brief Basic sanity tests for Lambert W function plog or lambert_w using algorithm from Thomas Luu. +//! \brief Basic sanity tests for Lambert W function plog +//! or lambert_w using algorithm from Thomas Luu, Veberic and Fukushima. #include // for real_concept #define BOOST_TEST_MAIN @@ -15,27 +16,22 @@ #include // Boost.Test #include -#include "test_value.hpp" // for create_test_value +#include +#include +#include #include // boost::multiprecision::cpp_dec_float_50 using boost::multiprecision::cpp_dec_float_50; #include - -#ifdef BOOST_HAS_FLOAT128 -#include // Not available for MSVC. -#endif - -#include - - fine BOOST_MATH_INSTRUMENT_LAMBERT_W // #define only for Lambert_w diagnostic output. -#include // For Lambert W lambert_w function. -using boost::math::lambert_w; +//#include // If available. #include // isnan, ifinite. +#include "test_value.hpp" // Macro BOOST_MATH_TEST_VALUE for create_test_value. -#include -#include -#include +//#define BOOST_MATH_INSTRUMENT_LAMBERT_W // #define only for much Lambert_w diagnostic output. +#include // For Lambert W lambert_w function. +using boost::math::lambert_w0; +using boost::math::lambert_wm1; #include #include @@ -54,8 +50,8 @@ static const boost::array test_data = //static const boost::array test_expected = //{ { -// BOOST_MATH_TEST_VALUE(T, 0.56714329040978387299996866221035554975381578718651), // Output from https://www.wolframalpha.com/input/?i=lambert_w(1) -// BOOST_MATH_TEST_VALUE(T, 1.432404775898300311234078007212058694786434608804302025655) // Output from https://www.wolframalpha.com/input/?i=lambert_w(6) +// BOOST_MATH_TEST_VALUE(T, 0.56714329040978387299996866221035554975381578718651), // Output from https://www.wolframalpha.com/input/?i=lambert_w0(1) +// BOOST_MATH_TEST_VALUE(T, 1.432404775898300311234078007212058694786434608804302025655) // Output from https://www.wolframalpha.com/input/?i=lambert_w0(6) // } }; // array test_data @@ -119,7 +115,8 @@ void test_spots(RealType) // (Unused Parameter value, arbitrarily zero, only communicates the floating point type). // test_spots(0.F); test_spots(0.); test_spots(0.L); - using boost::math::lambert_w; + using boost::math::lambert_w0; + using boost::math::lambert_wm1; using boost::math::constants::exp_minus_one; using boost::math::policies::policy; @@ -134,14 +131,14 @@ void test_spots(RealType) // // Test some bad parameters to the function, with default policy and with ignore_all policy. #ifndef BOOST_NO_EXCEPTIONS - BOOST_CHECK_THROW(boost::math::lambert_w(-1.), std::domain_error); - BOOST_CHECK_THROW(lambert_w(std::numeric_limits::quiet_NaN()), std::domain_error); // Would be NaN. - BOOST_CHECK_THROW(lambert_w(std::numeric_limits::infinity()), std::domain_error); // Would be infinite. - BOOST_CHECK_THROW(lambert_w(-static_cast(0.4)), std::domain_error); // Would be complex. + BOOST_CHECK_THROW(boost::math::lambert_w0(-1.), std::domain_error); + BOOST_CHECK_THROW(lambert_w0(std::numeric_limits::quiet_NaN()), std::domain_error); // Would be NaN. + BOOST_CHECK_THROW(lambert_w0(std::numeric_limits::infinity()), std::domain_error); // Would be infinite. + BOOST_CHECK_THROW(lambert_w0(-static_cast(0.4)), std::domain_error); // Would be complex. #else - BOOST_MATH_CHECK_EQUAL(boost::math::lambert_w(std::numeric_limits::quiet_NaN(), ignore_all_policy), std::numeric_limits(std::numeric_limits::infinity(), ignore_all_policy), std::numeric_limits(std::numeric_limits::quiet_NaN(), ignore_all_policy), std::numeric_limits(std::numeric_limits::infinity(), ignore_all_policy), std::numeric_limits(); // -exp(-1) = -0.36787944117144232159552377016146086744581113103176783450783680169746149574489980335714727434591964374662732527 - // lambert_w[-0.367879441171442321595523770161460867445811131031767834] == -1 + // lambert_w0[-0.367879441171442321595523770161460867445811131031767834] == -1 // -0.36787945032119751 RealType minus_one_value = BOOST_MATH_TEST_VALUE(RealType, -1.); //std::cout << "singular_value " << singular_value << ", expected Lambert W = " << minus_one_value << std::endl; BOOST_CHECK_CLOSE_FRACTION( // Check -exp(-1) = -0.367879450 = -1 - lambert_w(singular_value), + lambert_w0(singular_value), minus_one_value, tolerance); // OK BOOST_CHECK_CLOSE_FRACTION( // Check -exp(-1) ~= -0.367879450 == -1 - lambert_w(BOOST_MATH_TEST_VALUE(RealType, -0.36787944117144232159552377016146086744581113103176783450783680169746149574489980335714727434591964374662732527)), + lambert_w0(BOOST_MATH_TEST_VALUE(RealType, -0.36787944117144232159552377016146086744581113103176783450783680169746149574489980335714727434591964374662732527)), BOOST_MATH_TEST_VALUE(RealType, -1.), tolerance); BOOST_CHECK_CLOSE_FRACTION( // Check -exp(-1) ~= -0.367879450 == -1 - lambert_w(-exp_minus_one()), + lambert_w0(-exp_minus_one()), BOOST_MATH_TEST_VALUE(RealType, -1.), tolerance); // Tests with some spot values computed using // https://www.wolframalpha.com/input - // For example: N[lambert_w[1], 50] outputs: + // For example: N[lambert_w0[1], 50] outputs: // 0.56714329040978387299996866221035554975381578718651 - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 0.1)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 0.1)), BOOST_MATH_TEST_VALUE(RealType, 0.091276527160862264299895721423179568653119224051472), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(0.2) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(0.2) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 0.2)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 0.2)), BOOST_MATH_TEST_VALUE(RealType, 0.16891597349910956511647490370581839872844691351073), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(0.2) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(0.2) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 0.5)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 0.5)), BOOST_MATH_TEST_VALUE(RealType, 0.351733711249195826024909300929951065171464215517111804046), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(0.5) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(0.5) tolerance); BOOST_CHECK_CLOSE_FRACTION( - lambert_w(BOOST_MATH_TEST_VALUE(RealType, 1.)), + lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 1.)), BOOST_MATH_TEST_VALUE(RealType, 0.56714329040978387299996866221035554975381578718651), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(1) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(1) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 2.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 2.)), BOOST_MATH_TEST_VALUE(RealType, 0.852605502013725491346472414695317466898453300151403508772), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(2.) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(2.) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 3.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 3.)), BOOST_MATH_TEST_VALUE(RealType, 1.049908894964039959988697070552897904589466943706341452932), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(3.) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(3.) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 5.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 5.)), BOOST_MATH_TEST_VALUE(RealType, 1.326724665242200223635099297758079660128793554638047479789), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(0.5) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(0.5) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 6.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 6.)), BOOST_MATH_TEST_VALUE(RealType, 1.432404775898300311234078007212058694786434608804302025655), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(6) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(6) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 100.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 100.)), BOOST_MATH_TEST_VALUE(RealType, 3.3856301402900501848882443645297268674916941701578), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(100) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(100) tolerance); // This fails for fixed_point type used for other tests because out of range? - //BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 1.0e6)), + //BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 1.0e6)), //BOOST_MATH_TEST_VALUE(RealType, 11.383358086140052622000156781585004289033774706019), - //// Output from https://www.wolframalpha.com/input/?i=lambert_w(1e6) + //// Output from https://www.wolframalpha.com/input/?i=lambert_w0(1e6) //// tolerance * 1000); // fails for fixed_point type exceeds 0.00015258789063 // // 15.258789063 // // 11.383346558 @@ -241,7 +238,7 @@ void test_spots(RealType) // So need to use some spot tests for specific types, or use a bigger fixed_point type. // Check zero. - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 0.0)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 0.0)), BOOST_MATH_TEST_VALUE(RealType, 0.0), tolerance); // these fail for cpp_dec_float_50 @@ -251,11 +248,11 @@ void test_spots(RealType) /* if (std::numeric_limits::is_specialized) { // Check +/- values near to zero. - BOOST_CHECK_CLOSE_FRACTION(lambert_w(std::numeric_limits::epsilon()), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(std::numeric_limits::epsilon()), BOOST_MATH_TEST_VALUE(RealType, 0.0), tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(-std::numeric_limits::epsilon()), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(-std::numeric_limits::epsilon()), BOOST_MATH_TEST_VALUE(RealType, 0.0), tolerance); } // is_specialized @@ -263,11 +260,11 @@ void test_spots(RealType) // Check infinite if possible. if (std::numeric_limits::has_infinity) { - BOOST_CHECK_CLOSE_FRACTION(lambert_w(+std::numeric_limits::infinity()), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(+std::numeric_limits::infinity()), BOOST_MATH_TEST_VALUE(RealType, 0.0), tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(-std::numeric_limits::infinity()), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(-std::numeric_limits::infinity()), BOOST_MATH_TEST_VALUE(RealType, 0.0), tolerance); } @@ -275,11 +272,11 @@ void test_spots(RealType) // Check NaN if possible. if (std::numeric_limits::has_quiet_NaN) { - BOOST_CHECK_CLOSE_FRACTION(lambert_w(+std::numeric_limits::quiet_NaN()), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(+std::numeric_limits::quiet_NaN()), BOOST_MATH_TEST_VALUE(RealType, 0.0), tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(-std::numeric_limits::quiet_NaN()), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(-std::numeric_limits::quiet_NaN()), BOOST_MATH_TEST_VALUE(RealType, 0.0), tolerance); } @@ -291,9 +288,9 @@ void test_spots(RealType) // Checks on input that should throw. /* This should throw when implemented. - BOOST_CHECK_CLOSE_FRACTION(lambert_w(-0.5), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(-0.5), BOOST_MATH_TEST_VALUE(RealType, ), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(-0.5) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(-0.5) tolerance); */ } //template void test_spots(RealType) @@ -336,15 +333,15 @@ BOOST_AUTO_TEST_CASE(test_types) BOOST_AUTO_TEST_CASE(test_range_of_values) { - using boost::math::lambert_w; + using boost::math::lambert_w0; using boost::math::constants::exp_minus_one; BOOST_TEST_MESSAGE("Test Lambert W function type double for range of values."); // Want to test almost largest value. // test_value = (std::numeric_limits::max)() / 4; // std::cout << std::setprecision(std::numeric_limits::max_digits10) << "Max value = " << test_value << std::endl; - // Can't use a test like this for all types because max_value depends on RealType and thus the expected result of lambert_w does too. - //BOOST_CHECK_CLOSE_FRACTION(lambert_w(test_value), + // Can't use a test like this for all types because max_value depends on RealType and thus the expected result of lambert_w0 does too. + //BOOST_CHECK_CLOSE_FRACTION(lambert_w0(test_value), // BOOST_MATH_TEST_VALUE(RealType, ???), // tolerance); // So this section just tests a single type, say IEEE 64-bit double, for a range of spot values. @@ -355,19 +352,19 @@ BOOST_AUTO_TEST_CASE(test_range_of_values) RealType tolerance = boost::math::tools::epsilon() * epsilons; // 2 eps as a fraction. std::cout << "Tolerance " << epsilons << " * epsilon == " << tolerance << std::endl; - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 1.0e-6)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 1.0e-6)), BOOST_MATH_TEST_VALUE(RealType, 9.9999900000149999733333854165586669000967020964243e-7), // Output from https://www.wolframalpha.com/input/ N[lambert_w[1e-6],50]) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 0.0001)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 0.0001)), BOOST_MATH_TEST_VALUE(RealType, 0.000099990001499733385405869000452213835767629477903460), // Output from https://www.wolframalpha.com/input/ N[lambert_w[0.001],50]) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 0.001)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 0.001)), BOOST_MATH_TEST_VALUE(RealType, 0.00099900149733853088995782787410778559957065467928884), // Output from https://www.wolframalpha.com/input/ N[lambert_w[0.001],50]) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 0.01)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 0.01)), BOOST_MATH_TEST_VALUE(RealType, 0.0099014738435950118853363268165701079536277464949174), // Output from https://www.wolframalpha.com/input/ N[lambert_w[0.01],50]) tolerance * 25); // <<< Needs a much bigger tolerance??? @@ -381,60 +378,60 @@ BOOST_AUTO_TEST_CASE(test_range_of_values) // 0.00990728209160670 approx // 0.00990147384359511 previous - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 0.05)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 0.05)), BOOST_MATH_TEST_VALUE(RealType, 0.047672308600129374726388900514160870747062965933891), // Output from https://www.wolframalpha.com/input/ N[lambert_w[0.01],50]) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 0.1)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 0.1)), BOOST_MATH_TEST_VALUE(RealType, 0.091276527160862264299895721423179568653119224051472), // Output from https://www.wolframalpha.com/input/ N[lambert_w[1],50]) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 1.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 1.)), BOOST_MATH_TEST_VALUE(RealType, 0.56714329040978387299996866221035554975381578718651), // Output from https://www.wolframalpha.com/input/ N[lambert_w[1],50]) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 2.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 2.)), BOOST_MATH_TEST_VALUE(RealType, 0.852605502013725491346472414695317466898453300151403508772), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(2.) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(2.) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 3.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 3.)), BOOST_MATH_TEST_VALUE(RealType, 1.049908894964039959988697070552897904589466943706341452932), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(3.) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(3.) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 5.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 5.)), BOOST_MATH_TEST_VALUE(RealType, 1.326724665242200223635099297758079660128793554638047479789), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(0.5) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(0.5) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 6.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 6.)), BOOST_MATH_TEST_VALUE(RealType, 1.432404775898300311234078007212058694786434608804302025655), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(6) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(6) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 10.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 10.)), BOOST_MATH_TEST_VALUE(RealType, 1.7455280027406993830743012648753899115352881290809), // Output from https://www.wolframalpha.com/input/ N[lambert_w[10],50]) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 100.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 100.)), BOOST_MATH_TEST_VALUE(RealType, 3.3856301402900501848882443645297268674916941701578), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(100) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(100) tolerance); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 1000.)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 1000.)), BOOST_MATH_TEST_VALUE(RealType, 5.2496028524015962271260563196973062825214723860596), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(1000) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(1000) tolerance); // This fails for fixed_point type used for other tests because out of range of the type? - BOOST_CHECK_CLOSE_FRACTION(lambert_w(BOOST_MATH_TEST_VALUE(RealType, 1.0e6)), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(BOOST_MATH_TEST_VALUE(RealType, 1.0e6)), BOOST_MATH_TEST_VALUE(RealType, 11.383358086140052622000156781585004289033774706019), - // Output from https://www.wolframalpha.com/input/?i=lambert_w(1e6) + // Output from https://www.wolframalpha.com/input/?i=lambert_w0(1e6) tolerance); // // Tests for double only near the max and the singularity where Lambert_w estimates are less precise. @@ -448,7 +445,7 @@ BOOST_AUTO_TEST_CASE(test_range_of_values) // << " " << (std::numeric_limits::max)() / 4 // == 4.4942328371557893e+307 // << std::endl; - BOOST_CHECK_CLOSE_FRACTION(boost::math::lambert_w(4.4942328371557893e+307), // max_value/4 for IEEE 64-bit double. + BOOST_CHECK_CLOSE_FRACTION(boost::math::lambert_w0(4.4942328371557893e+307), // max_value/4 for IEEE 64-bit double. static_cast(702.02379914670587), // N[lambert_w[4.4942328371557893e+307], 35] == 701.84270921429200143342782556643059 // as a double == 701.83341468208209 @@ -456,14 +453,14 @@ BOOST_AUTO_TEST_CASE(test_range_of_values) // std::numeric_limits::epsilon() * 256); 0.0003); // Much less precise near the max edge. - BOOST_CHECK_CLOSE_FRACTION(boost::math::lambert_w(4.4942328371557893e+307/2), // near max_value for IEEE 64-bit double. + BOOST_CHECK_CLOSE_FRACTION(boost::math::lambert_w0(4.4942328371557893e+307/2), // near max_value for IEEE 64-bit double. static_cast(701.15054872492476914094824907722937), // N[lambert_w[4.4942328371557893e+307], 35] == 701.84270921429200143342782556643059 // as a double == 701.83341468208209 // Lambert computed 702.02379914670587 std::numeric_limits::epsilon()); - BOOST_CHECK_CLOSE_FRACTION(boost::math::lambert_w(4.4942328371557893e+307/4), // near max_value for IEEE 64-bit double. + BOOST_CHECK_CLOSE_FRACTION(boost::math::lambert_w0(4.4942328371557893e+307/4), // near max_value for IEEE 64-bit double. static_cast(700.45838920868939857588606393559517), // N[lambert_w[4.4942328371557893e+307], 35] == 701.84270921429200143342782556643059 // as a double == 701.83341468208209 @@ -474,7 +471,7 @@ BOOST_AUTO_TEST_CASE(test_range_of_values) // (below which the result has a non-zero imaginary part). RealType test_value = -exp_minus_one(); test_value += (std::numeric_limits::epsilon() * 1); - BOOST_CHECK_CLOSE_FRACTION(lambert_w(test_value), + BOOST_CHECK_CLOSE_FRACTION(lambert_w0(test_value), BOOST_MATH_TEST_VALUE(RealType, -0.99999996349975895), tolerance * 1000000000); // -0.99999996788201051 diff --git a/test/test_lambert_w0_precision_high.cpp b/test/test_lambert_w0_precision_high.cpp new file mode 100644 index 000000000..31221461d --- /dev/null +++ b/test/test_lambert_w0_precision_high.cpp @@ -0,0 +1,358 @@ +// Copyright Paul A. Bristow 2017. + +// 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). + +// Test evaluations of Lambert W function and comparison with reference values > 0.5 computed at 100 decimal digits precision. + +//#define BOOST_MATH_LAMBERT_W_TEST_OUTPUT // Define to output all values of argument z and lambert W and differences. + +#include // For float_64_t, float128_t. Must be first include! +#include // for BOOST_PLATFORM, BOOST_COMPILER, BOOST_STDLIB ...Fw = +#include // for BOOST_MSVC versions. +#include +#include // boost::exception +#include // For exp_minus_one == 3.67879441171442321595523770161460867e-01. +#include +//#include "test_value.hpp" // for create_test_value and macro BOOST_MATH_TEST_VALUE. + +#include // boost::multiprecision::cpp_dec_float_50 +using boost::multiprecision::cpp_dec_float_50; // 50 decimal digits type. +using boost::multiprecision::cpp_dec_float_100; // 100 decimal digits type. + +#include +// Multiprecision types: +//test_spots(static_cast(0)); +//test_spots(static_cast(0)); +//test_spots(static_cast(0)); + +using boost::multiprecision::cpp_bin_float_double_extended; +using boost::multiprecision::cpp_bin_float_double; +using boost::multiprecision::cpp_bin_float_quad; +// #define BOOST_MATH_INSTRUMENT_LAMBERT_W // #define only for (much) diagnostic output. + +#include // For lambert_w0 and _wm1 functions. + +#include +#include +#include +using boost::lexical_cast; +#include + +#include +#include +#include +#include +#include // For std::numeric_limits. +#include +#include + +// Include 'Known good' Lambert w values using N[productlog(-0.3), 100] +// evaluated to full precision of RealType (up to 100 decimal digits). +// Checked for a few z values using WolframAlpha command: N[productlog(-0.3), 100] +//#include "J:\Cpp\Misc\lambert_w_1000_test_values\lambert_w_mp_values.ipp" +#include "J:\Cpp\Misc\lambert_w_high_reference_values\lambert_w_mp_high_values.ipp" +// #include "lambert_w_mp_values.ipp" + +// Optional functions to list z arguments and reference lambert w values. +template +void list_zws() +{ + std::cout.precision(std::numeric_limits::max_digits10); + std::cout << noof_tests << " Test values of type: " << typeid(RealType).name() << std::endl; + + init_ws(); + init_zs(); + + for (size_t i = 0; i != noof_tests; i++) + { + std::cout << i << " " << zs[i] << " " << ws[i] << std::endl; + } +} // list_zws()template + + //! Test difference between 'known good' reference values (100 decimal digit precision) + //! of Lambert W and values computed for the RealType by lambert_w0 (or lambert_wm1) function. +template +float test_zws() +{ + std::cout << "Tests with type: " << typeid(RealType).name() << std::endl; + // std::cout << noof_tests << " test values computed and compared." << std::endl; + // Better to show just once at start of all tests? + std::cout << "digits10 = " << std::numeric_limits::digits10 + << ", max_digits10 = " << std::numeric_limits::max_digits10 + << std::setprecision(3) << ", epsilon = " << std::numeric_limits::epsilon() + << std::endl; + + std::cout.precision(std::numeric_limits::max_digits10); // Show all possibly significant digits. + //init_zs(); // Test z arguments. + //init_ws(); // Lambert W reference values. + init_zws(); // Test z arguments and Lambert W reference values. + + using boost::math::lambert_w0; + using boost::math::lambert_wm1; + using boost::math::float_distance; + + //! Biggest float distance between reference and computed Lambert W. + long long int max_distance = 0; + //! Total of all float distances for all the values tested. + long long int total_distance = 0; + // Mean distance = total_distance / noof_tests. + float mean_distance = 0.F; + + for (size_t i = 0; i != noof_tests; i++) + { + RealType z = zs[i]; + RealType w = lambert_w0(z); // Only for float or double! + RealType kw = ws[i]; // 'Known good' 100 decimal digits. + + RealType fd = float_distance(w, kw); + RealType diff = (w - kw); + + long long int distance = static_cast(fd); + long long int abs_distance = abs(distance); + total_distance += abs_distance; + if (abs_distance > max_distance) + { + max_distance = abs_distance; + } + mean_distance = (float)total_distance / noof_tests; + + #ifdef BOOST_MATH_LAMBERT_W_TEST_OUTPUT + std::cout << z << " " << w << " " << ws[i] // << ", Distance = " << distance not useful for multiprecision types? + << std::setprecision(3) + << ", diff abs " << diff + << ", diff rel " << (w - kw) / kw + << ", epsilons = " << diff / std::numeric_limits::epsilon() + << std::setprecision(std::numeric_limits::max_digits10) + << std::endl; + #endif + } // for + std::streamsize precision = std::cout.precision(3); + std::cout << "max " << max_distance << ", total distance = " << total_distance << " bits, mean " << mean_distance << std::endl; + std::cout.precision(precision); + return mean_distance; +} // void test_zws() + + //! Compare a single evaluation of lambert_w0 with reference value (100 decimal digit precision). + //! \returns distance between values in bits. + //! This falls foul of conversion using multiprecision. + //! And of loss of precision using multiprecision. + //! using macro BOOST_MATH_TEST_VALUE avoids this pitfall. +template +int test_spot(RealType z) +{ + using boost::math::lambert_w0; + using boost::math::float_distance; + + RealType lw = lambert_w0(z); + RealType rlw = static_cast(lambert_w0(z)); + + std::cout.precision(std::numeric_limits::max_digits10); // or + //std::cout.precision(std::numeric_limits::digits10); + std::cout << lw << "\n" << rlw << std::endl; + + int distance = static_cast(float_distance(rlw, lw)); + std::cout << "distance " << distance << std::endl; + return distance; +} // int test_spot(RealType z) + + //! Compare computed Lambert W(z) with 'known good' reference values. + //! Both as the same RealType. +template +int compare_spot(RealType z, RealType w) +{ + using boost::math::lambert_w0; + using boost::math::lambert_wm1; + using boost::math::nextafter; + using boost::math::float_next; + using boost::math::float_distance; + + //init_zs(); // Test z arguments. + //init_ws(); // Lambert W reference values. + init_zws(); // Initialise both Test z arguments and Lambert_w values. + + std::cout << std::boolalpha << "Test with type: " << typeid(RealType).name() << std::endl; + + std::cout << "digits10 = " << std::numeric_limits::digits10 + << ", max_digits10 = " << std::numeric_limits::max_digits10 + << ", epsilon = " << std::numeric_limits::epsilon() + << std::endl; + + // std::cout.precision(std::numeric_limits::max_digits10); + std::cout.precision(std::numeric_limits::digits10); + + RealType lw = lambert_w0(z); + RealType flw = w; + + std::cout << lw << "\n" << flw << std::endl; + + int distance = static_cast(float_distance(flw, lw)); + + std::cout << "distance " << distance << std::endl; + + return distance; +} // template int compare_spot(RealType z, RealType w) + + //! THis is no longer useful? + //template + //int test_spots(RealType) + //{ + // std::cout << std::boolalpha << "Test with type: " << typeid(RealType).name() << std::endl; + // //std::cout.precision(std::numeric_limits::max_digits10); // or digits10? + // std::cout.precision(std::numeric_limits::digits10); + // std::size_t n = noof_tests; + // std::cout << n << " test values. " << std::endl; + // int distances = 0; + // for (std::size_t i = 0; i != n; i++) + // { + // // RealType z = BOOST_MATH_TEST_VALUE(RealType, 0.5); + // //RealType w = BOOST_MATH_TEST_VALUE(RealType, "0.351733711249195826024909300929951065171464215517111804046"); + // //RealType z = lexical_cast(zs[i]); // lexical_cast doesn't do more than double precision! + // //RealType w = lexical_cast(ws[i]); + // // So can only do this safely using macro BOOST_MATH_TEST_VALUE. + // //RealType z = BOOST_MATH_TEST_VALUE(RealType, test_zs[i]); + // //RealType w = BOOST_MATH_TEST_VALUE(RealType, test_ws[i]); + // // error Missing suffix L + // + // RealType z = zs[i]; + // RealType w = ws[i]; + // std::cout << z << " " << w << std::endl; + // distances += compare_spot(z, w); + // } + // return distances; + //} // templateint test_spots(RealType) + +int main() +{ + try + { + std::cout << "Lambert W tests,\n" + << noof_tests << + " single spot tests comparing with 100 decimal digits precision reference values." << std::endl; + std::cout.precision(std::numeric_limits::max_digits10); + std::cout << std::showpoint << std::endl; // Trailing zeros. + + using boost::math::constants::exp_minus_one; + + using boost::math::lambert_w0; + using boost::math::lambert_wm1; + using boost::math::nextafter; + using boost::math::float_next; + + using boost::math::policies::make_policy; + using boost::math::policies::digits10; + using boost::math::policies::policy; + + using boost::math::policies::evaluation_error; + using boost::math::policies::domain_error; + using boost::math::policies::overflow_error; + using boost::math::policies::domain_error; + using boost::math::policies::throw_on_error; + + // Define a policy: + typedef policy< + domain_error, + overflow_error + > throw_policy; + + // Examples of some single tests show pitfalls using mutliprecision. + + // Single spot value test of lambert_w0(0.5). + //using boost::multiprecision::cpp_bin_float_quad; + //std::cout.precision(std::numeric_limits::max_digits10); + //cpp_bin_float_quad zq(0.5); + //std::cout << "\nLambert W (" << zq << ") = " << LambertW0(zq) << std::endl; // + // 0.351733711249195826024909300929951065171464215517111804046 expected from Wolfram (and Luu triple Halley). + // 0.3517337112491958262237012910577188474 // cpp_bin_float_quad + // 0.35173371124919584 // double + + test_spot(0.5F); // 0.351733714 + test_spot(0.5); // 0.35173371124919584 + // Multiprecision won't convert at full precision. + //test_spot(0.5); + //test_spot(0.5); + //test_spot(0.5); + + //std::cout <<"float total distances = " << test_spots(0.1f) << std::endl; + //std::cout <<"double total distances = " << test_spots(0.1) << std::endl; + //std::cout <<"cpp_bin_float_quad total distances = " << test_spots(0.1) << std::endl; + + // Compare double spot value: + compare_spot(0.5, 0.351733711249195826024909300929951065171464215517111804046); // 0.351733711249195826024909300929951 + + //cpp_bin_float_quad hq(0.5); // Care - only convert 17 decimal digits precision for double. + // but this value 0.5 is exactly representable, so exact, and so OK. + cpp_bin_float_quad hq("0.5"); // + // For multiprecision types, need to use a decimal digit string, not a floating-point literal: + cpp_bin_float_quad rhq("0.351733711249195826024909300929951065171464215517111804046"); + compare_spot(hq, rhq); // 0.351733711249195826024909300929951 and distance == 0 + // Useful to check a particular z argument. + //init_zs(); + //init_ws(); + init_zws(); + + compare_spot(zs[1], ws[1]); // -0.653694501269090 -0.653694501269089, distance = -1 + + // Simple group of test values, including near zero, and near singularity. + + // Optionally list the z arguments and reference test lambert_w values. + //list_zws(); + //list_zws(); + //list_zws(); + //list_zws(); + //list_zws(); + //list_zws<__float128>(); // OK, but fails test below. + //#ifdef BOOST_HAS_FLOAT128 + // list_zws(); + //#endif + // list_zws(); + //list_zws(); + + // Test several floating-point types: + test_zws(); + test_zws(); + + // test_zws(); expect exactly as double. + if (std::numeric_limits::digits == std::numeric_limits::digits) + { + // Emulate 80-bit long double. + test_zws(); + } + else + { // True 80-bit (or 128-bit) long double. + test_zws(); + } + test_zws(); + // test_zws(); + } + catch (std::exception& ex) + { + std::cout << ex.what() << std::endl; + } +} // int main() + + /* + Output: + + Lambert W tests, + 450 single spot tests comparing with 100 decimal digits precision reference values. + + Tests with type: float + digits10 = 6, max_digits10 = 9, epsilon = 1.19e-07 + max 1, total distance = 10 bits, mean 0.0222 + + Tests with type: double + digits10 = 15, max_digits10 = 17, epsilon = 2.22e-16 + max 1, total distance = 8 bits, mean 0.0178 + + Tests with type: class boost::multiprecision::number,0> + digits10 = 18, max_digits10 = 22, epsilon = 1.08e-19 + max 1, total distance = 109 bits, mean 0.242 + + Tests with type: class boost::multiprecision::number,0> + digits10 = 33, max_digits10 = 37, epsilon = 1.93e-34 + max 1, total distance = 135 bits, mean 0.300 + + + */ \ No newline at end of file diff --git a/test/test_lambert_w0_precision_low.cpp b/test/test_lambert_w0_precision_low.cpp new file mode 100644 index 000000000..9a8a39479 --- /dev/null +++ b/test/test_lambert_w0_precision_low.cpp @@ -0,0 +1,387 @@ +// Copyright Paul A. Bristow 2017. + +// 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). + +// Test evaluations of Lambert W function and comparison with reference values computed at 100 decimal digits precision. + +//#define BOOST_MATH_LAMBERT_W_TEST_OUTPUT // Define to output all values of argument z and lambert W and differences. + +#include // For float_64_t, float128_t. Must be first include! +#include // for BOOST_PLATFORM, BOOST_COMPILER, BOOST_STDLIB ...Fw = +#include // for BOOST_MSVC versions. +#include +#include // boost::exception +#include // For exp_minus_one == 3.67879441171442321595523770161460867e-01. +#include +//#include "test_value.hpp" // for create_test_value and macro BOOST_MATH_TEST_VALUE. + +// Built-in/fundamental Quad 128-bit type, if available. +#ifdef BOOST_HAS_FLOAT128 +#include // Not available for MSVC. +//using boost::multiprecision::float128; +#endif + +#include // boost::multiprecision::cpp_dec_float_50 +using boost::multiprecision::cpp_dec_float_50; // 50 decimal digits type. +using boost::multiprecision::cpp_dec_float_100; // 100 decimal digits type. + +#include +using boost::multiprecision::cpp_bin_float_50; // 50 decimal digits type. + +// Multiprecision types: +//test_spots(static_cast(0)); +//test_spots(static_cast(0)); +//test_spots(static_cast(0)); + +// #define BOOST_MATH_INSTRUMENT_LAMBERT_W // #define only for (much) diagnostic output. + +// For lambert_w function. +#include +using boost::multiprecision::cpp_bin_float_double_extended; +using boost::multiprecision::cpp_bin_float_double; +using boost::multiprecision::cpp_bin_float_quad; + +#include +#include +#include +using boost::lexical_cast; +#include + +#include +#include +#include +#include +#include // For std::numeric_limits. +#include +#include + +// Include 'Known good' Lambert w values using N[productlog(-0.3), 100] +// evaluated to full precision of RealType (up to 100 decimal digits). +// Checked for a few z values using WolframAlpha command: N[productlog(-0.3), 100] +#include "J:\Cpp\Misc\lambert_w_1000_test_values\lambert_w_mp_values.ipp" +// #include "lambert_w_mp_values.ipp" + +// Optional functions to list z arguments and reference lambert w values. +template +void list_zws() +{ + std::cout.precision(std::numeric_limits::max_digits10); + std::cout << noof_tests << " Test values of type: " << typeid(RealType).name() << std::endl; + + init_ws(); + init_zs(); + + for (size_t i = 0; i != noof_tests; i++) + { + std::cout << i << " " << zs[i] << " " << ws[i] << std::endl; + } +} // list_zws()template + +//! Test difference between 'known good' reference values (100 decimal digit precision) +//! of Lambert W and values computed for the RealType by lambert_w0 (or lambert_wm1) function. +template +float test_zws() +{ + std::cout << "Tests with type: " << typeid(RealType).name() << std::endl; + // std::cout << noof_tests << " test values computed and compared." << std::endl; + // Better to show just once at start of all tests? + std::cout << "digits10 = " << std::numeric_limits::digits10 + << ", max_digits10 = " << std::numeric_limits::max_digits10 + << std:: setprecision(3) << ", epsilon = " << std::numeric_limits::epsilon() + << std::endl; + + std::cout.precision(std::numeric_limits::max_digits10); // Show all possibly significant digits. + init_zs(); // Test z arguments. + init_ws(); // Lambert W reference values. + + using boost::math::lambert_w0; + using boost::math::lambert_wm1; + using boost::math::float_distance; + + //! Biggest float distance between reference and computed Lambert W. + long long int max_distance = 0; + //! Total of all float distances for all the values tested. + long long int total_distance = 0; + // Mean distance = total_distance / noof_tests. + float mean_distance = 0.F; + + for (size_t i = 0; i != noof_tests; i++) + { + RealType z = zs[i]; + RealType w = lambert_w0(z); // Only for float or double! + RealType kw = ws[i]; // 'Known good' 100 decimal digits. + + RealType fd = float_distance(w, kw); + RealType diff = (w - kw); + + long long int distance = static_cast(fd); + long long int abs_distance = abs(distance); + total_distance += abs_distance; + if (abs_distance > max_distance) + { + max_distance = abs_distance; + } + mean_distance = (float)total_distance / noof_tests; + + #ifdef BOOST_MATH_LAMBERT_W_TEST_OUTPUT + std::cout << z << " " << w << " " << ws[i] // << ", Distance = " << distance not useful for multiprecision types? + << std::setprecision(3) + << ", diff abs " << diff + << ", diff rel " << (w - kw) / kw + << ", epsilons = " << diff / std::numeric_limits::epsilon() + << std::setprecision(std::numeric_limits::max_digits10) + << std::endl; + #endif + } // for + std::streamsize precision = std::cout.precision(3); + std::cout << "max " << max_distance << ", total distance = " << total_distance << " bits, mean " << mean_distance << std::endl; + std::cout.precision(precision); + return mean_distance; +} // void test_zws() + +//! Compare a single evaluation of lambert_w0 with reference value (100 decimal digit precision). +//! \returns distance between values in bits. +//! This falls foul of conversion using multiprecision. +//! And of loss of precision using multiprecision. +//! using macro BOOST_MATH_TEST_VALUE avoids this pitfall. +template +int test_spot(RealType z) +{ + using boost::math::lambert_w0; + using boost::math::float_distance; + + RealType lw = lambert_w0(z); + RealType rlw = static_cast(lambert_w0(z)); + + std::cout.precision(std::numeric_limits::max_digits10); // or + //std::cout.precision(std::numeric_limits::digits10); + std::cout << lw << "\n" << rlw << std::endl; + + int distance = static_cast(float_distance(rlw, lw)); + std::cout << "distance " << distance << std::endl; + return distance; +} // int test_spot(RealType z) + +//! Compare computed Lambert W(z) with 'known good' reference values. +//! Both as the same RealType. +template +int compare_spot(RealType z, RealType w) +{ + using boost::math::lambert_w0; + using boost::math::lambert_wm1; + using boost::math::nextafter; + using boost::math::float_next; + using boost::math::float_distance; + + init_zs(); // Test z arguments. + init_ws(); // Lambert W reference values. + + std::cout << std::boolalpha << "Test with type: " << typeid(RealType).name() << std::endl; + + std::cout << "digits10 = " << std::numeric_limits::digits10 + << ", max_digits10 = " << std::numeric_limits::max_digits10 + << ", epsilon = " << std::numeric_limits::epsilon() + << std::endl; + + // std::cout.precision(std::numeric_limits::max_digits10); + std::cout.precision(std::numeric_limits::digits10); + + RealType lw = lambert_w0(z); + RealType flw = w; + + std::cout << lw << "\n" << flw << std::endl; + + int distance = static_cast(float_distance(flw, lw)); + + std::cout << "distance " << distance << std::endl; + + return distance; +} // template int compare_spot(RealType z, RealType w) + +//! THis is no longer useful? +//template +//int test_spots(RealType) +//{ +// std::cout << std::boolalpha << "Test with type: " << typeid(RealType).name() << std::endl; +// //std::cout.precision(std::numeric_limits::max_digits10); // or digits10? +// std::cout.precision(std::numeric_limits::digits10); +// std::size_t n = noof_tests; +// std::cout << n << " test values. " << std::endl; +// int distances = 0; +// for (std::size_t i = 0; i != n; i++) +// { +// // RealType z = BOOST_MATH_TEST_VALUE(RealType, 0.5); +// //RealType w = BOOST_MATH_TEST_VALUE(RealType, "0.351733711249195826024909300929951065171464215517111804046"); +// //RealType z = lexical_cast(zs[i]); // lexical_cast doesn't do more than double precision! +// //RealType w = lexical_cast(ws[i]); +// // So can only do this safely using macro BOOST_MATH_TEST_VALUE. +// //RealType z = BOOST_MATH_TEST_VALUE(RealType, test_zs[i]); +// //RealType w = BOOST_MATH_TEST_VALUE(RealType, test_ws[i]); +// // error Missing suffix L +// +// RealType z = zs[i]; +// RealType w = ws[i]; +// std::cout << z << " " << w << std::endl; +// distances += compare_spot(z, w); +// } +// return distances; +//} // templateint test_spots(RealType) + +int main() +{ + try + { + std::cout << "Lambert W tests,\n" + << noof_tests << + " single spot tests comparing with 100 decimal digits precision reference values." << std::endl; + std::cout.precision(std::numeric_limits::max_digits10); + std::cout << std::showpoint << std::endl; // Trailing zeros. + + using boost::math::constants::exp_minus_one; + + using boost::math::lambert_w0; + using boost::math::lambert_wm1; + using boost::math::nextafter; + using boost::math::float_next; + + using boost::math::policies::make_policy; + using boost::math::policies::digits10; + using boost::math::policies::policy; + + using boost::math::policies::evaluation_error; + using boost::math::policies::domain_error; + using boost::math::policies::overflow_error; + using boost::math::policies::domain_error; + using boost::math::policies::throw_on_error; + + // Define a policy: + typedef policy< + domain_error, + overflow_error + > throw_policy; + + // Examples of some single tests show pitfalls using mutliprecision. + + // Single spot value test of lambert_w0(0.5). + //using boost::multiprecision::cpp_bin_float_quad; + //std::cout.precision(std::numeric_limits::max_digits10); + //cpp_bin_float_quad zq(0.5); + //std::cout << "\nLambert W (" << zq << ") = " << LambertW0(zq) << std::endl; // + // 0.351733711249195826024909300929951065171464215517111804046 expected from Wolfram (and Luu triple Halley). + // 0.3517337112491958262237012910577188474 // cpp_bin_float_quad + // 0.35173371124919584 // double + + test_spot(0.5F); // 0.351733714 + test_spot(0.5); // 0.35173371124919584 + // Multiprecision won't convert at full precision. + //test_spot(0.5); + //test_spot(0.5); + //test_spot(0.5); + + //std::cout <<"float total distances = " << test_spots(0.1f) << std::endl; + //std::cout <<"double total distances = " << test_spots(0.1) << std::endl; + //std::cout <<"cpp_bin_float_quad total distances = " << test_spots(0.1) << std::endl; + + // Compare double spot value: + compare_spot(0.5, 0.351733711249195826024909300929951065171464215517111804046); // 0.351733711249195826024909300929951 + + //cpp_bin_float_quad hq(0.5); // Care - only convert 17 decimal digits precision for double. + // but this value 0.5 is exactly representable, so exact, and so OK. + cpp_bin_float_quad hq("0.5"); // + // For multiprecision types, need to use a decimal digit string, not a floating-point literal: + cpp_bin_float_quad rhq("0.351733711249195826024909300929951065171464215517111804046"); + compare_spot(hq, rhq); // 0.351733711249195826024909300929951 and distance == 0 + // Useful to check a particular z argument. + init_zs(); + init_ws(); + + compare_spot(zs[1], ws[1]); // -0.653694501269090 -0.653694501269089, distance = -1 + + // Simple group of test values, including near zero, and near singularity. + + // Optionally list the z arguments and reference test lambert_w values. + //list_zws(); + //list_zws(); + //list_zws(); + //list_zws(); + //list_zws(); + //list_zws<__float128>(); // OK, but fails test below. +//#ifdef BOOST_HAS_FLOAT128 +// list_zws(); +//#endif + // list_zws(); + //list_zws(); + + // Test several floating-point types: + test_zws(); + test_zws(); + + // test_zws(); expect exactly as double. + if (std::numeric_limits::digits == std::numeric_limits::digits) + { + // Emulate 80-bit long double. + test_zws(); + } + else + { // True 80-bit (or 128-bit) long double. + test_zws(); + } + test_zws(); + // test_zws(); + } + catch (std::exception& ex) + { + std::cout << ex.what() << std::endl; + } +} // int main() + +/* +test_lambert_w0_precision_low.cpp +Generating code +235 of 3718 functions ( 6.3%) were compiled, the rest were copied from previous compilation. +0 functions were new in current compilation +618 functions had inline decision re-evaluated but remain unchanged +Finished generating code +Lambert_w_pb2_tests.vcxproj -> J:\Cpp\Misc\x64\Release\Lambert_w_pb2_tests.exe +Lambert_w_pb2_tests.vcxproj -> J:\Cpp\Misc\x64\Release\Lambert_w_pb2_tests.pdb (Full PDB) +Lambert W tests, +100 single spot tests comparing with 100 decimal digits precision reference values. + +0.351733714 +0.351733714 +distance 0 +0.35173371124919584 +0.35173371124919584 +distance 0 +Test with type: double +digits10 = 15, max_digits10 = 17, epsilon = 2.2204460492503131e-16 +0.351733711249196 +0.351733711249196 +distance 0 +Test with type: class boost::multiprecision::number,0> +digits10 = 33, max_digits10 = 37, epsilon = 1.92592994438724e-34 +0.351733711249195826024909300929951 +0.351733711249195826024909300929951 +distance 0 +Test with type: double +digits10 = 15, max_digits10 = 17, epsilon = 2.22044604925031308084726333618164e-16 +-0.653694501269090 +-0.653694501269089 +distance -1 + +Tests with type: float +digits10 = 6, max_digits10 = 9, epsilon = 1.19e-07 +max 2, total distance = 37 bits, mean 0.370 +Tests with type: double +digits10 = 15, max_digits10 = 17, epsilon = 2.22e-16 +max 9, total distance = 49 bits, mean 0.490 +Tests with type: class boost::multiprecision::number,0> +digits10 = 18, max_digits10 = 22, epsilon = 1.08e-19 +max 4, total distance = 47 bits, mean 0.470 +Tests with type: class boost::multiprecision::number,0> +digits10 = 33, max_digits10 = 37, epsilon = 1.93e-34 +max 4, total distance = 54 bits, mean 0.540 + +*/ \ No newline at end of file diff --git a/test/test_value.hpp b/test/test_value.hpp new file mode 100644 index 000000000..c10596209 --- /dev/null +++ b/test/test_value.hpp @@ -0,0 +1,120 @@ +// Copyright Paul A. Bristow 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) + +// test_value.hpp + +#ifndef TEST_VALUE_HPP +#define TEST_VALUE_HPP + +// BOOST_MATH_TEST_VALUE is used to create a test value of suitable type from a decimal digit string. +// Two parameters, both a floating-point literal double like 1.23 (not long double so no suffix L) +// and a decimal digit string const char* like "1.23" must be provided. +// The decimal value represented must be the same of course, with at least enough precision for long double. +// Note there are two gotchas to this approach: +// * You need all values to be real floating-point values +// * and *MUST* include a decimal point (to avoid confusion with an integer literal). +// * It's slow to compile compared to a simple literal. + +// Speed is not an issue for a few test values, +// but it's not generally usable in large tables +// where you really need everything to be statically initialized. + +// Macro BOOST_MATH_INSTRUMENT_CREATE_TEST_VALUE provides a global diagnostic value for create_type. + +#include // For float_64_t, float128_t. Must be first include! +#include +#include +#include + +#ifdef BOOST_MATH_INSTRUMENT_CREATE_TEST_VALUE +// global int create_type(0); must be defined before including this file. +#endif + +#ifdef BOOST_HAS_FLOAT128 +typedef __float128 largest_float; +#define BOOST_MATH_TEST_LARGEST_FLOAT_SUFFIX(x) x##Q +#define BOOST_MATH_TEST_LARGEST_FLOAT_DIGITS std::numeric_limits::digits +#else +typedef long double largest_float; +#define BOOST_MATH_TEST_LARGEST_FLOAT_SUFFIX(x) x##L +#define BOOST_MATH_TEST_LARGEST_FLOAT_DIGITS std::numeric_limits::digits +#endif + +template +inline T create_test_value(largest_float val, const char*, const boost::mpl::true_&, const T2&) +{ // Construct from long double or quad parameter val (ignoring string/const char* str). + // (This is case for MPL parameters = true_ and T2 == false_, + // and MPL parameters = true_ and T2 == true_ cpp_bin_float) + // All built-in/fundamental floating-point types, + // and other User-Defined Types that can be constructed without loss of precision + // from long double suffix L (or quad suffix Q), + // + // Choose this method, even if can be constructed from a string, + // because it will be faster, and more likely to be the closest representation. + // (This is case for MPL parameters = mpl::true_ and T2 == mpl::true_). + #ifdef BOOST_MATH_INSTRUMENT_CREATE_TEST_VALUE + create_type = 1; + #endif + return static_cast(val); +} + +template +inline T create_test_value(largest_float, const char* str, const boost::mpl::false_&, const boost::mpl::true_&) +{ // Construct from decimal digit string const char* @c str (ignoring long double parameter). + // For example, extended precision or other User-Defined types which ARE constructible from a string + // (but not from double, or long double without loss of precision). + // (This is case for MPL parameters = mpl::false_ and T2 == mpl::true_). + #ifdef BOOST_MATH_INSTRUMENT_CREATE_TEST_VALUE + create_type = 2; + #endif + return T(str); +} + +template +inline T create_test_value(largest_float, const char* str, const boost::mpl::false_&, const boost::mpl::false_&) +{ // Create test value using from lexical cast of decimal digit string const char* str. + // For example, extended precision or other User-Defined types which are NOT constructible from a string + // (NOR constructible from a long double). + // (This is case T1 = mpl::false and T2 == mpl::false). + #ifdef BOOST_MATH_INSTRUMENT_CREATE_TEST_VALUE + create_type = 3; + #endif + return boost::lexical_cast(str); +} + +// T real type, x a decimal digits representation of a floating-point, for example: 12.34. +// It must include a decimal point (or it would be interpreted as an integer). + +// x is converted to a long double by appending the letter L (to suit long double fundamental type), 12.34L. +// x is also passed as a const char* or string representation "12.34" +// (to suit most other types that cannot be constructed from long double without possible loss). + +// BOOST_MATH_TEST_LARGEST_FLOAT_SUFFIX(x) makes a long double or quad version, with +// suffix a letter L (or Q) to suit long double (or quad) fundamental type, 12.34L or 12.34Q. +// #x makes a decimal digit string version to suit multiprecision and fixed_point constructors, "12.34". +// (Constructing from double or long double (or quad) could lose precision for multiprecision or fixed-point). + +// The matching create_test_value function above is chosen depending on the T1 and T2 mpl bool truths. +// The string version from #x is used if the precision of T is greater than long double. + +// Example: long double test_value = BOOST_MATH_TEST_VALUE(double, 1.23456789); + +#define BOOST_MATH_TEST_VALUE(T, x) create_test_value(\ + BOOST_MATH_TEST_LARGEST_FLOAT_SUFFIX(x),\ + #x,\ + boost::mpl::bool_<\ + std::numeric_limits::is_specialized &&\ + (std::numeric_limits::radix == 2)\ + && (std::numeric_limits::digits <= BOOST_MATH_TEST_LARGEST_FLOAT_DIGITS)\ + && boost::is_convertible::value>(),\ + boost::mpl::bool_<\ + boost::is_constructible::value>()\ +) +#endif // TEST_VALUE_HPP + +