From 5ed2ed3b6bbd506ea9878abf235158e8be196f3d Mon Sep 17 00:00:00 2001 From: Daniel James Date: Wed, 31 Mar 2010 21:39:07 +0000 Subject: [PATCH] Merge from trunk. - Add `quick_erase` for unordered. `erase_return_void` is now deprecated. Fixes #3966 - Avoid collision between 0 and 0.5. Fixes #4038 [SVN r60980] --- hash/test/hash_float_test.hpp | 17 +++++++++++++++++ .../hash/detail/hash_float_generic.hpp | 8 +++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/hash/test/hash_float_test.hpp b/hash/test/hash_float_test.hpp index 2818bb2..dd1358e 100644 --- a/hash/test/hash_float_test.hpp +++ b/hash/test/hash_float_test.hpp @@ -79,6 +79,11 @@ void float_tests(char const* name, T* = 0) BOOST_TEST(x1(minus_zero) == HASH_NAMESPACE::hash_value(minus_zero)); #endif + BOOST_TEST(x1(zero) != x1(0.5)); + BOOST_TEST(x1(minus_zero) != x1(0.5)); + BOOST_TEST(x1(0.5) != x1(-0.5)); + BOOST_TEST(x1(1) != x1(-1)); + using namespace std; // Doing anything with infinity causes borland to crash. @@ -176,6 +181,12 @@ void float_tests(char const* name, T* = 0) BOOST_TEST(half_max != three_quarter_max); BOOST_TEST(quarter_max != three_quarter_max); + BOOST_TEST(max != -max); + BOOST_TEST(half_max != -half_max); + BOOST_TEST(quarter_max != -quarter_max); + BOOST_TEST(three_quarter_max != -three_quarter_max); + + #if defined(TEST_EXTENSIONS) BOOST_TEST(x1(max) == HASH_NAMESPACE::hash_value(max)); BOOST_TEST(x1(half_max) == HASH_NAMESPACE::hash_value(half_max)); @@ -197,6 +208,12 @@ void float_tests(char const* name, T* = 0) BOOST_TEST(x1(half_max) != x1(three_quarter_max)); BOOST_TEST(x1(three_quarter_max) == x1(three_quarter_max)); + BOOST_TEST(x1(max) != x1(-max)); + BOOST_TEST(x1(half_max) != x1(-half_max)); + BOOST_TEST(x1(quarter_max) != x1(-quarter_max)); + BOOST_TEST(x1(three_quarter_max) != x1(-three_quarter_max)); + + // Intel with gcc stdlib sometimes segfaults on calls to asin and acos. #if !((defined(__INTEL_COMPILER) || defined(__ICL) || \ defined(__ICC) || defined(__ECC)) && \ diff --git a/include/boost/functional/hash/detail/hash_float_generic.hpp b/include/boost/functional/hash/detail/hash_float_generic.hpp index f9acee9..fdbf53f 100644 --- a/include/boost/functional/hash/detail/hash_float_generic.hpp +++ b/include/boost/functional/hash/detail/hash_float_generic.hpp @@ -51,17 +51,15 @@ namespace boost limits::min_exponent; } - // The result of frexp is always between 0.5 and 1, so its - // top bit will always be 1. Subtract by 0.5 to remove that. - v -= T(0.5); - v = ldexp(v, limits::digits + 1); + v = ldexp(v, limits::digits); std::size_t seed = static_cast(v); v -= seed; // ceiling(digits(T) * log2(radix(T))/ digits(size_t)) - 1; std::size_t const length = (limits::digits * - boost::static_log2::radix>::value - 1) + boost::static_log2::radix>::value + + limits::digits - 1) / limits::digits; for(std::size_t i = 0; i != length; ++i)