template<class T, class Policies> inline interval<T, Policies> asin(const interval<T, Policies>& x) { typedef interval<T, Policies> I; if (interval_lib::detail::test_input(x) || x.upper() < static_cast<T>(-1) || x.lower() > static_cast<T>(1)) return I::empty(); typename Policies::rounding rnd; T l = (x.lower() <= static_cast<T>(-1)) ? -interval_lib::constants::pi_half_upper<T>() : rnd.asin_down(x.lower()); T u = (x.upper() >= static_cast<T>(1) ) ? interval_lib::constants::pi_half_upper<T>() : rnd.asin_up (x.upper()); return I(l, u, true); }