Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r75053 - in sandbox/big_number: boost/multiprecision/detail boost/multiprecision/detail/functions libs/multiprecision/test
From: john_at_[hidden]
Date: 2011-10-18 14:10:22


Author: johnmaddock
Date: 2011-10-18 14:10:20 EDT (Tue, 18 Oct 2011)
New Revision: 75053
URL: http://svn.boost.org/trac/boost/changeset/75053

Log:
Add sin/cos/tan/asin functions.
Added:
   sandbox/big_number/boost/multiprecision/detail/functions/trig.hpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/test_asin.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/test_cos.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/test_sin.cpp (contents, props changed)
Text files modified:
   sandbox/big_number/boost/multiprecision/detail/default_ops.hpp | 2 +
   sandbox/big_number/boost/multiprecision/detail/functions/constants.hpp | 61 ++++++++++++++++++++++++++++++++++++++++
   sandbox/big_number/boost/multiprecision/detail/functions/pow.hpp | 45 +++++++++++++++--------------
   sandbox/big_number/libs/multiprecision/test/Jamfile.v2 | 49 ++++++++++++++++++++++++++++++++
   4 files changed, 135 insertions(+), 22 deletions(-)

Modified: sandbox/big_number/boost/multiprecision/detail/default_ops.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/detail/default_ops.hpp (original)
+++ sandbox/big_number/boost/multiprecision/detail/default_ops.hpp 2011-10-18 14:10:20 EDT (Tue, 18 Oct 2011)
@@ -363,6 +363,7 @@
       T temp;
       eval_fmod(temp, a, b);
       result = temp;
+ return;
    }
    T n;
    divide(result, a, b);
@@ -443,6 +444,7 @@
 //
 #include <boost/multiprecision/detail/functions/constants.hpp>
 #include <boost/multiprecision/detail/functions/pow.hpp>
+#include <boost/multiprecision/detail/functions/trig.hpp>
 
 }
 

Modified: sandbox/big_number/boost/multiprecision/detail/functions/constants.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/detail/functions/constants.hpp (original)
+++ sandbox/big_number/boost/multiprecision/detail/functions/constants.hpp 2011-10-18 14:10:20 EDT (Tue, 18 Oct 2011)
@@ -65,6 +65,54 @@
    divide(result, denom);
 }
 
+template <class T>
+void calc_pi(T& result, unsigned digits)
+{
+ typedef typename mpl::front<typename T::unsigned_types>::type ui_type;
+ typedef typename mpl::front<typename T::real_types>::type real_type;
+
+ T a;
+ a = ui_type(1);
+ T b;
+ T A(a);
+ T B;
+ B = real_type(0.5f);
+ T D;
+ D = real_type(0.25f);
+
+ T lim;
+ lim = ui_type(1);
+ eval_ldexp(lim, lim, -(int)digits);
+
+ unsigned k = 1;
+
+ do
+ {
+ add(result, A, B);
+ eval_ldexp(result, result, -2);
+ eval_sqrt(b, B);
+ add(a, b);
+ eval_ldexp(a, a, -1);
+ multiply(A, a, a);
+ subtract(B, A, result);
+ eval_ldexp(B, B, 1);
+ subtract(result, A, B);
+ bool neg = get_sign(result) < 0;
+ if(neg)
+ result.negate();
+ if(result.compare(lim) <= 0)
+ break;
+ if(neg)
+ result.negate();
+ eval_ldexp(result, result, k - 1);
+ subtract(D, result);
+ ++k;
+ eval_ldexp(lim, lim, 1);
+ }
+ while(true);
+
+ divide(result, B, D);
+}
 
 template <class T, const T& (*F)(void)>
 struct constant_initializer
@@ -114,3 +162,16 @@
    return result;
 }
 
+template <class T>
+const T& get_constant_pi()
+{
+ static T result;
+ static bool b = false;
+ if(!b)
+ calc_pi(result, std::numeric_limits<mp_number<T> >::digits);
+
+ constant_initializer<T, &get_constant_pi<T> >::do_nothing();
+
+ return result;
+}
+

Modified: sandbox/big_number/boost/multiprecision/detail/functions/pow.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/detail/functions/pow.hpp (original)
+++ sandbox/big_number/boost/multiprecision/detail/functions/pow.hpp 2011-10-18 14:10:20 EDT (Tue, 18 Oct 2011)
@@ -36,6 +36,7 @@
       T denom;
       pow_imp(denom, t, -p, mpl::true_());
       divide(result, temp, denom);
+ return;
    }
 
    switch(p)
@@ -106,6 +107,11 @@
 
    add(H0F0, x_pow_n_div_n_fact, ui_type(1));
 
+ T lim;
+ eval_ldexp(lim, H0F0, 1 - tol);
+ if(get_sign(lim) < 0)
+ lim.negate();
+
    ui_type n;
 
    // Series expansion of hyperg_0f0(; ; x).
@@ -113,17 +119,14 @@
    {
       multiply(x_pow_n_div_n_fact, x);
       divide(x_pow_n_div_n_fact, n);
-
- if(n > 20)
- {
- eval_ldexp(t, H0F0, -tol);
- if(t.compare(x_pow_n_div_n_fact) >= 0)
- {
- break;
- }
- }
-
       add(H0F0, x_pow_n_div_n_fact);
+ bool neg = get_sign(x_pow_n_div_n_fact);
+ if(neg)
+ x_pow_n_div_n_fact.negate();
+ if(lim.compare(x_pow_n_div_n_fact) > 0)
+ break;
+ if(neg)
+ x_pow_n_div_n_fact.negate();
    }
    if(n >= 300)
       throw std::runtime_error("H0F0 failed to converge");
@@ -152,6 +155,10 @@
 
    multiply(H1F0, pochham_a, x_pow_n_div_n_fact);
    add(H1F0, si_type(1));
+ T lim;
+ eval_ldexp(lim, H1F0, 1 - std::numeric_limits<mp_number<T> >::digits);
+ if(get_sign(lim) < 0)
+ lim.negate();
 
    si_type n;
    T term, part;
@@ -162,21 +169,13 @@
       multiply(x_pow_n_div_n_fact, x);
       divide(x_pow_n_div_n_fact, n);
       increment(ap);
-
       multiply(pochham_a, ap);
-
       multiply(term, pochham_a, x_pow_n_div_n_fact);
-
- if(n > 20)
- {
- exp_type e1, e2;
- eval_frexp(part, H1F0, &e1);
- eval_frexp(part, term, &e2);
- if(e1 - e2 >= std::numeric_limits<mp_number<T> >::digits)
- break;
- }
-
       add(H1F0, term);
+ if(get_sign(term) < 0)
+ term.negate();
+ if(lim.compare(term) < 0)
+ break;
    }
    if(n >= 1000)
       throw std::runtime_error("H1F0 failed to converge");
@@ -190,6 +189,7 @@
       T temp;
       eval_exp(temp, x);
       result = temp;
+ return;
    }
    typedef typename boost::multiprecision::detail::canonical<unsigned, T>::type ui_type;
    typedef typename boost::multiprecision::detail::canonical<int, T>::type si_type;
@@ -336,6 +336,7 @@
       T temp;
       eval_log(temp, arg);
       result = temp;
+ return;
    }
 
    typedef typename boost::multiprecision::detail::canonical<int, T>::type si_type;

Added: sandbox/big_number/boost/multiprecision/detail/functions/trig.hpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/boost/multiprecision/detail/functions/trig.hpp 2011-10-18 14:10:20 EDT (Tue, 18 Oct 2011)
@@ -0,0 +1,524 @@
+
+// Copyright Christopher Kormanyos 2002 - 2011.
+// Copyright 2011 John Maddock. Distributed under the Boost
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This work is based on an earlier work:
+// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
+// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469
+//
+// This file has no include guards or namespaces - it's expanded inline inside default_ops.hpp
+//
+
+template <class T>
+void hyp0F1(T& result, const T& b, const T& x)
+{
+ typedef typename boost::multiprecision::detail::canonical<boost::int32_t, T>::type si_type;
+ typedef typename boost::multiprecision::detail::canonical<boost::uint32_t, T>::type ui_type;
+ typedef typename T::exponent_type exp_type;
+ typedef typename boost::multiprecision::detail::canonical<exp_type, T>::type canonical_exp_type;
+ typedef typename mpl::front<typename T::real_types>::type fp_type;
+
+ // Compute the series representation of Hypergeometric0F1 taken from
+ // http://functions.wolfram.com/HypergeometricFunctions/Hypergeometric0F1/06/01/01/
+ // There are no checks on input range or parameter boundaries.
+
+ T x_pow_n_div_n_fact(x);
+ T pochham_b (b);
+ T bp (b);
+
+ divide(result, x_pow_n_div_n_fact, pochham_b);
+ add(result, ui_type(1));
+
+ si_type n;
+
+ T tol;
+ tol = ui_type(1);
+ eval_ldexp(tol, tol, 1 - std::numeric_limits<mp_number<T> >::digits);
+ multiply(tol, result);
+ if(get_sign(tol) < 0)
+ tol.negate();
+ T term;
+
+ // Series expansion of hyperg_0f1(; b; x).
+ for(n = 2; n < 300; ++n)
+ {
+ multiply(x_pow_n_div_n_fact, x);
+ divide(x_pow_n_div_n_fact, n);
+ increment(bp);
+ multiply(pochham_b, bp);
+
+ divide(term, x_pow_n_div_n_fact, pochham_b);
+ add(result, term);
+
+ bool neg_term = get_sign(term) < 0;
+ if(neg_term)
+ term.negate();
+ if(term.compare(tol) <= 0)
+ break;
+ }
+
+ if(n >= 300)
+ throw std::runtime_error("H0F1 Failed to Converge");
+}
+
+
+template <class T>
+void eval_sin(T& result, const T& x)
+{
+ if(&result == &x)
+ {
+ T temp;
+ eval_sin(temp, x);
+ result = temp;
+ return;
+ }
+
+ typedef typename boost::multiprecision::detail::canonical<boost::int32_t, T>::type si_type;
+ typedef typename boost::multiprecision::detail::canonical<boost::uint32_t, T>::type ui_type;
+ typedef typename T::exponent_type exp_type;
+ typedef typename boost::multiprecision::detail::canonical<exp_type, T>::type canonical_exp_type;
+ typedef typename mpl::front<typename T::real_types>::type fp_type;
+
+ switch(eval_fpclassify(x))
+ {
+ case FP_INFINITE:
+ case FP_NAN:
+ result = std::numeric_limits<mp_number<T> >::quiet_NaN().backend();
+ return;
+ case FP_ZERO:
+ result = ui_type(0);
+ return;
+ default: ;
+ }
+
+ // Local copy of the argument
+ T xx = x;
+
+ // Analyze and prepare the phase of the argument.
+ // Make a local, positive copy of the argument, xx.
+ // The argument xx will be reduced to 0 <= xx <= pi/2.
+ bool b_negate_sin = false;
+
+ if(get_sign(x) < 0)
+ {
+ xx.negate();
+ b_negate_sin = !b_negate_sin;
+ }
+
+ T n_pi, t;
+ // Remove even multiples of pi.
+ if(xx.compare(get_constant_pi<T>()) > 0)
+ {
+ divide(n_pi, xx, get_constant_pi<T>());
+ eval_trunc(n_pi, n_pi);
+ t = ui_type(2);
+ eval_fmod(t, n_pi, t);
+ const bool b_n_pi_is_even = get_sign(t) == 0;
+ multiply(n_pi, get_constant_pi<T>());
+ subtract(xx, n_pi);
+
+ // Adjust signs if the multiple of pi is not even.
+ if(!b_n_pi_is_even)
+ {
+ b_negate_sin = !b_negate_sin;
+ }
+ }
+
+ // Reduce the argument to 0 <= xx <= pi/2.
+ eval_ldexp(t, get_constant_pi<T>(), -1);
+ if(xx.compare(t) > 0)
+ {
+ subtract(xx, get_constant_pi<T>(), xx);
+ }
+
+ subtract(t, xx);
+ const bool b_zero = get_sign(xx) == 0;
+ const bool b_pi_half = get_sign(t) == 0;
+
+ // Check if the reduced argument is very close to 0 or pi/2.
+ const bool b_near_zero = xx.compare(fp_type(1e-1)) < 0;
+ const bool b_near_pi_half = t.compare(fp_type(1e-1)) < 0;;
+
+ if(b_zero)
+ {
+ result = ui_type(0);
+ }
+ else if(b_pi_half)
+ {
+ result = ui_type(1);
+ }
+ else if(b_near_zero)
+ {
+ multiply(t, xx, xx);
+ divide(t, si_type(-4));
+ T t2;
+ t2 = fp_type(1.5);
+ hyp0F1(result, t2, t);
+ multiply(result, xx);
+ }
+ else if(b_near_pi_half)
+ {
+ multiply(t, t);
+ divide(t, si_type(-4));
+ T t2;
+ t2 = fp_type(0.5);
+ hyp0F1(result, t2, t);
+ }
+ else
+ {
+ // Scale to a small argument for an efficient Taylor series,
+ // implemented as a hypergeometric function. Use a standard
+ // divide by three identity a certain number of times.
+ // Here we use division by 3^9 --> (19683 = 3^9).
+
+ static const si_type n_scale = 9;
+ static const si_type n_three_pow_scale = static_cast<si_type>(19683L);
+
+ divide(xx, n_three_pow_scale);
+
+ // Now with small arguments, we are ready for a series expansion.
+ multiply(t, xx, xx);
+ divide(t, si_type(-4));
+ T t2;
+ t2 = fp_type(1.5);
+ hyp0F1(result, t2, t);
+ multiply(result, xx);
+
+ // Convert back using multiple angle identity.
+ for(boost::int32_t k = static_cast<boost::int32_t>(0); k < n_scale; k++)
+ {
+ // Rescale the cosine value using the multiple angle identity.
+ multiply(t2, result, ui_type(3));
+ multiply(t, result, result);
+ multiply(t, result);
+ multiply(t, ui_type(4));
+ subtract(result, t2, t);
+ }
+ }
+
+ if(b_negate_sin)
+ result.negate();
+}
+
+template <class T>
+void eval_cos(T& result, const T& x)
+{
+ if(&result == &x)
+ {
+ T temp;
+ eval_sin(temp, x);
+ result = temp;
+ return;
+ }
+
+ typedef typename boost::multiprecision::detail::canonical<boost::int32_t, T>::type si_type;
+ typedef typename boost::multiprecision::detail::canonical<boost::uint32_t, T>::type ui_type;
+ typedef typename T::exponent_type exp_type;
+ typedef typename boost::multiprecision::detail::canonical<exp_type, T>::type canonical_exp_type;
+ typedef typename mpl::front<typename T::real_types>::type fp_type;
+
+ switch(eval_fpclassify(x))
+ {
+ case FP_INFINITE:
+ case FP_NAN:
+ result = std::numeric_limits<mp_number<T> >::quiet_NaN().backend();
+ return;
+ case FP_ZERO:
+ result = ui_type(1);
+ return;
+ default: ;
+ }
+
+ // Local copy of the argument
+ T xx = x;
+
+ // Analyze and prepare the phase of the argument.
+ // Make a local, positive copy of the argument, xx.
+ // The argument xx will be reduced to 0 <= xx <= pi/2.
+ bool b_negate_cos = false;
+
+ if(get_sign(x) < 0)
+ {
+ xx.negate();
+ b_negate_cos = !b_negate_cos;
+ }
+
+ T n_pi, t;
+ // Remove even multiples of pi.
+ if(xx.compare(get_constant_pi<T>()) > 0)
+ {
+ divide(t, xx, get_constant_pi<T>());
+ eval_trunc(n_pi, t);
+ multiply(t, n_pi, get_constant_pi<T>());
+ subtract(xx, t);
+
+ // Adjust signs if the multiple of pi is not even.
+ t = ui_type(2);
+ eval_fmod(t, n_pi, t);
+ const bool b_n_pi_is_even = get_sign(t) == 0;
+
+ if(!b_n_pi_is_even)
+ {
+ b_negate_cos = !b_negate_cos;
+ }
+ }
+
+ // Reduce the argument to 0 <= xx <= pi/2.
+ eval_ldexp(t, get_constant_pi<T>(), -1);
+ int com = xx.compare(t);
+ if(com > 0)
+ {
+ subtract(xx, get_constant_pi<T>(), xx);
+ b_negate_cos = !b_negate_cos;
+ }
+
+ const bool b_zero = get_sign(xx) == 0;
+ const bool b_pi_half = com == 0;
+
+ // Check if the reduced argument is very close to 0 or pi/2.
+ const bool b_near_zero = xx.compare(fp_type(1e-4)) < 0;
+ subtract(t, xx);
+ const bool b_near_pi_half = t.compare(fp_type(1e-4)) < 0;
+
+ if(b_zero)
+ {
+ result = si_type(1);
+ }
+ else if(b_pi_half)
+ {
+ result = si_type(0);
+ }
+ else if(b_near_zero)
+ {
+ multiply(t, xx, xx);
+ divide(t, si_type(-4));
+ n_pi = fp_type(0.5f);
+ hyp0F1(result, n_pi, t);
+ }
+ else if(b_near_pi_half)
+ {
+ T t2(t);
+ multiply(t, t);
+ divide(t, si_type(-4));
+ n_pi = fp_type(1.5f);
+ hyp0F1(result, n_pi, t);
+ multiply(result, t2);
+ }
+ else
+ {
+ // Scale to a small argument for an efficient Taylor series,
+ // implemented as a hypergeometric function. Use a standard
+ // divide by three identity a certain number of times.
+ // Here we use division by 3^9 --> (19683 = 3^9).
+
+ static const ui_type n_scale = 9;
+ static const ui_type n_three_pow_scale = 19683;
+ divide(xx, n_three_pow_scale);
+
+ multiply(t, xx, xx);
+ divide(t, si_type(-4));
+ n_pi = fp_type(0.5f);
+
+ // Now with small arguments, we are ready for a series expansion.
+ hyp0F1(result, n_pi, t);
+
+ // Convert back using multiple angle identity.
+ for(ui_type k = 0; k < n_scale; k++)
+ {
+ multiply(t, result, result);
+ multiply(t, result);
+ multiply(t, ui_type(4));
+ multiply(result, si_type(-3));
+ add(result, t);
+ }
+ }
+ if(b_negate_cos)
+ result.negate();
+}
+
+template <class T>
+void eval_tan(T& result, const T& x)
+{
+ T t;
+ eval_sin(result, x);
+ eval_cos(t, x);
+ divide(result, t);
+}
+
+template <class T>
+void hyp2F1(T& result, const T& a, const T& b, const T& c, const T& x)
+{
+ // Compute the series representation of hyperg_2f1 taken from
+ // Abramowitz and Stegun 15.1.1.
+ // There are no checks on input range or parameter boundaries.
+
+ typedef typename boost::multiprecision::detail::canonical<boost::int32_t, T>::type si_type;
+ typedef typename boost::multiprecision::detail::canonical<boost::uint32_t, T>::type ui_type;
+ typedef typename T::exponent_type exp_type;
+ typedef typename boost::multiprecision::detail::canonical<exp_type, T>::type canonical_exp_type;
+ typedef typename mpl::front<typename T::real_types>::type fp_type;
+
+ T x_pow_n_div_n_fact(x);
+ T pochham_a (a);
+ T pochham_b (b);
+ T pochham_c (c);
+ T ap (a);
+ T bp (b);
+ T cp (c);
+
+ multiply(result, pochham_a, pochham_b);
+ divide(result, pochham_c);
+ multiply(result, x_pow_n_div_n_fact);
+ add(result, ui_type(1));
+
+ T lim;
+ eval_ldexp(lim, result, 1 - std::numeric_limits<mp_number<T> >::digits);
+
+ if(get_sign(lim) < 0)
+ lim.negate();
+
+ ui_type n;
+ T term;
+
+ // Series expansion of hyperg_2f1(a, b; c; x).
+ for(n = 2; n < 300; ++n)
+ {
+ multiply(x_pow_n_div_n_fact, x);
+ divide(x_pow_n_div_n_fact, n);
+
+ increment(ap);
+ multiply(pochham_a, ap);
+ increment(bp);
+ multiply(pochham_b, bp);
+ increment(cp);
+ multiply(pochham_c, cp);
+
+ multiply(term, pochham_a, pochham_b);
+ divide(term, pochham_c);
+ multiply(term, x_pow_n_div_n_fact);
+ add(result, term);
+
+ if(get_sign(term) < 0)
+ term.negate();
+ if(lim.compare(term) >= 0)
+ break;
+ }
+ if(n > 300)
+ throw std::runtime_error("H2F1 failed to converge.");
+}
+
+template <class T>
+void eval_asin(T& result, const T& x)
+{
+ typedef typename boost::multiprecision::detail::canonical<boost::int32_t, T>::type si_type;
+ typedef typename boost::multiprecision::detail::canonical<boost::uint32_t, T>::type ui_type;
+ typedef typename T::exponent_type exp_type;
+ typedef typename boost::multiprecision::detail::canonical<exp_type, T>::type canonical_exp_type;
+ typedef typename mpl::front<typename T::real_types>::type fp_type;
+
+ if(&result == &x)
+ {
+ T t(x);
+ eval_asin(result, t);
+ return;
+ }
+
+ switch(eval_fpclassify(x))
+ {
+ case FP_NAN:
+ case FP_INFINITE:
+ result = std::numeric_limits<mp_number<T> >::quiet_NaN().backend();
+ return;
+ case FP_ZERO:
+ result = ui_type(0);
+ return;
+ default: ;
+ }
+
+ const bool b_neg = get_sign(x) < 0;
+
+ T xx(x);
+ if(b_neg)
+ xx.negate();
+
+ int c = xx.compare(ui_type(1));
+ if(c > 0)
+ {
+ result = std::numeric_limits<mp_number<T> >::quiet_NaN().backend();
+ return;
+ }
+ else if(c == 0)
+ {
+ result = get_constant_pi<T>();
+ eval_ldexp(result, result, -1);
+ if(b_neg)
+ result.negate();
+ return;
+ }
+
+ if(xx.compare(fp_type(1e-4)) < 0)
+ {
+ // http://functions.wolfram.com/ElementaryFunctions/ArcSin/26/01/01/
+ multiply(xx, xx);
+ T t1, t2;
+ t1 = fp_type(0.5f);
+ t2 = fp_type(1.5f);
+ hyp2F1(result, t1, t1, t2, xx);
+ multiply(result, x);
+ if(b_neg)
+ result.negate();
+ return;
+ }
+ else if(xx.compare(fp_type(1 - 1e-4f)) > 0)
+ {
+ T dx1;
+ T t1, t2;
+ subtract(dx1, ui_type(1), xx);
+ t1 = fp_type(0.5f);
+ t2 = fp_type(1.5f);
+ eval_ldexp(dx1, dx1, -1);
+ hyp2F1(result, t1, t1, t2, dx1);
+ eval_ldexp(dx1, dx1, 2);
+ eval_sqrt(t1, dx1);
+ multiply(result, t1);
+ eval_ldexp(t1, get_constant_pi<T>(), -1);
+ result.negate();
+ add(result, t1);
+ if(b_neg)
+ result.negate();
+ return;
+ }
+
+ // Get initial estimate using standard math function asin.
+ double dd;
+ convert_to(&dd, xx);
+
+ result = fp_type(std::asin(dd));
+
+ // Newton-Raphson iteration
+ while(true)
+ {
+ T s, c;
+ eval_sin(s, result);
+ eval_cos(c, result);
+ subtract(s, xx);
+ divide(s, c);
+ subtract(result, s);
+
+ T lim;
+ eval_ldexp(lim, result, 1 - std::numeric_limits<mp_number<T> >::digits);
+ if(get_sign(s) < 0)
+ s.negate();
+ if(get_sign(lim) < 0)
+ lim.negate();
+ if(lim.compare(s) >= 0)
+ break;
+ }
+ if(b_neg)
+ result.negate();
+}
+
+

