From 0a3631cc7657d6fe0cb577681092e9b6f926dbb9 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 10 May 2018 10:35:00 -0400 Subject: FloatUtils: Remove IntDouble and IntFloat Type punning via unions in C++ invokes undefined behavior. Instead, leverage BitCast, our variant of C++2a's std::bit_cast --- Source/UnitTests/Common/FloatUtilsTest.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'Source/UnitTests/Common/FloatUtilsTest.cpp') diff --git a/Source/UnitTests/Common/FloatUtilsTest.cpp b/Source/UnitTests/Common/FloatUtilsTest.cpp index c1f7117162..bcc3e94cf2 100644 --- a/Source/UnitTests/Common/FloatUtilsTest.cpp +++ b/Source/UnitTests/Common/FloatUtilsTest.cpp @@ -7,6 +7,7 @@ #include +#include "Common/BitUtils.h" #include "Common/FloatUtils.h" TEST(FloatUtils, IsQNAN) @@ -51,18 +52,16 @@ TEST(FloatUtils, FlushToZero) std::uniform_int_distribution dist(0x00800000u, 0x7fffffffu); for (u32 i = 0; i <= 0x007fffffu; ++i) { - Common::IntFloat x(i); - EXPECT_EQ(+0.f, Common::FlushToZero(x.f)); + u32 i_tmp = i; + EXPECT_EQ(+0.f, Common::FlushToZero(Common::BitCast(i_tmp))); - x.i = i | 0x80000000u; - EXPECT_EQ(-0.f, Common::FlushToZero(x.f)); + i_tmp |= 0x80000000u; + EXPECT_EQ(-0.f, Common::FlushToZero(Common::BitCast(i_tmp))); - x.i = dist(engine); - Common::IntFloat y(Common::FlushToZero(x.f)); - EXPECT_EQ(x.i, y.i); + i_tmp = dist(engine); + EXPECT_EQ(i_tmp, Common::BitCast(Common::FlushToZero(Common::BitCast(i_tmp)))); - x.i |= 0x80000000u; - y.f = Common::FlushToZero(x.f); - EXPECT_EQ(x.i, y.i); + i_tmp |= 0x80000000u; + EXPECT_EQ(i_tmp, Common::BitCast(Common::FlushToZero(Common::BitCast(i_tmp)))); } } -- cgit v1.2.3