// signbit.hpp #ifndef BOOST_SPIRIT_MATH_SIGNBIT_HPP #define BOOST_SPIRIT_MATH_SIGNBIT_HPP // Copyright (c) 2006 Johan Rade // Distributed under 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) #if defined(_MSC_VER) #pragma once #endif #include namespace boost { namespace spirit { namespace math { //------------------------------------------------------------------------------ template bool (signbit)(T x) { typedef BOOST_DEDUCED_TYPENAME detail::fp_traits::type traits; traits::init(); BOOST_DEDUCED_TYPENAME traits::bits a; traits::get_bits(x,a); a &= traits::sign; return a != 0; } //------------------------------------------------------------------------------ namespace detail { template T copysign_impl(T x, T y) { typedef BOOST_DEDUCED_TYPENAME fp_traits::type traits; traits::init(); BOOST_DEDUCED_TYPENAME traits::bits a; traits::get_bits(x,a); a &= ~traits::sign; BOOST_DEDUCED_TYPENAME traits::bits b; traits::get_bits(y,b); b &= traits::sign; traits::set_bits(x,a|b); return x; } } inline float (copysign)(float x, float y) // magnitude of x and sign of y { return detail::copysign_impl(x,y); } inline double (copysign)(double x, double y) { return detail::copysign_impl(x,y); } inline long double (copysign)(long double x, long double y) { return detail::copysign_impl(x,y); } //------------------------------------------------------------------------------ template T (changesign)(T x) { typedef BOOST_DEDUCED_TYPENAME detail::fp_traits::type traits; traits::init(); BOOST_DEDUCED_TYPENAME traits::bits a; traits::get_bits(x,a); a ^= traits::sign; traits::set_bits(x,a); return x; } //------------------------------------------------------------------------------ } // namespace math } // namespace spirit } // namespace boost #endif