diff --git a/stan/math/prim/prob/normal_lccdf.hpp b/stan/math/prim/prob/normal_lccdf.hpp index 123dced2a60..b3f62e9bd29 100644 --- a/stan/math/prim/prob/normal_lccdf.hpp +++ b/stan/math/prim/prob/normal_lccdf.hpp @@ -1,19 +1,7 @@ #ifndef STAN_MATH_PRIM_PROB_NORMAL_LCCDF_HPP #define STAN_MATH_PRIM_PROB_NORMAL_LCCDF_HPP -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include namespace stan { namespace math { @@ -24,74 +12,7 @@ template normal_lccdf(const T_y& y, const T_loc& mu, const T_scale& sigma) { - using T_partials_return = partials_return_t; - using std::exp; - using std::log; - using T_y_ref = ref_type_t; - using T_mu_ref = ref_type_t; - using T_sigma_ref = ref_type_t; - static constexpr const char* function = "normal_lccdf"; - check_consistent_sizes(function, "Random variable", y, "Location parameter", - mu, "Scale parameter", sigma); - T_y_ref y_ref = y; - T_mu_ref mu_ref = mu; - T_sigma_ref sigma_ref = sigma; - check_not_nan(function, "Random variable", y_ref); - check_finite(function, "Location parameter", mu_ref); - check_positive(function, "Scale parameter", sigma_ref); - - if (size_zero(y, mu, sigma)) { - return 0; - } - - T_partials_return ccdf_log(0.0); - auto ops_partials = make_partials_propagator(y_ref, mu_ref, sigma_ref); - - scalar_seq_view y_vec(y_ref); - scalar_seq_view mu_vec(mu_ref); - scalar_seq_view sigma_vec(sigma_ref); - size_t N = max_size(y, mu, sigma); - - for (size_t n = 0; n < N; n++) { - const T_partials_return y_dbl = y_vec.val(n); - const T_partials_return mu_dbl = mu_vec.val(n); - const T_partials_return sigma_dbl = sigma_vec.val(n); - - const T_partials_return scaled_diff - = (y_dbl - mu_dbl) / (sigma_dbl * SQRT_TWO); - - T_partials_return one_m_erf; - if (scaled_diff < -37.5 * INV_SQRT_TWO) { - one_m_erf = 2.0; - } else if (scaled_diff < -5.0 * INV_SQRT_TWO) { - one_m_erf = 2.0 - erfc(-scaled_diff); - } else if (scaled_diff > 8.25 * INV_SQRT_TWO) { - one_m_erf = 0.0; - } else { - one_m_erf = 1.0 - erf(scaled_diff); - } - - ccdf_log += LOG_HALF + log(one_m_erf); - - if constexpr (is_any_autodiff_v) { - const T_partials_return rep_deriv_div_sigma - = scaled_diff > 8.25 * INV_SQRT_TWO - ? INFTY - : SQRT_TWO_OVER_SQRT_PI * exp(-scaled_diff * scaled_diff) - / one_m_erf / sigma_dbl; - if constexpr (is_autodiff_v) { - partials<0>(ops_partials)[n] -= rep_deriv_div_sigma; - } - if constexpr (is_autodiff_v) { - partials<1>(ops_partials)[n] += rep_deriv_div_sigma; - } - if constexpr (is_autodiff_v) { - partials<2>(ops_partials)[n] - += rep_deriv_div_sigma * scaled_diff * SQRT_TWO; - } - } - } - return ops_partials.build(ccdf_log); + return normal_lcdf(-as_array_or_scalar(y), -as_array_or_scalar(mu), sigma); } } // namespace math diff --git a/stan/math/prim/prob/std_normal_lccdf.hpp b/stan/math/prim/prob/std_normal_lccdf.hpp index 9ee17d204b0..8978a7fd082 100644 --- a/stan/math/prim/prob/std_normal_lccdf.hpp +++ b/stan/math/prim/prob/std_normal_lccdf.hpp @@ -1,19 +1,7 @@ #ifndef STAN_MATH_PRIM_PROB_STD_NORMAL_LCCDF_HPP #define STAN_MATH_PRIM_PROB_STD_NORMAL_LCCDF_HPP -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include namespace stan { namespace math { @@ -22,51 +10,7 @@ template < typename T_y, require_all_not_nonscalar_prim_or_rev_kernel_expression_t* = nullptr> inline return_type_t std_normal_lccdf(const T_y& y) { - using T_partials_return = partials_return_t; - using std::exp; - using std::log; - using T_y_ref = ref_type_t; - static constexpr const char* function = "std_normal_lccdf"; - T_y_ref y_ref = y; - check_not_nan(function, "Random variable", y_ref); - - if (size_zero(y)) { - return 0; - } - - T_partials_return lccdf(0.0); - auto ops_partials = make_partials_propagator(y_ref); - - scalar_seq_view y_vec(y_ref); - size_t N = stan::math::size(y); - - for (size_t n = 0; n < N; n++) { - const T_partials_return y_dbl = y_vec.val(n); - const T_partials_return scaled_y = y_dbl * INV_SQRT_TWO; - - T_partials_return one_m_erf; - if (y_dbl < -37.5) { - one_m_erf = 2.0; - } else if (y_dbl < -5.0) { - one_m_erf = 2.0 - erfc(-scaled_y); - } else if (y_dbl > 8.25) { - one_m_erf = 0.0; - } else { - one_m_erf = 1.0 - erf(scaled_y); - } - - lccdf += LOG_HALF + log(one_m_erf); - - if constexpr (is_autodiff_v) { - const T_partials_return rep_deriv - = y_dbl > 8.25 - ? INFTY - : SQRT_TWO_OVER_SQRT_PI * exp(-scaled_y * scaled_y) / one_m_erf; - partials<0>(ops_partials)[n] -= rep_deriv; - } - } - - return ops_partials.build(lccdf); + return std_normal_lcdf(-as_array_or_scalar(y)); } } // namespace math diff --git a/test/unit/math/prim/prob/normal_ccdf_log_test.cpp b/test/unit/math/prim/prob/normal_ccdf_log_test.cpp index cc17ed90eab..2649ee5747f 100644 --- a/test/unit/math/prim/prob/normal_ccdf_log_test.cpp +++ b/test/unit/math/prim/prob/normal_ccdf_log_test.cpp @@ -16,34 +16,113 @@ TEST(ProbNormal, ccdf_log_matches_lccdf) { TEST(ProbNormal, lccdf_tail) { using stan::math::normal_lccdf; - EXPECT_FLOAT_EQ(-6.661338147750941214694e-16, normal_lccdf(-8.0, 0, 1)); - EXPECT_FLOAT_EQ(-3.186340080674249758114e-14, normal_lccdf(-7.5, 0, 1)); - EXPECT_FLOAT_EQ(-1.279865102788699562477e-12, normal_lccdf(-7.0, 0, 1)); - EXPECT_FLOAT_EQ(-4.015998644826973564545e-11, normal_lccdf(-6.5, 0, 1)); - EXPECT_FLOAT_EQ(-9.865877009111571184118e-10, normal_lccdf(-6.0, 0, 1)); - EXPECT_FLOAT_EQ(-1.898956265833514866414e-08, normal_lccdf(-5.5, 0, 1)); - EXPECT_FLOAT_EQ(-2.866516130081049047962e-07, normal_lccdf(-5.0, 0, 1)); - EXPECT_FLOAT_EQ(-3.397678896843115195074e-06, normal_lccdf(-4.5, 0, 1)); - EXPECT_FLOAT_EQ(-3.167174337748932124543e-05, normal_lccdf(-4.0, 0, 1)); - EXPECT_FLOAT_EQ(-0.0002326561413768195969113, normal_lccdf(-3.5, 0, 1)); - EXPECT_FLOAT_EQ(-0.001350809964748202673598, normal_lccdf(-3.0, 0, 1)); - EXPECT_FLOAT_EQ(-0.0062290254858600267035, normal_lccdf(-2.5, 0, 1)); - EXPECT_FLOAT_EQ(-0.02301290932896348992442, normal_lccdf(-2.0, 0, 1)); - EXPECT_FLOAT_EQ(-0.06914345561223400604689, normal_lccdf(-1.5, 0, 1)); - EXPECT_FLOAT_EQ(-0.1727537790234499048836, normal_lccdf(-1.0, 0, 1)); + // The test values come from 4.6.1 + // + // q <- seq(-10, 37.5, by = 0.5) + // for (i in 1:length(q)) { + // cat( + // sprintf( + // "EXPECT_FLOAT_EQ(%.22g, normal_lccdf(%.1f, 0, 1));\n", + // pnorm(q[i], lower.tail = FALSE, log.p = TRUE), + // q[i] + // ) + // ) + // } + + EXPECT_FLOAT_EQ(-7.619853024160526919908e-24, normal_lccdf(-10.0, 0, 1)); + EXPECT_FLOAT_EQ(-1.049451507536260815732e-21, normal_lccdf(-9.5, 0, 1)); + EXPECT_FLOAT_EQ(-1.128588405953840782741e-19, normal_lccdf(-9.0, 0, 1)); + EXPECT_FLOAT_EQ(-9.479534822203319190782e-18, normal_lccdf(-8.5, 0, 1)); + EXPECT_FLOAT_EQ(-6.220960574271786832586e-16, normal_lccdf(-8.0, 0, 1)); + EXPECT_FLOAT_EQ(-3.19089167291094746711e-14, normal_lccdf(-7.5, 0, 1)); + EXPECT_FLOAT_EQ(-1.279812543886654064677e-12, normal_lccdf(-7.0, 0, 1)); + EXPECT_FLOAT_EQ(-4.016000583939758853991e-11, normal_lccdf(-6.5, 0, 1)); + EXPECT_FLOAT_EQ(-9.865876455243755941787e-10, normal_lccdf(-6.0, 0, 1)); + EXPECT_FLOAT_EQ(-1.898956264618946382412e-08, normal_lccdf(-5.5, 0, 1)); + EXPECT_FLOAT_EQ(-2.866516129637635770404e-07, normal_lccdf(-5.0, 0, 1)); + EXPECT_FLOAT_EQ(-3.397678896834465718134e-06, normal_lccdf(-4.5, 0, 1)); + EXPECT_FLOAT_EQ(-3.167174337748926703532e-05, normal_lccdf(-4.0, 0, 1)); + EXPECT_FLOAT_EQ(-0.0002326561413768044451859, normal_lccdf(-3.5, 0, 1)); + EXPECT_FLOAT_EQ(-0.001350809964748193783141, normal_lccdf(-3.0, 0, 1)); + EXPECT_FLOAT_EQ(-0.006229025485860002417371, normal_lccdf(-2.5, 0, 1)); + EXPECT_FLOAT_EQ(-0.02301290932896349339387, normal_lccdf(-2.0, 0, 1)); + EXPECT_FLOAT_EQ(-0.0691434556122339921691, normal_lccdf(-1.5, 0, 1)); + EXPECT_FLOAT_EQ(-0.172753779023449877128, normal_lccdf(-1.0, 0, 1)); EXPECT_FLOAT_EQ(-0.3689464152886565151412, normal_lccdf(-0.5, 0, 1)); - EXPECT_FLOAT_EQ(-0.6931471805599452862268, normal_lccdf(0, 0, 1)); - EXPECT_FLOAT_EQ(-1.175911761593618320987, normal_lccdf(0.5, 0, 1)); - EXPECT_FLOAT_EQ(-1.841021645009263352222, normal_lccdf(1.0, 0, 1)); - EXPECT_FLOAT_EQ(-2.705944400823889317564, normal_lccdf(1.5, 0, 1)); - EXPECT_FLOAT_EQ(-3.78318433368203210776, normal_lccdf(2.0, 0, 1)); - EXPECT_FLOAT_EQ(-5.081648277278686620662, normal_lccdf(2.5, 0, 1)); - EXPECT_FLOAT_EQ(-6.607726221510342945464, normal_lccdf(3.0, 0, 1)); - EXPECT_FLOAT_EQ(-8.366065308344028395027, normal_lccdf(3.5, 0, 1)); - EXPECT_FLOAT_EQ(-10.36010148652728979357, normal_lccdf(4.0, 0, 1)); - EXPECT_FLOAT_EQ(-12.59241973571053385683, normal_lccdf(4.5, 0, 1)); - EXPECT_FLOAT_EQ(-15.06499839383403838156, normal_lccdf(5.0, 0, 1)); - EXPECT_FLOAT_EQ(-17.77937635198566113104, normal_lccdf(5.5, 0, 1)); - EXPECT_FLOAT_EQ(-20.73676889383495947072, normal_lccdf(6.0, 0, 1)); - EXPECT_FLOAT_EQ(-23.93814997800869548428, normal_lccdf(6.5, 0, 1)); + EXPECT_FLOAT_EQ(-0.6931471805599452862268, normal_lccdf(0.0, 0, 1)); + EXPECT_FLOAT_EQ(-1.175911761593618543031, normal_lccdf(0.5, 0, 1)); + EXPECT_FLOAT_EQ(-1.841021645009263574266, normal_lccdf(1.0, 0, 1)); + EXPECT_FLOAT_EQ(-2.705944400823889761654, normal_lccdf(1.5, 0, 1)); + EXPECT_FLOAT_EQ(-3.78318433368203166367, normal_lccdf(2.0, 0, 1)); + EXPECT_FLOAT_EQ(-5.081648277278690173375, normal_lccdf(2.5, 0, 1)); + EXPECT_FLOAT_EQ(-6.607726221510349162713, normal_lccdf(3.0, 0, 1)); + EXPECT_FLOAT_EQ(-8.36606530834409412023, normal_lccdf(3.5, 0, 1)); + EXPECT_FLOAT_EQ(-10.36010148652729156993, normal_lccdf(4.0, 0, 1)); + EXPECT_FLOAT_EQ(-12.59241973571307937618, normal_lccdf(4.5, 0, 1)); + EXPECT_FLOAT_EQ(-15.06499839398872531149, normal_lccdf(5.0, 0, 1)); + EXPECT_FLOAT_EQ(-17.77937635262525972735, normal_lccdf(5.5, 0, 1)); + EXPECT_FLOAT_EQ(-20.73676894997470654403, normal_lccdf(6.0, 0, 1)); + EXPECT_FLOAT_EQ(-23.93814949516183787637, normal_lccdf(6.5, 0, 1)); + EXPECT_FLOAT_EQ(-27.38430749881107573174, normal_lccdf(7.0, 0, 1)); + EXPECT_FLOAT_EQ(-31.07589090289000210987, normal_lccdf(7.5, 0, 1)); + EXPECT_FLOAT_EQ(-35.0134371599145524101, normal_lccdf(8.0, 0, 1)); + EXPECT_FLOAT_EQ(-39.19739642821767233727, normal_lccdf(8.5, 0, 1)); + EXPECT_FLOAT_EQ(-43.62814911333211398414, normal_lccdf(9.0, 0, 1)); + EXPECT_FLOAT_EQ(-48.30601929896523216712, normal_lccdf(9.5, 0, 1)); + EXPECT_FLOAT_EQ(-53.23128515051246978373, normal_lccdf(10.0, 0, 1)); + EXPECT_FLOAT_EQ(-58.40418706107324453569, normal_lccdf(10.5, 0, 1)); + EXPECT_FLOAT_EQ(-63.82493409442371756768, normal_lccdf(11.0, 0, 1)); + EXPECT_FLOAT_EQ(-69.49370912909535036306, normal_lccdf(11.5, 0, 1)); + EXPECT_FLOAT_EQ(-75.41067300156879582573, normal_lccdf(12.0, 0, 1)); + EXPECT_FLOAT_EQ(-81.57596787074388089422, normal_lccdf(12.5, 0, 1)); + EXPECT_FLOAT_EQ(-87.98971997102252373679, normal_lccdf(13.0, 0, 1)); + EXPECT_FLOAT_EQ(-94.65204188128289786164, normal_lccdf(13.5, 0, 1)); + EXPECT_FLOAT_EQ(-101.5630344074499618046, normal_lccdf(14.0, 0, 1)); + EXPECT_FLOAT_EQ(-108.7227881543204688342, normal_lccdf(14.5, 0, 1)); + EXPECT_FLOAT_EQ(-116.1313848457116932877, normal_lccdf(15.0, 0, 1)); + EXPECT_FLOAT_EQ(-123.788898439410374408, normal_lccdf(15.5, 0, 1)); + EXPECT_FLOAT_EQ(-131.6953960737596958097, normal_lccdf(16.0, 0, 1)); + EXPECT_FLOAT_EQ(-139.850938875285208951, normal_lccdf(16.5, 0, 1)); + EXPECT_FLOAT_EQ(-148.255582650980386461, normal_lccdf(17.0, 0, 1)); + EXPECT_FLOAT_EQ(-156.9093784843464050027, normal_lccdf(17.5, 0, 1)); + EXPECT_FLOAT_EQ(-165.8123732507141880888, normal_lccdf(18.0, 0, 1)); + EXPECT_FLOAT_EQ(-174.9646100645466049173, normal_lccdf(18.5, 0, 1)); + EXPECT_FLOAT_EQ(-184.3661286691609575428, normal_lccdf(19.0, 0, 1)); + EXPECT_FLOAT_EQ(-194.0169657774974893982, normal_lccdf(19.5, 0, 1)); + EXPECT_FLOAT_EQ(-203.9171553710972659701, normal_lccdf(20.0, 0, 1)); + EXPECT_FLOAT_EQ(-214.066728963263813057, normal_lccdf(20.5, 0, 1)); + EXPECT_FLOAT_EQ(-224.4657158314144851374, normal_lccdf(21.0, 0, 1)); + EXPECT_FLOAT_EQ(-235.114143222833007485, normal_lccdf(21.5, 0, 1)); + EXPECT_FLOAT_EQ(-246.0120365373809079301, normal_lccdf(22.0, 0, 1)); + EXPECT_FLOAT_EQ(-257.1594194901841774481, normal_lccdf(22.5, 0, 1)); + EXPECT_FLOAT_EQ(-268.5563142568631178619, normal_lccdf(23.0, 0, 1)); + EXPECT_FLOAT_EQ(-280.2027416034976567971, normal_lccdf(23.5, 0, 1)); + EXPECT_FLOAT_EQ(-292.0987210032077996402, normal_lccdf(24.0, 0, 1)); + EXPECT_FLOAT_EQ(-304.2442707409637137062, normal_lccdf(24.5, 0, 1)); + EXPECT_FLOAT_EQ(-316.6394080080202684258, normal_lccdf(25.0, 0, 1)); + EXPECT_FLOAT_EQ(-329.2841489871795488398, normal_lccdf(25.5, 0, 1)); + EXPECT_FLOAT_EQ(-342.1785089299278297403, normal_lccdf(26.0, 0, 1)); + EXPECT_FLOAT_EQ(-355.3225022263559935709, normal_lccdf(26.5, 0, 1)); + EXPECT_FLOAT_EQ(-368.7161424686563577779, normal_lccdf(27.0, 0, 1)); + EXPECT_FLOAT_EQ(-382.3594425088898560716, normal_lccdf(27.5, 0, 1)); + EXPECT_FLOAT_EQ(-396.252414511631059213, normal_lccdf(28.0, 0, 1)); + EXPECT_FLOAT_EQ(-410.3950700020255908385, normal_lccdf(28.5, 0, 1)); + EXPECT_FLOAT_EQ(-424.7874199097301470829, normal_lccdf(29.0, 0, 1)); + EXPECT_FLOAT_EQ(-439.4294746091502474883, normal_lccdf(29.5, 0, 1)); + EXPECT_FLOAT_EQ(-454.3212439563432099021, normal_lccdf(30.0, 0, 1)); + EXPECT_FLOAT_EQ(-469.4627373229121189979, normal_lccdf(30.5, 0, 1)); + EXPECT_FLOAT_EQ(-484.8539636271792687694, normal_lccdf(31.0, 0, 1)); + EXPECT_FLOAT_EQ(-500.494931362897091276, normal_lccdf(31.5, 0, 1)); + EXPECT_FLOAT_EQ(-516.3856486257253664007, normal_lccdf(32.0, 0, 1)); + EXPECT_FLOAT_EQ(-532.5261231376803152671, normal_lccdf(32.5, 0, 1)); + EXPECT_FLOAT_EQ(-548.9163622697381015314, normal_lccdf(33.0, 0, 1)); + EXPECT_FLOAT_EQ(-565.5563730627579843713, normal_lccdf(33.5, 0, 1)); + EXPECT_FLOAT_EQ(-582.4461622468717223455, normal_lccdf(34.0, 0, 1)); + EXPECT_FLOAT_EQ(-599.5857362594723554139, normal_lccdf(34.5, 0, 1)); + EXPECT_FLOAT_EQ(-616.9751012619225321032, normal_lccdf(35.0, 0, 1)); + EXPECT_FLOAT_EQ(-634.6142631550883379532, normal_lccdf(35.5, 0, 1)); + EXPECT_FLOAT_EQ(-652.5032275937984422853, normal_lccdf(36.0, 0, 1)); + EXPECT_FLOAT_EQ(-670.642000000313714736, normal_lccdf(36.5, 0, 1)); + EXPECT_FLOAT_EQ(-689.0305855768906440062, normal_lccdf(37.0, 0, 1)); + EXPECT_FLOAT_EQ(-707.6689893175072256781, normal_lccdf(37.5, 0, 1)); } diff --git a/test/unit/math/prim/prob/normal_cdf_log_test.cpp b/test/unit/math/prim/prob/normal_cdf_log_test.cpp index 2cc71187fb1..20bbcd62a45 100644 --- a/test/unit/math/prim/prob/normal_cdf_log_test.cpp +++ b/test/unit/math/prim/prob/normal_cdf_log_test.cpp @@ -18,100 +18,113 @@ TEST(ProbNormal, lcdf_tails) { using stan::math::normal_lcdf; using std::exp; - EXPECT_FLOAT_EQ(4.60535300958196e-308, exp(normal_lcdf(-37.5, 0, 1))); - EXPECT_FLOAT_EQ(5.72557122252458e-300, exp(normal_lcdf(-37, 0, 1))); - EXPECT_FLOAT_EQ(5.54472571307484e-292, exp(normal_lcdf(-36.5, 0, 1))); - EXPECT_FLOAT_EQ(4.18262406579728e-284, exp(normal_lcdf(-36, 0, 1))); - EXPECT_FLOAT_EQ(2.45769154066194e-276, exp(normal_lcdf(-35.5, 0, 1))); - EXPECT_FLOAT_EQ(1.12491070647241e-268, exp(normal_lcdf(-35, 0, 1))); - EXPECT_FLOAT_EQ(4.01072896657726e-261, exp(normal_lcdf(-34.5, 0, 1))); - EXPECT_FLOAT_EQ(1.11389878557438e-253, exp(normal_lcdf(-34, 0, 1))); - EXPECT_FLOAT_EQ(2.40983869512039e-246, exp(normal_lcdf(-33.5, 0, 1))); - EXPECT_FLOAT_EQ(4.06118562091586e-239, exp(normal_lcdf(-33, 0, 1))); - EXPECT_FLOAT_EQ(5.33142435967881e-232, exp(normal_lcdf(-32.5, 0, 1))); - EXPECT_FLOAT_EQ(5.4520806035124e-225, exp(normal_lcdf(-32, 0, 1))); - EXPECT_FLOAT_EQ(4.34323260103177e-218, exp(normal_lcdf(-31.5, 0, 1))); - EXPECT_FLOAT_EQ(2.6952500812005e-211, exp(normal_lcdf(-31, 0, 1))); - EXPECT_FLOAT_EQ(1.30293791317808e-204, exp(normal_lcdf(-30.5, 0, 1))); - EXPECT_FLOAT_EQ(4.90671392714819e-198, exp(normal_lcdf(-30, 0, 1))); - EXPECT_FLOAT_EQ(1.43947455222918e-191, exp(normal_lcdf(-29.5, 0, 1))); - EXPECT_FLOAT_EQ(3.28978526670438e-185, exp(normal_lcdf(-29, 0, 1))); - EXPECT_FLOAT_EQ(5.85714125380634e-179, exp(normal_lcdf(-28.5, 0, 1))); - EXPECT_FLOAT_EQ(8.12386946965943e-173, exp(normal_lcdf(-28, 0, 1))); - EXPECT_FLOAT_EQ(8.77817055687808e-167, exp(normal_lcdf(-27.5, 0, 1))); - EXPECT_FLOAT_EQ(7.38948100688502e-161, exp(normal_lcdf(-27, 0, 1))); - EXPECT_FLOAT_EQ(4.84616266030332e-155, exp(normal_lcdf(-26.5, 0, 1))); - EXPECT_FLOAT_EQ(2.47606331550339e-149, exp(normal_lcdf(-26, 0, 1))); - EXPECT_FLOAT_EQ(9.85623651896393e-144, exp(normal_lcdf(-25.5, 0, 1))); - EXPECT_FLOAT_EQ(3.05669670638256e-138, exp(normal_lcdf(-25, 0, 1))); - EXPECT_FLOAT_EQ(7.38570686148941e-133, exp(normal_lcdf(-24.5, 0, 1))); - EXPECT_FLOAT_EQ(1.3903921185497e-127, exp(normal_lcdf(-24, 0, 1))); - EXPECT_FLOAT_EQ(2.03936756324998e-122, exp(normal_lcdf(-23.5, 0, 1))); - EXPECT_FLOAT_EQ(2.33063700622065e-117, exp(normal_lcdf(-23, 0, 1))); - EXPECT_FLOAT_EQ(2.07531079906636e-112, exp(normal_lcdf(-22.5, 0, 1))); - EXPECT_FLOAT_EQ(1.43989243514508e-107, exp(normal_lcdf(-22, 0, 1))); - EXPECT_FLOAT_EQ(7.78439707718263e-103, exp(normal_lcdf(-21.5, 0, 1))); - EXPECT_FLOAT_EQ(3.27927801897904e-98, exp(normal_lcdf(-21, 0, 1))); - EXPECT_FLOAT_EQ(1.0764673258791e-93, exp(normal_lcdf(-20.5, 0, 1))); - EXPECT_FLOAT_EQ(2.75362411860623e-89, exp(normal_lcdf(-20, 0, 1))); - EXPECT_FLOAT_EQ(5.48911547566041e-85, exp(normal_lcdf(-19.5, 0, 1))); - EXPECT_FLOAT_EQ(8.52722395263098e-81, exp(normal_lcdf(-19, 0, 1))); - EXPECT_FLOAT_EQ(1.03236986895633e-76, exp(normal_lcdf(-18.5, 0, 1))); - EXPECT_FLOAT_EQ(9.74094891893715e-73, exp(normal_lcdf(-18, 0, 1))); - EXPECT_FLOAT_EQ(7.16345876623504e-69, exp(normal_lcdf(-17.5, 0, 1))); - EXPECT_FLOAT_EQ(4.10599620209891e-65, exp(normal_lcdf(-17, 0, 1))); - EXPECT_FLOAT_EQ(1.83446300316473e-61, exp(normal_lcdf(-16.5, 0, 1))); - EXPECT_FLOAT_EQ(6.38875440053809e-58, exp(normal_lcdf(-16, 0, 1))); - EXPECT_FLOAT_EQ(1.73446079179387e-54, exp(normal_lcdf(-15.5, 0, 1))); - EXPECT_FLOAT_EQ(3.67096619931275e-51, exp(normal_lcdf(-15, 0, 1))); - EXPECT_FLOAT_EQ(6.05749476441522e-48, exp(normal_lcdf(-14.5, 0, 1))); - EXPECT_FLOAT_EQ(7.7935368191928e-45, exp(normal_lcdf(-14, 0, 1))); - EXPECT_FLOAT_EQ(7.81880730565789e-42, exp(normal_lcdf(-13.5, 0, 1))); - EXPECT_FLOAT_EQ(6.11716439954988e-39, exp(normal_lcdf(-13, 0, 1))); - EXPECT_FLOAT_EQ(3.73256429887771e-36, exp(normal_lcdf(-12.5, 0, 1))); - EXPECT_FLOAT_EQ(1.77648211207768e-33, exp(normal_lcdf(-12, 0, 1))); - EXPECT_FLOAT_EQ(6.59577144611367e-31, exp(normal_lcdf(-11.5, 0, 1))); - EXPECT_FLOAT_EQ(1.91065957449868e-28, exp(normal_lcdf(-11, 0, 1))); - EXPECT_FLOAT_EQ(4.31900631780923e-26, exp(normal_lcdf(-10.5, 0, 1))); - EXPECT_FLOAT_EQ(7.61985302416053e-24, exp(normal_lcdf(-10, 0, 1))); - EXPECT_FLOAT_EQ(1.04945150753626e-21, exp(normal_lcdf(-9.5, 0, 1))); - EXPECT_FLOAT_EQ(1.12858840595384e-19, exp(normal_lcdf(-9, 0, 1))); - EXPECT_FLOAT_EQ(9.47953482220332e-18, exp(normal_lcdf(-8.5, 0, 1))); - EXPECT_FLOAT_EQ(6.22096057427178e-16, exp(normal_lcdf(-8, 0, 1))); - EXPECT_FLOAT_EQ(3.1908916729109e-14, exp(normal_lcdf(-7.5, 0, 1))); - EXPECT_FLOAT_EQ(1.27981254388584e-12, exp(normal_lcdf(-7, 0, 1))); - EXPECT_FLOAT_EQ(4.01600058385912e-11, exp(normal_lcdf(-6.5, 0, 1))); - EXPECT_FLOAT_EQ(9.86587645037698e-10, exp(normal_lcdf(-6, 0, 1))); - EXPECT_FLOAT_EQ(1.89895624658877e-08, exp(normal_lcdf(-5.5, 0, 1))); - EXPECT_FLOAT_EQ(2.86651571879194e-07, exp(normal_lcdf(-5, 0, 1))); - EXPECT_FLOAT_EQ(3.39767312473006e-06, exp(normal_lcdf(-4.5, 0, 1))); - EXPECT_FLOAT_EQ(3.16712418331199e-05, exp(normal_lcdf(-4, 0, 1))); - EXPECT_FLOAT_EQ(0.000232629079035525, exp(normal_lcdf(-3.5, 0, 1))); - EXPECT_FLOAT_EQ(0.00134989803163009, exp(normal_lcdf(-3, 0, 1))); - EXPECT_FLOAT_EQ(0.00620966532577613, exp(normal_lcdf(-2.5, 0, 1))); - EXPECT_FLOAT_EQ(0.0227501319481792, exp(normal_lcdf(-2, 0, 1))); - EXPECT_FLOAT_EQ(0.0668072012688581, exp(normal_lcdf(-1.5, 0, 1))); - EXPECT_FLOAT_EQ(0.158655253931457, exp(normal_lcdf(-1, 0, 1))); - EXPECT_FLOAT_EQ(0.308537538725987, exp(normal_lcdf(-0.5, 0, 1))); - EXPECT_FLOAT_EQ(0.5, exp(normal_lcdf(0, 0, 1))); - EXPECT_FLOAT_EQ(0.691462461274013, exp(normal_lcdf(0.5, 0, 1))); - EXPECT_FLOAT_EQ(0.841344746068543, exp(normal_lcdf(1, 0, 1))); - EXPECT_FLOAT_EQ(0.933192798731142, exp(normal_lcdf(1.5, 0, 1))); - EXPECT_FLOAT_EQ(0.977249868051821, exp(normal_lcdf(2, 0, 1))); - EXPECT_FLOAT_EQ(0.993790334674224, exp(normal_lcdf(2.5, 0, 1))); - EXPECT_FLOAT_EQ(0.99865010196837, exp(normal_lcdf(3, 0, 1))); - EXPECT_FLOAT_EQ(0.999767370920964, exp(normal_lcdf(3.5, 0, 1))); - EXPECT_FLOAT_EQ(0.999968328758167, exp(normal_lcdf(4, 0, 1))); - EXPECT_FLOAT_EQ(0.999996602326875, exp(normal_lcdf(4.5, 0, 1))); - EXPECT_FLOAT_EQ(0.999999713348428, exp(normal_lcdf(5, 0, 1))); - EXPECT_FLOAT_EQ(0.999999981010438, exp(normal_lcdf(5.5, 0, 1))); - EXPECT_FLOAT_EQ(0.999999999013412, exp(normal_lcdf(6, 0, 1))); - EXPECT_FLOAT_EQ(0.99999999995984, exp(normal_lcdf(6.5, 0, 1))); - EXPECT_FLOAT_EQ(0.99999999999872, exp(normal_lcdf(7, 0, 1))); - EXPECT_FLOAT_EQ(0.999999999999968, exp(normal_lcdf(7.5, 0, 1))); - EXPECT_FLOAT_EQ(0.999999999999999, exp(normal_lcdf(8, 0, 1))); - EXPECT_FLOAT_EQ(1, exp(normal_lcdf(8.5, 0, 1))); - EXPECT_FLOAT_EQ(1, exp(normal_lcdf(9, 0, 1))); - EXPECT_FLOAT_EQ(1, exp(normal_lcdf(9.5, 0, 1))); - EXPECT_FLOAT_EQ(1, exp(normal_lcdf(10, 0, 1))); + // The test values come from R 4.6.1 + // + // q <- seq(-37.5, 10, by = 0.5) + // for (i in 1:length(q)) { + // cat( + // sprintf( + // "EXPECT_FLOAT_EQ(%.22g, normal_lcdf(%.1f, 0, 1));\n", + // pnorm(q[i], lower.tail = TRUE, log.p = TRUE), + // q[i] + // ) + // ) + // } + + EXPECT_FLOAT_EQ(-707.6689893175072256781, normal_lcdf(-37.5, 0, 1)); + EXPECT_FLOAT_EQ(-689.0305855768906440062, normal_lcdf(-37.0, 0, 1)); + EXPECT_FLOAT_EQ(-670.642000000313714736, normal_lcdf(-36.5, 0, 1)); + EXPECT_FLOAT_EQ(-652.5032275937984422853, normal_lcdf(-36.0, 0, 1)); + EXPECT_FLOAT_EQ(-634.6142631550883379532, normal_lcdf(-35.5, 0, 1)); + EXPECT_FLOAT_EQ(-616.9751012619225321032, normal_lcdf(-35.0, 0, 1)); + EXPECT_FLOAT_EQ(-599.5857362594723554139, normal_lcdf(-34.5, 0, 1)); + EXPECT_FLOAT_EQ(-582.4461622468717223455, normal_lcdf(-34.0, 0, 1)); + EXPECT_FLOAT_EQ(-565.5563730627579843713, normal_lcdf(-33.5, 0, 1)); + EXPECT_FLOAT_EQ(-548.9163622697381015314, normal_lcdf(-33.0, 0, 1)); + EXPECT_FLOAT_EQ(-532.5261231376803152671, normal_lcdf(-32.5, 0, 1)); + EXPECT_FLOAT_EQ(-516.3856486257253664007, normal_lcdf(-32.0, 0, 1)); + EXPECT_FLOAT_EQ(-500.494931362897091276, normal_lcdf(-31.5, 0, 1)); + EXPECT_FLOAT_EQ(-484.8539636271792687694, normal_lcdf(-31.0, 0, 1)); + EXPECT_FLOAT_EQ(-469.4627373229121189979, normal_lcdf(-30.5, 0, 1)); + EXPECT_FLOAT_EQ(-454.3212439563432099021, normal_lcdf(-30.0, 0, 1)); + EXPECT_FLOAT_EQ(-439.4294746091502474883, normal_lcdf(-29.5, 0, 1)); + EXPECT_FLOAT_EQ(-424.7874199097301470829, normal_lcdf(-29.0, 0, 1)); + EXPECT_FLOAT_EQ(-410.3950700020255908385, normal_lcdf(-28.5, 0, 1)); + EXPECT_FLOAT_EQ(-396.252414511631059213, normal_lcdf(-28.0, 0, 1)); + EXPECT_FLOAT_EQ(-382.3594425088898560716, normal_lcdf(-27.5, 0, 1)); + EXPECT_FLOAT_EQ(-368.7161424686563577779, normal_lcdf(-27.0, 0, 1)); + EXPECT_FLOAT_EQ(-355.3225022263559935709, normal_lcdf(-26.5, 0, 1)); + EXPECT_FLOAT_EQ(-342.1785089299278297403, normal_lcdf(-26.0, 0, 1)); + EXPECT_FLOAT_EQ(-329.2841489871795488398, normal_lcdf(-25.5, 0, 1)); + EXPECT_FLOAT_EQ(-316.6394080080202684258, normal_lcdf(-25.0, 0, 1)); + EXPECT_FLOAT_EQ(-304.2442707409637137062, normal_lcdf(-24.5, 0, 1)); + EXPECT_FLOAT_EQ(-292.0987210032077996402, normal_lcdf(-24.0, 0, 1)); + EXPECT_FLOAT_EQ(-280.2027416034976567971, normal_lcdf(-23.5, 0, 1)); + EXPECT_FLOAT_EQ(-268.5563142568631178619, normal_lcdf(-23.0, 0, 1)); + EXPECT_FLOAT_EQ(-257.1594194901841774481, normal_lcdf(-22.5, 0, 1)); + EXPECT_FLOAT_EQ(-246.0120365373809079301, normal_lcdf(-22.0, 0, 1)); + EXPECT_FLOAT_EQ(-235.114143222833007485, normal_lcdf(-21.5, 0, 1)); + EXPECT_FLOAT_EQ(-224.4657158314144851374, normal_lcdf(-21.0, 0, 1)); + EXPECT_FLOAT_EQ(-214.066728963263813057, normal_lcdf(-20.5, 0, 1)); + EXPECT_FLOAT_EQ(-203.9171553710972659701, normal_lcdf(-20.0, 0, 1)); + EXPECT_FLOAT_EQ(-194.0169657774974893982, normal_lcdf(-19.5, 0, 1)); + EXPECT_FLOAT_EQ(-184.3661286691609575428, normal_lcdf(-19.0, 0, 1)); + EXPECT_FLOAT_EQ(-174.9646100645466049173, normal_lcdf(-18.5, 0, 1)); + EXPECT_FLOAT_EQ(-165.8123732507141880888, normal_lcdf(-18.0, 0, 1)); + EXPECT_FLOAT_EQ(-156.9093784843464050027, normal_lcdf(-17.5, 0, 1)); + EXPECT_FLOAT_EQ(-148.255582650980386461, normal_lcdf(-17.0, 0, 1)); + EXPECT_FLOAT_EQ(-139.850938875285208951, normal_lcdf(-16.5, 0, 1)); + EXPECT_FLOAT_EQ(-131.6953960737596958097, normal_lcdf(-16.0, 0, 1)); + EXPECT_FLOAT_EQ(-123.788898439410374408, normal_lcdf(-15.5, 0, 1)); + EXPECT_FLOAT_EQ(-116.1313848457116932877, normal_lcdf(-15.0, 0, 1)); + EXPECT_FLOAT_EQ(-108.7227881543204688342, normal_lcdf(-14.5, 0, 1)); + EXPECT_FLOAT_EQ(-101.5630344074499618046, normal_lcdf(-14.0, 0, 1)); + EXPECT_FLOAT_EQ(-94.65204188128289786164, normal_lcdf(-13.5, 0, 1)); + EXPECT_FLOAT_EQ(-87.98971997102252373679, normal_lcdf(-13.0, 0, 1)); + EXPECT_FLOAT_EQ(-81.57596787074388089422, normal_lcdf(-12.5, 0, 1)); + EXPECT_FLOAT_EQ(-75.41067300156879582573, normal_lcdf(-12.0, 0, 1)); + EXPECT_FLOAT_EQ(-69.49370912909535036306, normal_lcdf(-11.5, 0, 1)); + EXPECT_FLOAT_EQ(-63.82493409442371756768, normal_lcdf(-11.0, 0, 1)); + EXPECT_FLOAT_EQ(-58.40418706107324453569, normal_lcdf(-10.5, 0, 1)); + EXPECT_FLOAT_EQ(-53.23128515051246978373, normal_lcdf(-10.0, 0, 1)); + EXPECT_FLOAT_EQ(-48.30601929896523216712, normal_lcdf(-9.5, 0, 1)); + EXPECT_FLOAT_EQ(-43.62814911333211398414, normal_lcdf(-9.0, 0, 1)); + EXPECT_FLOAT_EQ(-39.19739642821767233727, normal_lcdf(-8.5, 0, 1)); + EXPECT_FLOAT_EQ(-35.0134371599145524101, normal_lcdf(-8.0, 0, 1)); + EXPECT_FLOAT_EQ(-31.07589090289000210987, normal_lcdf(-7.5, 0, 1)); + EXPECT_FLOAT_EQ(-27.38430749881107573174, normal_lcdf(-7.0, 0, 1)); + EXPECT_FLOAT_EQ(-23.93814949516183787637, normal_lcdf(-6.5, 0, 1)); + EXPECT_FLOAT_EQ(-20.73676894997470654403, normal_lcdf(-6.0, 0, 1)); + EXPECT_FLOAT_EQ(-17.77937635262525972735, normal_lcdf(-5.5, 0, 1)); + EXPECT_FLOAT_EQ(-15.06499839398872531149, normal_lcdf(-5.0, 0, 1)); + EXPECT_FLOAT_EQ(-12.59241973571307937618, normal_lcdf(-4.5, 0, 1)); + EXPECT_FLOAT_EQ(-10.36010148652729156993, normal_lcdf(-4.0, 0, 1)); + EXPECT_FLOAT_EQ(-8.36606530834409412023, normal_lcdf(-3.5, 0, 1)); + EXPECT_FLOAT_EQ(-6.607726221510349162713, normal_lcdf(-3.0, 0, 1)); + EXPECT_FLOAT_EQ(-5.081648277278690173375, normal_lcdf(-2.5, 0, 1)); + EXPECT_FLOAT_EQ(-3.78318433368203166367, normal_lcdf(-2.0, 0, 1)); + EXPECT_FLOAT_EQ(-2.705944400823889761654, normal_lcdf(-1.5, 0, 1)); + EXPECT_FLOAT_EQ(-1.841021645009263574266, normal_lcdf(-1.0, 0, 1)); + EXPECT_FLOAT_EQ(-1.175911761593618543031, normal_lcdf(-0.5, 0, 1)); + EXPECT_FLOAT_EQ(-0.6931471805599452862268, normal_lcdf(0.0, 0, 1)); + EXPECT_FLOAT_EQ(-0.3689464152886565151412, normal_lcdf(0.5, 0, 1)); + EXPECT_FLOAT_EQ(-0.172753779023449877128, normal_lcdf(1.0, 0, 1)); + EXPECT_FLOAT_EQ(-0.0691434556122339921691, normal_lcdf(1.5, 0, 1)); + EXPECT_FLOAT_EQ(-0.02301290932896349339387, normal_lcdf(2.0, 0, 1)); + EXPECT_FLOAT_EQ(-0.006229025485860002417371, normal_lcdf(2.5, 0, 1)); + EXPECT_FLOAT_EQ(-0.001350809964748193783141, normal_lcdf(3.0, 0, 1)); + EXPECT_FLOAT_EQ(-0.0002326561413768044451859, normal_lcdf(3.5, 0, 1)); + EXPECT_FLOAT_EQ(-3.167174337748926703532e-05, normal_lcdf(4.0, 0, 1)); + EXPECT_FLOAT_EQ(-3.397678896834465718134e-06, normal_lcdf(4.5, 0, 1)); + EXPECT_FLOAT_EQ(-2.866516129637635770404e-07, normal_lcdf(5.0, 0, 1)); + EXPECT_FLOAT_EQ(-1.898956264618946382412e-08, normal_lcdf(5.5, 0, 1)); + EXPECT_FLOAT_EQ(-9.865876455243755941787e-10, normal_lcdf(6.0, 0, 1)); + EXPECT_FLOAT_EQ(-4.016000583939758853991e-11, normal_lcdf(6.5, 0, 1)); + EXPECT_FLOAT_EQ(-1.279812543886654064677e-12, normal_lcdf(7.0, 0, 1)); + EXPECT_FLOAT_EQ(-3.19089167291094746711e-14, normal_lcdf(7.5, 0, 1)); + EXPECT_FLOAT_EQ(-6.220960574271786832586e-16, normal_lcdf(8.0, 0, 1)); + EXPECT_FLOAT_EQ(-9.479534822203319190782e-18, normal_lcdf(8.5, 0, 1)); + EXPECT_FLOAT_EQ(-1.128588405953840782741e-19, normal_lcdf(9.0, 0, 1)); + EXPECT_FLOAT_EQ(-1.049451507536260815732e-21, normal_lcdf(9.5, 0, 1)); + EXPECT_FLOAT_EQ(-7.619853024160526919908e-24, normal_lcdf(10.0, 0, 1)); } diff --git a/test/unit/math/prim/prob/std_normal_ccdf_log_test.cpp b/test/unit/math/prim/prob/std_normal_ccdf_log_test.cpp index 33aafcd71bd..0207eb4ed7b 100644 --- a/test/unit/math/prim/prob/std_normal_ccdf_log_test.cpp +++ b/test/unit/math/prim/prob/std_normal_ccdf_log_test.cpp @@ -13,34 +13,113 @@ TEST(ProbStdNormal, ccdf_log_matches_lccdf) { TEST(ProbStdNormal, lccdf_tail) { using stan::math::std_normal_lccdf; - EXPECT_FLOAT_EQ(-6.661338147750941214694e-16, std_normal_lccdf(-8.0)); - EXPECT_FLOAT_EQ(-3.186340080674249758114e-14, std_normal_lccdf(-7.5)); - EXPECT_FLOAT_EQ(-1.279865102788699562477e-12, std_normal_lccdf(-7.0)); - EXPECT_FLOAT_EQ(-4.015998644826973564545e-11, std_normal_lccdf(-6.5)); - EXPECT_FLOAT_EQ(-9.865877009111571184118e-10, std_normal_lccdf(-6.0)); - EXPECT_FLOAT_EQ(-1.898956265833514866414e-08, std_normal_lccdf(-5.5)); - EXPECT_FLOAT_EQ(-2.866516130081049047962e-07, std_normal_lccdf(-5.0)); - EXPECT_FLOAT_EQ(-3.397678896843115195074e-06, std_normal_lccdf(-4.5)); - EXPECT_FLOAT_EQ(-3.167174337748932124543e-05, std_normal_lccdf(-4.0)); - EXPECT_FLOAT_EQ(-0.0002326561413768195969113, std_normal_lccdf(-3.5)); - EXPECT_FLOAT_EQ(-0.001350809964748202673598, std_normal_lccdf(-3.0)); - EXPECT_FLOAT_EQ(-0.0062290254858600267035, std_normal_lccdf(-2.5)); - EXPECT_FLOAT_EQ(-0.02301290932896348992442, std_normal_lccdf(-2.0)); - EXPECT_FLOAT_EQ(-0.06914345561223400604689, std_normal_lccdf(-1.5)); - EXPECT_FLOAT_EQ(-0.1727537790234499048836, std_normal_lccdf(-1.0)); + // The test values come from 4.6.1 + // + // q <- seq(-10, 37.5, by = 0.5) + // for (i in 1:length(q)) { + // cat( + // sprintf( + // "EXPECT_FLOAT_EQ(%.22g, std_normal_lccdf(%.1f));\n", + // pnorm(q[i], lower.tail = FALSE, log.p = TRUE), + // q[i] + // ) + // ) + // } + + EXPECT_FLOAT_EQ(-7.619853024160526919908e-24, std_normal_lccdf(-10.0)); + EXPECT_FLOAT_EQ(-1.049451507536260815732e-21, std_normal_lccdf(-9.5)); + EXPECT_FLOAT_EQ(-1.128588405953840782741e-19, std_normal_lccdf(-9.0)); + EXPECT_FLOAT_EQ(-9.479534822203319190782e-18, std_normal_lccdf(-8.5)); + EXPECT_FLOAT_EQ(-6.220960574271786832586e-16, std_normal_lccdf(-8.0)); + EXPECT_FLOAT_EQ(-3.19089167291094746711e-14, std_normal_lccdf(-7.5)); + EXPECT_FLOAT_EQ(-1.279812543886654064677e-12, std_normal_lccdf(-7.0)); + EXPECT_FLOAT_EQ(-4.016000583939758853991e-11, std_normal_lccdf(-6.5)); + EXPECT_FLOAT_EQ(-9.865876455243755941787e-10, std_normal_lccdf(-6.0)); + EXPECT_FLOAT_EQ(-1.898956264618946382412e-08, std_normal_lccdf(-5.5)); + EXPECT_FLOAT_EQ(-2.866516129637635770404e-07, std_normal_lccdf(-5.0)); + EXPECT_FLOAT_EQ(-3.397678896834465718134e-06, std_normal_lccdf(-4.5)); + EXPECT_FLOAT_EQ(-3.167174337748926703532e-05, std_normal_lccdf(-4.0)); + EXPECT_FLOAT_EQ(-0.0002326561413768044451859, std_normal_lccdf(-3.5)); + EXPECT_FLOAT_EQ(-0.001350809964748193783141, std_normal_lccdf(-3.0)); + EXPECT_FLOAT_EQ(-0.006229025485860002417371, std_normal_lccdf(-2.5)); + EXPECT_FLOAT_EQ(-0.02301290932896349339387, std_normal_lccdf(-2.0)); + EXPECT_FLOAT_EQ(-0.0691434556122339921691, std_normal_lccdf(-1.5)); + EXPECT_FLOAT_EQ(-0.172753779023449877128, std_normal_lccdf(-1.0)); EXPECT_FLOAT_EQ(-0.3689464152886565151412, std_normal_lccdf(-0.5)); - EXPECT_FLOAT_EQ(-0.6931471805599452862268, std_normal_lccdf(0)); - EXPECT_FLOAT_EQ(-1.175911761593618320987, std_normal_lccdf(0.5)); - EXPECT_FLOAT_EQ(-1.841021645009263352222, std_normal_lccdf(1.0)); - EXPECT_FLOAT_EQ(-2.705944400823889317564, std_normal_lccdf(1.5)); - EXPECT_FLOAT_EQ(-3.78318433368203210776, std_normal_lccdf(2.0)); - EXPECT_FLOAT_EQ(-5.081648277278686620662, std_normal_lccdf(2.5)); - EXPECT_FLOAT_EQ(-6.607726221510342945464, std_normal_lccdf(3.0)); - EXPECT_FLOAT_EQ(-8.366065308344028395027, std_normal_lccdf(3.5)); - EXPECT_FLOAT_EQ(-10.36010148652728979357, std_normal_lccdf(4.0)); - EXPECT_FLOAT_EQ(-12.59241973571053385683, std_normal_lccdf(4.5)); - EXPECT_FLOAT_EQ(-15.06499839383403838156, std_normal_lccdf(5.0)); - EXPECT_FLOAT_EQ(-17.77937635198566113104, std_normal_lccdf(5.5)); - EXPECT_FLOAT_EQ(-20.73676889383495947072, std_normal_lccdf(6.0)); - EXPECT_FLOAT_EQ(-23.93814997800869548428, std_normal_lccdf(6.5)); + EXPECT_FLOAT_EQ(-0.6931471805599452862268, std_normal_lccdf(0.0)); + EXPECT_FLOAT_EQ(-1.175911761593618543031, std_normal_lccdf(0.5)); + EXPECT_FLOAT_EQ(-1.841021645009263574266, std_normal_lccdf(1.0)); + EXPECT_FLOAT_EQ(-2.705944400823889761654, std_normal_lccdf(1.5)); + EXPECT_FLOAT_EQ(-3.78318433368203166367, std_normal_lccdf(2.0)); + EXPECT_FLOAT_EQ(-5.081648277278690173375, std_normal_lccdf(2.5)); + EXPECT_FLOAT_EQ(-6.607726221510349162713, std_normal_lccdf(3.0)); + EXPECT_FLOAT_EQ(-8.36606530834409412023, std_normal_lccdf(3.5)); + EXPECT_FLOAT_EQ(-10.36010148652729156993, std_normal_lccdf(4.0)); + EXPECT_FLOAT_EQ(-12.59241973571307937618, std_normal_lccdf(4.5)); + EXPECT_FLOAT_EQ(-15.06499839398872531149, std_normal_lccdf(5.0)); + EXPECT_FLOAT_EQ(-17.77937635262525972735, std_normal_lccdf(5.5)); + EXPECT_FLOAT_EQ(-20.73676894997470654403, std_normal_lccdf(6.0)); + EXPECT_FLOAT_EQ(-23.93814949516183787637, std_normal_lccdf(6.5)); + EXPECT_FLOAT_EQ(-27.38430749881107573174, std_normal_lccdf(7.0)); + EXPECT_FLOAT_EQ(-31.07589090289000210987, std_normal_lccdf(7.5)); + EXPECT_FLOAT_EQ(-35.0134371599145524101, std_normal_lccdf(8.0)); + EXPECT_FLOAT_EQ(-39.19739642821767233727, std_normal_lccdf(8.5)); + EXPECT_FLOAT_EQ(-43.62814911333211398414, std_normal_lccdf(9.0)); + EXPECT_FLOAT_EQ(-48.30601929896523216712, std_normal_lccdf(9.5)); + EXPECT_FLOAT_EQ(-53.23128515051246978373, std_normal_lccdf(10.0)); + EXPECT_FLOAT_EQ(-58.40418706107324453569, std_normal_lccdf(10.5)); + EXPECT_FLOAT_EQ(-63.82493409442371756768, std_normal_lccdf(11.0)); + EXPECT_FLOAT_EQ(-69.49370912909535036306, std_normal_lccdf(11.5)); + EXPECT_FLOAT_EQ(-75.41067300156879582573, std_normal_lccdf(12.0)); + EXPECT_FLOAT_EQ(-81.57596787074388089422, std_normal_lccdf(12.5)); + EXPECT_FLOAT_EQ(-87.98971997102252373679, std_normal_lccdf(13.0)); + EXPECT_FLOAT_EQ(-94.65204188128289786164, std_normal_lccdf(13.5)); + EXPECT_FLOAT_EQ(-101.5630344074499618046, std_normal_lccdf(14.0)); + EXPECT_FLOAT_EQ(-108.7227881543204688342, std_normal_lccdf(14.5)); + EXPECT_FLOAT_EQ(-116.1313848457116932877, std_normal_lccdf(15.0)); + EXPECT_FLOAT_EQ(-123.788898439410374408, std_normal_lccdf(15.5)); + EXPECT_FLOAT_EQ(-131.6953960737596958097, std_normal_lccdf(16.0)); + EXPECT_FLOAT_EQ(-139.850938875285208951, std_normal_lccdf(16.5)); + EXPECT_FLOAT_EQ(-148.255582650980386461, std_normal_lccdf(17.0)); + EXPECT_FLOAT_EQ(-156.9093784843464050027, std_normal_lccdf(17.5)); + EXPECT_FLOAT_EQ(-165.8123732507141880888, std_normal_lccdf(18.0)); + EXPECT_FLOAT_EQ(-174.9646100645466049173, std_normal_lccdf(18.5)); + EXPECT_FLOAT_EQ(-184.3661286691609575428, std_normal_lccdf(19.0)); + EXPECT_FLOAT_EQ(-194.0169657774974893982, std_normal_lccdf(19.5)); + EXPECT_FLOAT_EQ(-203.9171553710972659701, std_normal_lccdf(20.0)); + EXPECT_FLOAT_EQ(-214.066728963263813057, std_normal_lccdf(20.5)); + EXPECT_FLOAT_EQ(-224.4657158314144851374, std_normal_lccdf(21.0)); + EXPECT_FLOAT_EQ(-235.114143222833007485, std_normal_lccdf(21.5)); + EXPECT_FLOAT_EQ(-246.0120365373809079301, std_normal_lccdf(22.0)); + EXPECT_FLOAT_EQ(-257.1594194901841774481, std_normal_lccdf(22.5)); + EXPECT_FLOAT_EQ(-268.5563142568631178619, std_normal_lccdf(23.0)); + EXPECT_FLOAT_EQ(-280.2027416034976567971, std_normal_lccdf(23.5)); + EXPECT_FLOAT_EQ(-292.0987210032077996402, std_normal_lccdf(24.0)); + EXPECT_FLOAT_EQ(-304.2442707409637137062, std_normal_lccdf(24.5)); + EXPECT_FLOAT_EQ(-316.6394080080202684258, std_normal_lccdf(25.0)); + EXPECT_FLOAT_EQ(-329.2841489871795488398, std_normal_lccdf(25.5)); + EXPECT_FLOAT_EQ(-342.1785089299278297403, std_normal_lccdf(26.0)); + EXPECT_FLOAT_EQ(-355.3225022263559935709, std_normal_lccdf(26.5)); + EXPECT_FLOAT_EQ(-368.7161424686563577779, std_normal_lccdf(27.0)); + EXPECT_FLOAT_EQ(-382.3594425088898560716, std_normal_lccdf(27.5)); + EXPECT_FLOAT_EQ(-396.252414511631059213, std_normal_lccdf(28.0)); + EXPECT_FLOAT_EQ(-410.3950700020255908385, std_normal_lccdf(28.5)); + EXPECT_FLOAT_EQ(-424.7874199097301470829, std_normal_lccdf(29.0)); + EXPECT_FLOAT_EQ(-439.4294746091502474883, std_normal_lccdf(29.5)); + EXPECT_FLOAT_EQ(-454.3212439563432099021, std_normal_lccdf(30.0)); + EXPECT_FLOAT_EQ(-469.4627373229121189979, std_normal_lccdf(30.5)); + EXPECT_FLOAT_EQ(-484.8539636271792687694, std_normal_lccdf(31.0)); + EXPECT_FLOAT_EQ(-500.494931362897091276, std_normal_lccdf(31.5)); + EXPECT_FLOAT_EQ(-516.3856486257253664007, std_normal_lccdf(32.0)); + EXPECT_FLOAT_EQ(-532.5261231376803152671, std_normal_lccdf(32.5)); + EXPECT_FLOAT_EQ(-548.9163622697381015314, std_normal_lccdf(33.0)); + EXPECT_FLOAT_EQ(-565.5563730627579843713, std_normal_lccdf(33.5)); + EXPECT_FLOAT_EQ(-582.4461622468717223455, std_normal_lccdf(34.0)); + EXPECT_FLOAT_EQ(-599.5857362594723554139, std_normal_lccdf(34.5)); + EXPECT_FLOAT_EQ(-616.9751012619225321032, std_normal_lccdf(35.0)); + EXPECT_FLOAT_EQ(-634.6142631550883379532, std_normal_lccdf(35.5)); + EXPECT_FLOAT_EQ(-652.5032275937984422853, std_normal_lccdf(36.0)); + EXPECT_FLOAT_EQ(-670.642000000313714736, std_normal_lccdf(36.5)); + EXPECT_FLOAT_EQ(-689.0305855768906440062, std_normal_lccdf(37.0)); + EXPECT_FLOAT_EQ(-707.6689893175072256781, std_normal_lccdf(37.5)); } diff --git a/test/unit/math/prim/prob/std_normal_cdf_log_test.cpp b/test/unit/math/prim/prob/std_normal_cdf_log_test.cpp index 6cb75bb93f8..24111543aaf 100644 --- a/test/unit/math/prim/prob/std_normal_cdf_log_test.cpp +++ b/test/unit/math/prim/prob/std_normal_cdf_log_test.cpp @@ -14,100 +14,113 @@ TEST(ProbStdNormal, lcdf_tails) { using stan::math::std_normal_lcdf; using std::exp; - EXPECT_FLOAT_EQ(4.60535300958196e-308, exp(std_normal_lcdf(-37.5))); - EXPECT_FLOAT_EQ(5.72557122252458e-300, exp(std_normal_lcdf(-37))); - EXPECT_FLOAT_EQ(5.54472571307484e-292, exp(std_normal_lcdf(-36.5))); - EXPECT_FLOAT_EQ(4.18262406579728e-284, exp(std_normal_lcdf(-36))); - EXPECT_FLOAT_EQ(2.45769154066194e-276, exp(std_normal_lcdf(-35.5))); - EXPECT_FLOAT_EQ(1.12491070647241e-268, exp(std_normal_lcdf(-35))); - EXPECT_FLOAT_EQ(4.01072896657726e-261, exp(std_normal_lcdf(-34.5))); - EXPECT_FLOAT_EQ(1.11389878557438e-253, exp(std_normal_lcdf(-34))); - EXPECT_FLOAT_EQ(2.40983869512039e-246, exp(std_normal_lcdf(-33.5))); - EXPECT_FLOAT_EQ(4.06118562091586e-239, exp(std_normal_lcdf(-33))); - EXPECT_FLOAT_EQ(5.33142435967881e-232, exp(std_normal_lcdf(-32.5))); - EXPECT_FLOAT_EQ(5.4520806035124e-225, exp(std_normal_lcdf(-32))); - EXPECT_FLOAT_EQ(4.34323260103177e-218, exp(std_normal_lcdf(-31.5))); - EXPECT_FLOAT_EQ(2.6952500812005e-211, exp(std_normal_lcdf(-31))); - EXPECT_FLOAT_EQ(1.30293791317808e-204, exp(std_normal_lcdf(-30.5))); - EXPECT_FLOAT_EQ(4.90671392714819e-198, exp(std_normal_lcdf(-30))); - EXPECT_FLOAT_EQ(1.43947455222918e-191, exp(std_normal_lcdf(-29.5))); - EXPECT_FLOAT_EQ(3.28978526670438e-185, exp(std_normal_lcdf(-29))); - EXPECT_FLOAT_EQ(5.85714125380634e-179, exp(std_normal_lcdf(-28.5))); - EXPECT_FLOAT_EQ(8.12386946965943e-173, exp(std_normal_lcdf(-28))); - EXPECT_FLOAT_EQ(8.77817055687808e-167, exp(std_normal_lcdf(-27.5))); - EXPECT_FLOAT_EQ(7.38948100688502e-161, exp(std_normal_lcdf(-27))); - EXPECT_FLOAT_EQ(4.84616266030332e-155, exp(std_normal_lcdf(-26.5))); - EXPECT_FLOAT_EQ(2.47606331550339e-149, exp(std_normal_lcdf(-26))); - EXPECT_FLOAT_EQ(9.85623651896393e-144, exp(std_normal_lcdf(-25.5))); - EXPECT_FLOAT_EQ(3.05669670638256e-138, exp(std_normal_lcdf(-25))); - EXPECT_FLOAT_EQ(7.38570686148941e-133, exp(std_normal_lcdf(-24.5))); - EXPECT_FLOAT_EQ(1.3903921185497e-127, exp(std_normal_lcdf(-24))); - EXPECT_FLOAT_EQ(2.03936756324998e-122, exp(std_normal_lcdf(-23.5))); - EXPECT_FLOAT_EQ(2.33063700622065e-117, exp(std_normal_lcdf(-23))); - EXPECT_FLOAT_EQ(2.07531079906636e-112, exp(std_normal_lcdf(-22.5))); - EXPECT_FLOAT_EQ(1.43989243514508e-107, exp(std_normal_lcdf(-22))); - EXPECT_FLOAT_EQ(7.78439707718263e-103, exp(std_normal_lcdf(-21.5))); - EXPECT_FLOAT_EQ(3.27927801897904e-98, exp(std_normal_lcdf(-21))); - EXPECT_FLOAT_EQ(1.0764673258791e-93, exp(std_normal_lcdf(-20.5))); - EXPECT_FLOAT_EQ(2.75362411860623e-89, exp(std_normal_lcdf(-20))); - EXPECT_FLOAT_EQ(5.48911547566041e-85, exp(std_normal_lcdf(-19.5))); - EXPECT_FLOAT_EQ(8.52722395263098e-81, exp(std_normal_lcdf(-19))); - EXPECT_FLOAT_EQ(1.03236986895633e-76, exp(std_normal_lcdf(-18.5))); - EXPECT_FLOAT_EQ(9.74094891893715e-73, exp(std_normal_lcdf(-18))); - EXPECT_FLOAT_EQ(7.16345876623504e-69, exp(std_normal_lcdf(-17.5))); - EXPECT_FLOAT_EQ(4.10599620209891e-65, exp(std_normal_lcdf(-17))); - EXPECT_FLOAT_EQ(1.83446300316473e-61, exp(std_normal_lcdf(-16.5))); - EXPECT_FLOAT_EQ(6.38875440053809e-58, exp(std_normal_lcdf(-16))); - EXPECT_FLOAT_EQ(1.73446079179387e-54, exp(std_normal_lcdf(-15.5))); - EXPECT_FLOAT_EQ(3.67096619931275e-51, exp(std_normal_lcdf(-15))); - EXPECT_FLOAT_EQ(6.05749476441522e-48, exp(std_normal_lcdf(-14.5))); - EXPECT_FLOAT_EQ(7.7935368191928e-45, exp(std_normal_lcdf(-14))); - EXPECT_FLOAT_EQ(7.81880730565789e-42, exp(std_normal_lcdf(-13.5))); - EXPECT_FLOAT_EQ(6.11716439954988e-39, exp(std_normal_lcdf(-13))); - EXPECT_FLOAT_EQ(3.73256429887771e-36, exp(std_normal_lcdf(-12.5))); - EXPECT_FLOAT_EQ(1.77648211207768e-33, exp(std_normal_lcdf(-12))); - EXPECT_FLOAT_EQ(6.59577144611367e-31, exp(std_normal_lcdf(-11.5))); - EXPECT_FLOAT_EQ(1.91065957449868e-28, exp(std_normal_lcdf(-11))); - EXPECT_FLOAT_EQ(4.31900631780923e-26, exp(std_normal_lcdf(-10.5))); - EXPECT_FLOAT_EQ(7.61985302416053e-24, exp(std_normal_lcdf(-10))); - EXPECT_FLOAT_EQ(1.04945150753626e-21, exp(std_normal_lcdf(-9.5))); - EXPECT_FLOAT_EQ(1.12858840595384e-19, exp(std_normal_lcdf(-9))); - EXPECT_FLOAT_EQ(9.47953482220332e-18, exp(std_normal_lcdf(-8.5))); - EXPECT_FLOAT_EQ(6.22096057427178e-16, exp(std_normal_lcdf(-8))); - EXPECT_FLOAT_EQ(3.1908916729109e-14, exp(std_normal_lcdf(-7.5))); - EXPECT_FLOAT_EQ(1.27981254388584e-12, exp(std_normal_lcdf(-7))); - EXPECT_FLOAT_EQ(4.01600058385912e-11, exp(std_normal_lcdf(-6.5))); - EXPECT_FLOAT_EQ(9.86587645037698e-10, exp(std_normal_lcdf(-6))); - EXPECT_FLOAT_EQ(1.89895624658877e-08, exp(std_normal_lcdf(-5.5))); - EXPECT_FLOAT_EQ(2.86651571879194e-07, exp(std_normal_lcdf(-5))); - EXPECT_FLOAT_EQ(3.39767312473006e-06, exp(std_normal_lcdf(-4.5))); - EXPECT_FLOAT_EQ(3.16712418331199e-05, exp(std_normal_lcdf(-4))); - EXPECT_FLOAT_EQ(0.000232629079035525, exp(std_normal_lcdf(-3.5))); - EXPECT_FLOAT_EQ(0.00134989803163009, exp(std_normal_lcdf(-3))); - EXPECT_FLOAT_EQ(0.00620966532577613, exp(std_normal_lcdf(-2.5))); - EXPECT_FLOAT_EQ(0.0227501319481792, exp(std_normal_lcdf(-2))); - EXPECT_FLOAT_EQ(0.0668072012688581, exp(std_normal_lcdf(-1.5))); - EXPECT_FLOAT_EQ(0.158655253931457, exp(std_normal_lcdf(-1))); - EXPECT_FLOAT_EQ(0.308537538725987, exp(std_normal_lcdf(-0.5))); - EXPECT_FLOAT_EQ(0.5, exp(std_normal_lcdf(0))); - EXPECT_FLOAT_EQ(0.691462461274013, exp(std_normal_lcdf(0.5))); - EXPECT_FLOAT_EQ(0.841344746068543, exp(std_normal_lcdf(1))); - EXPECT_FLOAT_EQ(0.933192798731142, exp(std_normal_lcdf(1.5))); - EXPECT_FLOAT_EQ(0.977249868051821, exp(std_normal_lcdf(2))); - EXPECT_FLOAT_EQ(0.993790334674224, exp(std_normal_lcdf(2.5))); - EXPECT_FLOAT_EQ(0.99865010196837, exp(std_normal_lcdf(3))); - EXPECT_FLOAT_EQ(0.999767370920964, exp(std_normal_lcdf(3.5))); - EXPECT_FLOAT_EQ(0.999968328758167, exp(std_normal_lcdf(4))); - EXPECT_FLOAT_EQ(0.999996602326875, exp(std_normal_lcdf(4.5))); - EXPECT_FLOAT_EQ(0.999999713348428, exp(std_normal_lcdf(5))); - EXPECT_FLOAT_EQ(0.999999981010438, exp(std_normal_lcdf(5.5))); - EXPECT_FLOAT_EQ(0.999999999013412, exp(std_normal_lcdf(6))); - EXPECT_FLOAT_EQ(0.99999999995984, exp(std_normal_lcdf(6.5))); - EXPECT_FLOAT_EQ(0.99999999999872, exp(std_normal_lcdf(7))); - EXPECT_FLOAT_EQ(0.999999999999968, exp(std_normal_lcdf(7.5))); - EXPECT_FLOAT_EQ(0.999999999999999, exp(std_normal_lcdf(8))); - EXPECT_FLOAT_EQ(1, exp(std_normal_lcdf(8.5))); - EXPECT_FLOAT_EQ(1, exp(std_normal_lcdf(9))); - EXPECT_FLOAT_EQ(1, exp(std_normal_lcdf(9.5))); - EXPECT_FLOAT_EQ(1, exp(std_normal_lcdf(10))); + // The test values come from R 4.6.1 + // + // q <- seq(-37.5, 10, by = 0.5) + // for (i in 1:length(q)) { + // cat( + // sprintf( + // "EXPECT_FLOAT_EQ(%.22g, std_normal_lcdf(%.1f));\n", + // pnorm(q[i], lower.tail = TRUE, log.p = TRUE), + // q[i] + // ) + // ) + // } + + EXPECT_FLOAT_EQ(-707.6689893175072256781, std_normal_lcdf(-37.5)); + EXPECT_FLOAT_EQ(-689.0305855768906440062, std_normal_lcdf(-37.0)); + EXPECT_FLOAT_EQ(-670.642000000313714736, std_normal_lcdf(-36.5)); + EXPECT_FLOAT_EQ(-652.5032275937984422853, std_normal_lcdf(-36.0)); + EXPECT_FLOAT_EQ(-634.6142631550883379532, std_normal_lcdf(-35.5)); + EXPECT_FLOAT_EQ(-616.9751012619225321032, std_normal_lcdf(-35.0)); + EXPECT_FLOAT_EQ(-599.5857362594723554139, std_normal_lcdf(-34.5)); + EXPECT_FLOAT_EQ(-582.4461622468717223455, std_normal_lcdf(-34.0)); + EXPECT_FLOAT_EQ(-565.5563730627579843713, std_normal_lcdf(-33.5)); + EXPECT_FLOAT_EQ(-548.9163622697381015314, std_normal_lcdf(-33.0)); + EXPECT_FLOAT_EQ(-532.5261231376803152671, std_normal_lcdf(-32.5)); + EXPECT_FLOAT_EQ(-516.3856486257253664007, std_normal_lcdf(-32.0)); + EXPECT_FLOAT_EQ(-500.494931362897091276, std_normal_lcdf(-31.5)); + EXPECT_FLOAT_EQ(-484.8539636271792687694, std_normal_lcdf(-31.0)); + EXPECT_FLOAT_EQ(-469.4627373229121189979, std_normal_lcdf(-30.5)); + EXPECT_FLOAT_EQ(-454.3212439563432099021, std_normal_lcdf(-30.0)); + EXPECT_FLOAT_EQ(-439.4294746091502474883, std_normal_lcdf(-29.5)); + EXPECT_FLOAT_EQ(-424.7874199097301470829, std_normal_lcdf(-29.0)); + EXPECT_FLOAT_EQ(-410.3950700020255908385, std_normal_lcdf(-28.5)); + EXPECT_FLOAT_EQ(-396.252414511631059213, std_normal_lcdf(-28.0)); + EXPECT_FLOAT_EQ(-382.3594425088898560716, std_normal_lcdf(-27.5)); + EXPECT_FLOAT_EQ(-368.7161424686563577779, std_normal_lcdf(-27.0)); + EXPECT_FLOAT_EQ(-355.3225022263559935709, std_normal_lcdf(-26.5)); + EXPECT_FLOAT_EQ(-342.1785089299278297403, std_normal_lcdf(-26.0)); + EXPECT_FLOAT_EQ(-329.2841489871795488398, std_normal_lcdf(-25.5)); + EXPECT_FLOAT_EQ(-316.6394080080202684258, std_normal_lcdf(-25.0)); + EXPECT_FLOAT_EQ(-304.2442707409637137062, std_normal_lcdf(-24.5)); + EXPECT_FLOAT_EQ(-292.0987210032077996402, std_normal_lcdf(-24.0)); + EXPECT_FLOAT_EQ(-280.2027416034976567971, std_normal_lcdf(-23.5)); + EXPECT_FLOAT_EQ(-268.5563142568631178619, std_normal_lcdf(-23.0)); + EXPECT_FLOAT_EQ(-257.1594194901841774481, std_normal_lcdf(-22.5)); + EXPECT_FLOAT_EQ(-246.0120365373809079301, std_normal_lcdf(-22.0)); + EXPECT_FLOAT_EQ(-235.114143222833007485, std_normal_lcdf(-21.5)); + EXPECT_FLOAT_EQ(-224.4657158314144851374, std_normal_lcdf(-21.0)); + EXPECT_FLOAT_EQ(-214.066728963263813057, std_normal_lcdf(-20.5)); + EXPECT_FLOAT_EQ(-203.9171553710972659701, std_normal_lcdf(-20.0)); + EXPECT_FLOAT_EQ(-194.0169657774974893982, std_normal_lcdf(-19.5)); + EXPECT_FLOAT_EQ(-184.3661286691609575428, std_normal_lcdf(-19.0)); + EXPECT_FLOAT_EQ(-174.9646100645466049173, std_normal_lcdf(-18.5)); + EXPECT_FLOAT_EQ(-165.8123732507141880888, std_normal_lcdf(-18.0)); + EXPECT_FLOAT_EQ(-156.9093784843464050027, std_normal_lcdf(-17.5)); + EXPECT_FLOAT_EQ(-148.255582650980386461, std_normal_lcdf(-17.0)); + EXPECT_FLOAT_EQ(-139.850938875285208951, std_normal_lcdf(-16.5)); + EXPECT_FLOAT_EQ(-131.6953960737596958097, std_normal_lcdf(-16.0)); + EXPECT_FLOAT_EQ(-123.788898439410374408, std_normal_lcdf(-15.5)); + EXPECT_FLOAT_EQ(-116.1313848457116932877, std_normal_lcdf(-15.0)); + EXPECT_FLOAT_EQ(-108.7227881543204688342, std_normal_lcdf(-14.5)); + EXPECT_FLOAT_EQ(-101.5630344074499618046, std_normal_lcdf(-14.0)); + EXPECT_FLOAT_EQ(-94.65204188128289786164, std_normal_lcdf(-13.5)); + EXPECT_FLOAT_EQ(-87.98971997102252373679, std_normal_lcdf(-13.0)); + EXPECT_FLOAT_EQ(-81.57596787074388089422, std_normal_lcdf(-12.5)); + EXPECT_FLOAT_EQ(-75.41067300156879582573, std_normal_lcdf(-12.0)); + EXPECT_FLOAT_EQ(-69.49370912909535036306, std_normal_lcdf(-11.5)); + EXPECT_FLOAT_EQ(-63.82493409442371756768, std_normal_lcdf(-11.0)); + EXPECT_FLOAT_EQ(-58.40418706107324453569, std_normal_lcdf(-10.5)); + EXPECT_FLOAT_EQ(-53.23128515051246978373, std_normal_lcdf(-10.0)); + EXPECT_FLOAT_EQ(-48.30601929896523216712, std_normal_lcdf(-9.5)); + EXPECT_FLOAT_EQ(-43.62814911333211398414, std_normal_lcdf(-9.0)); + EXPECT_FLOAT_EQ(-39.19739642821767233727, std_normal_lcdf(-8.5)); + EXPECT_FLOAT_EQ(-35.0134371599145524101, std_normal_lcdf(-8.0)); + EXPECT_FLOAT_EQ(-31.07589090289000210987, std_normal_lcdf(-7.5)); + EXPECT_FLOAT_EQ(-27.38430749881107573174, std_normal_lcdf(-7.0)); + EXPECT_FLOAT_EQ(-23.93814949516183787637, std_normal_lcdf(-6.5)); + EXPECT_FLOAT_EQ(-20.73676894997470654403, std_normal_lcdf(-6.0)); + EXPECT_FLOAT_EQ(-17.77937635262525972735, std_normal_lcdf(-5.5)); + EXPECT_FLOAT_EQ(-15.06499839398872531149, std_normal_lcdf(-5.0)); + EXPECT_FLOAT_EQ(-12.59241973571307937618, std_normal_lcdf(-4.5)); + EXPECT_FLOAT_EQ(-10.36010148652729156993, std_normal_lcdf(-4.0)); + EXPECT_FLOAT_EQ(-8.36606530834409412023, std_normal_lcdf(-3.5)); + EXPECT_FLOAT_EQ(-6.607726221510349162713, std_normal_lcdf(-3.0)); + EXPECT_FLOAT_EQ(-5.081648277278690173375, std_normal_lcdf(-2.5)); + EXPECT_FLOAT_EQ(-3.78318433368203166367, std_normal_lcdf(-2.0)); + EXPECT_FLOAT_EQ(-2.705944400823889761654, std_normal_lcdf(-1.5)); + EXPECT_FLOAT_EQ(-1.841021645009263574266, std_normal_lcdf(-1.0)); + EXPECT_FLOAT_EQ(-1.175911761593618543031, std_normal_lcdf(-0.5)); + EXPECT_FLOAT_EQ(-0.6931471805599452862268, std_normal_lcdf(0.0)); + EXPECT_FLOAT_EQ(-0.3689464152886565151412, std_normal_lcdf(0.5)); + EXPECT_FLOAT_EQ(-0.172753779023449877128, std_normal_lcdf(1.0)); + EXPECT_FLOAT_EQ(-0.0691434556122339921691, std_normal_lcdf(1.5)); + EXPECT_FLOAT_EQ(-0.02301290932896349339387, std_normal_lcdf(2.0)); + EXPECT_FLOAT_EQ(-0.006229025485860002417371, std_normal_lcdf(2.5)); + EXPECT_FLOAT_EQ(-0.001350809964748193783141, std_normal_lcdf(3.0)); + EXPECT_FLOAT_EQ(-0.0002326561413768044451859, std_normal_lcdf(3.5)); + EXPECT_FLOAT_EQ(-3.167174337748926703532e-05, std_normal_lcdf(4.0)); + EXPECT_FLOAT_EQ(-3.397678896834465718134e-06, std_normal_lcdf(4.5)); + EXPECT_FLOAT_EQ(-2.866516129637635770404e-07, std_normal_lcdf(5.0)); + EXPECT_FLOAT_EQ(-1.898956264618946382412e-08, std_normal_lcdf(5.5)); + EXPECT_FLOAT_EQ(-9.865876455243755941787e-10, std_normal_lcdf(6.0)); + EXPECT_FLOAT_EQ(-4.016000583939758853991e-11, std_normal_lcdf(6.5)); + EXPECT_FLOAT_EQ(-1.279812543886654064677e-12, std_normal_lcdf(7.0)); + EXPECT_FLOAT_EQ(-3.19089167291094746711e-14, std_normal_lcdf(7.5)); + EXPECT_FLOAT_EQ(-6.220960574271786832586e-16, std_normal_lcdf(8.0)); + EXPECT_FLOAT_EQ(-9.479534822203319190782e-18, std_normal_lcdf(8.5)); + EXPECT_FLOAT_EQ(-1.128588405953840782741e-19, std_normal_lcdf(9.0)); + EXPECT_FLOAT_EQ(-1.049451507536260815732e-21, std_normal_lcdf(9.5)); + EXPECT_FLOAT_EQ(-7.619853024160526919908e-24, std_normal_lcdf(10.0)); }