diff options
author | Antonio Sanchez <cantonios@google.com> | 2020-10-12 12:24:08 +0100 |
---|---|---|
committer | Rasmus Munk Larsen <rmlarsen@google.com> | 2021-02-10 22:45:41 +0000 |
commit | 4cb563a01e0619ea1798c7927f1909755ead2dd8 (patch) | |
tree | f1a1c213a13ad6320fa86ebb144af777568eeeea /Eigen/src/Core/GenericPacketMath.h | |
parent | 7eb07da538ecc1b8937bfb5dac0d071067728397 (diff) |
Fix ldexp implementations.
The previous implementations produced garbage values if the exponent did
not fit within the exponent bits. See #2131 for a complete discussion,
and !375 for other possible implementations.
Here we implement the 4-factor version. See `pldexp_impl` in
`GenericPacketMathFunctions.h` for a full description.
The SSE `pcmp*` methods were moved down since `pcmp_le<Packet4i>`
requires `por`.
Left as a "TODO" is to delegate to a faster version if we know the
exponent does fit within the exponent bits.
Fixes #2131.
Diffstat (limited to 'Eigen/src/Core/GenericPacketMath.h')
-rw-r--r-- | Eigen/src/Core/GenericPacketMath.h | 24 |
1 files changed, 1 insertions, 23 deletions
diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h index 7160fa084..f8c7826db 100644 --- a/Eigen/src/Core/GenericPacketMath.h +++ b/Eigen/src/Core/GenericPacketMath.h @@ -453,7 +453,7 @@ EIGEN_DEVICE_FUNC inline Packet pfrexp(const Packet& a, Packet& exponent) { return result; } -/** \internal \returns a * 2^exponent +/** \internal \returns a * 2^((int)exponent) * See https://en.cppreference.com/w/cpp/numeric/math/ldexp */ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet @@ -905,28 +905,6 @@ pblend(const Selector<unpacket_traits<Packet>::size>& ifPacket, const Packet& th return ifPacket.select[0] ? thenPacket : elsePacket; } -/*************************************************************************** - * Some generic implementations to be used by implementors -***************************************************************************/ - -/** Default implementation of pfrexp for float. - * It is expected to be called by implementers of template<> pfrexp. - */ -template<typename Packet> EIGEN_STRONG_INLINE Packet -pfrexp_float(const Packet& a, Packet& exponent); - -/** Default implementation of pldexp for float. - * It is expected to be called by implementers of template<> pldexp. - */ -template<typename Packet> EIGEN_STRONG_INLINE Packet -pldexp_float(Packet a, Packet exponent); - -/** Default implementation of pldexp for double. - * It is expected to be called by implementers of template<> pldexp. - */ -template<typename Packet> EIGEN_STRONG_INLINE Packet -pldexp_double(Packet a, Packet exponent); - } // end namespace internal } // end namespace Eigen |