%PDF- %PDF-
Direktori : /usr/include/xsimd/math/ |
Current File : //usr/include/xsimd/math/xsimd_fp_manipulation.hpp |
/*************************************************************************** * Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and * * Martin Renou * * Copyright (c) QuantStack * * * * Distributed under the terms of the BSD 3-Clause License. * * * * The full license is in the file LICENSE, distributed with this software. * ****************************************************************************/ #ifndef XSIMD_FP_MANIPULATION_HPP #define XSIMD_FP_MANIPULATION_HPP #include "xsimd_numerical_constant.hpp" namespace xsimd { template <class T, std::size_t N> batch<T, N> ldexp(const batch<T, N>& x, const batch<as_integer_t<T>, N>& e); template <class T, std::size_t N> batch<T, N> frexp(const batch<T, N>& arg, batch<as_integer_t<T>, N>& exp); /******************************************************** * Floating point manipulation functions implementation * ********************************************************/ /* origin: boost/simd/arch/common/simd/function/ldexp.hpp */ /* * ==================================================== * copyright 2016 NumScale SAS * * Distributed under the Boost Software License, Version 1.0. * (See copy at http://boost.org/LICENSE_1_0.txt) * ==================================================== */ template <class T, std::size_t N> inline batch<T, N> ldexp(const batch<T, N>& x, const batch<as_integer_t<T>, N>& e) { using btype = batch<T, N>; using itype = as_integer_t<btype>; itype ik = e + maxexponent<T>(); ik = ik << nmb<T>(); return x * bitwise_cast<btype>(ik); } /* origin: boost/simd/arch/common/simd/function/ifrexp.hpp */ /* * ==================================================== * copyright 2016 NumScale SAS * * Distributed under the Boost Software License, Version 1.0. * (See copy at http://boost.org/LICENSE_1_0.txt) * ==================================================== */ template <class T, std::size_t N> inline batch<T, N> frexp(const batch<T, N>& arg, batch<as_integer_t<T>, N>& exp) { using b_type = batch<T, N>; using i_type = batch<as_integer_t<T>, N>; i_type m1f = mask1frexp<b_type>(); i_type r1 = m1f & bitwise_cast<i_type>(arg); b_type x = arg & bitwise_cast<b_type>(~m1f); exp = (r1 >> nmb<b_type>()) - maxexponentm1<b_type>(); exp = select(bool_cast(arg != b_type(0.)), exp, zero<i_type>()); return select((arg != b_type(0.)), x | bitwise_cast<b_type>(mask2frexp<b_type>()), b_type(0.)); } } #endif