R safe_convert_to_float(const LargeInteger& i) { using std::ldexp; if(!i) return R(0); if(std::numeric_limits<R>::is_specialized && std::numeric_limits<R>::max_exponent) { LargeInteger val(i); if(val.sign() < 0) val = -val; unsigned mb = msb(val); if(mb >= std::numeric_limits<R>::max_exponent) { int scale_factor = (int)mb + 1 - std::numeric_limits<R>::max_exponent; BOOST_ASSERT(scale_factor >= 1); val >>= scale_factor; R result = val.template convert_to<R>(); if(std::numeric_limits<R>::digits == 0 || std::numeric_limits<R>::digits >= std::numeric_limits<R>::max_exponent) { // // Calculate and add on the remainder, only if there are more // digits in the mantissa that the size of the exponent, in // other words if we are dropping digits in the conversion // otherwise: // LargeInteger remainder(i); remainder &= (LargeInteger(1) << scale_factor) - 1; result += ldexp(safe_convert_to_float<R>(remainder), -scale_factor); } return i.sign() < 0 ? static_cast<R>(-result) : result; }
void test_spots(T) { using std::ldexp; T tolerance = boost::math::tools::epsilon<T>() * 40000; BOOST_CHECK_CLOSE( ::boost::math::ibeta_derivative( static_cast<T>(2), static_cast<T>(4), ldexp(static_cast<T>(1), -557)), static_cast<T>(4.23957586190238472641508753637420672781472122471791800210e-167L), tolerance * 4); BOOST_CHECK_CLOSE( ::boost::math::ibeta_derivative( static_cast<T>(2), static_cast<T>(4.5), ldexp(static_cast<T>(1), -557)), static_cast<T>(5.24647512910420109893867082626308082567071751558842352760e-167L), tolerance * 4); }
inline quantity<Unit, Y> ldexp(const quantity<Unit, Y>& q,const Int& ex) { using std::ldexp; typedef quantity<Unit,Y> quantity_type; return quantity_type::from_value(ldexp(q.value(), ex)); }
/** * The latitude resolution of a geohash. * * @param[in] len the length of the geohash. * @return the latitude resolution (degrees). * * Internally, \e len is first put in the range [0, 18]. **********************************************************************/ static Math::real LatitudeResolution(int len) { using std::ldexp; len = (std::max)(0, (std::min)(int(maxlen_), len)); return ldexp(real(180), -(5 * len / 2)); }