Modified: sandbox/big_number/libs/multiprecision/test/Jamfile.v2
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/Jamfile.v2 (original)
+++ sandbox/big_number/libs/multiprecision/test/Jamfile.v2 2011-10-18 14:10:20 EDT (Tue, 18 Oct 2011)
@@ -282,3 +282,52 @@
               <define>TEST_MPFR_50
          [ check-target-builds ../config//has_mpfr : : <build>no ]
         : test_tanh_mpfr50 ;
+
+run test_sin.cpp gmp
+ : # command line
+ : # input files
+ : # requirements
+ <define>TEST_MPF50
+ [ check-target-builds ../config//has_gmp : : <build>no ]
+ : test_sin_mpf50 ;
+
+run test_sin.cpp mpfr
+ : # command line
+ : # input files
+ : # requirements
+ <define>TEST_MPFR_50
+ [ check-target-builds ../config//has_mpfr : : <build>no ]
+ : test_sin_mpfr_50 ;
+
+run test_cos.cpp gmp
+ : # command line
+ : # input files
+ : # requirements
+ <define>TEST_MPF50
+ [ check-target-builds ../config//has_gmp : : <build>no ]
+ : test_cos_mpf50 ;
+
+run test_cos.cpp mpfr
+ : # command line
+ : # input files
+ : # requirements
+ <define>TEST_MPFR_50
+ [ check-target-builds ../config//has_mpfr : : <build>no ]
+ : test_cos_mpfr_50 ;
+
+run test_asin.cpp gmp
+ : # command line
+ : # input files
+ : # requirements
+ <define>TEST_MPF50
+ [ check-target-builds ../config//has_gmp : : <build>no ]
+ : test_asin_mpf50 ;
+
+run test_asin.cpp mpfr
+ : # command line
+ : # input files
+ : # requirements
+ <define>TEST_MPFR_50
+ [ check-target-builds ../config//has_mpfr : : <build>no ]
+ : test_asin_mpfr_50 ;
+

Added: sandbox/big_number/libs/multiprecision/test/test_asin.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/test_asin.cpp 2011-10-18 14:10:20 EDT (Tue, 18 Oct 2011)
@@ -0,0 +1,98 @@
+///////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2002 - 2011.
+// Copyright 2011 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_
+//
+// This work is based on an earlier work:
+// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
+// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/array.hpp>
+
+#if !defined(TEST_MPF50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_E_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPQ)
+# define TEST_MPF50
+//# define TEST_MPF
+# define TEST_BACKEND
+# define TEST_E_FLOAT
+
+#ifdef _MSC_VER
+#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
+#endif
+#ifdef __GNUC__
+#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
+#endif
+
+#endif
+
+#if defined(TEST_MPF50)
+#include <boost/multiprecision/gmp.hpp>
+#endif
+#if defined(TEST_MPFR_50)
+#include <boost/multiprecision/mpfr.hpp>
+#endif
+#ifdef TEST_BACKEND
+#include <boost/multiprecision/concepts/mp_number_architypes.hpp>
+#endif
+#ifdef TEST_E_FLOAT
+#include <boost/multiprecision/e_float.hpp>
+#endif
+
+template <class T>
+void test()
+{
+ //
+ // Test with some exact binary values as input - this tests our code
+ // rather than the test data:
+ //
+ static const boost::array<boost::array<T, 2>, 6> exact_data =
+ {{
+ {{ 0.5, "0.523598775598298873077107230546583814032861566562517636829157432051302734381034833104672470890352844663691347752213717775" }},
+ {{ 0.25, "0.252680255142078653485657436993710972252193733096838193633923778740575060481021222411748742228014601605092602909414066566" }},
+ {{0.75, "0.848062078981481008052944338998418080073366213263112642860718163570200821228474234349189801731957230300995227265307531834" }},
+ {{std::ldexp(1.0, -20), "9.53674316406394560289664793089102218648031077292419572854816420395098616062014311172490017625353237219958438022056661501e-7" }},
+ {{ 1 - std::ldexp(1.0, -20), "1.56941525875313420204921285316218397515809899320201864334535204504240776023375739189119474528488143494473216475057072728" }},
+ {{ 1, "1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064" }},
+ }};
+ unsigned max_err = 0;
+ for(unsigned k = 0; k < exact_data.size(); k++)
+ {
+ T val = asin(exact_data[k][0]);
+ T e = (exact_data[k][1] == 0) ? T(ceil(fabs((val - exact_data[k][1]) / std::numeric_limits<T>::epsilon()))) : T(ceil(fabs((val - exact_data[k][1]) / exact_data[k][1]) / std::numeric_limits<T>::epsilon()));
+ unsigned err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ val = asin(-exact_data[k][0]);
+ e = T(ceil(fabs((val + exact_data[k][1]) / exact_data[k][1]) / std::numeric_limits<T>::epsilon()));
+ err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ }
+ std::cout << "Max error was: " << max_err << std::endl;
+ BOOST_TEST(max_err < 20);
+ BOOST_TEST(asin(T(0)) == 0);
+}
+
+
+int main()
+{
+#ifdef TEST_BACKEND
+ test<boost::multiprecision::mp_number<boost::multiprecision::concepts::mp_number_backend_real_architype> >();
+#endif
+#ifdef TEST_MPF50
+ test<boost::multiprecision::mpf_real_50>();
+ test<boost::multiprecision::mpf_real_100>();
+#endif
+#ifdef TEST_MPFR_50
+ test<boost::multiprecision::mpfr_real_50>();
+ test<boost::multiprecision::mpfr_real_100>();
+#endif
+#ifdef TEST_E_FLOAT
+ test<boost::multiprecision::e_float>();
+#endif
+ return boost::report_errors();
+}
+
+
+

Added: sandbox/big_number/libs/multiprecision/test/test_cos.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/test_cos.cpp 2011-10-18 14:10:20 EDT (Tue, 18 Oct 2011)
@@ -0,0 +1,291 @@
+///////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2002 - 2011.
+// Copyright 2011 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_
+//
+// This work is based on an earlier work:
+// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
+// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/array.hpp>
+
+#if !defined(TEST_MPF50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_E_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPQ)
+# define TEST_MPF50
+//# define TEST_MPF
+# define TEST_BACKEND
+# define TEST_E_FLOAT
+
+#ifdef _MSC_VER
+#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
+#endif
+#ifdef __GNUC__
+#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
+#endif
+
+#endif
+
+#if defined(TEST_MPF50)
+#include <boost/multiprecision/gmp.hpp>
+#endif
+#if defined(TEST_MPFR_50)
+#include <boost/multiprecision/mpfr.hpp>
+#endif
+#ifdef TEST_BACKEND
+#include <boost/multiprecision/concepts/mp_number_architypes.hpp>
+#endif
+#ifdef TEST_E_FLOAT
+#include <boost/multiprecision/e_float.hpp>
+#endif
+
+template <class T>
+void test()
+{
+ static const boost::array<T, 101u> data =
+ {{
+ T("-0.50162154214905535006507934761566421365808962336874567677926739022768858180703782104157334491773507690211622144412751863172893119122904872120863946237533655183100979972269651012785895305465091942482860884709266947899655662267052604131701946158941092922207257375120965677001058006645609151579188243577188192831765423148813895489546306047297711022539509473462404019089733447430114238267379980532396311664"),
+ T("0.60313571428133694309325113655636540756247392441681227046917143280974317371916820972719995253248954425492897594051861535050840463205496306256237562726891289696301688567930026444972968333329934552460084325207412884738539384203738886072440013640125030433738691853586812704775040754220545555524237855361445575868855139945713834823411715711428213828850093318644478373792898000948569667301322178250159228606"),
+ T("0.96902885660223213449832417965462288346382027027907788639786102888188268413128284808786908788351970794814191573322198094839000459295090920127430762740525901384778314480815531039485728089512489227948630012091333107823627672161756650613535363845597750943844039360212709462602480040358932164638277463645635101178868520058961493135889052671922314786442189473233561252419424865659925386520422456933994031412"),
+ T("0.14782491492260520954264860310453392894688582499520847868449990765772811594316839506757584243129175527745236732059643506743012867347391315093605558463510078020864683057368198129858823908327097108583620570511151521896111105026538667326749527786043478669088587777236123716686756088055458828079103458534402182273835161066708126746360741813126817035007484464329141515901214558732724557437706092450180726378"),
+ T("-0.85447015139344948471094821054366626768019606763269341666053644333072070840260166961763856973284893831954425042860099172316086950440334996806598196522184690224018944138578542327045770832471332376269716674841615467614625539483750018876502303839670098606230317226296309325404589665701938190004997832683948796843166639576625281030300467522347494569768687089899397360725496800596493559470637547748735594697"),
+ T("-0.81000689036588888102398287378618104836450574863713892332248232301021899106208419137911694670935600210389307190348154033680700645928539580731142634010602466147128679656911798991740456705453963764056901956423046807435258488930954638670002070774439646670450724500520094586192645160847046520311570082832431061691996839606591067443335185302732221888316818825870721496315105401624866741940813589284275695918"),
+ T("0.2267455177003321384894005667464998092097833850092894238480831378466683827110057043871346060005709235569800215748516185659827893723700508589640891976972716570403665692613477548038629552153079218542242417184271182264022470709072429310981387965885388758575814101891100826647083444934684812292662215448102626341015149572372707444725994248777658076421636637760492982947444020394182326376291158696727384852"),
+ T("0.98572607094681400469823142383450564975177916157871840422129452719452525174019803417354200370408054482797693621385765351670173144053171524005535725427317409189868483686977845578192854125777358818593005952568285102554187813023457756929121023181880198348203083841375515867843145321766318476866476607321938993078073105088587752971311300418067382395754489252201424628686354714684325074264340586434068083735"),
+ T("0.53715481965030691887397316962489853948341836449029599646266321884877186476498260019355874856809552188645630606126976563119123530724283602396484950653123503399938294688332329634386257314146589125825636097592371320563696604271190825947497633567945681092924620382686009619110102110209885034787176755762448527267043281608584015012767667899712762371285806841811102653584612955459666723163160014123341963671"),
+ T("-0.56945144858011886915780505911780725010620323062276283805115420871306570794972703588425077520601752861293077323301792800610549113139402646104081762175534061087117946244152125287975953108704696268847815261917377065241801643783329354778399526877290332215236634903080639679860355847620563822363712579548641527844739938293967364597110377469773489014211951212857101374318452911401420528677259991331090266005"),
+ T("-0.97845810511310366097345864112668906661089075307983663561178996977421991305045684012227818895513901547325249161241097295038349597373820690088476031256136981855438584632935895625291791741570973153071536443895825053372019222244541345181800559983327493395843212471107951435623879503589116197386166395270332969985628390518342285544128149350904869144760786557644083102040293619728857795557725975446387638082"),
+ T("-0.18881649076882036818094718893825891946691295900905829577570255489597056088743777799436529545269699011594065157007321752198038423373390670103253610646983030773571922979273600163598344653044825786274322207994738104766932351285365246017952816761886637102290439956065197679903357501267350062489863581450400525901254917975058272557102311416424438039867176899411547343130655797011597302924818642795986910776"),
+ T("0.83213248256248718391648282211236200464150938178343837417522635579213705328552770623957486792338755433958256100224720251839082676782210674078979903328623897712870422600430978907177584667709552233768475968506874004560085480509103334782228549116928850495590090914133655583767781543886956699592465303315591578411513564172526903206600594554996369316967222569167592338646796759203865876228192676690576393957"),
+ T("0.83368761966098380317914918853127190012005517198095141616372457983351189700156411681039093358761555771758536229588242982647239744187242300801829995961871412772468923394414109025642424234703592018655517051393077978860068845984020869413624371103031896740117407710299198562267502869147100200858539656754317575041431701939759759225389946719106478332366708137354276007919533255169664638235639383569564110075"),
+ T("-0.18605618137227649584671124815631620875769157093190685600569736108086402885199167407702422320100843062616644714444408614621390574242763877642390939806307957026167805604628333909629405976831956784535026886701013223479257442178936513209253370459988519785036119662696969209506800793520534365946487576733594348627957021254017447520897947123358509837940617442852539597167693389591380189862319487892792923153"),
+ T("-0.97787410706912947200700947809086987929552083940545236541182287303790608208610023257624198390105132776123115664110406549669787968717953162987933260638310530750565076435745587024443942712810356372635589174338356282870564205603334997652974637518927664227105047973535688395040777968082125500061259190313820373870936866720823176265958448162090987423326403872038897090958331050185525989399368410147697601184"),
+ T("-0.57175918163121264025616107589630751551161205724757288681494194505248342228571881008866075970817690438186545379919710148119548771419260784258379302863349865022779589406640338106461807885184578720013258862884778613907350162349826641089246855371608494365729193629734711852175384638728815913727055118781471960575965215193534386589450370243853256890375165575818694142504618584610839931680003465519416417686"),
+ T("0.53478241597498682890636923119124507573138434225226478301997338705931821657049944750562391125304256759887391004338167587322019260365925435302391176930331161896818003746464685277508807805130884660314731429722219318699505836398912422599554793162364836595300619860913573673921432325981205409702897337053197706014049687225094538593517626884763534008626048851538197945922313231461994435494917556595912129444"),
+ T("0.98619528108436834444622772244233500550001863518169392038562682097011946713614830549103565779570404766638555367268020992254689671390965312890416679706192473068433717014095521991774567755994345709131209844512998942709582638991869821050636439257597063856249038092119512871640381123843890013812838185293393263756058350072768448458950380360337889770923256206901689904823829217396801268618019194906772703227"),
+ T("0.22948154144509182369415746800698328364988547396475691620681392787566104183462052622980774444304368277802870979261579895452333488316470495027443871923297117956210113575448119970237881958246782891025814249305970662163236166516394039705137544157900789683194435211763787511069822409683486532927557658412323180776903688623277362060713475574739265599518489263464320833102602215450190502358534383949241852484"),
+ T("-0.80835578582046670310464731711696478601773118159925609840597870029856375850957218864062941877059300809268098041286606529894870899049159003652074961379621476411176224648451902760457011220845176506086174749134555188467902316469475288975403773973857636373892326760376585744094430003550369691223550482756797212146056901318410686997010241891041855811922027651329719928389111111167862044112446757189042088046"),
+ T("-0.85592663170679958406515397649643131309994249316454429005131578645085757570761552251729365670632975735279522675018975575836010210249068470527194075548251441076976420496548792075626757772699437483366302008026562909787676760497709271997930485538120627136230760141137536077186130465523928404376378372203755818590534658221264961808618483334189725855704258977192100851554017405085224133570406300901634686193"),
+ T("0.14504509334766993343679732543237665601748015028110051986903855469561805431836897592755787294803720321294196670692675860425817019156006795472544060301573514970130737237352276407965078322598196015088783620318485742726789260216376389721616761481364286097504141935673467904417287244647363440435023754573347620436961058676078531225670052103877411944831266665091545142351559495386200504307614132116833066489"),
+ T("0.96833108057454018135440242001894400433450486884893467698495154667147695605198346971512860434896301677316979407715828973045999189796179033252360390253384834782428911228350312995059296512013202981214049690155973624217982618572186690629393688668380855531415343035476364485845562203330354168788849023043609092864372997506131587372974589034738683570955059234741409975711088655065542622757333229038929539614"),
+ T("0.60537478588662083093550030671881062835301187704838619957445140277346831579708290170559342372438997696786583564116411747796066131598667722839502247472418892060636953054544383896701697716904288008881811071365393348940494848858720140528491631498078923089892805069340832767510592701952499233084373444894649962175905154151059310656485499518493307751028032192138975110743944975104530590939205299365402172399"),
+ T("-0.49918857050765127165246443100830980202323621859663295606411941969457362189652587284758726475585312743864487499288977743573076640209331558808543037798473406138898808010287039327632227491127621026484760216100025745074711422052006517238053729631745694408780163847537773119573702459176085803816861008338932982744241500509585746534632592189239382341678009278118030810458222678068124752194184440160812863357"),
+ T("-0.99222700442041793244341637163672398376812477454144578739458582830385307501573374493329418110400264981611911650266336290704933803675752414608868505761080497715998786605323101072631863530928986865345605473152114701760347977346551445152252230086602267733482237318264916817026594817822201149718727077242483980112025554281082958570816251191650760457174817529165817706742958860474153596353298087887496342571"),
+ T("-0.26974974384283529407135442904911380728022891803412415907499156005666362362451160206340942887714356745930732393405178421002248875485798257350416225295845333813028470892948983232570745331205136828532696050523659085855991735781739399449780199864580413509362957674310213115088541667662139444692787904342579506007770224294439456180398644394712078670122120840185549712701180444406705582313291159418160268707"),
+ T("0.78318117881507218281256857540210491140619166393457160009274918850278377150347503811659906527658912201560000425062426213174077300808809107842767634667207644130246300983762258813379724135069575858579484972987736881337517572218810617863132592764984653001013079710817700332509430207238192747837232227382559069149116081099363790759716765670238049577887842168907894878101742345788299501918210802461045488336"),
+ T("0.87668546801298894316611272503029374001219866661666136243743380759468378098691643969637456927472038354627520673349367283367324121916949272869177620477269451717775313582362761369952753768494804335788010017359300886827719062432162897060693014847129089532263482838487347672588768501033685070780610322543843882757687187812123549700825256897742477675410408774989851342602781239821815645715958753412070397601"),
+ T("-0.10378317514630283035697337871092369012118223784464643078377333318832860627512487321975641507120202567300966096393096627338947655380820003149059343389474916418959764384086933825280338584080543377015355584259569741193189206873606119903440824298765910897401393832760642020478309582400187458069600297503471338694965049437285901431495005334289622152511502991672903524064211804721113695218039893263678813343"),
+ T("-0.95711349446199095576893296201081918391006544549413893765144324906139169225887225012143883285387366088163020556116889558963741768284740305902934334806946850023570597825714830361465408561420292855043502515001498149850537134194706047165529988277670109220102766502269805527095332398862295461748072266537481745404509807754999697692445286508080110297609601749711507506133141464812431049826946597146636354781"),
+ T("-0.63794350009531545667254180005058967014091074426028186874676752373058269762260454593384980188290943960936825811511438820242903324463297183316287071729253599410382790069375166807977207973311824805416905280934478728402362367738590911068930970233001798070025927580146476114118351752104439608955539133724726044901319895130615046919558595196176958507074369945336446902427277357686167969430099800901266255694"),
+ T("0.46273146552227640776400067795797886210480882393837882658186448207173350896006259857463834781474074845803406523589452301046262359240960602310918185550315272791571940053255136983368027733514059954139407173745111843912155780937211468453669133666656749905679399238836226218178194842769436017337481617143672364099652685726181145621234602247890953107767351286824995678514316143524362442186848118247298539021"),
+ T("0.99654284430835394575771581445263740011621544801262270069888725717770662527892701805906692059703566000057199727570596201090018843521079740099451243652812902235907552357808897819533630795824169795169152613897271256945242079733003533677278244438976511094582819587451104089603294510862191561695442770960262566234171127458107369852758518111412741106821369313642094603607640773678048962065297712686264798258"),
+ T("0.30955146113330921967430965120100702675233631993391895373629969028737150573338643391886330012902676396897993034209801929950606565714260278367377830209837135331181218082619455762666764549875449196418398841614865341526715151403235213502358851080285994526097503071014059233244883279123955235243977740815084262049389088713424955579803462877942093968546097956762333725432236406001838616369819684003862992419"),
+ T("-0.7566521966358354309951093880175904595961117293429649925035725302909818579817906207321292211570710827880191877879999303605651415336764708947953554392170782512559588243742231488130076898716985771987302881464753061056309847520640566277714873772103739495076986709669815846805764241489433274054604832770486905571732368583068561729787356544754173018704553303862640097086917153589464723040964231442327725739"),
+ T("-0.89592822979483709059243413613768383910182989046075476634617095657797990928508436396136302337758704430356065256820357837873075721305029630953922861317062956315025129501726888033240428998214338302878323599895725515251065134297830575602290889130735518399074878206099064423045326729243958866358871543482110235173182896730253794606214425305515937065566938780643012662976806400899752708380354702107584200173"),
+ T("0.06234178205498326768449331827227332778878332201276384069140804289468809818009465781317127499109411839409445261411097713389998386056235706454635141010244151932394411847811136494628546693592312682393427375069804704908617054121292472216996067137584186214292728977551151133236612796923969229055426308128461924845361007211592745940106076843829115607148914933190080636946774340167862449354032670081682503677"),
+ T("0.94424074758905426693013670501578752072879728684274664557376317555913249162898450233304331602359948789616904949986891686512171337619053651010052765459159420933905715970952322156715741540214635674374384487833082591105216552403945633258288248064096802773248182125224091036161363816821787326423255076418870584794499423986465255713593740475609695103672895656428014974438779094737722426473065402390479127002"),
+ T("0.66940900234972085772698395256659605212272643739109209667125733824405981903658617201709239065102665405063166964631091092744127095503906134074823656023393611554152837997449326176648259796105677009519668003831584281955537599169598905666609420488437109555473016150415050976685545370751598833602947303804286613228920011048601435648630323226945291269501824614939897919341523226599107705055297349402859236896"),
+ T("-0.42547414721971330565409790138583216442479880361609527886964392881677619848933007107332651801952059053556471752375648666462158176314752197637071456256008899487321608724189395189615041157311878404609283475043414911337534183547148088572894035977423720231858134885165786681305346317203268564898788667422942217715710500639870156821380173286044798492696421543055302879445405671926952506373313300693015863574"),
+ T("-0.99913533725625827895885420059533174260228060155728399323156205571706305217929202105237251086305720615246638608665744238167422868148494071388447512869369652666016804258416975268792629805702694345570129997561583877702300615841988105832696053353859384414627875276769517809636231032799628078938353066535288163274118038591394188369361821148103018841138634739652369087495081203873309267574158616396567307492"),
+ T("-0.34881786319235757353608331390774426958801870286240250260169998305471883501204837208323576855595361379043170036069553791773607809536655382734659088580969476301635137094982435633208997311383294130223650445792658125459022909462690696664526317408366804098986643756477511847342019476173582109336405217301916061499808856137725615883817070458120962726145756438119220448588723418633370427189844667611481792962"),
+ T("0.72881471652779599579578058763983370510799582516797066846624634893882199724038302182668125377701493863656762620352413750563017197413808000383697483717264271873855767687937510341726345841626061553517042595268476874385774311053499675017743616990623307920507987935959383718695693618200297497313502037997098069759583079411517535532519668785928165917878363955532156662323627880875149433884315003009524969368"),
+ T("0.91362164005394510404798528088309623890018900746219043351480570272112701909791508825990618473644291633475042035900507995909672613140877257670920948316716218048879267235797825939302972470200910320624112626429381475376664864431458828213242682906890618620939480878412280722400697167591741919704297000951832259295785803906002953167528593565353099927772534139636590356175767293503013121188135804719329377757"),
+ T("-0.020792579731020884570917489924829815990901072176716833800451630402659488568602453092320962870467062725056963726749091346237812411927788553678105022434525207164566719010754898510917339890499700846699846272929873718752144808990322962955858259663820680120429324521028803111432757858749225053719910422285494416920886558156485737807758736556364535329791051459890234311397811046030022550124420890079918499806"),
+ T("-0.92973510112499140703211303301543817758564572287706026278579630272201180630168028836976329577763576080557925500836630218023453183589136530080853328463253256043937995662714702310301104590063206629677773404210676707719408386980510414385968423854465563338165624928483173590672543381355453313463456551085355191753472704341195875901211063845473814165083882940066653120643707041759352014177322989513249712945"),
+ T("-0.69971687855481202313282264003416633874007708241691504684133936897916129633508695580324089944109853489892619325255884869329787559760565315713290477914000125094981765362135662354044758619666857636031878131847413243331348066629478769360995267702914881219005969303814156065237352978323936029385435868138673545623501852266665885946448589623038753247551331280396083996799682701685286072955536720942219340784"),
+ T("0.38748104563009787102820133164016447769400048035334289735708379460553950678502357006276775381947203793501041447662719507628277154284594473586657342957139018292691624326995856690727098436205171520067762188653923456293311998678147550312423215288396830773761466919125058572139335774599032387616617354102353665454197825146894321951594670500888745959955736169293525665535786830770045479189693672271780123876"),
+ T("1."),
+ T("0.38748104563009787102820133164016447769400048035334289735708379460553950678502357006276775381947203793501041447662719507628277154284594473586657342957139018292691624326995856690727098436205171520067762188653923456293311998678147550312423215288396830773761466919125058572139335774599032387616617354102353665454197825146894321951594670500888745959955736169293525665535786830770045479189693672271780123876"),
+ T("-0.69971687855481202313282264003416633874007708241691504684133936897916129633508695580324089944109853489892619325255884869329787559760565315713290477914000125094981765362135662354044758619666857636031878131847413243331348066629478769360995267702914881219005969303814156065237352978323936029385435868138673545623501852266665885946448589623038753247551331280396083996799682701685286072955536720942219340784"),
+ T("-0.92973510112499140703211303301543817758564572287706026278579630272201180630168028836976329577763576080557925500836630218023453183589136530080853328463253256043937995662714702310301104590063206629677773404210676707719408386980510414385968423854465563338165624928483173590672543381355453313463456551085355191753472704341195875901211063845473814165083882940066653120643707041759352014177322989513249712945"),
+ T("-0.020792579731020884570917489924829815990901072176716833800451630402659488568602453092320962870467062725056963726749091346237812411927788553678105022434525207164566719010754898510917339890499700846699846272929873718752144808990322962955858259663820680120429324521028803111432757858749225053719910422285494416920886558156485737807758736556364535329791051459890234311397811046030022550124420890079918499806"),
+ T("0.91362164005394510404798528088309623890018900746219043351480570272112701909791508825990618473644291633475042035900507995909672613140877257670920948316716218048879267235797825939302972470200910320624112626429381475376664864431458828213242682906890618620939480878412280722400697167591741919704297000951832259295785803906002953167528593565353099927772534139636590356175767293503013121188135804719329377757"),
+ T("0.72881471652779599579578058763983370510799582516797066846624634893882199724038302182668125377701493863656762620352413750563017197413808000383697483717264271873855767687937510341726345841626061553517042595268476874385774311053499675017743616990623307920507987935959383718695693618200297497313502037997098069759583079411517535532519668785928165917878363955532156662323627880875149433884315003009524969368"),
+ T("-0.34881786319235757353608331390774426958801870286240250260169998305471883501204837208323576855595361379043170036069553791773607809536655382734659088580969476301635137094982435633208997311383294130223650445792658125459022909462690696664526317408366804098986643756477511847342019476173582109336405217301916061499808856137725615883817070458120962726145756438119220448588723418633370427189844667611481792962"),
+ T("-0.99913533725625827895885420059533174260228060155728399323156205571706305217929202105237251086305720615246638608665744238167422868148494071388447512869369652666016804258416975268792629805702694345570129997561583877702300615841988105832696053353859384414627875276769517809636231032799628078938353066535288163274118038591394188369361821148103018841138634739652369087495081203873309267574158616396567307492"),
+ T("-0.42547414721971330565409790138583216442479880361609527886964392881677619848933007107332651801952059053556471752375648666462158176314752197637071456256008899487321608724189395189615041157311878404609283475043414911337534183547148088572894035977423720231858134885165786681305346317203268564898788667422942217715710500639870156821380173286044798492696421543055302879445405671926952506373313300693015863574"),
+ T("0.66940900234972085772698395256659605212272643739109209667125733824405981903658617201709239065102665405063166964631091092744127095503906134074823656023393611554152837997449326176648259796105677009519668003831584281955537599169598905666609420488437109555473016150415050976685545370751598833602947303804286613228920011048601435648630323226945291269501824614939897919341523226599107705055297349402859236896"),
+ T("0.94424074758905426693013670501578752072879728684274664557376317555913249162898450233304331602359948789616904949986891686512171337619053651010052765459159420933905715970952322156715741540214635674374384487833082591105216552403945633258288248064096802773248182125224091036161363816821787326423255076418870584794499423986465255713593740475609695103672895656428014974438779094737722426473065402390479127002"),
+ T("0.06234178205498326768449331827227332778878332201276384069140804289468809818009465781317127499109411839409445261411097713389998386056235706454635141010244151932394411847811136494628546693592312682393427375069804704908617054121292472216996067137584186214292728977551151133236612796923969229055426308128461924845361007211592745940106076843829115607148914933190080636946774340167862449354032670081682503677"),
+ T("-0.89592822979483709059243413613768383910182989046075476634617095657797990928508436396136302337758704430356065256820357837873075721305029630953922861317062956315025129501726888033240428998214338302878323599895725515251065134297830575602290889130735518399074878206099064423045326729243958866358871543482110235173182896730253794606214425305515937065566938780643012662976806400899752708380354702107584200173"),
+ T("-0.7566521966358354309951093880175904595961117293429649925035725302909818579817906207321292211570710827880191877879999303605651415336764708947953554392170782512559588243742231488130076898716985771987302881464753061056309847520640566277714873772103739495076986709669815846805764241489433274054604832770486905571732368583068561729787356544754173018704553303862640097086917153589464723040964231442327725739"),
+ T("0.30955146113330921967430965120100702675233631993391895373629969028737150573338643391886330012902676396897993034209801929950606565714260278367377830209837135331181218082619455762666764549875449196418398841614865341526715151403235213502358851080285994526097503071014059233244883279123955235243977740815084262049389088713424955579803462877942093968546097956762333725432236406001838616369819684003862992419"),
+ T("0.99654284430835394575771581445263740011621544801262270069888725717770662527892701805906692059703566000057199727570596201090018843521079740099451243652812902235907552357808897819533630795824169795169152613897271256945242079733003533677278244438976511094582819587451104089603294510862191561695442770960262566234171127458107369852758518111412741106821369313642094603607640773678048962065297712686264798258"),
+ T("0.46273146552227640776400067795797886210480882393837882658186448207173350896006259857463834781474074845803406523589452301046262359240960602310918185550315272791571940053255136983368027733514059954139407173745111843912155780937211468453669133666656749905679399238836226218178194842769436017337481617143672364099652685726181145621234602247890953107767351286824995678514316143524362442186848118247298539021"),
+ T("-0.63794350009531545667254180005058967014091074426028186874676752373058269762260454593384980188290943960936825811511438820242903324463297183316287071729253599410382790069375166807977207973311824805416905280934478728402362367738590911068930970233001798070025927580146476114118351752104439608955539133724726044901319895130615046919558595196176958507074369945336446902427277357686167969430099800901266255694"),
+ T("-0.95711349446199095576893296201081918391006544549413893765144324906139169225887225012143883285387366088163020556116889558963741768284740305902934334806946850023570597825714830361465408561420292855043502515001498149850537134194706047165529988277670109220102766502269805527095332398862295461748072266537481745404509807754999697692445286508080110297609601749711507506133141464812431049826946597146636354781"),
+ T("-0.10378317514630283035697337871092369012118223784464643078377333318832860627512487321975641507120202567300966096393096627338947655380820003149059343389474916418959764384086933825280338584080543377015355584259569741193189206873606119903440824298765910897401393832760642020478309582400187458069600297503471338694965049437285901431495005334289622152511502991672903524064211804721113695218039893263678813343"),
+ T("0.87668546801298894316611272503029374001219866661666136243743380759468378098691643969637456927472038354627520673349367283367324121916949272869177620477269451717775313582362761369952753768494804335788010017359300886827719062432162897060693014847129089532263482838487347672588768501033685070780610322543843882757687187812123549700825256897742477675410408774989851342602781239821815645715958753412070397601"),
+ T("0.78318117881507218281256857540210491140619166393457160009274918850278377150347503811659906527658912201560000425062426213174077300808809107842767634667207644130246300983762258813379724135069575858579484972987736881337517572218810617863132592764984653001013079710817700332509430207238192747837232227382559069149116081099363790759716765670238049577887842168907894878101742345788299501918210802461045488336"),
+ T("-0.26974974384283529407135442904911380728022891803412415907499156005666362362451160206340942887714356745930732393405178421002248875485798257350416225295845333813028470892948983232570745331205136828532696050523659085855991735781739399449780199864580413509362957674310213115088541667662139444692787904342579506007770224294439456180398644394712078670122120840185549712701180444406705582313291159418160268707"),
+ T("-0.99222700442041793244341637163672398376812477454144578739458582830385307501573374493329418110400264981611911650266336290704933803675752414608868505761080497715998786605323101072631863530928986865345605473152114701760347977346551445152252230086602267733482237318264916817026594817822201149718727077242483980112025554281082958570816251191650760457174817529165817706742958860474153596353298087887496342571"),
+ T("-0.49918857050765127165246443100830980202323621859663295606411941969457362189652587284758726475585312743864487499288977743573076640209331558808543037798473406138898808010287039327632227491127621026484760216100025745074711422052006517238053729631745694408780163847537773119573702459176085803816861008338932982744241500509585746534632592189239382341678009278118030810458222678068124752194184440160812863357"),
+ T("0.60537478588662083093550030671881062835301187704838619957445140277346831579708290170559342372438997696786583564116411747796066131598667722839502247472418892060636953054544383896701697716904288008881811071365393348940494848858720140528491631498078923089892805069340832767510592701952499233084373444894649962175905154151059310656485499518493307751028032192138975110743944975104530590939205299365402172399"),
+ T("0.96833108057454018135440242001894400433450486884893467698495154667147695605198346971512860434896301677316979407715828973045999189796179033252360390253384834782428911228350312995059296512013202981214049690155973624217982618572186690629393688668380855531415343035476364485845562203330354168788849023043609092864372997506131587372974589034738683570955059234741409975711088655065542622757333229038929539614"),
+ T("0.14504509334766993343679732543237665601748015028110051986903855469561805431836897592755787294803720321294196670692675860425817019156006795472544060301573514970130737237352276407965078322598196015088783620318485742726789260216376389721616761481364286097504141935673467904417287244647363440435023754573347620436961058676078531225670052103877411944831266665091545142351559495386200504307614132116833066489"),
+ T("-0.85592663170679958406515397649643131309994249316454429005131578645085757570761552251729365670632975735279522675018975575836010210249068470527194075548251441076976420496548792075626757772699437483366302008026562909787676760497709271997930485538120627136230760141137536077186130465523928404376378372203755818590534658221264961808618483334189725855704258977192100851554017405085224133570406300901634686193"),
+ T("-0.80835578582046670310464731711696478601773118159925609840597870029856375850957218864062941877059300809268098041286606529894870899049159003652074961379621476411176224648451902760457011220845176506086174749134555188467902316469475288975403773973857636373892326760376585744094430003550369691223550482756797212146056901318410686997010241891041855811922027651329719928389111111167862044112446757189042088046"),
+ T("0.22948154144509182369415746800698328364988547396475691620681392787566104183462052622980774444304368277802870979261579895452333488316470495027443871923297117956210113575448119970237881958246782891025814249305970662163236166516394039705137544157900789683194435211763787511069822409683486532927557658412323180776903688623277362060713475574739265599518489263464320833102602215450190502358534383949241852484"),
+ T("0.98619528108436834444622772244233500550001863518169392038562682097011946713614830549103565779570404766638555367268020992254689671390965312890416679706192473068433717014095521991774567755994345709131209844512998942709582638991869821050636439257597063856249038092119512871640381123843890013812838185293393263756058350072768448458950380360337889770923256206901689904823829217396801268618019194906772703227"),
+ T("0.53478241597498682890636923119124507573138434225226478301997338705931821657049944750562391125304256759887391004338167587322019260365925435302391176930331161896818003746464685277508807805130884660314731429722219318699505836398912422599554793162364836595300619860913573673921432325981205409702897337053197706014049687225094538593517626884763534008626048851538197945922313231461994435494917556595912129444"),
+ T("-0.57175918163121264025616107589630751551161205724757288681494194505248342228571881008866075970817690438186545379919710148119548771419260784258379302863349865022779589406640338106461807885184578720013258862884778613907350162349826641089246855371608494365729193629734711852175384638728815913727055118781471960575965215193534386589450370243853256890375165575818694142504618584610839931680003465519416417686"),
+ T("-0.97787410706912947200700947809086987929552083940545236541182287303790608208610023257624198390105132776123115664110406549669787968717953162987933260638310530750565076435745587024443942712810356372635589174338356282870564205603334997652974637518927664227105047973535688395040777968082125500061259190313820373870936866720823176265958448162090987423326403872038897090958331050185525989399368410147697601184"),
+ T("-0.18605618137227649584671124815631620875769157093190685600569736108086402885199167407702422320100843062616644714444408614621390574242763877642390939806307957026167805604628333909629405976831956784535026886701013223479257442178936513209253370459988519785036119662696969209506800793520534365946487576733594348627957021254017447520897947123358509837940617442852539597167693389591380189862319487892792923153"),
+ T("0.83368761966098380317914918853127190012005517198095141616372457983351189700156411681039093358761555771758536229588242982647239744187242300801829995961871412772468923394414109025642424234703592018655517051393077978860068845984020869413624371103031896740117407710299198562267502869147100200858539656754317575041431701939759759225389946719106478332366708137354276007919533255169664638235639383569564110075"),
+ T("0.83213248256248718391648282211236200464150938178343837417522635579213705328552770623957486792338755433958256100224720251839082676782210674078979903328623897712870422600430978907177584667709552233768475968506874004560085480509103334782228549116928850495590090914133655583767781543886956699592465303315591578411513564172526903206600594554996369316967222569167592338646796759203865876228192676690576393957"),
+ T("-0.18881649076882036818094718893825891946691295900905829577570255489597056088743777799436529545269699011594065157007321752198038423373390670103253610646983030773571922979273600163598344653044825786274322207994738104766932351285365246017952816761886637102290439956065197679903357501267350062489863581450400525901254917975058272557102311416424438039867176899411547343130655797011597302924818642795986910776"),
+ T("-0.97845810511310366097345864112668906661089075307983663561178996977421991305045684012227818895513901547325249161241097295038349597373820690088476031256136981855438584632935895625291791741570973153071536443895825053372019222244541345181800559983327493395843212471107951435623879503589116197386166395270332969985628390518342285544128149350904869144760786557644083102040293619728857795557725975446387638082"),
+ T("-0.56945144858011886915780505911780725010620323062276283805115420871306570794972703588425077520601752861293077323301792800610549113139402646104081762175534061087117946244152125287975953108704696268847815261917377065241801643783329354778399526877290332215236634903080639679860355847620563822363712579548641527844739938293967364597110377469773489014211951212857101374318452911401420528677259991331090266005"),
+ T("0.53715481965030691887397316962489853948341836449029599646266321884877186476498260019355874856809552188645630606126976563119123530724283602396484950653123503399938294688332329634386257314146589125825636097592371320563696604271190825947497633567945681092924620382686009619110102110209885034787176755762448527267043281608584015012767667899712762371285806841811102653584612955459666723163160014123341963671"),
+ T("0.98572607094681400469823142383450564975177916157871840422129452719452525174019803417354200370408054482797693621385765351670173144053171524005535725427317409189868483686977845578192854125777358818593005952568285102554187813023457756929121023181880198348203083841375515867843145321766318476866476607321938993078073105088587752971311300418067382395754489252201424628686354714684325074264340586434068083735"),
+ T("0.2267455177003321384894005667464998092097833850092894238480831378466683827110057043871346060005709235569800215748516185659827893723700508589640891976972716570403665692613477548038629552153079218542242417184271182264022470709072429310981387965885388758575814101891100826647083444934684812292662215448102626341015149572372707444725994248777658076421636637760492982947444020394182326376291158696727384852"),
+ T("-0.81000689036588888102398287378618104836450574863713892332248232301021899106208419137911694670935600210389307190348154033680700645928539580731142634010602466147128679656911798991740456705453963764056901956423046807435258488930954638670002070774439646670450724500520094586192645160847046520311570082832431061691996839606591067443335185302732221888316818825870721496315105401624866741940813589284275695918"),
+ T("-0.85447015139344948471094821054366626768019606763269341666053644333072070840260166961763856973284893831954425042860099172316086950440334996806598196522184690224018944138578542327045770832471332376269716674841615467614625539483750018876502303839670098606230317226296309325404589665701938190004997832683948796843166639576625281030300467522347494569768687089899397360725496800596493559470637547748735594697"),
+ T("0.14782491492260520954264860310453392894688582499520847868449990765772811594316839506757584243129175527745236732059643506743012867347391315093605558463510078020864683057368198129858823908327097108583620570511151521896111105026538667326749527786043478669088587777236123716686756088055458828079103458534402182273835161066708126746360741813126817035007484464329141515901214558732724557437706092450180726378"),
+ T("0.96902885660223213449832417965462288346382027027907788639786102888188268413128284808786908788351970794814191573322198094839000459295090920127430762740525901384778314480815531039485728089512489227948630012091333107823627672161756650613535363845597750943844039360212709462602480040358932164638277463645635101178868520058961493135889052671922314786442189473233561252419424865659925386520422456933994031412"),
+ T("0.60313571428133694309325113655636540756247392441681227046917143280974317371916820972719995253248954425492897594051861535050840463205496306256237562726891289696301688567930026444972968333329934552460084325207412884738539384203738886072440013640125030433738691853586812704775040754220545555524237855361445575868855139945713834823411715711428213828850093318644478373792898000948569667301322178250159228606"),
+ T("-0.50162154214905535006507934761566421365808962336874567677926739022768858180703782104157334491773507690211622144412751863172893119122904872120863946237533655183100979972269651012785895305465091942482860884709266947899655662267052604131701946158941092922207257375120965677001058006645609151579188243577188192831765423148813895489546306047297711022539509473462404019089733447430114238267379980532396311664"),
+ }};
+
+ T eg = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+
+ boost::uintmax_t max_err = 0;
+ for(unsigned k = 0; k < data.size(); k++)
+ {
+ static const T euler_gamma = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ T val = cos(euler_gamma * ((100 * k) - 5000));
+ T e = (data[k] == 0) ? T(ceil(fabs((val - data[k]) / std::numeric_limits<T>::epsilon()))) : T(ceil(fabs((val - data[k]) / data[k]) / std::numeric_limits<T>::epsilon()));
+ unsigned err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ val = cos(-euler_gamma * ((100 * k) - 5000));
+ e = (data[k] == 0) ? T(ceil(fabs((val + data[k]) / std::numeric_limits<T>::epsilon()))) : T(ceil(fabs((val + data[k]) / -data[k]) / std::numeric_limits<T>::epsilon()));
+ err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ }
+ std::cout << "Max error was: " << max_err << std::endl;
+ BOOST_TEST(max_err < 5000000000L);
+
+ static const boost::array<T, 51u> near_one =
+ {{
+ T("0.001103662615143147017601393734232421549156847219973314118949247990939859507971857976111288683988415478257878902917354105871236439563170045857810738102729287303674642020538722348587741395785016549139854168605590336633274890874911975139498047488076101124170425114828336211817830671418321600962996502656221412102902998671173649312277667706874059520046508702908872747388744526457997404065469953155187340837"),
+ T("0.0030157041572432190019717764776322147049224887913331212054173669461673516770769148735558540290915754514269097799280330158745508542936966046640795712691698490758472574837678659161855207596563250546269614348515005196657786359646020537231301121492728577410212550350070502426482802490452572415879214994201864402901595309726458026672888041860289772080407882673424767232857435141510615538430445535588448032261"),
+ T("0.0049277346741750694119109616231402901360500185022482787362616412856233338679208830974124749830793778323997684640684587346403570647040211088376986993615001420565608501262335822815041623056442245053684626079448221530207757672939048030945164948521320401574074802966260975904478775314730002799895049652983052125151436511589335123254582883803928373794668948878049089088843407672795237410750365571990834236348"),
+ T("0.0068397471757112108044544339281399968563253858411528016363900245610068161564091499398024110635089866212789583403491711476788985949178019078796740862827299289838108117219486357027460681238178010067475221327133396780718266880540272936860185783976937569903778160170225166328920201699827472893824363838439627437187765159770262282930293057633886299749088561182830982345936603553661004526800797082995898813903"),
+ T("0.008751734671690018552720976028788304981263251327799787402847843531098338033456389098956160956160597460869666211569183483587979772678557230743050583975270977754518475970489741156524119378847305446845331098526962579804361960647344836744631465315238254178161716870409320747176674142306881908614436607977326507761331050644035013756409444911127742401762647885817361924274132830920030936589562922803846509607"),
+ T("0.010663690172041286306192948782895990881227033104763005629047563262531418373465237876680529005058533981010793759446966868628480908709812402179047774888094761104238131843239037167212206469894485599085717216855637620318723457013401360290343196462723174177342294339229792213396006286331141933952648238459364417067676760977202812721209681621184724443514062993874571816382775241753902032787099435678672474841"),
+ T("0.012575606686811781116778815864446643746718166744927923785139233710240017201737625088406861185781739628293213436323314376708933534933748436720721568462267317026688561438144113855290140925120435317506169856461386623828941531577425811393721991195661429557079268566156800689149725770186985872449679872155877537432897653904213375816262709009448220490217917537801655330411526526290708967440087145630462068976"),
+ T("0.014487477226190798137230457835664944872810802211308342685055637400305474021552028493778559102552025380880477103065187688337931713540557562373991431880251553620947836940726544553647739994157300967262941976933375115946629204615918888689039777423610894099269527633757403818072000860056651445780074486612843419789636984117740884711882675016016919064788076097669389652323393864660933705259163296837955978748"),
+ T("0.016399294800535714798489384358524900105286836154421890562438917862501411947245037986455919696365301666112414890097246479762149456962809638588245466988584093380263545543023411087203351948681559905336010066900667101787138862856447778428938265451537422367650992162004154495705878092019403922006152498705687706013973674800621422751806347308220226407830977673540994341535381202679482907460136241543505771361"),
+ T("0.018311052420397544372537858201001145083914223029622271478159852925692124442640247100336262041440360412392318902558295108452513123454103504516607498763863728284797202978975409264141138861738184468257576157204552383675442780049333490201800526935793000727771598103735596829143729912656158790924063286176336412427525710457367751437348230246446466833498557166002214984255422115833828533909144072330080184872"),
+ T("0.020222743096546488827333191237246591760639730704704148795009602627175281013458865557238240830203973690492882935553111519759474835556686812553430134442713057622274348510526931333124437928482001301214776111358848026164688447150395879262705323533149853785508106018564787140458587165768350143018847840661371060583295055600185059031740386698369796694993301139380463919242175430688496936048982929502368583755"),
+ T("0.022134359839997490880406060727014362125793630864951833270601574861700025448109186301755833862830343973100181180995751924514611578149687732808840212399134735559355116816700346196685057916461444889179117142807858883574426062415931319905031345377305247124198345242221848293630112578508459623098934259229893301963120289071135120089672338617200639338087265986570094025605269870532431816151660553037324591448"),
+ T("0.024045895662035785157706623778569329505432699504171659064296747761761946910295074291838826981712792368282349553905175996858645967280135417577488810651594776626562252686758463813820791031580579721782251705600570838044158357396828391251385978824608388341556751951593319015721256942139947235672567093309227673005475237474351604086627391812539914665025071874865132198040631867741985556198082915821590691115"),
+ T("0.025957343574242448364285479040344211549214421772336408904791690210449825580868841229728937909141136116652894475476991471494524501035809956288247010861464302066154254736425460468024350571584780489213056428098560686376999562953811729945811217829999284678155635497607933780499844559793793320393174691097636750027421158473345884329284455326733063073401001936304522649050748641723222539485352644237494855455"),
+ T("0.027868696588519948373400137317728007608587427701668964330844960393232962659347088604492706251530487148805683505883152882204177723404307465324383408418716579280515871949790204586171885981761699066301009410176801635003961167315448162116236938093263170474354430610732127054993766008385425707409224417795873645410443727472246508894027549288331903202127478347028519320691939639175445464091747341289465807076"),
+ T("0.029779947717117692140641616959423088975059158964671307393654571763491553590582559015283533532986018614029995854278748039155177088839414450454409571267110720713374288363670804692289394770804051182510495900322915294613479146430103948686457060129295537542317247965142780968717375277053102667416124807987527429828758851341378395347636356414345553353015296944031211364374602764176767114282660874356057979248"),
+ T("0.03169108997265757234968007548831539092664261419258315028339932724609641378752993073240305448323210275610250474048387518003293691429670190316839718892647475151605557113852966925288722557261748981001717642661075734993748510506277165730472207647763678204813714194082852502621623007244214605646094787730992510318924772328958129857640953691466395972638014259980360897599169526022683004620965496473543834477"),
+ T("0.033602116368159512696233026049065446239504816931754722314316906991719894135599777826750609185018647633748023602662568553364455253741994701511752478506175671449029859193583332380924298164350627023797218098539441228986492601142199774579432202424360114528105854714450548265654769162069979862894518829365029262734944196495563243510942310738160350648115273816371164862001848102516957052031698646996790510953"),
+ T("0.035513019917067011716864665791693591701266221069066142988726516832036728613300457006403299601385922973285573124147669717618486570986860008564309641657943172757912451506572783449830586163814477502720341010870119231030511664725149033496023356743601581035789746158436049009960920433265660001864258067191594425969638702851317416487965304378219676062220223886417078628342731900948906319081697480745936074075"),
+ T("0.037423793633272685069230163289099410548201460485083250584815890545695501760634737348027106921155349564805321222282824709072582234185849564440670000847571561359324629877368620222775856068569278590582843550096096627510109210574429458414697641703261368397349100700647508781941466979105505468662952228018391181441110331804231754679360190526351574820397399161022517352576803713854137820941977691824804918229"),
+ T("0.039334430531143806170384413477273936914540782490679532559795199052084263353981243128408259086619593938946158294175465792633584421592350011455198124846778194417281005620258982615227234871780679327289232072858751285307955384102986030326321993554199425677956531006546270705693578070953933490084008156062047268010604414954653769711129551190023978078265436680151306319349753427763894284339669614362603225399"),
+ T("0.041244923625547845099780771389235760645292527949481044094490883777921290140650504322516472637184803214130714431279474404434513167088543202171922178874118967991301744186858054508473413647148744260057423931033177973119110921967581379650616945061418716237102199971097086754171168500651650526166023618723542873290120298640370217463634503988257867984189842393302366909916756244585593509804376197012137137735"),
+ T("0.043155265931878005673591620105503250213648422568500347993529171942176855000247082147052189275394127432389966427668413127665366489709229602926384588361071126297040547180622989395253518259197742053810419372452372506534313264090033740095357809571640645325965973975968081307185286025492280541542290934505383760407808393490207181258819590768103829347539943429968533891105456889889207923129412409325200337396"),
+ T("0.045065450466078760596989313842010956972889269629840996618541471076456145341576346037140737554087089598232657340541865108389258265511462307708855932308284610805209084413460614598570062354088931179587984702006847566162492414964136182928014974554852612762940578089297583097434972291633301329615187665009664697057933900728259220674217919826618275818024987757805509580781060051826778978395144370327934582031"),
+ T("0.046975470244671384601033063916347240271496301008030038885300525267985292259051299166038486168462131096926077920611254966322965395673221324506213593415263189667393727124978454125104192236004303056348320706091018781990803164595039969574510002737990997634364247271320535459089400357647302806652831431190979518269432197656547265417669309719787317687585776029758282182901563328846367691507505917911626458378"),
+ T("0.048885318284779485470814703449342779874157141188272539012461507790598796169844054420701400747288103863351008593834375336008952419161297787680355981672505884405645257094616683497040471721980241679616912483788844007649447969703512155758482444019770785766752697959554691538291379700303132353876869628124563105576278585509058450081192711918856522653293896204836307264696289474219755720645459588331890558889"),
+ T("0.050794987604154532871523976044438688478988546522275702591135165295075684834775069782087540212155311599924632216878717363279038406203747968637573994688146329296755023729170505930935028107359530042909822369245609091696704070694133386183688825674952803613566914142157159664703170379754943610785780639205752343103591085978554489192416588288410803225066825839880971435465232206429722600557780654218330146221"),
+ T("0.052704471221201384879102044313723519214541830844294339002006150295000261803629777930668202713875629368914012613840180174156598399096984605842000917709330893871365961242812860633022132663435078869433262371062200555333508565564704972551921154864927879748108180002977668648111714062992755985320189721615088748697314805428967770533095416911693326757965362169171309026356339280576158225848771071227224373815"),
+ T("0.054613762155003812122160305957618147686113745063989650607179163157398820817715079449268802189362998719256947035541552524839497119721884536865240705017403409053301625152685151644761334409897199810093505097528650897729279062117617766845257388412635800174656504897022571125534403010151970450307624961920347280823962725005822339087173498538012712497715370388872960900453285934131578336748483622553313648565"),
+ T("0.056522853425350019441850338124226420404372628229474954730316461224029279793449121148941830155705856364290655296696008865349058650396297667951745639266344993911111272076019522476315254920931469406381088740392436352997178777214659473302034620137440843681809428909274912969436139312159105442160243076856936138443854294531618433726198293972487505166088883354213979143973990964298454127970039847456893860203"),
+ T("0.058431738052758164976379864942430396555977098734986011309321413104802080798824039565461521608355122102022725461220269967251619843394860641070621951433765763369761658916816880868188275032453137184211673934079277285593935159478757148621410070196500221526968060556586710920750728824112282461003224923995158937905479480579208549847478185757177039153501786271361921802927586114942206193581554801605680183774"),
+ T("0.060340409058501876576879058406717550375449897922866349024612531373677724965692896763451690034750214807393086060232183962741893455630800282528706094634312497867863194252914455062127544671909424505367559503649890477570116767021509485710626043408265846213906257952113003324887350087083283630715857354116849013376841533857321740197047217435805280085872071354373524395263864933170034771001607559366437835689"),
+ T("0.06224885946463576546133123915706193746686049729742751789281333411875145041642253752249398319274836506892916659694331849766284472811963607782488993959669913942440995816339529777656740297867471191540909520680122909159182411803441391065468297111274482089347737322313334144161837035757661055283810143238846811496286086926075008068489724098160672664550444107807861952850135669761489736449089327971794824585"),
+ T("0.064157082294020937013292141108273585068933185681722806586173136512969086561151000586083228827704474922133659368208499428517560937267711287558275856325851735527047525549135602809953924346232393575354505341516408877034795144989051337120442048812961016500803766780090428411925756071299228254760633032932651170483895163866111455935100454818941073761804284777739005007991141161823471943803047351369535073521"),
+ T("0.066065070570350498632132342303164932774411476452581548988386145454309844170784631219900687545375669726062411278210148833761887075889382631711319762066717518842787273543143969874177059386003262516941215168234997245420735913778365997498382320917159517052861653706668051150014889560865161606396037665048820655743861710636504450723955435275019348223982732095398949832565423361714391500479155224225613768011"),
+ T("0.067972817318175064541548243754498015429928588516517183822313264446879635682093113384264993280408482780193047687370305892309106748875519486540879020142902362307237689684697063792225838111742241714789823601251998299331254097504567214769822096812914869886418586879378868131071702869283011709161582762527864014863950459121468893761825841337802563429112718615110803469902519051203360473993644451463303576859"),
+ T("0.069880315562928257463098098362562671709183706398122146969098129179472379455539984270317889382725678551314678030902515782188203802362460214070192378666311369730755912670660970378408284876465192356340335277225457776091515934608751710356445501169982098020701963512215973413220903547301855847279762573955110834619967590588317288171580291576756417265600792610005176888567344924086299458709493921684370833814"),
+ T("0.071787558330952207061531053207739391124226218288071373402959685303573894071937999096931283415397385296306228484128726125223568292760110763075739612174182840148193517540379302896938375357744754831885570482299802985278525692833941172622048860945698352794727105726197891701070706523197225463566498764869186174536278875440544967870368440256565084805804998877012238900798874720340885805165811704445925369809"),
+ T("0.07369453864952304506868897057861922170414313661538863465614770246556638808351254050794164760581857499175318127117745597595046399453737415234966090460819383278338184265518294393589316067434296307320873514873375534499000895507092920123162793722742278902956263178675873980121089525814840115300730124457959632013360479776554262210801798434607194598511786777350540581826836696200671400628870250659962729555"),
+ T("0.075601249546876396992772935963040077834759122887264324876826746597298507042570795315940378957369646666545616927930046677179646722187557860442506025110541968257406052679604681892086517951648112201767029044637142334937786145563391280677987040697732028896674786378870229133792190093646530752257521390201161387698590619925316803401938362974478273195688740273778224688121208296858072701246429755713258468481"),
+ T("0.077507684052232870319778844857360483087988665809157375994805235390695227945273826842335916971262245322463861698987988491433092759415620685754813456247989287157909601376742141647886684380473379403067343977633347655683745871434202230624968375294472571053679501320680048739346844244553807193670436672857163839591129928936603341033670518982144557944158002407590669543043048232580344768659176122645763500513"),
+ T("0.079413835195823539113919284592789131508074280056913456617148863190077260584186476150168101766032692499585019572300009477107342325731806003539645749720998260074894005503243715777788187754550286488316966320623707403846973934258796072434720381188302956748572794547906591019552569722211941807674118070825610462581312695693650893380241875873254675082431417454526920871842555422162216221640850141209989864308"),
+ T("0.081319696008915424923862092389736899811819511475112310887916890436246797704730704673729056088324784096921353721791055102563812592375189346816348952621603248827528923433998597558478366712658235656924601774921095079356565867874041683517103417362062033545480747089630436317004907748679995334911923789802669273406449877710501792905734235548100216242648355048174292232350538531258791292074224222773259366265"),
+ T("0.083225259523836973901629476483826882570495097409722948211156651871411915926347698443317606324912095013846386144848076019334983060323996364575622231284156371311209803383868297666027142776492604713451401116304951916037351315288808149328656282592946622481248077426878390562084748274992526750980236994304445617883874613002677387890383751048690275480465558930319669630406765794141303531112767626885032234711"),
+ T("0.085130518774003530041015433371012162123590338565297712899451572274044870858132401685294989726432756808251618198809497117031428754224182463768189333992610411750324249283786647605964593556580841488686189374310703328490638378071341189999989736919850819640255203388192531225871093915262442913255553964348789674386732423763999398384843950222967487918049677831350991752153610543052586794779289758903475438463"),
+ T("0.087035466793942804442393380943589773874807384137701777807755858606555806090045313793349743667697666495784828540247587627381581545620918795107877715086227932192756144780086856515641298195558204484728115519445514732755572178929839231921546119143469647706999890259163924570037168105911942268212237224359201159897493303064534985539474450028748960081579369980283792804593122976296597796047722827878891322393"),
+ T("0.088940096619320340510800454481897179643787714504988904779549430422905882044782054375828906100456879992313640144934242418129400679706865644316664458061953684856607341811667576418163339843372041295322709797007871604740491453013916791024918954258557372755707588171502529270934617054742841996068375532958173787119651672031238405892943090742861150287144368470297356054911834742041692715934237148148936307154"),
+ T("0.090844401286964974994199780075024285173534240616972938308566124002318176156233343333797652771250228033597767340846476094210813299723066344955542455246897302945908336756464582189829335315055318509171623072382573656172991307091055717376996812421994002305994837615827430425975713541786272473174908117299253875064746541808768776888139494200307162476704515967971265236163183394620211890252072718610942571965"),
+ T("0.092748373834894294768837248013614869545920040757666771889792264347367335922283987944081370356939214799510822558638935486112190359701790662792925773186897671244831971450474952036618937833706899006048469791213129922302798462311426294239282200248625552430083292818594731518350634587677158329361662244008606299358410273467156168469937529868888478684257396004386633746334360279683178784117372066095688934486"),
+ T("0.094652007302340089278624856973167138217258137565762699413364163993950641989798336903224059425798872308451866930780842878435503832366316245159154044350517727312654980455290163514021860802028251981954724580292247887851185639950862672925642859475325430465650514258094310141033116303195908372018392349011340787373492402788283020594141795669947097771918542864972570255253465754192708165241608041715996375567"),
+ T("0.09655529472977379853549858833033074225823562054271495313739665642376685099661084023094270272485976247900824483810911634635819558334630910267353320029261330296977292720266655308513559530586843550229208517388789783011887450865488554143475302590353915732321663418057567573042594801866258948380684000769091353165879953111046260532796891917772727185993569684246844052518121013717183610828519193371796413317"),
+ }};
+
+ T half_pi = "1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064";
+
+ max_err = 0;
+ for(unsigned k = 0; k < near_one.size(); k++)
+ {
+ static const T euler_gamma = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ T val = cos(half_pi - (euler_gamma + k) / 523);
+ T e = (near_one[k] == 0) ? T(ceil(fabs((val - near_one[k]) / std::numeric_limits<T>::epsilon()))) : T(ceil(fabs((val - near_one[k]) / near_one[k]) / std::numeric_limits<T>::epsilon()));
+ unsigned err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ }
+ std::cout << "Max error was: " << max_err << std::endl;
+ BOOST_TEST(max_err < 500);
+
+ //
+ // Test with some exact binary values as input - this tests our code
+ // rather than the test data:
+ //
+ static const boost::array<boost::array<T, 2>, 7> exact_data =
+ {{
+ {{ 0.5, "0.877582561890372716116281582603829651991645197109744052997610868315950763274213947405794184084682258355478400593109053993" }},
+ {{ 0.25, "0.968912421710644784144595449494189199804134190287442831148128124288942561184523327264655202799685025510352709626116202617" }},
+ {{0.75, "0.731688868873820886311838753000084543840541276050772482507683220220750082501569499540967562610201174960122884908227300721" }},
+ {{std::ldexp(1.0, -20), "0.99999999999954525264911357034690133684385823577463126432241468890539365027135494672267164697779879113636143901797362388" }},
+ {{ 2, "-0.416146836547142386997568229500762189766000771075544890755149973781964936124079169074531777860169140367366791365215728559" }},
+ {{ 5, "0.283662185463226264466639171513557308334422592252215944930359066586151456767382702286176981668344573238827368717546699737" }},
+ {{ 10, "-0.839071529076452452258863947824064834519930165133168546835953731048792586866270768400933712760422138927451054405350243624" }}
+ }};
+ max_err = 0;
+ for(unsigned k = 0; k < exact_data.size(); k++)
+ {
+ T val = cos(exact_data[k][0]);
+ T e = (exact_data[k][1] == 0) ? T(ceil(fabs((val - exact_data[k][1]) / std::numeric_limits<T>::epsilon()))) : T(ceil(fabs((val - exact_data[k][1]) / exact_data[k][1]) / std::numeric_limits<T>::epsilon()));
+ unsigned err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ }
+ std::cout << "Max error was: " << max_err << std::endl;
+ BOOST_TEST(max_err < 20);
+
+ BOOST_TEST(cos(T(0)) == 1);
+ BOOST_TEST(fabs(cos(half_pi)) < std::numeric_limits<T>::epsilon());
+}
+
+
+int main()
+{
+#ifdef TEST_BACKEND
+ test<boost::multiprecision::mp_number<boost::multiprecision::concepts::mp_number_backend_real_architype> >();
+#endif
+#ifdef TEST_MPF50
+ test<boost::multiprecision::mpf_real_50>();
+ test<boost::multiprecision::mpf_real_100>();
+#endif
+#ifdef TEST_MPFR_50
+ test<boost::multiprecision::mpfr_real_50>();
+ test<boost::multiprecision::mpfr_real_100>();
+#endif
+#ifdef TEST_E_FLOAT
+ test<boost::multiprecision::e_float>();
+#endif
+ return boost::report_errors();
+}
+
+
+

Added: sandbox/big_number/libs/multiprecision/test/test_sin.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/test_sin.cpp 2011-10-18 14:10:20 EDT (Tue, 18 Oct 2011)
@@ -0,0 +1,297 @@
+///////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2002 - 2011.
+// Copyright 2011 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_
+//
+// This work is based on an earlier work:
+// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
+// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/array.hpp>
+
+#if !defined(TEST_MPF50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && !defined(TEST_E_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPQ)
+# define TEST_MPF50
+//# define TEST_MPF
+# define TEST_BACKEND
+# define TEST_E_FLOAT
+
+#ifdef _MSC_VER
+#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
+#endif
+#ifdef __GNUC__
+#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
+#endif
+
+#endif
+
+#if defined(TEST_MPF50)
+#include <boost/multiprecision/gmp.hpp>
+#endif
+#if defined(TEST_MPFR_50)
+#include <boost/multiprecision/mpfr.hpp>
+#endif
+#ifdef TEST_BACKEND
+#include <boost/multiprecision/concepts/mp_number_architypes.hpp>
+#endif
+#ifdef TEST_E_FLOAT
+#include <boost/multiprecision/e_float.hpp>
+#endif
+
+template <class T>
+void test()
+{
+ static const boost::array<T, 101u> data =
+ {{
+ T("-0.86508717968306725270818735916557777730599862881751831435316187689198923993283521790498932671735565487198406771220725516598383731877859238387113868142949869746710189966430151098818077220502499366007854414799684058332411166897077090145203892212195332779437567412064793775991386725873517928401298446944183864288115967332769329141686571538486980106767058872245206155998183801127952563209302584516809804068"),
+ T("-0.79763858366953481259714957489398094215522640329181266031581650731842869736147648450595884906779088504877531298007549709584387968778149220989565106227234119514920955857261247662051707093671536949960734074547532698822613207712655346154633044042812601716529880175764244503721748663711634053406295594334950958339944104852233364538438677862264102037879639671893945361353871735018017912124896762688051071101"),
+ T("0.24694751481270393816989455015331965599577990782082974819820952118012926923238759680307705708664260650582713915549160371243741339970969856458066110960284501686263922529370992689985210394245398556897269198908375140963677715274995382713675198405319566885196239063678630261988218491689541221423165343153282194748383394932208400962140245741297801785867823531750497892155090643962052920864620306068640533502"),
+ T("0.98901354618029602175090175847463473510249349724827992487552201591187355027688868967642510244298626184812677555619430672681773746616625955520405639182509666726561394718194458471759810888548201804764323767747429110609233156664896859247358618600160567275441201363464883016296014653448896069217108492576553919644561112490398174029484186504656523262450502010870102764110481052688040511085868232105814711948"),
+ T("0.51950049121984044339738214491377557901625353846688754076530639315973808266367537549984077340395292997735469833961726139018356328562746542110713036413300858234570352248446585277165262617881845994831334396201052962253340345385732694479841227791272253515875849614421139763193705915213364104134129815431668002845745090121741132063335533091373430722704456843140034973756911786188684117004466722017726632522"),
+ T("-0.58642035909386951523768726695456120016000621264121118748335087467285913667949995440747093529938553592801111543797937432739099086039685347738175389472878030459744416755494430838140051041697426054654163206937572434284771573711696435479889701764370159398277764008561691680023659946126461221466012782190610630337123139316903479632261164136029483310671081582686512548571027968589672841130517258821548718323"),
+ T("-0.97395403906078050869854812754010898778588110998510216999024129038738667688293411233247507547660433481826378554022069634273248636871268889943206657893365085495908990103953837221918076997320773016743323042411543366853067308772133354882422005996025272628299293665330139411017152702226907842064909056524954416279212381635918809975293849765789208374484279614272702262407912547006420026381898882431367705053"),
+ T("-0.16835709980798731779763364790367408966536862842255885422223099514294148991190930841731427782587704016811168224144233724867667772646548196695213703654087451353235456862964457399533377933177974811857965890770102023474800434793450796708363928962489727300887984685066126963778396606401313473669144644834322766129500826515170674439623002622166198644072962305451561242924295496497673865817996583336572441598"),
+ T("0.84348366891508115788160933441645221250048198837137321279789763092610185698937735368600669544368356295269809174537295606389343383737539420322987993567260099654804618392548221004269952154930593772246006464043499864133979093900482916664339574929175866269202056532433888199203357312856354292159018595451908698245799015703256761432875415473819767251067057623850803832618933566752146583252515995117479236918"),
+ T("0.82202496781424117249008335037366444394838277287311909893953311783617946236226559994208529824007840086283951031540156850110406585677216210109663411850204100009480981960066776312830296812837514885788767571642502602406668355250521717143900938155040050319876970346676468728877434985446025106390443319201723689927608809502112038908318173339375177994594042306023859374748187782138324203679569236625767697521"),
+ T("-0.20644548078966172278108566693593446671066500009311131547131824408615418778824039740776494907158941999700112622969927991803006352755440587105827687343678969660134349201419765578964725001619127224358098018507197217477518476424879393188273937853474771810828977229876872752634362284867524335876537185168202058991502610059394227279455590213187025513498301701182162411129861291651458149809232765920694382718"),
+ T("-0.98201238933821398742743268689921357999177043645192920595050426161233644052306998773405192706007122833665193511424723001758553674874382453729473736698967318043174263178305116522678701572642644955125046307737685013720369337168716304062292912089093170603176088603092541579085189475146906948455044376044742840712066206800020164347462069250277677754185339937853236236760620498554396625100570743064458561012"),
+ T("-0.55457689409530213747356287041164249845415987873946462511683197174099773035991522752407571732843646308149750048541683187925931560402799808039721796055589991969835698977651564881904161899499528485305192774993355886674471830577982958725011962505578939702283684004757222629888058039297509802651204034056785648094344956773393289641899074853933663408784777126564054915893792740950321751681666900366149285673"),
+ T("0.55223631972553454320768877543021740444770413956059533654445613814866273197657606242587941011620967135302125178080188557790223181274132635479848516001166956056684169152368919096181559634794365697929692462933846221564253699877634144325144847224182437654513501600352945517055120350460290761483324902471273182702037419675899405714185903257727806710137118071603904368311406545920382236241507802254402670342"),
+ T("0.98253910729963647217200550710547625178905758256820276353400539681385849046526414570850258127380376793100401827298985862391604692170961399606758739415403392939490853364686526772514484164160895334184339538751098251139449063960873514450954179656572162689800220524835985551929362412800974236601606988593425142227646314150034874268224737812934754054739495109549178354735648685843025309695149000523043036256"),
+ T("0.20919424161231759292985627465559155127857466748292444765172341549043455435483356353779261807927572689301399184910446505295185314912207254913673684840121644950196263845525205209069485089301207501133253448764073025457512071224229423661258059212569761388984180893967120131886763302041343297149817612448231084051035085349821477062216670975268069118975416132488618059227673886548754511524393205260913936737"),
+ T("-0.82042150034016416806875390736702748196355225785028360060677365666061470851725327317484829164156996988612675463903575414696300136809557656769505171924327821177877208936984569326071873868949719900334446867163962763207795935703399610925921076634415348400788763860462929861356452609306026119961919669078311635349472648728526901263549622576885884996291919276608766907523487313088490283878962209939268414829"),
+ T("-0.84498980323075860897972946021725417020274887656496755152613838764676035268791649188464914202966471633575987923264828416390016799882223646789601058107569902148674040269544868920695600748107986559656481124234185704814218734471348170295455557819067840791831040541198080087226424277346298230729678145499808600603861335243905613388932855271426976928024047466289393683437131604292988966125504076029384924023"),
+ T("0.16558643533491417205585047942945840817444866977186231320483545168338776228411479964576268852405814440921094618356469443677441509984568603636330335278789316351077745488280059266519036588084571034766067428538242876359850813716345435707699637862360396048950400623443566517903264884891653913736982243815926409161441171926621253221896245282532431364608500284511449412428102071793828094632271947929662322388"),
+ T("0.9733130134422248664781076439996325547596041902633251431309613137772871577452457011348386026771902539246123917754369011815275465953253766314483807639106238230199709503923447643159359893490066619470146552346442263259964047308322485032089683425930804181966240839058765435955921596502848477098334939721288492487750073064012585262871240814591890531382462762625592433554435697556163942273461885638661645373"),
+ T("0.58869425301303541994797274551524668431807337246095715070998523760895824155086577422557656235988936714948459396658626194388329584290953541802060334893578288199017940637454710820521526799628794241448315885605593820784070904763717099063196519196389181232206959679228386773967307850125102763819453488563433855077856029436716904341327752651679433491068803177798096114777267163356371922112193539114936367793"),
+ T("-0.51709728401438414917109716343072272559608361642833403289320143191669289972512815282728235788726767946133258714516539347300398650917111088383730840642462745361559628023336834708274177008810720997864503236483231424256182008792514317978767120858313922250278919795149943234196749501590214648800764097687555634887106709926715156050968991302040120816446887836448112221991715147755412747643904982369941874903"),
+ T("-0.98942504561778994579633520641173655056014959757317198390962485163668002823254326156828513148058511330328117672273198435854028958189163569498745241605165009769541862169414925124968295274462159200520442455095613008718526467538007940197043090974670359128924585720097669855764038631475310106434490427905711290624710915672501400113806220416195439435490181070678989789478092500957769720727750016650901714876"),
+ T("-0.24966961848279291797571833930275478107046130070512731730054610018931793329197222379145867877191403438507358664845958042303643850373616999952368954956802652884289978026682268405432675662623924967650629865863280328006489120844535221004915558956531029998007360982378798891060454706118319300864403238959986801161474819341364524976070498799822591253693631124434026399072435454954851787496900161449413279223"),
+ T("0.79594055595422952691181178601097588849087648705672837252520925001820847496121721128286756288605360935162062680205427201959305734943295649471345888560139726757801278052687627513338719817916945750214503848241201988433673534399927155896112448547784281558455109017382599606935223412144543300644796946427196636388890407359228183542249818866763328733472675174818547133151154516588878300883530746640968325861"),
+ T("0.86649337624388547603453321055003727682405511135812925957248489739919757880982158700509398511202886625151501180599611933401736555472982930024421765233048287030623272875751902474678241444565197252953357529927172840699144509942108163113181199347462221304945816329094035938388900123384165001280011688853078191968630514719137943065609922040635003116435361117139325021519623335846499222050126246453597170833"),
+ T("-0.1244410370371604254208240524194278926442108653864928935045533919736466234398227704731948452746209576611285042916086804685407426387667022583034033620993631898331144469445927075361836574325552419453828929182451743365661513957092134365138299104921209789330945195117245194360833974076928889872484098355943802078944073614928420504484518104238232385695964828077489150197654158701678306792352671268317890272"),
+ T("-0.96293046254479079199525681753175960597403031074325898542927860894499480571620304305496779255522714740449920561168034834326825673596092141778811133613057020474685368838786612124083863539941316962278807332763650117226990808742108594645615178525818371573122469236743437907516188100317299657360446054991401261819129204379540798883211112991870608214671142610787565091372101286504874487369815732318336349301"),
+ T("-0.62179356795469823415192312397624874675187191101898449037192803173787210412483490820000397097177845254715052331863963593667486830949291665803517410280665438510706842857082320141162218238699592290729367363950604466282373746899578041764378198664733652245195397766367192007717967103668113752808285669458804690643918469292331076180494649617596159416023979394805630825188506001209288256336069204288392918838"),
+ T("0.48106401879047921636300391903940107974582760756679309056624716720150642739438342683672522048951018737803088677542525404601585084899079521603734609111135623651892724625992491018152917388956983222505917061754711563327272328292684822300781993087528192469722167755578240677892037874808381277754976653429844703376014341933327393380277555990041743102376562190670837062637051362532345331538219172506270246382"),
+ T("0.99459994598660210790246203022148930567403641332218416710062008621506849496380708626551905127945616727090196117664589091004541642161620912257208486753611501380010498988340379322071716856719164564672927645435101404830980303745361961742256873999110722481713879285794690870477524893138199111938913573011925775303350770468373885738832279778798291949531285037943371526561613622424317208916781257715667313581"),
+ T("0.28971323531857568215733762332571032238826720017802004073812127963067217035517116389133284725195297132478232737373492302474489345753341693637584844179360668204049858751950419151081083323122754896023020805399882258107804380387112498888463322046038842525866090837069466212429580864869728865250452052787720449604911495690324684990021677192825514006536158108787009532155828922880124667158494830079658512834"),
+ T("-0.77008317127836149586878227059441350607034119134834670931732901937779794039455678722027323000807268437290639233506821159491390367599326413477276644187223128663850330256445887240546131620117611701853928301285348103306423446252568562902316700603944623091642743103450263900938785484049174821097911777581836743736428447638710800031710950631619240205470844855655792342941803794181628118648640971785223895876"),
+ T("-0.88649850017673821224561809313855387711494312733345943767846677270453513982665617998145538590166442213419297144115248659615137339374320428869731210388654046137340073163830069184603212007278659182492697000063091326735676965960505375616122884162932165199220730427526058986119610548232796127810029383442287778473786899637739243088842682085531376471601373062369273637834719593554537141683999217223108777744"),
+ T("0.083080439682369446261941860869339750420290004566040999778829779164510726472983010580067243494180590665495350929857908288257260333087985455133237616981062631238079114106138544790668480770034429554478579438789193350580847656213214727573008763057329069201052276891726438472292117455024152732335694633669865925030242983966039212743857415675412320417462552183844941128084005364683434559113799225166204962233"),
+ T("0.95088269145580379080881101181112994052817118522049856992220036183689985937794231145980774478416653809589611744235048028615644615194631392655321782728314051357571890517116936363315155374421300181857604455336079096611022607668388384799386418069760723004847858784954833878669474357403336991887563364651104186693715603819443888233612866696932669196365387585172649113432965547015182359279258388342378601416"),
+ T("0.65381759943134372106091314588882519891954306836908397778723174077695027443392791956504268149479549903097213397297315499069850358516736287190903269479767199733614758880061832597202653797690144333090552903833899073895212983370074179915262608190468586811072275899498782703930003207603330356201921815802020943598313063056751498074179598679039887095914705463376631567774307957063595250839360463815064201881"),
+ T("-0.44419883729776869434215071043777351144885030313451423935916035359618633896743881816177107613844097597506905160463293878480033961624169222223295759692648326664891288415570974076231512054827602757300757558932537164133079144259056831830919794753959849196109997567447839019812358107684761555967862120024116269901062705630447884553959212830932666828758642780403825798457036759897149148537604844399459548053"),
+ T("-0.99805485931896998415393032770516446507771859322057899721697973416742915484901238232275785525940419957209526513627987177343779809373389157284465387153256600311648238334663448491831652332368312374266794595524373421505295425580509620840292149779344897042078912546100024102919688347595170844681619630553312369459496674685957338099812389267540391789384661598432484560731964762141424249915228499619880194537"),
+ T("-0.32925584367246074527751396405706006739637798458722245566584108718687942076934044708484934395776690595227015287405290706639110667384016496689668602236850778364504698270562443122446777121633580240826031233297957129154523055470095490128048296939167974638270094687461177877139544097682449778044363207679045057493400456686353020427908875447286459468112566742417779096833118762203417239243684311231171355257"),
+ T("0.74289406214691971730748689577071217763372018162585246470580187915854993014301138575550281083980887718816934749714046327786941209573648523055241872433461772076860288459827515491353103487336092666555533666775562550333977874850593623837303036248122754018490021383285853316403824589398140210724484596507930263094598302837215576862656152830461839065227673408330599330179492764472850719715849698041674036671"),
+ T("0.90497057965861947038086599125811051384385044697380649969790067815919477474459340879746896604169505347120527692320057718967343970641857165915886346383145960515992441520153342687355055159285406653023104853613872396986139584358904781952363737284861566876891343765798384121744173765740395134357707977315982337368931113664139166273039854021692888036428013020429307841621946009361316544995599016861275630769"),
+ T("-0.041576169205724414854331070120053457632530839733700369568167900754032406936654732772225888568634961935991599374915238690240599985796132138663492274966652919918441321848911576199257910762408333861417879305855108842865299418446579173115561267409572938992011498300648706364387410319460214397723214932915588169565205375812490511157716082500702780952451334934264616069402150160091480447723605317627380573224"),
+ T("-0.93719053469287541428447587920734971303045432291101939590716959209616543859713365160616776090412883872180361728110905082632348674501130850562014606872006847637794825897919364230003376975014085954809549306630677263098107502639663445116999448134011722873039267927440801790504248068619316004733842223304424897958505882332051426143421784920188133729127262166283872235910357317736650757661074470493571412889"),
+ T("-0.68471096746912734562470712876063800310010723726902681221146004451735978903661775368964845187095694357185341078508280456672582218780943948231295585200462910309462638043306220829569568223236127599504907044705589687387386319181085952764133248551365406192657503789196736085441072782932910447315642044863129150642662429341110770180104183011207149983149660707056083856793755175252844455169463798794450950564"),
+ T("0.40656549143420863029908616751057885992068413298024300589949432115120595898702030047373213851768191655418538252805786101555132655463705735655711116154911765012476201409686869641764641591979668818343426771144822241041750152386563094831102053728224980943104700599378495286307562549354472575266695139105050719290255561758911030594734879707560039179536988148731390148863859754525169110234247580451842221669"),
+ T("0.99978381094521086442978283578205200383899997058493813685797491852361573237867864126930099929206074874924525764484785288016649661565231871317512839959145480453557525203272815558595173449617271532616787029536616206070064038068200899478815974462302016941233137744957010925379020671232973472871426623684133227677308974216593623778540970772162801182795433315750474086424241697242150612379589791040978731667"),
+ T("0.36822906150398015822020319344162532428677981447045504526401832896397568656416150947456641712465258877489220724479853323760381517310729310497119744108741895595122245701305436253648702833101014863503443210528716577148214088604629263271753365879547676920872334528859185577830585960895038151179369059434978333166167532494557340097007973338568999353459041439303550202850628759030952416080241927287498139623"),
+ T("-0.7144202473793071622881824775602288526051552507380513260225595579233618296068431093342018128610611262439148937183337715231254167800684731882124998094889468876528172261692144316638297695446478340662483258456439006572000095777092767225185208121633549640410407788341811629709553299018947000385149072176583748965166297086235970966085113896085627672474399917518485166722788989758308777458718519262591124605"),
+ T("-0.92187767045167441324530701803233328862428889387952715397673074188905541924455439014301496958042559842229652278722386549208881577386402901283648710147036914825018808066251392970466575927695920587735551236320976667968957032620207459743622857456422499005778316090809442840146125918223889417182053059405944140104740509712594294160758554714036208559142846789714294797916313510255933830907372057747524929562"),
+ T("0"),
+ T("0.92187767045167441324530701803233328862428889387952715397673074188905541924455439014301496958042559842229652278722386549208881577386402901283648710147036914825018808066251392970466575927695920587735551236320976667968957032620207459743622857456422499005778316090809442840146125918223889417182053059405944140104740509712594294160758554714036208559142846789714294797916313510255933830907372057747524929562"),
+ T("0.7144202473793071622881824775602288526051552507380513260225595579233618296068431093342018128610611262439148937183337715231254167800684731882124998094889468876528172261692144316638297695446478340662483258456439006572000095777092767225185208121633549640410407788341811629709553299018947000385149072176583748965166297086235970966085113896085627672474399917518485166722788989758308777458718519262591124605"),
+ T("-0.36822906150398015822020319344162532428677981447045504526401832896397568656416150947456641712465258877489220724479853323760381517310729310497119744108741895595122245701305436253648702833101014863503443210528716577148214088604629263271753365879547676920872334528859185577830585960895038151179369059434978333166167532494557340097007973338568999353459041439303550202850628759030952416080241927287498139623"),
+ T("-0.99978381094521086442978283578205200383899997058493813685797491852361573237867864126930099929206074874924525764484785288016649661565231871317512839959145480453557525203272815558595173449617271532616787029536616206070064038068200899478815974462302016941233137744957010925379020671232973472871426623684133227677308974216593623778540970772162801182795433315750474086424241697242150612379589791040978731667"),
+ T("-0.40656549143420863029908616751057885992068413298024300589949432115120595898702030047373213851768191655418538252805786101555132655463705735655711116154911765012476201409686869641764641591979668818343426771144822241041750152386563094831102053728224980943104700599378495286307562549354472575266695139105050719290255561758911030594734879707560039179536988148731390148863859754525169110234247580451842221669"),
+ T("0.68471096746912734562470712876063800310010723726902681221146004451735978903661775368964845187095694357185341078508280456672582218780943948231295585200462910309462638043306220829569568223236127599504907044705589687387386319181085952764133248551365406192657503789196736085441072782932910447315642044863129150642662429341110770180104183011207149983149660707056083856793755175252844455169463798794450950564"),
+ T("0.93719053469287541428447587920734971303045432291101939590716959209616543859713365160616776090412883872180361728110905082632348674501130850562014606872006847637794825897919364230003376975014085954809549306630677263098107502639663445116999448134011722873039267927440801790504248068619316004733842223304424897958505882332051426143421784920188133729127262166283872235910357317736650757661074470493571412889"),
+ T("0.041576169205724414854331070120053457632530839733700369568167900754032406936654732772225888568634961935991599374915238690240599985796132138663492274966652919918441321848911576199257910762408333861417879305855108842865299418446579173115561267409572938992011498300648706364387410319460214397723214932915588169565205375812490511157716082500702780952451334934264616069402150160091480447723605317627380573224"),
+ T("-0.90497057965861947038086599125811051384385044697380649969790067815919477474459340879746896604169505347120527692320057718967343970641857165915886346383145960515992441520153342687355055159285406653023104853613872396986139584358904781952363737284861566876891343765798384121744173765740395134357707977315982337368931113664139166273039854021692888036428013020429307841621946009361316544995599016861275630769"),
+ T("-0.74289406214691971730748689577071217763372018162585246470580187915854993014301138575550281083980887718816934749714046327786941209573648523055241872433461772076860288459827515491353103487336092666555533666775562550333977874850593623837303036248122754018490021383285853316403824589398140210724484596507930263094598302837215576862656152830461839065227673408330599330179492764472850719715849698041674036671"),
+ T("0.32925584367246074527751396405706006739637798458722245566584108718687942076934044708484934395776690595227015287405290706639110667384016496689668602236850778364504698270562443122446777121633580240826031233297957129154523055470095490128048296939167974638270094687461177877139544097682449778044363207679045057493400456686353020427908875447286459468112566742417779096833118762203417239243684311231171355257"),
+ T("0.99805485931896998415393032770516446507771859322057899721697973416742915484901238232275785525940419957209526513627987177343779809373389157284465387153256600311648238334663448491831652332368312374266794595524373421505295425580509620840292149779344897042078912546100024102919688347595170844681619630553312369459496674685957338099812389267540391789384661598432484560731964762141424249915228499619880194537"),
+ T("0.44419883729776869434215071043777351144885030313451423935916035359618633896743881816177107613844097597506905160463293878480033961624169222223295759692648326664891288415570974076231512054827602757300757558932537164133079144259056831830919794753959849196109997567447839019812358107684761555967862120024116269901062705630447884553959212830932666828758642780403825798457036759897149148537604844399459548053"),
+ T("-0.65381759943134372106091314588882519891954306836908397778723174077695027443392791956504268149479549903097213397297315499069850358516736287190903269479767199733614758880061832597202653797690144333090552903833899073895212983370074179915262608190468586811072275899498782703930003207603330356201921815802020943598313063056751498074179598679039887095914705463376631567774307957063595250839360463815064201881"),
+ T("-0.95088269145580379080881101181112994052817118522049856992220036183689985937794231145980774478416653809589611744235048028615644615194631392655321782728314051357571890517116936363315155374421300181857604455336079096611022607668388384799386418069760723004847858784954833878669474357403336991887563364651104186693715603819443888233612866696932669196365387585172649113432965547015182359279258388342378601416"),
+ T("-0.083080439682369446261941860869339750420290004566040999778829779164510726472983010580067243494180590665495350929857908288257260333087985455133237616981062631238079114106138544790668480770034429554478579438789193350580847656213214727573008763057329069201052276891726438472292117455024152732335694633669865925030242983966039212743857415675412320417462552183844941128084005364683434559113799225166204962233"),
+ T("0.88649850017673821224561809313855387711494312733345943767846677270453513982665617998145538590166442213419297144115248659615137339374320428869731210388654046137340073163830069184603212007278659182492697000063091326735676965960505375616122884162932165199220730427526058986119610548232796127810029383442287778473786899637739243088842682085531376471601373062369273637834719593554537141683999217223108777744"),
+ T("0.77008317127836149586878227059441350607034119134834670931732901937779794039455678722027323000807268437290639233506821159491390367599326413477276644187223128663850330256445887240546131620117611701853928301285348103306423446252568562902316700603944623091642743103450263900938785484049174821097911777581836743736428447638710800031710950631619240205470844855655792342941803794181628118648640971785223895876"),
+ T("-0.28971323531857568215733762332571032238826720017802004073812127963067217035517116389133284725195297132478232737373492302474489345753341693637584844179360668204049858751950419151081083323122754896023020805399882258107804380387112498888463322046038842525866090837069466212429580864869728865250452052787720449604911495690324684990021677192825514006536158108787009532155828922880124667158494830079658512834"),
+ T("-0.99459994598660210790246203022148930567403641332218416710062008621506849496380708626551905127945616727090196117664589091004541642161620912257208486753611501380010498988340379322071716856719164564672927645435101404830980303745361961742256873999110722481713879285794690870477524893138199111938913573011925775303350770468373885738832279778798291949531285037943371526561613622424317208916781257715667313581"),
+ T("-0.48106401879047921636300391903940107974582760756679309056624716720150642739438342683672522048951018737803088677542525404601585084899079521603734609111135623651892724625992491018152917388956983222505917061754711563327272328292684822300781993087528192469722167755578240677892037874808381277754976653429844703376014341933327393380277555990041743102376562190670837062637051362532345331538219172506270246382"),
+ T("0.62179356795469823415192312397624874675187191101898449037192803173787210412483490820000397097177845254715052331863963593667486830949291665803517410280665438510706842857082320141162218238699592290729367363950604466282373746899578041764378198664733652245195397766367192007717967103668113752808285669458804690643918469292331076180494649617596159416023979394805630825188506001209288256336069204288392918838"),
+ T("0.96293046254479079199525681753175960597403031074325898542927860894499480571620304305496779255522714740449920561168034834326825673596092141778811133613057020474685368838786612124083863539941316962278807332763650117226990808742108594645615178525818371573122469236743437907516188100317299657360446054991401261819129204379540798883211112991870608214671142610787565091372101286504874487369815732318336349301"),
+ T("0.1244410370371604254208240524194278926442108653864928935045533919736466234398227704731948452746209576611285042916086804685407426387667022583034033620993631898331144469445927075361836574325552419453828929182451743365661513957092134365138299104921209789330945195117245194360833974076928889872484098355943802078944073614928420504484518104238232385695964828077489150197654158701678306792352671268317890272"),
+ T("-0.86649337624388547603453321055003727682405511135812925957248489739919757880982158700509398511202886625151501180599611933401736555472982930024421765233048287030623272875751902474678241444565197252953357529927172840699144509942108163113181199347462221304945816329094035938388900123384165001280011688853078191968630514719137943065609922040635003116435361117139325021519623335846499222050126246453597170833"),
+ T("-0.79594055595422952691181178601097588849087648705672837252520925001820847496121721128286756288605360935162062680205427201959305734943295649471345888560139726757801278052687627513338719817916945750214503848241201988433673534399927155896112448547784281558455109017382599606935223412144543300644796946427196636388890407359228183542249818866763328733472675174818547133151154516588878300883530746640968325861"),
+ T("0.24966961848279291797571833930275478107046130070512731730054610018931793329197222379145867877191403438507358664845958042303643850373616999952368954956802652884289978026682268405432675662623924967650629865863280328006489120844535221004915558956531029998007360982378798891060454706118319300864403238959986801161474819341364524976070498799822591253693631124434026399072435454954851787496900161449413279223"),
+ T("0.98942504561778994579633520641173655056014959757317198390962485163668002823254326156828513148058511330328117672273198435854028958189163569498745241605165009769541862169414925124968295274462159200520442455095613008718526467538007940197043090974670359128924585720097669855764038631475310106434490427905711290624710915672501400113806220416195439435490181070678989789478092500957769720727750016650901714876"),
+ T("0.51709728401438414917109716343072272559608361642833403289320143191669289972512815282728235788726767946133258714516539347300398650917111088383730840642462745361559628023336834708274177008810720997864503236483231424256182008792514317978767120858313922250278919795149943234196749501590214648800764097687555634887106709926715156050968991302040120816446887836448112221991715147755412747643904982369941874903"),
+ T("-0.58869425301303541994797274551524668431807337246095715070998523760895824155086577422557656235988936714948459396658626194388329584290953541802060334893578288199017940637454710820521526799628794241448315885605593820784070904763717099063196519196389181232206959679228386773967307850125102763819453488563433855077856029436716904341327752651679433491068803177798096114777267163356371922112193539114936367793"),
+ T("-0.9733130134422248664781076439996325547596041902633251431309613137772871577452457011348386026771902539246123917754369011815275465953253766314483807639106238230199709503923447643159359893490066619470146552346442263259964047308322485032089683425930804181966240839058765435955921596502848477098334939721288492487750073064012585262871240814591890531382462762625592433554435697556163942273461885638661645373"),
+ T("-0.16558643533491417205585047942945840817444866977186231320483545168338776228411479964576268852405814440921094618356469443677441509984568603636330335278789316351077745488280059266519036588084571034766067428538242876359850813716345435707699637862360396048950400623443566517903264884891653913736982243815926409161441171926621253221896245282532431364608500284511449412428102071793828094632271947929662322388"),
+ T("0.84498980323075860897972946021725417020274887656496755152613838764676035268791649188464914202966471633575987923264828416390016799882223646789601058107569902148674040269544868920695600748107986559656481124234185704814218734471348170295455557819067840791831040541198080087226424277346298230729678145499808600603861335243905613388932855271426976928024047466289393683437131604292988966125504076029384924023"),
+ T("0.82042150034016416806875390736702748196355225785028360060677365666061470851725327317484829164156996988612675463903575414696300136809557656769505171924327821177877208936984569326071873868949719900334446867163962763207795935703399610925921076634415348400788763860462929861356452609306026119961919669078311635349472648728526901263549622576885884996291919276608766907523487313088490283878962209939268414829"),
+ T("-0.20919424161231759292985627465559155127857466748292444765172341549043455435483356353779261807927572689301399184910446505295185314912207254913673684840121644950196263845525205209069485089301207501133253448764073025457512071224229423661258059212569761388984180893967120131886763302041343297149817612448231084051035085349821477062216670975268069118975416132488618059227673886548754511524393205260913936737"),
+ T("-0.98253910729963647217200550710547625178905758256820276353400539681385849046526414570850258127380376793100401827298985862391604692170961399606758739415403392939490853364686526772514484164160895334184339538751098251139449063960873514450954179656572162689800220524835985551929362412800974236601606988593425142227646314150034874268224737812934754054739495109549178354735648685843025309695149000523043036256"),
+ T("-0.55223631972553454320768877543021740444770413956059533654445613814866273197657606242587941011620967135302125178080188557790223181274132635479848516001166956056684169152368919096181559634794365697929692462933846221564253699877634144325144847224182437654513501600352945517055120350460290761483324902471273182702037419675899405714185903257727806710137118071603904368311406545920382236241507802254402670342"),
+ T("0.55457689409530213747356287041164249845415987873946462511683197174099773035991522752407571732843646308149750048541683187925931560402799808039721796055589991969835698977651564881904161899499528485305192774993355886674471830577982958725011962505578939702283684004757222629888058039297509802651204034056785648094344956773393289641899074853933663408784777126564054915893792740950321751681666900366149285673"),
+ T("0.98201238933821398742743268689921357999177043645192920595050426161233644052306998773405192706007122833665193511424723001758553674874382453729473736698967318043174263178305116522678701572642644955125046307737685013720369337168716304062292912089093170603176088603092541579085189475146906948455044376044742840712066206800020164347462069250277677754185339937853236236760620498554396625100570743064458561012"),
+ T("0.20644548078966172278108566693593446671066500009311131547131824408615418778824039740776494907158941999700112622969927991803006352755440587105827687343678969660134349201419765578964725001619127224358098018507197217477518476424879393188273937853474771810828977229876872752634362284867524335876537185168202058991502610059394227279455590213187025513498301701182162411129861291651458149809232765920694382718"),
+ T("-0.82202496781424117249008335037366444394838277287311909893953311783617946236226559994208529824007840086283951031540156850110406585677216210109663411850204100009480981960066776312830296812837514885788767571642502602406668355250521717143900938155040050319876970346676468728877434985446025106390443319201723689927608809502112038908318173339375177994594042306023859374748187782138324203679569236625767697521"),
+ T("-0.84348366891508115788160933441645221250048198837137321279789763092610185698937735368600669544368356295269809174537295606389343383737539420322987993567260099654804618392548221004269952154930593772246006464043499864133979093900482916664339574929175866269202056532433888199203357312856354292159018595451908698245799015703256761432875415473819767251067057623850803832618933566752146583252515995117479236918"),
+ T("0.16835709980798731779763364790367408966536862842255885422223099514294148991190930841731427782587704016811168224144233724867667772646548196695213703654087451353235456862964457399533377933177974811857965890770102023474800434793450796708363928962489727300887984685066126963778396606401313473669144644834322766129500826515170674439623002622166198644072962305451561242924295496497673865817996583336572441598"),
+ T("0.97395403906078050869854812754010898778588110998510216999024129038738667688293411233247507547660433481826378554022069634273248636871268889943206657893365085495908990103953837221918076997320773016743323042411543366853067308772133354882422005996025272628299293665330139411017152702226907842064909056524954416279212381635918809975293849765789208374484279614272702262407912547006420026381898882431367705053"),
+ T("0.58642035909386951523768726695456120016000621264121118748335087467285913667949995440747093529938553592801111543797937432739099086039685347738175389472878030459744416755494430838140051041697426054654163206937572434284771573711696435479889701764370159398277764008561691680023659946126461221466012782190610630337123139316903479632261164136029483310671081582686512548571027968589672841130517258821548718323"),
+ T("-0.51950049121984044339738214491377557901625353846688754076530639315973808266367537549984077340395292997735469833961726139018356328562746542110713036413300858234570352248446585277165262617881845994831334396201052962253340345385732694479841227791272253515875849614421139763193705915213364104134129815431668002845745090121741132063335533091373430722704456843140034973756911786188684117004466722017726632522"),
+ T("-0.98901354618029602175090175847463473510249349724827992487552201591187355027688868967642510244298626184812677555619430672681773746616625955520405639182509666726561394718194458471759810888548201804764323767747429110609233156664896859247358618600160567275441201363464883016296014653448896069217108492576553919644561112490398174029484186504656523262450502010870102764110481052688040511085868232105814711948"),
+ T("-0.24694751481270393816989455015331965599577990782082974819820952118012926923238759680307705708664260650582713915549160371243741339970969856458066110960284501686263922529370992689985210394245398556897269198908375140963677715274995382713675198405319566885196239063678630261988218491689541221423165343153282194748383394932208400962140245741297801785867823531750497892155090643962052920864620306068640533502"),
+ T("0.79763858366953481259714957489398094215522640329181266031581650731842869736147648450595884906779088504877531298007549709584387968778149220989565106227234119514920955857261247662051707093671536949960734074547532698822613207712655346154633044042812601716529880175764244503721748663711634053406295594334950958339944104852233364538438677862264102037879639671893945361353871735018017912124896762688051071101"),
+ T("0.86508717968306725270818735916557777730599862881751831435316187689198923993283521790498932671735565487198406771220725516598383731877859238387113868142949869746710189966430151098818077220502499366007854414799684058332411166897077090145203892212195332779437567412064793775991386725873517928401298446944183864288115967332769329141686571538486980106767058872245206155998183801127952563209302584516809804068"),
+ }};
+
+ T eg = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+
+ boost::uintmax_t max_err = 0;
+ for(unsigned k = 0; k < data.size(); k++)
+ {
+ static const T euler_gamma = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ T val = sin(euler_gamma * ((100 * k) - 5000));
+ T e = (data[k] == 0) ? T(ceil(fabs((val - data[k]) / std::numeric_limits<T>::epsilon()))) : T(ceil(fabs((val - data[k]) / data[k]) / std::numeric_limits<T>::epsilon()));
+ unsigned err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ val = sin(-euler_gamma * ((100 * k) - 5000));
+ e = (data[k] == 0) ? T(ceil(fabs((val + data[k]) / std::numeric_limits<T>::epsilon()))) : T(ceil(fabs((val + data[k]) / -data[k]) / std::numeric_limits<T>::epsilon()));
+ err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ }
+ std::cout << "Max error was: " << max_err << std::endl;
+ BOOST_TEST(max_err < 5000000000);
+
+ static const boost::array<T, 51u> small_data =
+ {{
+ T("0.010890646307437399028563191160252839599929232814970922208664909237494716181484215717644776933044418903207919912063594159099133490979634344811936925144447725948305353257042599564404885434349760121009797816724142318243738364307036155852011004353462651092012819894667485840322627440332163428546845499107471983896711023161969130462687924045508477090891879273259947713367290982391204265694893491531721581439"),
+ T("0.029754394000520972141380267705677256353702996169858414168445272181777338962866552847084800544086743338130195210005002660881957584567978770485056322086472328896988088721899728258224129935989180857437073412730903070983582129359565450458299328041955729258476583848159389714290107649243089149974776893563078190705561325124542669960182002956940545214147678093802442811362846262655415145897575707676223535749"),
+ T("0.04860754948595027759689273751438643634234576398271158524070718139962965653841137425728738193533514318422431877217110239554743968609870039776938201724688048349972662394084789924867267405853696017478160702683117974766657840965270625814482422398422216605490620054574252910928068433847115132429726072853170339113804838625536981361490008602432476302086066307320875870985443111858828925332085101376920451257"),
+ T("0.067443401266329792365583268418977022587089806595860818790246293104463576184436096833111903064801552379988362224633198052490234517656318474005568709048710308123967082103235230201516378834855764348740505470176912466587139988300259624310153055247378188811239571439869254255368050758213303082097176168650573121101094016896349982672715603054645687782535250201448606757920212668324401846105554332382154705308"),
+ T("0.086255244004175604199645786226683865650130764638142939010554245919172299560583634262067769465886944689883333394099120765964771092069938753689253686543017871063587988437235057514131760587649504670117933814486942187589706655157340717185354058186603027300571692666150552274324933749082047517987509942119060274537912867956274549119040817359639741746006374702951412541338483858389306953539029174581171144916"),
+ T("0.10503638090893519164596691292161072193010174143933600597680115817738720676321226654184308409972393036413684625874294713490753271261380987552528236660688624108474124469034444076627315674234385578608111398112242272762722849083801773818689342174907858373883192220827687618321085007917387951532673599267211035785307947515638810735621964273183425401191468313574763898720597251843424536611952986478638938787"),
+ T("0.12378012612096459891996422671239906394195356627713556749926735466337892925173796651675302282473738808218327028589606894825728784823540605065317506645900565980161901287116410208049542818796994171203890952761651470187834173644651508025088970034800067245131759655003164127161058084682831906406941473650395873577925901419536540828468001386512234321890242266327761400155849351025221609783793228816606096155"),
+ T("0.14247980709161433833827358255114404185333478069639957369769805221957506649654851981837061160249376538785737485777248817812720592537597263252706422066438137522011148566625861552209380620325080441618503257506798981598559897331754555335688284111417797211888381141445522536739542765207936516297907076923899840216864191777039028622886076254231994264908278499537587536902686114072117102531777746791366147472"),
+ T("0.16112876695857673825462942280040873226725445145336882995544646098546697397681955191516861690559627281570477802647683153249828731761062718487424104325152088763220776831248566486363299448443795266104568555186977695939803420793575204146124697832793773870449082377964029658283741910741804550762511379894890589132658450368609377005630322641674351408014813725947288936865021810537922503050280596331958949813"),
+ T("0.17972036691564914131189073707203611766536704952071818203835281740755093560444625679032703078557333645546302532200674729781663838075105196332695024246509042831095553050804767663788014113177991938252225120228302734228632787082072480689719322299247090887229731260135165819595797392665106642595359433094386743214852929965104946276195924300495453775467378376551444126292108291215861133471208854009513721707"),
+ T("0.19824798857606934571352609051549058593435535174283382080060738672122306773474119459815363636791069253463660528114022041674780565798655265640072669329819802234483545444085426470661233958030668844326674768815456315879868376252722369574694411591080512527683145774214215193268992508938562109669843137270238454905091555179756374512457742554641355319960601765568460966738628365652972463731882673979926092423"),
+ T("0.2167050363285819704223187876642169717474346025766606244643176750460657731203611217470241676182041675112171974414875203007374497968642376196256262296063879827128970901451226217571636202438144440234868076467587220541438440149682254317134405302648426790500751310485432990930185087578150399032543990173811106465656404530116032387260432178319507278340110997943206401370789106214680733463126804159766688178"),
+ T("0.23508493968539701289801441539326267060915175918342580386836036980227948313782327655061004506711767031388143537081826986030990557707922203603349984851809173788402101756510017046639631528282698404857654444279509591873678208318484036337040837844539190863615310872984455261973647897667843302241773795592355085118273592671348602240382153223466391512738221253451636183066773121830262978729780866153048605159"),
+ T("0.2533811556212047542679161173582151227103672187769971543582388259784795155332622779547839459016647290250036005712168909799523370471647322112833886051217950625710683025675691585734514265087749450457714578451290681140064635291501640395753290532318406110106892218388811781561305402570000283806458134435822529043797962340420841850011846648265787470508569124672250211852546600514370101687713861131209463861"),
+ T("0.27158717090241435065755609312085387589073221253701701142877476904254125053252466469600403650634482409879186635717002370089097070045821182432642232618427944489732133359996899812980722107011126957850576210476679069162561257167921627603536603943342268770727524690332400255408587654094512383349857596775777725888982277559281982571487656535560758087235441872907962373375423740325723506626374882319859924962"),
+ T("0.28969650440578692965912855479777150523900698183973110358010443581781966348171378962307935462457921708108325003566673849851640304571019200113280406744551445148200341554501141174444530008329262826786160080931309057528673711507934822659456861163197618813727062179453555460400169858233923358238607875306523866767536243361049306545596678120228677505849040202788510059415993219975440657979707947898632705847"),
+ T("0.30770270942563778634443222550824378057595253208974144909939396933701715445493088586920897452838893301853350676955400357197838773823140696209649573828382477454711986806154497998912926265388494228459988323524548750870702083339285969468391846533348589851520262990720843670148790211009236063622194282315540801467216625666505663699480592080398449845511909092071640909885054719301078547683325662349532658001"),
+ T("0.32559937596878634249263192973385963275552570142977727375619908690982968889531407133936548327912894149757305868454394002531385820341045863161146695151908269553629121372700695833373968533510661265854738947940689721812230819575490874211279007289828369964583273676393398981064015459284982970048174649094549631109312941188691838118955683939990881732219088392629316401227525790752712758279892546851835776728"),
+ T("0.34338013303643689435259984865624959352259286039436985939426483729323987764837568376066164703227630278807584950278626035763399164177429894322425866236150336898079573258157833074772287354310049676029566569737995054499018518699450946056626536479822852758163848528920078247789349605898976290484284018984355696648190967701849464571286257873661615051036433297599097073117151941857301740816310919312668936753"),
+ T("0.36103865089217782674224266392907326208964452822379102503439414768728197653534265911503054023760783622236800804794470785631737993143180071550223728801984904852623160397230839644629077782630949486339104760008566935013234195735777070582106661423219379374522941522832331186147905332977726043795737008218909226025962294880541867964419424128310806148008435847967256901208159302482322730929744194185143496647"),
+ T("0.37856864331529191294683302986737462527422720295203122486985051910813389831630458742420433021640718832999264813674938157273375290592788753133996741859965258034273428657399863159488519434113093863042179261649202584979828347495161391780592433454809420632605178105958049630938532568156789806946629309375790343585791884755866400295470651281289167454617624179556306285775538273640784278475358303871406797294"),
+ T("0.3959638698385755489557710011250921602780605301308457595569865098132061251227321128681128349835212212508810246299921462519655630208347321575504292305860152320513799100372630595769065936291506594220617567642210250680560302662459931036815131767702563357378794733903424219866581554015722958062178902473414883933807190920961687912191470152974845756609418554739641361171541363409996648143043979357302190703"),
+ T("0.41321813796987028521091431473013916161596830805293649687424341688961507413716621591649879163383882641673238540682782626959358955002216003316726344623613626809950993449214457071292961126188761860214007662067345193545393653191742497646193189677890657992964660139924463087072704096969748995358605459064076775540679952182100013584273877612509536257834358450242426357122974687246428904315337788603554112487"),
+ T("0.43032530539651581726649227346608528709372859200683817125277384462849187532000288969537766724897319030479860713591459932866508254904869456423088312945970943686450425589907227275358186473310644458353392107693439475272544181726520566221333846008220008702070460626739342310039148106649726719665728169819714333172605016313499067227953767878741853545763313707499816244740855778447731454065384788859848319503"),
+ T("0.44727928217193967651655712666040617006236300257644793444619887007723922383970962870988815495150987337761018019128790177957898245520422485269324604484642139354461290347689315448558082058132330317789105861674569680430563377440355102600184370927625450804550114009478901349833826102470780452480255838220723171955252412104006070322080932915859579006653276371401264439817338080069936810866666557553662506811"),
+ T("0.46407403288360522126660904671571257203469668709200603873826642103612288853249598361813813213381052968904786566929537791978751985511297321991996818974870946807510786919602279514706154473236597480481149516597293844121405001964448599792635426082163120478756812832932606227610137817312140031064078333902425335570730565173883252754294319888872518149175050583958244086010074110878967984441526026195572046031"),
+ T("0.48070357880154616464768530714893198018226307768872832018696934136162055774617690112915494983829868655926209174893609677823844628976682666861087174925649829592164380174433963170047900751735818142724368678683601091750819984658303806035572915499999180599872513173096429390456178642478189724903758698238722978406369084171804020040246631229610021517925007543961283845124822740019511921386188934760298241688"),
+ T("0.49716200000672278683141570737786924159326600032981923078600441023882683095816876734389429898823686013764499093454507915253215528870989821318738227798745591597923864925733083640574132559603114206682739488541451077277291582357627881380008066440685837422009543184722898767087492264154499861112499590934108906196324393034778681622285346845867860458748417916763883649390228287689107774312170267691257606116"),
+ T("0.51344343749844216224309565441486087365890516381683759696704839526386373494321578458551193514743669178342420835082611868891019193801223760604220552152028015878259509179672236586872004169442377393342941368136686044214656339879518691219516228434732537186028321245942076903928921929607502848888640267094590400556200402256089794954485061564115688273804254406706725374971267431122825004095102239220991848356"),
+ T("0.52954209528009218542956877037980380998240467111773187487177084701668417706002935457309027480414979338624119758863233287969233845786459113619958146654397106933375312089626001011352424174223416515118670901639015699899005014886945323983797633471828049323917701068414699189471811508040323789047713536270617216249222074877291822920747392986535291960399633972613345908694327479738445245500914715996152461985"),
+ T("0.54545224242244689926647810432697721723945987179773365856990386707254353534614807468692870318816991084937065603191754270239773531928848863926268254420020634174904439920465735399587679402503040251639815041072160696029528969373711375024524059535996077596844557011786411865071706766713049961515353664484996577751962474564968659755104983468313555304855249829815310291744255989014492588353749587481644931913"),
+ T("0.56116821510380861353700162760755101727268623115746212675907859515911800480855365905235006799852352328451502804871577600277181740574994973635138803211912076695967558806493981733454148905054449991651227073996616835900542604367257843601995979944175684600136575098939764120745952964355353589317556067474680987527548079297833539998258342242865222215681747969549869015697939554127499557081626950060916329896"),
+ T("0.57668441862626054773920164705882295031880435874490231795930393597704964539534854834250638055542815083463738683146430082379073149079998953871974990605030531115748567904948229002538680465351816034414085890696196467615521969543006224204433997063527288514443404935419253943724579872472854300703798475966107579038880496698051818375532546368197809806544115496171522444187250876233927302975709248591908972346"),
+ T("0.59199532940731223634617420193837196766186356068263223313261061480558639436412180991021350240470913092271149633483820904350945127229180169976070379470147429711011056203078210298313829635000565303787641997857930629432231274870246836108452732993007541125359738273485061324228778750531830069944570036169084871305329515261365955383178502917713214334808810726412625844210978481512366368025275438632291862785"),
+ T("0.60709549694622869462483067245797028399468956070763942538530335526853282815406226053099893555611232739741099281199863420254333016184720313024881100010161759837083928797224725640021095785125988238992410296927225409984765886863313873892022531648958451940083661715815760806237878803609330649695132473889046508160482887768573723088361332267243452286610176948724186843039692112797106039213976473403724518188"),
+ T("0.62197954576434335539696684219824327976988998993669475584026026679831221725774460365328908947620452777457191790806959938899059379387140391128845696987642418506611453321626607869801717870254836897328796165084605948086983949944714226464644755644542238083403302661596239269476252222614109836597348873471190787660391585694078779921390758232910639208518119325492789999941075221166054973249356136808607130253"),
+ T("0.6366421773186640485920116318191204083389644098160828009666722635549477083039305904975813615643101060893999315509501318081025137289051787335454356108133761354485193083183997634369795655283340428506642872565827559825155045924936470784378552800563136355526499002558162019410271880717338646318471375684163442601830537613691628498474632262547856029932241457937391840960919415488213025664314613747543749464"),
+ T("0.65107817188809080279752785471799265973958362274943758073000075578938519480042543196041314945170036193559782763524413154927612489597355144799562963417455961310886431794132437757357185377007718709790504976900339191552944965308823754898079933186431693664015814010551367365293786806527034958873669211570906132849013497458819941168651227792824572805777219160376304646562062564773441718051418178414899683019"),
+ T("0.6652823904315739978766556052897347198651017349760138699519597733553278561013395851136458951983261597283585391502588949649092379467069209284755289821255744166256794329589771465045421874634188329764638118238723545310838064785644468083837991172367935880462068347034222894524074808990476036821633127927532229213401486467496527893691588255513769781016943243185567913995336109327864083859254466073492381187"),
+ T("0.67924977641755138662041086036801948989088186294785002709809874961811116536667286127777672928127306388394020078452402417993836722984523906631302047812425809759286220237826357465064765092612104224837992075711035615650942777454297235908308024053950635657488001916036801234116581671119069849133344664024677517075723660642709275823456343659009540444032487248071553674961012055521740306092600444870718199652"),
+ T("0.69297535762401272778114932738244728669670875114228232862389083194872888693112134130021641463393969624412179768291914405554577080353247136859984307940401373940521815913274464950964347624918449081645304540343160683388727015489772202472645406318288749244334156857814927405528763108558137488794292057315715995191324964500528600378291562277858608403425720078390497455476055579003286296442406491998525563297"),
+ T("0.70645424790855122905182233963742667718470686911515869065744744473731249895412640632516625097411541437953942564566468313798077366853928608154168668667806938130662439220702019172328936889436324187304262248463334787504456805683070026006307765178787997020889111556678907849442591478755800698808480163225125777511828352357189284217101098738405458071150544253514248561787426067001460586251699075230390564367"),
+ T("0.71968164894777168289159927814596788937422432901416956306230349431557362414856173295064125294878325237342190029914430775648665560145040598898117000971783978541799092281781000633902779626437866517288284324732827083065703448279654800632624171861777710582293639879819116932680545313562525074940809403693475624332169458744562386580074420532959714281903926902622613852892104465683714186704831143197300465955"),
+ T("0.73265285194543608674851404628602868786755398311878599262050209465658337331457767882450516660833910207846986678480603058221329185506983962144302950162737505562091432645466997334653618075359372680522922578429510783107155224742867979206003853893418268095936450823867623873015528453108944563276576646508412198497923383466470895808777876544429706485835161864475122029711660543090876323595451165397047981956"),
+ T("0.74536323930873866831066285008063416514858255428941319323031554151661731879818806472410911187787504167842137286019020264008471692607030872105020489874402631524823767448432915438225335869622093354538021006314536198469136634364850042715775621307965524560308901397550829610851125072518884822515926626213581949190024268711827023522012804341871590177804438418738255381261594827085100659777173578154500251787"),
+ T("0.75780828629211358196731753685850074775187628883294491833833279769413437275246840580617185041212744084038976069700142887035937511309419495512390089087847775651833369173386038513330257480188204696687136231267595399438343156895032682495327740328291738325217778497473260463740600852973600297913238958828132336080624048815574113414592522918778477418427876829087439774857073733879539765547872800792711360592"),
+ T("0.76998356260799010064124325420889481428942836988785464918451704687709959533402569414853910266075223008145347866420469852220997470992987183595134711278161994827010482478666523199914707457365681979989417199177427808129308850228595726632468139527316915481709465938257650120793934685421343443942356060396291075752713480402305699120964704579260218579751719693291565685728074939857101460901984240449471777639"),
+ T("0.78188473400392189344901888012886357289691591193533323711550248487573232160560048524966536928562079994581390209192526509899176077393862245482807165569409036943146775931090958041945317489351020506180957959482939768275851398130892970557450783138983566392455270904228057175489097967314871299150832712632639718878702471658606369540854496281803565819545728647765960328269135853132407415684491934581417388002"),
+ T("0.79350756380552895006859336306152006552993066088382163294295016384877329185292344719536879395060919553184640006473875955257330264813115929942877156894433233876161573894628944452740080653935089289153173836334040374431360850336851424574668632837338016740333716530963434291489645017931035529052587483629111178971917421121398732580060101294617212337648611654041575132820234403350225337355214099696493406567"),
+ T("0.80484791442470288298134387731514331459831415420391927496917008531718727007136925375073869996549995938671025493755987802316807560672754205522916341547950527416285009447065632296220924964603370109747266700136618832767813938243784759073035555035361911772169687111972294262096081393656654067512785827139608367560009298721819281091010743363153063005841441400130721362346287552727162527118465104052539630019"),
+ T("0.81590174883253870457705586780548750833668862852238889952372206236774966573191832400412494946116015154305873210759963247859431688393192829248700535837612167242633896627292821666890819736549652534738107012873094812825219601489880060491958385552979476621004236099490018887651186347086675381603801017940808290855340870383683075409122477045713172106217670870448929077822708030574128623585863036730829850118"),
+ }};
+
+ max_err = 0;
+ for(unsigned k = 0; k < small_data.size(); k++)
+ {
+ static const T euler_gamma = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ T val = sin((euler_gamma + k) / 53);
+ T e = (small_data[k] == 0) ? T(ceil(fabs((val - small_data[k]) / std::numeric_limits<T>::epsilon()))) : T(ceil(fabs((val - small_data[k]) / small_data[k]) / std::numeric_limits<T>::epsilon()));
+ unsigned err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ val = sin(-(euler_gamma + k) / 53);
+ e = (small_data[k] == 0) ? T(ceil(fabs((val + small_data[k]) / std::numeric_limits<T>::epsilon()))) : T(ceil(fabs((val + small_data[k]) / -small_data[k]) / std::numeric_limits<T>::epsilon()));
+ err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ }
+ std::cout << "Max error was: " << max_err << std::endl;
+ BOOST_TEST(max_err < 20);
+
+
+ //
+ // Test with some exact binary values as input - this tests our code
+ // rather than the test data:
+ //
+ static const boost::array<boost::array<T, 2>, 7> exact_data =
+ {{
+ {{ 0.5, "0.479425538604203000273287935215571388081803367940600675188616613125535000287814832209631274684348269086132091084505717418" }},
+ {{ 0.25, "0.247403959254522929596848704849389195893390980386965810676544830494398136043486821690984848527973792338327197752176516138" }},
+ {{0.75, "0.681638760023334166733241952779893935338382394659229909213625262151100388887003782753145274849781911981438190343146876189" }},
+ {{std::ldexp(1.0, -20), "9.53674316406105439710335272649306549801506698739838753888815787489707114648106832493113326022411646219016312547902694921e-7" }},
+ {{ 2, "0.909297426825681695396019865911744842702254971447890268378973011530967301540783544620126688924959380309967896742399486261" }},
+ {{ 5, "-0.958924274663138468893154406155993973352461543964601778131672454235102558086559603076995955429532866596530638461663378937" }},
+ {{ 10, "-0.544021110889369813404747661851377281683643012916223891574184012616757209640493425707075673894983216158293824238262832286" }}
+ }};
+ max_err = 0;
+ for(unsigned k = 0; k < exact_data.size(); k++)
+ {
+ T val = sin(exact_data[k][0]);
+ T e = (exact_data[k][1] == 0) ? T(ceil(fabs((val - exact_data[k][1]) / std::numeric_limits<T>::epsilon()))) : T(ceil(fabs((val - exact_data[k][1]) / exact_data[k][1]) / std::numeric_limits<T>::epsilon()));
+ unsigned err = e.template convert_to<unsigned>();
+ if(err > max_err)
+ max_err = err;
+ }
+ std::cout << "Max error was: " << max_err << std::endl;
+ BOOST_TEST(max_err < 20);
+
+ T half_pi = "1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064";
+
+ BOOST_TEST(sin(T(0)) == 0);
+ BOOST_TEST(sin(half_pi) == 1);
+}
+
+
+int main()
+{
+#ifdef TEST_BACKEND
+ test<boost::multiprecision::mp_number<boost::multiprecision::concepts::mp_number_backend_real_architype> >();
+#endif
+#ifdef TEST_MPF50
+ test<boost::multiprecision::mpf_real_50>();
+ test<boost::multiprecision::mpf_real_100>();
+#endif
+#ifdef TEST_MPFR_50
+ test<boost::multiprecision::mpfr_real_50>();
+ test<boost::multiprecision::mpfr_real_100>();
+#endif
+#ifdef TEST_E_FLOAT
+ test<boost::multiprecision::e_float>();
+#endif
+ return boost::report_errors();
+}
+
+
+


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk