
On 10/31/05, Cromwell Enage <sponage@yahoo.com> wrote:
I've now added a BOOST_MPL_CFC_NO_MATH_DOUBLE macro that is defined in <boost/mpl/aux_/config/math_double.hpp> when it is known that BOOST_MPL_MATH_DOUBLE won't compile. Please send me your compiler-platform configuration if BOOST_MPL_MATH_DOUBLE doesn't work for you.
Peder, The double_::aux::get_value function still returns a number 2^16 times too big on MSVC 7.1 when the input is a whole number.
I do not observe this on my VC7.1 compiler. What I see, is another effect: Using setprecision(40) causes some overflow in the iostream formatting of double, so that 800.0 is outputted as 8000000. This error is only present for whole numbers. Reducing setprecision to 36 eliminates the problem, and for every extra digit of precision you specify, you get another 0 appended. Also, BOOST_MPL_MATH_DOUBLE is very unstable on VC7.1, For whole numbers between 10 and 100 it ICE's (Not so for negative whole numbers between -100 and -10) Adding a . at the end of the number, prevents the ICE. typedef BOOST_MPL_MATH_DOUBLE(56) type; <-ICE typedef BOOST_MPL_MATH_DOUBLE(56.) type; <-OK I also found a continued fraction representation for tangent that converges much faster (and better) than any of the series representation I have found: http://functions.wolfram.com/ElementaryFunctions/Tan/10/ Here is an implementation of this series. It is much faster on the tangent.cpp test file, and doesn't give warnings for double_.... Works in the range -pi/2,pi/2 (Remove the double/tangent.hpp overload first :) template <typename NumericTag> struct tangent_impl { /* * Continued fraction representation (http://functions.wolfram.com/ElementaryFunctions/Tan/10) */ template < typename AngleSquare , typename I , typename FractionCount > struct fraction { private: typedef typename eval_if< less<plus<int_<1>,I>,FractionCount> , fraction<AngleSquare,plus<int_<1>,I>,FractionCount> , mpl::int_<1> >::type next_term; public: typedef typename minus< plus< times<int_<2>,I>,int_<1> > , divides<AngleSquare,next_term> >::type type; }; template < typename Angle , typename SeriesCount > struct apply #if !defined BOOST_MPL_CFG_NO_NESTED_FORWARDING : divides<Angle,typename fraction<times<Angle,Angle>,int_<0>,SeriesCount>::type> { #else { /* * Metafunction class return type. */ typedef typename divides< Angle , typename series<times<Angle,Angle>,int_<0>,SeriesCount>::type >::type type; #endif /* BOOST_MPL_CFG_NO_NESTED_FORWARDING */ }; }; Regards, Peder.
Cromwell D. Enage
__________________________________ Yahoo! Mail - PC Magazine Editors' Choice 2005 http://mail.yahoo.com _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost