diff --git a/test/test_0F1.cpp b/test/test_0F1.cpp
index 26e1e304b2..0c501a0c1c 100644
--- a/test/test_0F1.cpp
+++ b/test/test_0F1.cpp
@@ -16,7 +16,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept|cpp_bin_float_quad|dec_40";
    }
diff --git a/test/test_1F1.cpp b/test/test_1F1.cpp
index f3b226efdd..f204e85322 100644
--- a/test/test_1F1.cpp
+++ b/test/test_1F1.cpp
@@ -15,7 +15,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept|cpp_bin_float_quad|dec_40|cpp_bin_float_double_extended";
    }
@@ -71,6 +71,8 @@ void expected_results()
       "Small.*",                     // test data group
       ".*", 1000, 300);              // test function
 
+   if(boost::math::policies::promote_double<>())
+   {
 #if (LDBL_MANT_DIG < DBL_MANT_DIG * 2) && (LDBL_MANT_DIG != DBL_MANT_DIG)
    //
    // long double has only a little extra precision and errors may creep
@@ -116,6 +118,7 @@ void expected_results()
       ".*", 10, 5);                 // test function
 
 #endif
+   }
 
    add_expected_result(
       ".*",                          // compiler
diff --git a/test/test_1F1_log.cpp b/test/test_1F1_log.cpp
index b0ea07332b..f9b16008ef 100644
--- a/test/test_1F1_log.cpp
+++ b/test/test_1F1_log.cpp
@@ -15,7 +15,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept|cpp_bin_float_quad|dec_40|cpp_bin_float_double_extended";
    }
@@ -72,6 +72,8 @@ void expected_results()
       ".*", 1000, 300);              // test function
 
 #if (LDBL_MANT_DIG < DBL_MANT_DIG * 2) && (LDBL_MANT_DIG != DBL_MANT_DIG)
+   if(boost::math::policies::promote_double<>())
+   {
    //
    // long double has only a little extra precision and errors may creep
    // into the double results:
@@ -106,7 +108,7 @@ void expected_results()
       "double",                      // test type(s)
       "Bug.*",                     // test data group
       ".*", 300, 50);                 // test function
-
+   }
 #endif
 
    add_expected_result(
diff --git a/test/test_1F1_regularized.cpp b/test/test_1F1_regularized.cpp
index e16e32943f..315f2a4b83 100644
--- a/test/test_1F1_regularized.cpp
+++ b/test/test_1F1_regularized.cpp
@@ -17,7 +17,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept|cpp_bin_float_quad|dec_40|cpp_bin_float_double_extended";
    }
@@ -74,6 +74,8 @@ void expected_results()
       ".*", 1000, 300);              // test function
 
 #if (LDBL_MANT_DIG < DBL_MANT_DIG * 2) && (LDBL_MANT_DIG != DBL_MANT_DIG)
+   if(boost::math::policies::promote_double<>())
+   {
    //
    // long double has only a little extra precision and errors may creep
    // into the double results:
@@ -108,7 +110,7 @@ void expected_results()
       "double",                      // test type(s)
       "Bug.*",                     // test data group
       ".*", 300, 50);                 // test function
-
+   }
 #endif
 
    add_expected_result(
diff --git a/test/test_2F0.cpp b/test/test_2F0.cpp
index 4e5fe4bacf..1e8a1d25e1 100644
--- a/test/test_2F0.cpp
+++ b/test/test_2F0.cpp
@@ -16,7 +16,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept|cpp_bin_float_quad|dec_40";
    }
@@ -29,7 +29,7 @@ void expected_results()
 #endif
 
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if (boost::math::policies::digits<double, boost::math::policies::policy<> >() != boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if (boost::math::policies::promote_double<>() && boost::math::policies::digits<double, boost::math::policies::policy<> >() != boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       add_expected_result(
          ".*",                          // compiler
diff --git a/test/test_bessel_i.cpp b/test/test_bessel_i.cpp
index 817569760a..119e9cddd3 100644
--- a/test/test_bessel_i.cpp
+++ b/test/test_bessel_i.cpp
@@ -51,7 +51,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_bessel_i_prime.cpp b/test/test_bessel_i_prime.cpp
index 831cd7e0d6..508536825e 100644
--- a/test/test_bessel_i_prime.cpp
+++ b/test/test_bessel_i_prime.cpp
@@ -37,7 +37,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_bessel_j.cpp b/test/test_bessel_j.cpp
index 1dd63a68a5..6d78c8c478 100644
--- a/test/test_bessel_j.cpp
+++ b/test/test_bessel_j.cpp
@@ -51,7 +51,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
@@ -197,6 +197,8 @@ void expected_results()
    BOOST_IF_CONSTEXPR ((std::numeric_limits<double>::digits != std::numeric_limits<long double>::digits)
       && (std::numeric_limits<long double>::digits < 90))
    {
+      if (boost::math::policies::promote_double<>())
+      {
       // some errors spill over into type double as well:
       add_expected_result(
          ".*",                          // compiler
@@ -226,6 +228,7 @@ void expected_results()
          "double",                      // test type(s)
          ".*",                          // test data group
          ".*", 30, 30);                 // test function
+      }
       //
       // and we have a few cases with higher limits as well:
       //
@@ -251,7 +254,7 @@ void expected_results()
          ".*(JN|j).*|.*Tricky.*",       // test data group
          ".*", 33000, 20000);               // test function
    }
-   else BOOST_IF_CONSTEXPR (std::numeric_limits<long double>::digits >= 90)
+   else BOOST_IF_CONSTEXPR (boost::math::policies::promote_double<>() && std::numeric_limits<long double>::digits >= 90)
    {
       add_expected_result(
          ".*",                          // compiler
diff --git a/test/test_bessel_j_prime.cpp b/test/test_bessel_j_prime.cpp
index d4641bbd48..3a22434452 100644
--- a/test/test_bessel_j_prime.cpp
+++ b/test/test_bessel_j_prime.cpp
@@ -38,7 +38,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
@@ -177,7 +177,7 @@ void expected_results()
 
 
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if((std::numeric_limits<double>::digits != std::numeric_limits<long double>::digits)
+   if(boost::math::policies::promote_double<>() && (std::numeric_limits<double>::digits != std::numeric_limits<long double>::digits)
       && (std::numeric_limits<long double>::digits < 90))
    {
       // some errors spill over into type double as well:
diff --git a/test/test_bessel_k.cpp b/test/test_bessel_k.cpp
index 6c31f5ab05..3926fd63b2 100644
--- a/test/test_bessel_k.cpp
+++ b/test/test_bessel_k.cpp
@@ -58,7 +58,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
diff --git a/test/test_bessel_k_prime.cpp b/test/test_bessel_k_prime.cpp
index 6d69268f85..a9e03d0387 100644
--- a/test/test_bessel_k_prime.cpp
+++ b/test/test_bessel_k_prime.cpp
@@ -43,7 +43,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
diff --git a/test/test_bessel_y.cpp b/test/test_bessel_y.cpp
index 8251920c5b..836c67b45f 100644
--- a/test/test_bessel_y.cpp
+++ b/test/test_bessel_y.cpp
@@ -51,7 +51,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
@@ -201,7 +201,7 @@ void expected_results()
       ".*", 2000, 2000);         // test function
 
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   BOOST_IF_CONSTEXPR((std::numeric_limits<double>::digits != std::numeric_limits<long double>::digits)
+   BOOST_IF_CONSTEXPR(boost::math::policies::promote_double<>() && (std::numeric_limits<double>::digits != std::numeric_limits<long double>::digits)
       && (std::numeric_limits<long double>::digits < 90))
    {
       // some errors spill over into type double as well:
@@ -220,7 +220,7 @@ void expected_results()
          ".*Yv.*",              // test data group
          ".*", 80, 70);         // test function
    }
-   else BOOST_IF_CONSTEXPR(std::numeric_limits<long double>::digits >= 90)
+   else BOOST_IF_CONSTEXPR(boost::math::policies::promote_double<>() && std::numeric_limits<long double>::digits >= 90)
    {
       add_expected_result(
          ".*",                          // compiler
diff --git a/test/test_bessel_y_prime.cpp b/test/test_bessel_y_prime.cpp
index 9848b63356..4d99259cd6 100644
--- a/test/test_bessel_y_prime.cpp
+++ b/test/test_bessel_y_prime.cpp
@@ -38,7 +38,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
@@ -220,7 +220,7 @@ void expected_results()
       ".*", 2000, 2000);         // test function
 
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if((std::numeric_limits<double>::digits != std::numeric_limits<long double>::digits)
+   if(boost::math::policies::promote_double<>() && (std::numeric_limits<double>::digits != std::numeric_limits<long double>::digits)
       && (std::numeric_limits<long double>::digits < 90))
    {
       // some errors spill over into type double as well:
diff --git a/test/test_binomial_coeff.cpp b/test/test_binomial_coeff.cpp
index 552fcda946..3659da55ee 100644
--- a/test/test_binomial_coeff.cpp
+++ b/test/test_binomial_coeff.cpp
@@ -36,7 +36,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_carlson.cpp b/test/test_carlson.cpp
index 41b16fae61..e4512f980a 100644
--- a/test/test_carlson.cpp
+++ b/test/test_carlson.cpp
@@ -43,7 +43,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_cbrt.cpp b/test/test_cbrt.cpp
index 6abb9bd885..4b23d6390c 100644
--- a/test/test_cbrt.cpp
+++ b/test/test_cbrt.cpp
@@ -46,7 +46,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
diff --git a/test/test_ellint_1.cpp b/test/test_ellint_1.cpp
index 9366e4545a..af953165ac 100644
--- a/test/test_ellint_1.cpp
+++ b/test/test_ellint_1.cpp
@@ -48,7 +48,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_ellint_2.cpp b/test/test_ellint_2.cpp
index 0da012c133..8cc6317000 100644
--- a/test/test_ellint_2.cpp
+++ b/test/test_ellint_2.cpp
@@ -44,7 +44,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_ellint_3.cpp b/test/test_ellint_3.cpp
index 18b82e6488..bad1d342ba 100644
--- a/test/test_ellint_3.cpp
+++ b/test/test_ellint_3.cpp
@@ -41,7 +41,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
diff --git a/test/test_ellint_d.cpp b/test/test_ellint_d.cpp
index 420bc0c022..6930dc24b4 100644
--- a/test/test_ellint_d.cpp
+++ b/test/test_ellint_d.cpp
@@ -42,7 +42,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_gamma.cpp b/test/test_gamma.cpp
index fb86080d72..98345e7f53 100644
--- a/test/test_gamma.cpp
+++ b/test/test_gamma.cpp
@@ -43,7 +43,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_hermite.cpp b/test/test_hermite.cpp
index 60dafdb8f1..28fd2b02b7 100644
--- a/test/test_hermite.cpp
+++ b/test/test_hermite.cpp
@@ -47,7 +47,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_heuman_lambda.cpp b/test/test_heuman_lambda.cpp
index cdcf39aa68..98b748026d 100644
--- a/test/test_heuman_lambda.cpp
+++ b/test/test_heuman_lambda.cpp
@@ -42,7 +42,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_hypergeometric_dist.cpp b/test/test_hypergeometric_dist.cpp
index 961e5394a6..8a59ed1ed1 100644
--- a/test/test_hypergeometric_dist.cpp
+++ b/test/test_hypergeometric_dist.cpp
@@ -57,7 +57,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
@@ -69,7 +69,7 @@ void expected_results()
    largest_type = "(long\\s+)?double";
 #endif
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if((boost::math::tools::digits<long double>() > boost::math::tools::digits<double>())
+   if(boost::math::policies::promote_double<>() && (boost::math::tools::digits<long double>() > boost::math::tools::digits<double>())
       && (boost::math::tools::digits<long double>() < 100))
    {
       //
diff --git a/test/test_ibeta.cpp b/test/test_ibeta.cpp
index 987b361105..a53e4d0bfa 100644
--- a/test/test_ibeta.cpp
+++ b/test/test_ibeta.cpp
@@ -56,7 +56,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_ibeta_derivative.cpp b/test/test_ibeta_derivative.cpp
index 5d6a312754..70081193d2 100644
--- a/test/test_ibeta_derivative.cpp
+++ b/test/test_ibeta_derivative.cpp
@@ -48,7 +48,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
diff --git a/test/test_ibeta_inv.cpp b/test/test_ibeta_inv.cpp
index ab1f4267fc..9b4a7339af 100644
--- a/test/test_ibeta_inv.cpp
+++ b/test/test_ibeta_inv.cpp
@@ -67,7 +67,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
@@ -87,6 +87,8 @@ void expected_results()
    //
    if(std::numeric_limits<long double>::digits == 64)
    {
+      if(boost::math::policies::promote_double<>())
+      {
       add_expected_result(
          ".*",                          // compiler
          ".*",                          // stdlib
@@ -94,6 +96,7 @@ void expected_results()
          "double",                      // test type(s)
          ".*",                          // test data group
          ".*", 20, 10);            // test function
+      }
       add_expected_result(
          ".*",                          // compiler
          ".*",                          // stdlib
diff --git a/test/test_ibeta_inv_ab.cpp b/test/test_ibeta_inv_ab.cpp
index fdf735ef1e..26d34ca80e 100644
--- a/test/test_ibeta_inv_ab.cpp
+++ b/test/test_ibeta_inv_ab.cpp
@@ -55,7 +55,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_igamma.cpp b/test/test_igamma.cpp
index 6e034f3c60..3be05bb814 100644
--- a/test/test_igamma.cpp
+++ b/test/test_igamma.cpp
@@ -49,7 +49,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_igamma_inv.cpp b/test/test_igamma_inv.cpp
index 80a553427c..c8ff058ef3 100644
--- a/test/test_igamma_inv.cpp
+++ b/test/test_igamma_inv.cpp
@@ -59,7 +59,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_jacobi.cpp b/test/test_jacobi.cpp
index d4e7cc0aa8..6c5ccaadf8 100644
--- a/test/test_jacobi.cpp
+++ b/test/test_jacobi.cpp
@@ -39,7 +39,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
diff --git a/test/test_jacobi_zeta.cpp b/test/test_jacobi_zeta.cpp
index c64f99580e..890d06f2e7 100644
--- a/test/test_jacobi_zeta.cpp
+++ b/test/test_jacobi_zeta.cpp
@@ -42,7 +42,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_laguerre.cpp b/test/test_laguerre.cpp
index e4290c7a1a..3cde95bcf2 100644
--- a/test/test_laguerre.cpp
+++ b/test/test_laguerre.cpp
@@ -38,7 +38,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
@@ -54,7 +54,7 @@ void expected_results()
    // even though the implementation contains nothing but basic
    // arithmetic?
    //
-   if((std::numeric_limits<long double>::digits <= 64)
+   if(boost::math::policies::promote_double<>() && (std::numeric_limits<long double>::digits <= 64)
       && (std::numeric_limits<long double>::digits != std::numeric_limits<double>::digits))
    {
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
diff --git a/test/test_legendre.cpp b/test/test_legendre.cpp
index 7551fdd605..f043b81400 100644
--- a/test/test_legendre.cpp
+++ b/test/test_legendre.cpp
@@ -38,7 +38,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
@@ -52,7 +52,7 @@ void expected_results()
    //
    // Linux:
    //
-   if((std::numeric_limits<long double>::digits <= 64)
+   if(boost::math::policies::promote_double<>() && (std::numeric_limits<long double>::digits <= 64)
       && (std::numeric_limits<long double>::digits != std::numeric_limits<double>::digits))
    {
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
diff --git a/test/test_nc_beta.cpp b/test/test_nc_beta.cpp
index 105db62a3e..9e0f9a059e 100644
--- a/test/test_nc_beta.cpp
+++ b/test/test_nc_beta.cpp
@@ -63,22 +63,19 @@ void expected_results()
    // Define the max and mean errors expected for
    // various compilers and platforms.
    //
-   const char* largest_type;
+   const char* largest_type = "(long\\s+)?double|real_concept";
+   const char* non_promoted_type = largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
-   {
-      largest_type = "(long\\s+)?double|real_concept";
-   }
-   else
+   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() != boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "long double|real_concept";
+      if (boost::math::policies::promote_double<>())
+         non_promoted_type = largest_type;
    }
-#else
-   largest_type = "(long\\s+)?double|real_concept";
 #endif
 
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::tools::digits<long double>() == 64)
+   if(boost::math::policies::promote_double<>() && boost::math::tools::digits<long double>() == 64)
    {
       //
       // Allow a small amount of error leakage from long double to double:
@@ -117,7 +114,7 @@ void expected_results()
       "[^|]*",                          // compiler
       "[^|]*",                          // stdlib
       "[^|]*",                          // platform
-      largest_type,                     // test type(s)
+      non_promoted_type,                // test type(s)
       "[^|]*medium[^|]*",               // test data group
       "[^|]*", 1500, 500);               // test function
    add_expected_result(
@@ -131,7 +128,7 @@ void expected_results()
       "[^|]*",                          // compiler
       "[^|]*",                          // stdlib
       "[^|]*",                          // platform
-      largest_type,                     // test type(s)
+      non_promoted_type,                // test type(s)
       "[^|]*large[^|]*",                // test data group
       "[^|]*", 20000, 2000);             // test function
    //
diff --git a/test/test_nc_chi_squared.cpp b/test/test_nc_chi_squared.cpp
index 0d6f261fa3..a39d0fc9f0 100644
--- a/test/test_nc_chi_squared.cpp
+++ b/test/test_nc_chi_squared.cpp
@@ -68,7 +68,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
diff --git a/test/test_nc_t.cpp b/test/test_nc_t.cpp
index 8a12635de7..d48c25115b 100644
--- a/test/test_nc_t.cpp
+++ b/test/test_nc_t.cpp
@@ -53,7 +53,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
diff --git a/test/test_owens_t.cpp b/test/test_owens_t.cpp
index 11389dd205..9902da70e5 100644
--- a/test/test_owens_t.cpp
+++ b/test/test_owens_t.cpp
@@ -73,7 +73,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
diff --git a/test/test_polygamma.cpp b/test/test_polygamma.cpp
index 276fc9fd14..d90baabe5a 100644
--- a/test/test_polygamma.cpp
+++ b/test/test_polygamma.cpp
@@ -15,7 +15,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double|real_concept";
    }
@@ -51,7 +51,7 @@ void expected_results()
       ".*negative.*",                // test data group
       ".*", 800, 500);               // test function
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if((std::numeric_limits<long double>::digits > std::numeric_limits<double>::digits)
+   if(boost::math::policies::promote_double<>() && (std::numeric_limits<long double>::digits > std::numeric_limits<double>::digits)
       && (std::numeric_limits<long double>::digits - std::numeric_limits<double>::digits < 20))
    {
       add_expected_result(
diff --git a/test/test_spherical_harmonic.cpp b/test/test_spherical_harmonic.cpp
index baeba51c22..cc0509a205 100644
--- a/test/test_spherical_harmonic.cpp
+++ b/test/test_spherical_harmonic.cpp
@@ -50,7 +50,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
@@ -62,7 +62,7 @@ void expected_results()
    largest_type = "(long\\s+)?double";
 #endif
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if((std::numeric_limits<long double>::digits <= 64) &&
+   if(boost::math::policies::promote_double<>() && (std::numeric_limits<long double>::digits <= 64) &&
       (std::numeric_limits<long double>::digits != std::numeric_limits<double>::digits))
    {
       add_expected_result(
diff --git a/test/test_tgamma_ratio.cpp b/test/test_tgamma_ratio.cpp
index 4a7fa982a5..9da13c5137 100644
--- a/test/test_tgamma_ratio.cpp
+++ b/test/test_tgamma_ratio.cpp
@@ -35,7 +35,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }
diff --git a/test/test_zeta.cpp b/test/test_zeta.cpp
index b1c4d23ac8..b1a1e4281b 100644
--- a/test/test_zeta.cpp
+++ b/test/test_zeta.cpp
@@ -39,7 +39,7 @@ void expected_results()
    //
    const char* largest_type;
 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
-   if(boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
+   if(!boost::math::policies::promote_double<>() || boost::math::policies::digits<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >())
    {
       largest_type = "(long\\s+)?double";
    }