diff --git a/Source/Core/Common/MathUtil.cpp b/Source/Core/Common/MathUtil.cpp
index eaff3f40ff..c7437cf533 100644
--- a/Source/Core/Common/MathUtil.cpp
+++ b/Source/Core/Common/MathUtil.cpp
@@ -15,8 +15,7 @@ namespace MathUtil
 u32 ClassifyDouble(double dvalue)
 {
 	// TODO: Optimize the below to be as fast as possible.
-	IntDouble value;
-	value.d = dvalue;
+	IntDouble value(dvalue);
 	u64 sign = value.i & DOUBLE_SIGN;
 	u64 exp  = value.i & DOUBLE_EXP;
 	if (exp > DOUBLE_ZERO && exp < DOUBLE_EXP)
@@ -55,8 +54,7 @@ u32 ClassifyDouble(double dvalue)
 u32 ClassifyFloat(float fvalue)
 {
 	// TODO: Optimize the below to be as fast as possible.
-	IntFloat value;
-	value.f = fvalue;
+	IntFloat value(fvalue);
 	u32 sign = value.i & FLOAT_SIGN;
 	u32 exp  = value.i & FLOAT_EXP;
 	if (exp > FLOAT_ZERO && exp < FLOAT_EXP)
diff --git a/Source/Core/Common/MathUtil.h b/Source/Core/Common/MathUtil.h
index 9ddacd6e1c..cec15f391e 100644
--- a/Source/Core/Common/MathUtil.h
+++ b/Source/Core/Common/MathUtil.h
@@ -36,35 +36,41 @@ static const u32 FLOAT_SIGN = 0x80000000,
 union IntDouble {
 	double d;
 	u64 i;
+
+	explicit IntDouble(u64 _i) : i(_i) {}
+	explicit IntDouble(double _d) : d(_d) {}
 };
 union IntFloat {
 	float f;
 	u32 i;
+
+	explicit IntFloat(u32 _i) : i(_i) {}
+	explicit IntFloat(float _f) : f(_f) {}
 };
 
 inline bool IsINF(double d)
 {
-	IntDouble x; x.d = d;
+	IntDouble x(d);
 	return (x.i & ~DOUBLE_SIGN) == DOUBLE_EXP;
 }
 
 inline bool IsNAN(double d)
 {
-	IntDouble x; x.d = d;
+	IntDouble x(d);
 	return ((x.i & DOUBLE_EXP) == DOUBLE_EXP) &&
 	       ((x.i & DOUBLE_FRAC) != DOUBLE_ZERO);
 }
 
 inline bool IsQNAN(double d)
 {
-	IntDouble x; x.d = d;
+	IntDouble x(d);
 	return ((x.i & DOUBLE_EXP) == DOUBLE_EXP) &&
 	       ((x.i & DOUBLE_QBIT) == DOUBLE_QBIT);
 }
 
 inline bool IsSNAN(double d)
 {
-	IntDouble x; x.d = d;
+	IntDouble x(d);
 	return ((x.i & DOUBLE_EXP) == DOUBLE_EXP) &&
 	       ((x.i & DOUBLE_FRAC) != DOUBLE_ZERO) &&
 	       ((x.i & DOUBLE_QBIT) == DOUBLE_ZERO);
@@ -72,7 +78,7 @@ inline bool IsSNAN(double d)
 
 inline float FlushToZero(float f)
 {
-	IntFloat x; x.f = f;
+	IntFloat x(f);
 	if ((x.i & FLOAT_EXP) == 0)
 	{
 		x.i &= FLOAT_SIGN;  // turn into signed zero
@@ -82,7 +88,7 @@ inline float FlushToZero(float f)
 
 inline double FlushToZero(double d)
 {
-	IntDouble x; x.d = d;
+	IntDouble x(d);
 	if ((x.i & DOUBLE_EXP) == 0)
 	{
 		x.i &= DOUBLE_SIGN;  // turn into signed zero