diff --git a/test/src/math/copysign_test.cpp b/test/src/math/copysign_test.cpp
index e063846..676e8fe 100644
--- a/test/src/math/copysign_test.cpp
+++ b/test/src/math/copysign_test.cpp
@@ -8,56 +8,42 @@
 
 #include "include/math.h"
 #include "src/math/copysign.h"
-#include "utils/FPUtil/BitPatterns.h"
-#include "utils/FPUtil/FloatOperations.h"
-#include "utils/FPUtil/FloatProperties.h"
+#include "utils/FPUtil/FPBits.h"
+#include "utils/FPUtil/TestHelpers.h"
 #include "utils/UnitTest/Test.h"
 
-using __llvm_libc::fputil::valueAsBits;
-using __llvm_libc::fputil::valueFromBits;
+using FPBits = __llvm_libc::fputil::FPBits<double>;
 
-using BitPatterns = __llvm_libc::fputil::BitPatterns<double>;
-using Properties = __llvm_libc::fputil::FloatProperties<double>;
+static const double zero = FPBits::zero();
+static const double negZero = FPBits::negZero();
+static const double nan = FPBits::buildNaN(1);
+static const double inf = FPBits::inf();
+static const double negInf = FPBits::negInf();
 
 TEST(CopySignTest, SpecialNumbers) {
-  EXPECT_EQ(BitPatterns::aNegativeQuietNaN,
-            valueAsBits(__llvm_libc::copysign(
-                valueFromBits(BitPatterns::aQuietNaN), -1.0)));
-  EXPECT_EQ(BitPatterns::aQuietNaN,
-            valueAsBits(__llvm_libc::copysign(
-                valueFromBits(BitPatterns::aNegativeQuietNaN), 1.0)));
+  EXPECT_FP_EQ(nan, __llvm_libc::copysign(nan, -1.0));
+  EXPECT_FP_EQ(nan, __llvm_libc::copysign(nan, 1.0));
 
-  EXPECT_EQ(BitPatterns::aNegativeSignallingNaN,
-            valueAsBits(__llvm_libc::copysign(
-                valueFromBits(BitPatterns::aSignallingNaN), -1.0)));
-  EXPECT_EQ(BitPatterns::aSignallingNaN,
-            valueAsBits(__llvm_libc::copysign(
-                valueFromBits(BitPatterns::aNegativeSignallingNaN), 1.0)));
+  EXPECT_FP_EQ(negInf, __llvm_libc::copysign(inf, -1.0));
+  EXPECT_FP_EQ(inf, __llvm_libc::copysign(negInf, 1.0));
 
-  EXPECT_EQ(BitPatterns::negInf, valueAsBits(__llvm_libc::copysign(
-                                     valueFromBits(BitPatterns::inf), -1.0)));
-  EXPECT_EQ(BitPatterns::inf, valueAsBits(__llvm_libc::copysign(
-                                  valueFromBits(BitPatterns::negInf), 1.0)));
-
-  EXPECT_EQ(BitPatterns::negZero, valueAsBits(__llvm_libc::copysign(
-                                      valueFromBits(BitPatterns::zero), -1.0)));
-  EXPECT_EQ(BitPatterns::zero, valueAsBits(__llvm_libc::copysign(
-                                   valueFromBits(BitPatterns::negZero), 1.0)));
+  EXPECT_FP_EQ(negZero, __llvm_libc::copysign(zero, -1.0));
+  EXPECT_FP_EQ(zero, __llvm_libc::copysign(negZero, 1.0));
 }
 
 TEST(CopySignTest, InDoubleRange) {
-  using BitsType = Properties::BitsType;
-  constexpr BitsType count = 1000000;
-  constexpr BitsType step = UINT64_MAX / count;
-  for (BitsType i = 0, v = 0; i <= count; ++i, v += step) {
-    double x = valueFromBits(v);
+  using UIntType = FPBits::UIntType;
+  constexpr UIntType count = 10000000;
+  constexpr UIntType step = UIntType(-1) / count;
+  for (UIntType i = 0, v = 0; i <= count; ++i, v += step) {
+    double x = FPBits(v);
     if (isnan(x) || isinf(x) || x == 0)
       continue;
 
     double res1 = __llvm_libc::copysign(x, -x);
-    ASSERT_TRUE(res1 == -x);
+    ASSERT_FP_EQ(res1, -x);
 
     double res2 = __llvm_libc::copysign(x, x);
-    ASSERT_TRUE(res2 == x);
+    ASSERT_FP_EQ(res2, x);
   }
 }
diff --git a/test/src/math/copysignf_test.cpp b/test/src/math/copysignf_test.cpp
index cb2cf51..a7c4346 100644
--- a/test/src/math/copysignf_test.cpp
+++ b/test/src/math/copysignf_test.cpp
@@ -1,5 +1,4 @@
-//===-- Unittests for copysignf
-//--------------------------------------------===//
+//===-- Unittests for copysignf -------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -9,57 +8,42 @@
 
 #include "include/math.h"
 #include "src/math/copysignf.h"
-#include "utils/FPUtil/BitPatterns.h"
-#include "utils/FPUtil/FloatOperations.h"
-#include "utils/FPUtil/FloatProperties.h"
+#include "utils/FPUtil/FPBits.h"
+#include "utils/FPUtil/TestHelpers.h"
 #include "utils/UnitTest/Test.h"
 
-using __llvm_libc::fputil::valueAsBits;
-using __llvm_libc::fputil::valueFromBits;
+using FPBits = __llvm_libc::fputil::FPBits<float>;
 
-using BitPatterns = __llvm_libc::fputil::BitPatterns<float>;
-using Properties = __llvm_libc::fputil::FloatProperties<float>;
+static const float zero = FPBits::zero();
+static const float negZero = FPBits::negZero();
+static const float nan = FPBits::buildNaN(1);
+static const float inf = FPBits::inf();
+static const float negInf = FPBits::negInf();
 
-TEST(CopySignFTest, SpecialNumbers) {
-  EXPECT_EQ(BitPatterns::aNegativeQuietNaN,
-            valueAsBits(__llvm_libc::copysignf(
-                valueFromBits(BitPatterns::aQuietNaN), -1.0f)));
-  EXPECT_EQ(BitPatterns::aQuietNaN,
-            valueAsBits(__llvm_libc::copysignf(
-                valueFromBits(BitPatterns::aNegativeQuietNaN), 1.0f)));
+TEST(CopySinfTest, SpecialNumbers) {
+  EXPECT_FP_EQ(nan, __llvm_libc::copysignf(nan, -1.0));
+  EXPECT_FP_EQ(nan, __llvm_libc::copysignf(nan, 1.0));
 
-  EXPECT_EQ(BitPatterns::aNegativeSignallingNaN,
-            valueAsBits(__llvm_libc::copysignf(
-                valueFromBits(BitPatterns::aSignallingNaN), -1.0f)));
-  EXPECT_EQ(BitPatterns::aSignallingNaN,
-            valueAsBits(__llvm_libc::copysignf(
-                valueFromBits(BitPatterns::aNegativeSignallingNaN), 1.0f)));
+  EXPECT_FP_EQ(negInf, __llvm_libc::copysignf(inf, -1.0));
+  EXPECT_FP_EQ(inf, __llvm_libc::copysignf(negInf, 1.0));
 
-  EXPECT_EQ(BitPatterns::negInf, valueAsBits(__llvm_libc::copysignf(
-                                     valueFromBits(BitPatterns::inf), -1.0f)));
-  EXPECT_EQ(BitPatterns::inf, valueAsBits(__llvm_libc::copysignf(
-                                  valueFromBits(BitPatterns::negInf), 1.0f)));
-
-  EXPECT_EQ(BitPatterns::negZero,
-            valueAsBits(__llvm_libc::copysignf(valueFromBits(BitPatterns::zero),
-                                               -1.0f)));
-  EXPECT_EQ(BitPatterns::zero, valueAsBits(__llvm_libc::copysignf(
-                                   valueFromBits(BitPatterns::negZero), 1.0f)));
+  EXPECT_FP_EQ(negZero, __llvm_libc::copysignf(zero, -1.0));
+  EXPECT_FP_EQ(zero, __llvm_libc::copysignf(negZero, 1.0));
 }
 
-TEST(CopySignFTest, InDoubleRange) {
-  using BitsType = Properties::BitsType;
-  constexpr BitsType count = 1000000;
-  constexpr BitsType step = UINT32_MAX / count;
-  for (BitsType i = 0, v = 0; i <= count; ++i, v += step) {
-    float x = valueFromBits(v);
+TEST(CopySinfTest, InFloatRange) {
+  using UIntType = FPBits::UIntType;
+  constexpr UIntType count = 1000000;
+  constexpr UIntType step = UIntType(-1) / count;
+  for (UIntType i = 0, v = 0; i <= count; ++i, v += step) {
+    float x = FPBits(v);
     if (isnan(x) || isinf(x) || x == 0)
       continue;
 
     float res1 = __llvm_libc::copysignf(x, -x);
-    ASSERT_TRUE(res1 == -x);
+    ASSERT_FP_EQ(res1, -x);
 
     float res2 = __llvm_libc::copysignf(x, x);
-    ASSERT_TRUE(res2 == x);
+    ASSERT_FP_EQ(res2, x);
   }
 }
diff --git a/test/src/math/copysignl_test.cpp b/test/src/math/copysignl_test.cpp
index 7ffb5fb..efe54e4 100644
--- a/test/src/math/copysignl_test.cpp
+++ b/test/src/math/copysignl_test.cpp
@@ -1,5 +1,4 @@
-//===-- Unittests for copysignl
-//--------------------------------------------===//
+//===-- Unittests for copysignl -------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -10,26 +9,29 @@
 #include "include/math.h"
 #include "src/math/copysignl.h"
 #include "utils/FPUtil/FPBits.h"
+#include "utils/FPUtil/TestHelpers.h"
 #include "utils/UnitTest/Test.h"
 
 using FPBits = __llvm_libc::fputil::FPBits<long double>;
 
-TEST(CopysignlTest, SpecialNumbers) {
-  EXPECT_TRUE(FPBits::negZero() ==
-              __llvm_libc::copysignl(FPBits::zero(), -1.0l));
-  EXPECT_TRUE(FPBits::zero() ==
-              __llvm_libc::copysignl(FPBits::negZero(), 1.0l));
+static const long double zero = FPBits::zero();
+static const long double negZero = FPBits::negZero();
+static const long double nan = FPBits::buildNaN(1);
+static const long double inf = FPBits::inf();
+static const long double negInf = FPBits::negInf();
 
-  EXPECT_TRUE(FPBits::negZero() ==
-              __llvm_libc::copysignl(FPBits::zero(), -1.0l));
-  EXPECT_TRUE(FPBits::zero() ==
-              __llvm_libc::copysignl(FPBits::negZero(), 1.0l));
+TEST(CopySinlTest, SpecialNumbers) {
+  EXPECT_FP_EQ(nan, __llvm_libc::copysignl(nan, -1.0));
+  EXPECT_FP_EQ(nan, __llvm_libc::copysignl(nan, 1.0));
 
-  EXPECT_TRUE(
-      FPBits(__llvm_libc::copysignl(FPBits::buildNaN(1), -1.0l)).isNaN());
+  EXPECT_FP_EQ(negInf, __llvm_libc::copysignl(inf, -1.0));
+  EXPECT_FP_EQ(inf, __llvm_libc::copysignl(negInf, 1.0));
+
+  EXPECT_FP_EQ(negZero, __llvm_libc::copysignl(zero, -1.0));
+  EXPECT_FP_EQ(zero, __llvm_libc::copysignl(negZero, 1.0));
 }
 
-TEST(CopysignlTest, InDoubleRange) {
+TEST(CopySinlTest, InLongDoubleRange) {
   using UIntType = FPBits::UIntType;
   constexpr UIntType count = 10000000;
   constexpr UIntType step = UIntType(-1) / count;
@@ -39,9 +41,9 @@
       continue;
 
     long double res1 = __llvm_libc::copysignl(x, -x);
-    ASSERT_TRUE(res1 == -x);
+    ASSERT_FP_EQ(res1, -x);
 
     long double res2 = __llvm_libc::copysignl(x, x);
-    ASSERT_TRUE(res2 == x);
+    ASSERT_FP_EQ(res2, x);
   }
 }
diff --git a/test/src/math/fabs_test.cpp b/test/src/math/fabs_test.cpp
index a9ce9e7..4c3f28f 100644
--- a/test/src/math/fabs_test.cpp
+++ b/test/src/math/fabs_test.cpp
@@ -8,17 +8,18 @@
 
 #include "include/math.h"
 #include "src/math/fabs.h"
-#include "utils/FPUtil/BitPatterns.h"
-#include "utils/FPUtil/FloatOperations.h"
-#include "utils/FPUtil/FloatProperties.h"
+#include "utils/FPUtil/FPBits.h"
+#include "utils/FPUtil/TestHelpers.h"
 #include "utils/MPFRWrapper/MPFRUtils.h"
 #include "utils/UnitTest/Test.h"
 
-using __llvm_libc::fputil::valueAsBits;
-using __llvm_libc::fputil::valueFromBits;
+using FPBits = __llvm_libc::fputil::FPBits<double>;
 
-using BitPatterns = __llvm_libc::fputil::BitPatterns<double>;
-using Properties = __llvm_libc::fputil::FloatProperties<double>;
+static const double zero = FPBits::zero();
+static const double negZero = FPBits::negZero();
+static const double nan = FPBits::buildNaN(1);
+static const double inf = FPBits::inf();
+static const double negInf = FPBits::negInf();
 
 namespace mpfr = __llvm_libc::testing::mpfr;
 
@@ -27,36 +28,21 @@
                                            0};
 
 TEST(FabsTest, SpecialNumbers) {
-  EXPECT_EQ(
-      BitPatterns::aQuietNaN,
-      valueAsBits(__llvm_libc::fabs(valueFromBits(BitPatterns::aQuietNaN))));
-  EXPECT_EQ(BitPatterns::aQuietNaN, valueAsBits(__llvm_libc::fabs(valueFromBits(
-                                        BitPatterns::aNegativeQuietNaN))));
+  EXPECT_FP_EQ(nan, __llvm_libc::fabs(nan));
 
-  EXPECT_EQ(BitPatterns::aSignallingNaN,
-            valueAsBits(
-                __llvm_libc::fabs(valueFromBits(BitPatterns::aSignallingNaN))));
-  EXPECT_EQ(BitPatterns::aSignallingNaN,
-            valueAsBits(__llvm_libc::fabs(
-                valueFromBits(BitPatterns::aNegativeSignallingNaN))));
+  EXPECT_FP_EQ(inf, __llvm_libc::fabs(inf));
+  EXPECT_FP_EQ(inf, __llvm_libc::fabs(negInf));
 
-  EXPECT_EQ(BitPatterns::inf,
-            valueAsBits(__llvm_libc::fabs(valueFromBits(BitPatterns::inf))));
-  EXPECT_EQ(BitPatterns::inf,
-            valueAsBits(__llvm_libc::fabs(valueFromBits(BitPatterns::negInf))));
-
-  EXPECT_EQ(BitPatterns::zero,
-            valueAsBits(__llvm_libc::fabs(valueFromBits(BitPatterns::zero))));
-  EXPECT_EQ(BitPatterns::zero, valueAsBits(__llvm_libc::fabs(
-                                   valueFromBits(BitPatterns::negZero))));
+  EXPECT_FP_EQ(zero, __llvm_libc::fabs(zero));
+  EXPECT_FP_EQ(zero, __llvm_libc::fabs(negZero));
 }
 
 TEST(FabsTest, InDoubleRange) {
-  using BitsType = Properties::BitsType;
-  constexpr BitsType count = 1000000;
-  constexpr BitsType step = UINT64_MAX / count;
-  for (BitsType i = 0, v = 0; i <= count; ++i, v += step) {
-    double x = valueFromBits(v);
+  using UIntType = FPBits::UIntType;
+  constexpr UIntType count = 10000000;
+  constexpr UIntType step = UIntType(-1) / count;
+  for (UIntType i = 0, v = 0; i <= count; ++i, v += step) {
+    double x = FPBits(v);
     if (isnan(x) || isinf(x))
       continue;
     ASSERT_MPFR_MATCH(mpfr::Operation::Abs, x, __llvm_libc::fabs(x), tolerance);
diff --git a/test/src/math/fabsf_test.cpp b/test/src/math/fabsf_test.cpp
index 4231a25..83425d7 100644
--- a/test/src/math/fabsf_test.cpp
+++ b/test/src/math/fabsf_test.cpp
@@ -8,17 +8,18 @@
 
 #include "include/math.h"
 #include "src/math/fabsf.h"
-#include "utils/FPUtil/BitPatterns.h"
-#include "utils/FPUtil/FloatOperations.h"
-#include "utils/FPUtil/FloatProperties.h"
+#include "utils/FPUtil/FPBits.h"
+#include "utils/FPUtil/TestHelpers.h"
 #include "utils/MPFRWrapper/MPFRUtils.h"
 #include "utils/UnitTest/Test.h"
 
-using __llvm_libc::fputil::valueAsBits;
-using __llvm_libc::fputil::valueFromBits;
+using FPBits = __llvm_libc::fputil::FPBits<float>;
 
-using BitPatterns = __llvm_libc::fputil::BitPatterns<float>;
-using Properties = __llvm_libc::fputil::FloatProperties<float>;
+static const float zero = FPBits::zero();
+static const float negZero = FPBits::negZero();
+static const float nan = FPBits::buildNaN(1);
+static const float inf = FPBits::inf();
+static const float negInf = FPBits::negInf();
 
 namespace mpfr = __llvm_libc::testing::mpfr;
 
@@ -26,39 +27,22 @@
 static constexpr mpfr::Tolerance tolerance{mpfr::Tolerance::floatPrecision, 0,
                                            0};
 
-namespace mpfr = __llvm_libc::testing::mpfr;
 TEST(FabsfTest, SpecialNumbers) {
-  EXPECT_EQ(
-      BitPatterns::aQuietNaN,
-      valueAsBits(__llvm_libc::fabsf(valueFromBits(BitPatterns::aQuietNaN))));
-  EXPECT_EQ(BitPatterns::aQuietNaN,
-            valueAsBits(__llvm_libc::fabsf(
-                valueFromBits(BitPatterns::aNegativeQuietNaN))));
+  EXPECT_FP_EQ(nan, __llvm_libc::fabsf(nan));
 
-  EXPECT_EQ(BitPatterns::aSignallingNaN,
-            valueAsBits(__llvm_libc::fabsf(
-                valueFromBits(BitPatterns::aSignallingNaN))));
-  EXPECT_EQ(BitPatterns::aSignallingNaN,
-            valueAsBits(__llvm_libc::fabsf(
-                valueFromBits(BitPatterns::aNegativeSignallingNaN))));
+  EXPECT_FP_EQ(inf, __llvm_libc::fabsf(inf));
+  EXPECT_FP_EQ(inf, __llvm_libc::fabsf(negInf));
 
-  EXPECT_EQ(BitPatterns::inf,
-            valueAsBits(__llvm_libc::fabsf(valueFromBits(BitPatterns::inf))));
-  EXPECT_EQ(BitPatterns::inf, valueAsBits(__llvm_libc::fabsf(
-                                  valueFromBits(BitPatterns::negInf))));
-
-  EXPECT_EQ(BitPatterns::zero,
-            valueAsBits(__llvm_libc::fabsf(valueFromBits(BitPatterns::zero))));
-  EXPECT_EQ(BitPatterns::zero, valueAsBits(__llvm_libc::fabsf(
-                                   valueFromBits(BitPatterns::negZero))));
+  EXPECT_FP_EQ(zero, __llvm_libc::fabsf(zero));
+  EXPECT_FP_EQ(zero, __llvm_libc::fabsf(negZero));
 }
 
 TEST(FabsfTest, InFloatRange) {
-  using BitsType = Properties::BitsType;
-  constexpr BitsType count = 1000000;
-  constexpr BitsType step = UINT32_MAX / count;
-  for (BitsType i = 0, v = 0; i <= count; ++i, v += step) {
-    double x = valueFromBits(v);
+  using UIntType = FPBits::UIntType;
+  constexpr UIntType count = 1000000;
+  constexpr UIntType step = UIntType(-1) / count;
+  for (UIntType i = 0, v = 0; i <= count; ++i, v += step) {
+    float x = FPBits(v);
     if (isnan(x) || isinf(x))
       continue;
     ASSERT_MPFR_MATCH(mpfr::Operation::Abs, x, __llvm_libc::fabsf(x),
diff --git a/test/src/math/fabsl_test.cpp b/test/src/math/fabsl_test.cpp
index 4a64568..b2ceb0c 100644
--- a/test/src/math/fabsl_test.cpp
+++ b/test/src/math/fabsl_test.cpp
@@ -9,11 +9,18 @@
 #include "include/math.h"
 #include "src/math/fabsl.h"
 #include "utils/FPUtil/FPBits.h"
+#include "utils/FPUtil/TestHelpers.h"
 #include "utils/MPFRWrapper/MPFRUtils.h"
 #include "utils/UnitTest/Test.h"
 
 using FPBits = __llvm_libc::fputil::FPBits<long double>;
 
+static const long double zero = FPBits::zero();
+static const long double negZero = FPBits::negZero();
+static const long double nan = FPBits::buildNaN(1);
+static const long double inf = FPBits::inf();
+static const long double negInf = FPBits::negInf();
+
 namespace mpfr = __llvm_libc::testing::mpfr;
 
 // Zero tolerance; As in, exact match with MPFR result.
@@ -21,15 +28,13 @@
                                            0};
 
 TEST(FabslTest, SpecialNumbers) {
-  EXPECT_TRUE(FPBits::zero() == __llvm_libc::fabsl(FPBits::zero()));
-  EXPECT_TRUE(FPBits::zero() == __llvm_libc::fabsl(FPBits::negZero()));
+  EXPECT_FP_EQ(nan, __llvm_libc::fabsl(nan));
 
-  EXPECT_TRUE(FPBits::inf() == __llvm_libc::fabsl(FPBits::inf()));
-  EXPECT_TRUE(FPBits::inf() == __llvm_libc::fabsl(FPBits::negInf()));
+  EXPECT_FP_EQ(inf, __llvm_libc::fabsl(inf));
+  EXPECT_FP_EQ(inf, __llvm_libc::fabsl(negInf));
 
-  long double nan = FPBits::buildNaN(1);
-  ASSERT_TRUE(isnan(nan) != 0);
-  ASSERT_TRUE(isnan(__llvm_libc::fabsl(nan)) != 0);
+  EXPECT_FP_EQ(zero, __llvm_libc::fabsl(zero));
+  EXPECT_FP_EQ(zero, __llvm_libc::fabsl(negZero));
 }
 
 TEST(FabslTest, InLongDoubleRange) {
