diff options
author | Antonio Sanchez <cantonios@google.com> | 2021-02-25 14:29:49 -0800 |
---|---|---|
committer | Antonio Sanchez <cantonios@google.com> | 2021-02-25 14:39:26 -0800 |
commit | 5529db7524b93208f3d97f5fadc53aff1de70190 (patch) | |
tree | 776d264bc8af0004bcd5eb6468ddb5c2bb4ea299 /test | |
parent | ecb7b19dfa6c4bbf7a4068e114a1c86aa88908fe (diff) |
Fix SSE/NEON pfloor/pceil for saturated values.
The original will saturate if the input does not fit into an integer
type. Here we fix this, returning the input if it doesn't have
enough precision to have a fractional part.
Also added `pceil` for NEON.
Fixes #1969.
Diffstat (limited to 'test')
-rw-r--r-- | test/packetmath.cpp | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/test/packetmath.cpp b/test/packetmath.cpp index 94a83c008..f355af491 100644 --- a/test/packetmath.cpp +++ b/test/packetmath.cpp @@ -546,14 +546,43 @@ void packetmath_real() { CHECK_CWISE1_IF(PacketTraits::HasCeil, numext::ceil, internal::pceil); CHECK_CWISE1_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor); CHECK_CWISE1_IF(PacketTraits::HasRint, numext::rint, internal::print); - - // See bug 1785. - for (int i = 0; i < size; ++i) { - data1[i] = Scalar(-1.5 + i); - data2[i] = Scalar(-1.5 + i); + + // Rounding edge cases. + if (PacketTraits::HasRound || PacketTraits::HasCeil || PacketTraits::HasFloor || PacketTraits::HasRint) { + typedef typename internal::make_integer<Scalar>::type IntType; + // Start with values that cannot fit inside an integer, work down to less than one. + Scalar val = Scalar(2) * static_cast<Scalar>(NumTraits<IntType>::highest()); + std::vector<Scalar> values; + while (val > Scalar(0.25)) { + // Cover both even and odd, positive and negative cases. + values.push_back(val); + values.push_back(val + Scalar(0.3)); + values.push_back(val + Scalar(0.5)); + values.push_back(val + Scalar(0.8)); + values.push_back(val + Scalar(1)); + values.push_back(val + Scalar(1.3)); + values.push_back(val + Scalar(1.5)); + values.push_back(val + Scalar(1.8)); + values.push_back(-val); + values.push_back(-val - Scalar(0.3)); + values.push_back(-val - Scalar(0.5)); + values.push_back(-val - Scalar(0.8)); + values.push_back(-val - Scalar(1)); + values.push_back(-val - Scalar(1.3)); + values.push_back(-val - Scalar(1.5)); + values.push_back(-val - Scalar(1.8)); + values.push_back(Scalar(-1.5) + val); // Bug 1785. + val = val / Scalar(2); + } + + for (size_t k=0; k<values.size(); ++k) { + data1[0] = values[k]; + CHECK_CWISE1_IF(PacketTraits::HasRound, numext::round, internal::pround); + CHECK_CWISE1_IF(PacketTraits::HasCeil, numext::ceil, internal::pceil); + CHECK_CWISE1_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor); + CHECK_CWISE1_IF(PacketTraits::HasRint, numext::rint, internal::print); + } } - CHECK_CWISE1_IF(PacketTraits::HasRound, numext::round, internal::pround); - CHECK_CWISE1_IF(PacketTraits::HasRint, numext::rint, internal::print); for (int i = 0; i < size; ++i) { data1[i] = Scalar(internal::random<double>(-1, 1)); |