// (C) Copyright Matt Borland 2021. // Use, modification and distribution are subject to 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) #include #include #include #include #include #include #include #include #ifdef BOOST_HAS_FLOAT128 #include #endif template constexpr void test() { // Tests are only valid on binary systems if constexpr (FLT_RADIX == 2) { if constexpr (std::numeric_limits::has_quiet_NaN) { static_assert(boost::math::ccmath::isnan(boost::math::ccmath::scalbn(std::numeric_limits::quiet_NaN(), 1)), "If x is NaN, NaN is returned"); } static_assert(!boost::math::ccmath::scalbn(T(0), 1), "If x is +- 0, it is returned, unmodified"); static_assert(!boost::math::ccmath::scalbn(T(-0), 1), "If x is +- 0, it is returned, unmodified"); static_assert(boost::math::ccmath::isinf(boost::math::ccmath::scalbn(std::numeric_limits::infinity(), 1)), "If x is +- inf, it is returned, unmodified"); static_assert(boost::math::ccmath::isinf(boost::math::ccmath::scalbn(-std::numeric_limits::infinity(), 1)), "If x is +- inf, it is returned, unmodified"); static_assert(boost::math::ccmath::scalbn(T(2), 0) == T(2), "If exp is 0, then x is returned, unmodified"); // 1 * 2^2 = 4 static_assert(boost::math::ccmath::scalbn(T(1), 2) == T(4)); // 1.2 * 2^10 = 1228.8 static_assert(boost::math::ccmath::scalbn(T(1.2), 10) == T(1228.8)); // 500 * 2^-2 = 125 static_assert(boost::math::ccmath::scalbn(T(500), -2) == T(125)); } } #if !defined(BOOST_MATH_NO_CONSTEXPR_DETECTION) && !defined(BOOST_MATH_USING_BUILTIN_CONSTANT_P) int main() { test(); test(); #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS test(); #endif #ifdef BOOST_HAS_FLOAT128 test(); #endif return 0; } #else int main() { return 0; } #endif