
-------------------------------------------------- From: "Kevin Sopp" <baraclese@googlemail.com> Sent: Friday, October 10, 2008 10:25 AM To: <boost@lists.boost.org> Subject: Re: [boost] [mp_int] new release
Here are the initial values:
- den - digits_ 0x003023e0 unsigned int * 185745031 unsigned int used_ 10 unsigned int
Since 185745031 is smaller than maxLong it should never enter the loop to subtract it. And I can confirm by manually subtracting it that it gives the right result. However a used count of 10 is definitely wrong thus signaling that it is actually larger than maxLong.
Ah, yes.. good point. It is pulled out of the boost::rational< mp_int<>
::denominator() call. So it will have undergone many arithmetic operations by the time I call it. I have an approximation algorithm for pi which I'm doing. Here's the code, perhaps you can replicate from it:
template <typename T, unsigned int Iterations> T calc_pi() { T intermediate_result(0); T numerator(0); T pi; for( int k = 0; k <= Iterations; ++k ) { if( k%2 ) { numerator = -1; } else { numerator = 1; } intermediate_result += numerator / ( T(2) * T(k) + T(1) ); pi = T(4) * intermediate_result; } return pi; } You'll need these: template <> class numeric_limits< boost::mp_math::mp_int<> > { private: typedef boost::mp_math::mp_int<> Type; public: static const bool is_specialized = true; static const int digits = 0; static const int digits10 = 0; static const bool is_signed = true; static const bool is_integer = true; static const bool is_exact = true; static const int radix = 2; static const int min_exponent = 0; static const int min_exponent10 = 0; static const int max_exponent = 0; static const int max_exponent10 = 0; static const bool has_infinity = false; static const bool has_quiet_NaN = false; static const bool has_signaling_NaN = false; static const float_denorm_style has_denorm = denorm_absent; static const bool has_denorm_loss = false; static const bool is_iec559 = false; static const bool is_bounded = false; static const bool is_modulo = false; static const bool traps = false; static const bool tinyness_before = false; static const float_round_style round_style = round_toward_zero; static Type min() { return static_cast<Type>(0); } static Type max() { return static_cast<Type>(0); } static Type epsilon() { return static_cast<Type>(1); } static Type round_error() { return static_cast<Type>(1); } static Type infinity() { return static_cast<Type>(0); } static Type quiet_NaN() { return static_cast<Type>(0); } static Type denorm_min() { return static_cast<Type>(1); } }; } // namespace std Call it like this: typedef boost::rational< mp_int<> > rational_int; rational_int pi = calc_pi< rational_int, 100>();
How do you create the input? den seems to be corrupted before it even enters the function. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost