// float_test.cpp --------------------------------------------------------------------// // Copyright Beman Dawes 2015 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt // See library home page at http://www.boost.org/libs/endian //--------------------------------------------------------------------------------------// #include //#define BOOST_ENDIAN_LOG #include #include #include #include #include #include using namespace boost::endian; using std::cout; using std::endl; using std::hex; using std::dec; using std::numeric_limits; namespace { std::string to_hex(const float& x) { std::stringstream stream; stream << "0x" << std::setfill('0') << std::setw(sizeof(float) * 2) << std::hex << *reinterpret_cast(&x); return stream.str(); } std::string to_hex(const double& x) { std::stringstream stream; stream << "0x" << std::setfill('0') << std::setw(sizeof(double) * 2) << std::hex << *reinterpret_cast(&x); return stream.str(); } template void show_value(const char* desc, const T& value) { cout << " " << desc << " " << value << ", big " << to_hex(native_to_big(value)) << ", little " << to_hex(native_to_little(value)) << "\n"; } template void report_limits(const char* type) { cout << "\nHeader values for std::numeric_limits<" << type << ">\n\n"; cout << " is_specialized " << numeric_limits::is_specialized << "\n"; cout << " is_signed " << numeric_limits::is_signed << "\n"; cout << " is_integer " << numeric_limits::is_integer << "\n"; cout << " is_exact " << numeric_limits::is_exact << "\n"; cout << " is_iec559 " << numeric_limits::is_iec559 << "\n"; cout << " is_bounded " << numeric_limits::is_bounded << "\n"; cout << " is_modulo " << numeric_limits::is_modulo << "\n"; cout << " traps " << numeric_limits::traps << "\n"; cout << " tinyness_before " << numeric_limits::tinyness_before << "\n"; cout << " round_style " << numeric_limits::round_style << "\n"; cout << " has_infinity " << numeric_limits::has_infinity << "\n"; cout << " has_quiet_NaN " << numeric_limits::has_quiet_NaN << "\n"; cout << " has_signaling_NaN " << numeric_limits::has_signaling_NaN << "\n"; cout << " has_denorm " << numeric_limits::has_denorm << "\n"; cout << " digits " << numeric_limits::digits << "\n"; cout << " digits10 " << numeric_limits::digits10 << "\n"; cout << " max_digits10 " << numeric_limits::max_digits10 << "\n"; cout << " radix " << numeric_limits::radix << "\n"; cout << " min_exponent " << numeric_limits::min_exponent << "\n"; cout << " min_exponent10 " << numeric_limits::min_exponent10 << "\n"; cout << " max_exponent " << numeric_limits::max_exponent << "\n"; cout << " max_exponent10 " << numeric_limits::max_exponent10 << "\n"; //cout << " min() " << numeric_limits::min() << ", " << to_hex(numeric_limits::min()) << "\n"; //cout << " max() " << numeric_limits::max() << "\n"; //cout << " lowest() " << numeric_limits::lowest() << "\n"; //cout << " epsilon() " << numeric_limits::epsilon() << "\n"; //cout << " round_error() " << numeric_limits::round_error() << "\n"; //cout << " infinity() " << numeric_limits::infinity() << "\n"; //cout << " quiet_NaN() " << numeric_limits::quiet_NaN() << "\n"; //cout << " signaling_NaN() " << numeric_limits::signaling_NaN() << "\n"; //cout << " denorm_min() " << numeric_limits::denorm_min() << "\n"; show_value("min()", numeric_limits::min()); show_value("max()", numeric_limits::max()); show_value("lowest()", numeric_limits::lowest()); show_value("epsilon()", numeric_limits::epsilon()); show_value("round_error()", numeric_limits::round_error()); show_value("infinity()", numeric_limits::infinity()); show_value("-infinity()", -numeric_limits::infinity()); show_value("quiet_NaN()", numeric_limits::quiet_NaN()); show_value("signaling_NaN()", numeric_limits::signaling_NaN()); show_value("denorm_min()", numeric_limits::denorm_min()); show_value("0.0", static_cast(0.0)); show_value("1.0", static_cast(1.0)); } template void round_trip_test(const char* type) { BOOST_TEST_MEMCMP_EQ(static_cast(1.0), static_cast(1.0)); // reality check BOOST_TEST_MEMCMP_EQ(endian_reverse(endian_reverse(numeric_limits::min())), numeric_limits::min()); BOOST_TEST_MEMCMP_EQ(endian_reverse(endian_reverse(numeric_limits::max())), numeric_limits::max()); BOOST_TEST_MEMCMP_EQ(endian_reverse(endian_reverse(numeric_limits::lowest())), numeric_limits::lowest()); BOOST_TEST_MEMCMP_EQ(endian_reverse(endian_reverse(numeric_limits::epsilon())), numeric_limits::epsilon()); BOOST_TEST_MEMCMP_EQ(endian_reverse(endian_reverse(numeric_limits::round_error())), numeric_limits::round_error()); BOOST_TEST_MEMCMP_EQ(endian_reverse(endian_reverse(numeric_limits::infinity())), numeric_limits::infinity()); BOOST_TEST_MEMCMP_EQ(endian_reverse(endian_reverse(numeric_limits::quiet_NaN())), numeric_limits::quiet_NaN()); BOOST_TEST_MEMCMP_EQ(endian_reverse(endian_reverse(numeric_limits::signaling_NaN())), numeric_limits::signaling_NaN()); BOOST_TEST_MEMCMP_EQ(endian_reverse(endian_reverse(numeric_limits::denorm_min())), numeric_limits::denorm_min()); } } // unnamed namespace //--------------------------------------------------------------------------------------// int cpp_main(int, char *[]) { cout << "byte swap intrinsics: " BOOST_ENDIAN_INTRINSIC_MSG << endl; //#define BOOST_ENDIAN_FORCE_ERROR #ifdef BOOST_ENDIAN_FORCE_ERROR BOOST_TEST_MEMCMP_EQ(1.0f, 1.0); BOOST_TEST_MEMCMP_EQ(1.0f, 1.1f); BOOST_TEST_MEMCMP_EQ(1.0, 1.1); #endif report_limits("float"); round_trip_test("float"); report_limits("double"); round_trip_test("double"); cout << "\n done" << endl; return ::boost::endian::report_errors(); } #include