1*640235e2SEnji Cooper /* $NetBSD: t_exp.c,v 1.8 2014/10/07 16:53:44 gson Exp $ */ 257718be8SEnji Cooper 357718be8SEnji Cooper /*- 457718be8SEnji Cooper * Copyright (c) 2011 The NetBSD Foundation, Inc. 557718be8SEnji Cooper * All rights reserved. 657718be8SEnji Cooper * 757718be8SEnji Cooper * This code is derived from software contributed to The NetBSD Foundation 857718be8SEnji Cooper * by Jukka Ruohonen. 957718be8SEnji Cooper * 1057718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 1157718be8SEnji Cooper * modification, are permitted provided that the following conditions 1257718be8SEnji Cooper * are met: 1357718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 1457718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 1557718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 1657718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 1757718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 1857718be8SEnji Cooper * 1957718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 2057718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2157718be8SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2257718be8SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2357718be8SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2457718be8SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2557718be8SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2657718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2757718be8SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2857718be8SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2957718be8SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 3057718be8SEnji Cooper */ 3157718be8SEnji Cooper 3257718be8SEnji Cooper #include <atf-c.h> 3357718be8SEnji Cooper #include <math.h> 3457718be8SEnji Cooper #include "t_libm.h" 3557718be8SEnji Cooper 3657718be8SEnji Cooper /* y = exp(x) */ 3757718be8SEnji Cooper static const struct { 3857718be8SEnji Cooper double x; 3957718be8SEnji Cooper double y; 4057718be8SEnji Cooper double e; 4157718be8SEnji Cooper } exp_values[] = { 4257718be8SEnji Cooper { -10, 0.4539992976248485e-4, 1e-4, }, 4357718be8SEnji Cooper { -5, 0.6737946999085467e-2, 1e-2, }, 4457718be8SEnji Cooper { -1, 0.3678794411714423, 1e-1, }, 4557718be8SEnji Cooper { -0.1, 0.9048374180359595, 1e-1, }, 4657718be8SEnji Cooper { 0, 1.0000000000000000, 1, }, 4757718be8SEnji Cooper { 0.1, 1.1051709180756477, 1, }, 4857718be8SEnji Cooper { 1, 2.7182818284590452, 1, }, 4957718be8SEnji Cooper { 5, 148.41315910257660, 1e2, }, 5057718be8SEnji Cooper { 10, 22026.465794806718, 1e4, }, 5157718be8SEnji Cooper }; 5257718be8SEnji Cooper 5357718be8SEnji Cooper /* 5457718be8SEnji Cooper * exp2/exp2f(3) 5557718be8SEnji Cooper */ 5657718be8SEnji Cooper ATF_LIBM_TEST(exp2_is_nan, "Test exp2(x) == NaN") 5757718be8SEnji Cooper { 5857718be8SEnji Cooper #ifdef T_LIBM_NAN 5957718be8SEnji Cooper T_LIBM_CHECK_NAN(0, exp2, T_LIBM_NAN); 6057718be8SEnji Cooper T_LIBM_CHECK_NAN(0, exp2f, T_LIBM_NAN); 6157718be8SEnji Cooper #else 6257718be8SEnji Cooper atf_tc_skip("no NaN on this machine"); 6357718be8SEnji Cooper #endif 6457718be8SEnji Cooper } 6557718be8SEnji Cooper 6657718be8SEnji Cooper ATF_LIBM_TEST(exp2_is_plus_zero, "Test exp2(x) == +0.0") 6757718be8SEnji Cooper { 6857718be8SEnji Cooper #ifdef T_LIBM_MINUS_INF 6957718be8SEnji Cooper T_LIBM_CHECK_PLUS_ZERO(0, exp2, T_LIBM_MINUS_INF); 7057718be8SEnji Cooper T_LIBM_CHECK_PLUS_ZERO(0, exp2f, T_LIBM_MINUS_INF); 7157718be8SEnji Cooper #else 7257718be8SEnji Cooper atf_tc_skip("no +/-Inf on this machine"); 7357718be8SEnji Cooper #endif 7457718be8SEnji Cooper } 7557718be8SEnji Cooper 7657718be8SEnji Cooper ATF_LIBM_TEST(exp2_powers, "Test exp2(x) is correct for some integer x") 7757718be8SEnji Cooper { 7857718be8SEnji Cooper static const struct { 7957718be8SEnji Cooper double x; 8057718be8SEnji Cooper double d_y; 8157718be8SEnji Cooper double f_y; 8257718be8SEnji Cooper } v[] = { 8357718be8SEnji Cooper { +0.0, 1.0, 1.0 }, 8457718be8SEnji Cooper { -0.0, 1.0, 1.0 }, 8557718be8SEnji Cooper { 1, 0x1p1, 0x1p1 }, 8657718be8SEnji Cooper { 2, 0x1p2, 0x1p2 }, 8757718be8SEnji Cooper { 100, 0x1p100, 0x1p100 }, 8857718be8SEnji Cooper { 125, 0x1p125, 0x1p125 }, 8957718be8SEnji Cooper { 126, 0x1p126, 0x1p126 }, 9057718be8SEnji Cooper #if __DBL_MAX_EXP__ > 129 9157718be8SEnji Cooper { 127, 0x1p127, 0x1p127 }, 9257718be8SEnji Cooper #endif 9357718be8SEnji Cooper #ifdef T_LIBM_PLUS_INF 9457718be8SEnji Cooper { 128, 0x1p128, T_LIBM_PLUS_INF }, 9557718be8SEnji Cooper { 129, 0x1p129, T_LIBM_PLUS_INF }, 9657718be8SEnji Cooper { 1000, 0x1p1000, T_LIBM_PLUS_INF }, 9757718be8SEnji Cooper { 1020, 0x1p1020, T_LIBM_PLUS_INF }, 9857718be8SEnji Cooper { 1023, 0x1p1023, T_LIBM_PLUS_INF }, 9957718be8SEnji Cooper { 1024, T_LIBM_PLUS_INF, T_LIBM_PLUS_INF }, 10057718be8SEnji Cooper { 1030, T_LIBM_PLUS_INF, T_LIBM_PLUS_INF }, 10157718be8SEnji Cooper { 1050, T_LIBM_PLUS_INF, T_LIBM_PLUS_INF }, 10257718be8SEnji Cooper { 2000, T_LIBM_PLUS_INF, T_LIBM_PLUS_INF }, 10357718be8SEnji Cooper { 16383, T_LIBM_PLUS_INF, T_LIBM_PLUS_INF }, 10457718be8SEnji Cooper { 16384, T_LIBM_PLUS_INF, T_LIBM_PLUS_INF }, 10557718be8SEnji Cooper { 16385, T_LIBM_PLUS_INF, T_LIBM_PLUS_INF }, 10657718be8SEnji Cooper #endif 10757718be8SEnji Cooper { -1, 0x1p-1, 0x1p-1 }, 10857718be8SEnji Cooper { -2, 0x1p-2, 0x1p-2 }, 10957718be8SEnji Cooper { -100, 0x1p-100, 0x1p-100 }, 11057718be8SEnji Cooper { -127, 0x1p-127, 0x1p-127 }, 11157718be8SEnji Cooper { -128, 0x1p-128, 0x1p-128 }, 11257718be8SEnji Cooper #if __LDBL_MIN_EXP__ < -129 11357718be8SEnji Cooper { -300, 0x1p-300, 0.0}, 11457718be8SEnji Cooper { -400, 0x1p-400, 0.0}, 11557718be8SEnji Cooper {-1000, 0x1p-1000, 0.0}, 11657718be8SEnji Cooper {-1022, 0x1p-1022, 0.0}, 11757718be8SEnji Cooper /* These should be denormal numbers */ 11857718be8SEnji Cooper {-1023, 0x1p-1023, 0.0}, 11957718be8SEnji Cooper {-1024, 0x1p-1024, 0.0}, 12057718be8SEnji Cooper {-1040, 0x1p-1040, 0.0}, 12157718be8SEnji Cooper {-1060, 0x1p-1060, 0.0}, 12257718be8SEnji Cooper /* This is the smallest result gcc will allow */ 12357718be8SEnji Cooper {-1074, 0x1p-1074, 0.0}, 12457718be8SEnji Cooper #endif 12557718be8SEnji Cooper {-1075, 0x0, 0.0}, 12657718be8SEnji Cooper {-1080, 0x0, 0.0}, 12757718be8SEnji Cooper {-2000, 0x0, 0.0}, 12857718be8SEnji Cooper {-16382, 0x0, 0.0}, 12957718be8SEnji Cooper {-16383, 0x0, 0.0}, 13057718be8SEnji Cooper {-16384, 0x0, 0.0}, 13157718be8SEnji Cooper }; 13257718be8SEnji Cooper unsigned int i; 13357718be8SEnji Cooper 13484e369d8SEnji Cooper #if defined(__FreeBSD__) && defined(__i386__) 13584e369d8SEnji Cooper atf_tc_expect_fail("a number of the assertions fail on i386"); 13684e369d8SEnji Cooper #endif 13784e369d8SEnji Cooper 13857718be8SEnji Cooper for (i = 0; i < __arraycount(v); i++) { 13957718be8SEnji Cooper T_LIBM_CHECK(i, exp2, v[i].x, v[i].d_y, 0.0); 14057718be8SEnji Cooper T_LIBM_CHECK(i, exp2f, v[i].x, v[i].f_y, 0.0); 14157718be8SEnji Cooper } 14257718be8SEnji Cooper } 14357718be8SEnji Cooper 14457718be8SEnji Cooper ATF_LIBM_TEST(exp2_values, "Test exp2(x) is correct for some x") 14557718be8SEnji Cooper { 14657718be8SEnji Cooper static const struct { 14757718be8SEnji Cooper double x; 148*640235e2SEnji Cooper double d_y; 149*640235e2SEnji Cooper float f_y; 15057718be8SEnji Cooper double d_eps; 15157718be8SEnji Cooper double f_eps; 15257718be8SEnji Cooper } v[] = { 15357718be8SEnji Cooper #if __DBL_MAX_EXP__ > 128 15457718be8SEnji Cooper /* The largest double constant */ 155*640235e2SEnji Cooper { 0x1.fffffffffffffp9, 0x1.ffffffffffd3ap1023, 0.00, 15657718be8SEnji Cooper 0x1p969, 0.0 }, 15757718be8SEnji Cooper /* The largest float constant */ 158*640235e2SEnji Cooper { 0x1.fffffep6, 0x1.ffff4ep+127, 0x1.ffff4ep+127, 6e30, 0.0 }, 15957718be8SEnji Cooper #endif 16057718be8SEnji Cooper #ifdef T_LIBM_PLUS_INF 161*640235e2SEnji Cooper { T_LIBM_PLUS_INF, T_LIBM_PLUS_INF, T_LIBM_PLUS_INF, 0.0, 0.0 }, 16257718be8SEnji Cooper #endif 16357718be8SEnji Cooper 16457718be8SEnji Cooper /* The few values from the old tests */ 16557718be8SEnji Cooper /* Results from i386/amd64, d_eps needed on i386 */ 166*640235e2SEnji Cooper /* f_y values calculated using py-mpmath */ 167*640235e2SEnji Cooper { 1.1, 0x1.125fbee250664p+1, 0x1.125fc0p+1, 0x1p-52, 0x1.8p-22 }, 168*640235e2SEnji Cooper { 2.2, 0x1.2611186bae675p+2, 0x1.26111ap+2, 0x1p-51, 0x1.8p-21 }, 169*640235e2SEnji Cooper { 3.3, 0x1.3b2c47bff8328p+3, 0x1.3b2c48p+3, 0x1p-50, 0x1.8p-20 }, 170*640235e2SEnji Cooper { 4.4, 0x1.51cb453b9536ep+4, 0x1.51cb46p+4, 0x1p-49, 0x1.8p-19 }, 171*640235e2SEnji Cooper { 5.5, 0x1.6a09e667f3bcdp+5, 0x1.6a09e6p+5, 0x1p-48, 0x1.8p-18 }, 172*640235e2SEnji Cooper { 6.6, 0x1.8406003b2ae5bp+6, 0x1.8405fep+6, 0x1p-47, 0x1.8p-17 }, 173*640235e2SEnji Cooper { 7.7, 0x1.9fdf8bcce533ep+7, 0x1.9fdf88p+7, 0x1p-46, 0x1.8p-16 }, 174*640235e2SEnji Cooper { 8.8, 0x1.bdb8cdadbe124p+8, 0x1.bdb8d2p+8, 0x1p-45, 0x1.8p-15 }, 17557718be8SEnji Cooper }; 17657718be8SEnji Cooper unsigned int i; 17757718be8SEnji Cooper 17857718be8SEnji Cooper for (i = 0; i < __arraycount(v); i++) { 179*640235e2SEnji Cooper T_LIBM_CHECK(i, exp2, v[i].x, v[i].d_y, v[i].d_eps); 18057718be8SEnji Cooper if (i > 1) 181*640235e2SEnji Cooper T_LIBM_CHECK(i, exp2f, v[i].x, v[i].f_y, v[i].f_eps); 18257718be8SEnji Cooper } 18357718be8SEnji Cooper } 18457718be8SEnji Cooper 18557718be8SEnji Cooper 18657718be8SEnji Cooper /* 18757718be8SEnji Cooper * exp(3) 18857718be8SEnji Cooper */ 18957718be8SEnji Cooper ATF_TC(exp_nan); 19057718be8SEnji Cooper ATF_TC_HEAD(exp_nan, tc) 19157718be8SEnji Cooper { 19257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test exp(NaN) == NaN"); 19357718be8SEnji Cooper } 19457718be8SEnji Cooper 19557718be8SEnji Cooper ATF_TC_BODY(exp_nan, tc) 19657718be8SEnji Cooper { 19757718be8SEnji Cooper const double x = 0.0L / 0.0L; 19857718be8SEnji Cooper 19957718be8SEnji Cooper if (isnan(exp(x)) == 0) 20057718be8SEnji Cooper atf_tc_fail_nonfatal("exp(NaN) != NaN"); 20157718be8SEnji Cooper } 20257718be8SEnji Cooper 20357718be8SEnji Cooper ATF_TC(exp_inf_neg); 20457718be8SEnji Cooper ATF_TC_HEAD(exp_inf_neg, tc) 20557718be8SEnji Cooper { 20657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test exp(-Inf) == +0.0"); 20757718be8SEnji Cooper } 20857718be8SEnji Cooper 20957718be8SEnji Cooper ATF_TC_BODY(exp_inf_neg, tc) 21057718be8SEnji Cooper { 21157718be8SEnji Cooper const double x = -1.0L / 0.0L; 21257718be8SEnji Cooper double y = exp(x); 21357718be8SEnji Cooper 21457718be8SEnji Cooper if (fabs(y) > 0.0 || signbit(y) != 0) 21557718be8SEnji Cooper atf_tc_fail_nonfatal("exp(-Inf) != +0.0"); 21657718be8SEnji Cooper } 21757718be8SEnji Cooper 21857718be8SEnji Cooper ATF_TC(exp_inf_pos); 21957718be8SEnji Cooper ATF_TC_HEAD(exp_inf_pos, tc) 22057718be8SEnji Cooper { 22157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test exp(+Inf) == +Inf"); 22257718be8SEnji Cooper } 22357718be8SEnji Cooper 22457718be8SEnji Cooper ATF_TC_BODY(exp_inf_pos, tc) 22557718be8SEnji Cooper { 22657718be8SEnji Cooper const double x = 1.0L / 0.0L; 22757718be8SEnji Cooper double y = exp(x); 22857718be8SEnji Cooper 22957718be8SEnji Cooper if (isinf(y) == 0 || signbit(y) != 0) 23057718be8SEnji Cooper atf_tc_fail_nonfatal("exp(+Inf) != +Inf"); 23157718be8SEnji Cooper } 23257718be8SEnji Cooper 23357718be8SEnji Cooper ATF_TC(exp_product); 23457718be8SEnji Cooper ATF_TC_HEAD(exp_product, tc) 23557718be8SEnji Cooper { 23657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test some selected exp(x)"); 23757718be8SEnji Cooper } 23857718be8SEnji Cooper 23957718be8SEnji Cooper ATF_TC_BODY(exp_product, tc) 24057718be8SEnji Cooper { 24157718be8SEnji Cooper double eps; 24257718be8SEnji Cooper double x; 24357718be8SEnji Cooper double y; 24457718be8SEnji Cooper size_t i; 24557718be8SEnji Cooper 24657718be8SEnji Cooper for (i = 0; i < __arraycount(exp_values); i++) { 24757718be8SEnji Cooper x = exp_values[i].x; 24857718be8SEnji Cooper y = exp_values[i].y; 24957718be8SEnji Cooper eps = 1e-15 * exp_values[i].e; 25057718be8SEnji Cooper 25157718be8SEnji Cooper if (fabs(exp(x) - y) > eps) 25257718be8SEnji Cooper atf_tc_fail_nonfatal("exp(%0.01f) != %18.18e", x, y); 25357718be8SEnji Cooper } 25457718be8SEnji Cooper } 25557718be8SEnji Cooper 25657718be8SEnji Cooper ATF_TC(exp_zero_neg); 25757718be8SEnji Cooper ATF_TC_HEAD(exp_zero_neg, tc) 25857718be8SEnji Cooper { 25957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test exp(-0.0) == 1.0"); 26057718be8SEnji Cooper } 26157718be8SEnji Cooper 26257718be8SEnji Cooper ATF_TC_BODY(exp_zero_neg, tc) 26357718be8SEnji Cooper { 26457718be8SEnji Cooper const double x = -0.0L; 26557718be8SEnji Cooper 26657718be8SEnji Cooper if (fabs(exp(x) - 1.0) > 0.0) 26757718be8SEnji Cooper atf_tc_fail_nonfatal("exp(-0.0) != 1.0"); 26857718be8SEnji Cooper } 26957718be8SEnji Cooper 27057718be8SEnji Cooper ATF_TC(exp_zero_pos); 27157718be8SEnji Cooper ATF_TC_HEAD(exp_zero_pos, tc) 27257718be8SEnji Cooper { 27357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test exp(+0.0) == 1.0"); 27457718be8SEnji Cooper } 27557718be8SEnji Cooper 27657718be8SEnji Cooper ATF_TC_BODY(exp_zero_pos, tc) 27757718be8SEnji Cooper { 27857718be8SEnji Cooper const double x = 0.0L; 27957718be8SEnji Cooper 28057718be8SEnji Cooper if (fabs(exp(x) - 1.0) > 0.0) 28157718be8SEnji Cooper atf_tc_fail_nonfatal("exp(+0.0) != 1.0"); 28257718be8SEnji Cooper } 28357718be8SEnji Cooper 28457718be8SEnji Cooper /* 28557718be8SEnji Cooper * expf(3) 28657718be8SEnji Cooper */ 28757718be8SEnji Cooper ATF_TC(expf_nan); 28857718be8SEnji Cooper ATF_TC_HEAD(expf_nan, tc) 28957718be8SEnji Cooper { 29057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expf(NaN) == NaN"); 29157718be8SEnji Cooper } 29257718be8SEnji Cooper 29357718be8SEnji Cooper ATF_TC_BODY(expf_nan, tc) 29457718be8SEnji Cooper { 29557718be8SEnji Cooper const float x = 0.0L / 0.0L; 29657718be8SEnji Cooper 29757718be8SEnji Cooper if (isnan(expf(x)) == 0) 29857718be8SEnji Cooper atf_tc_fail_nonfatal("expf(NaN) != NaN"); 29957718be8SEnji Cooper } 30057718be8SEnji Cooper 30157718be8SEnji Cooper ATF_TC(expf_inf_neg); 30257718be8SEnji Cooper ATF_TC_HEAD(expf_inf_neg, tc) 30357718be8SEnji Cooper { 30457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expf(-Inf) == +0.0"); 30557718be8SEnji Cooper } 30657718be8SEnji Cooper 30757718be8SEnji Cooper ATF_TC_BODY(expf_inf_neg, tc) 30857718be8SEnji Cooper { 30957718be8SEnji Cooper const float x = -1.0L / 0.0L; 31057718be8SEnji Cooper float y = expf(x); 31157718be8SEnji Cooper 31257718be8SEnji Cooper if (fabsf(y) > 0.0 || signbit(y) != 0) 31357718be8SEnji Cooper atf_tc_fail_nonfatal("expf(-Inf) != +0.0"); 31457718be8SEnji Cooper } 31557718be8SEnji Cooper 31657718be8SEnji Cooper ATF_TC(expf_inf_pos); 31757718be8SEnji Cooper ATF_TC_HEAD(expf_inf_pos, tc) 31857718be8SEnji Cooper { 31957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expf(+Inf) == +Inf"); 32057718be8SEnji Cooper } 32157718be8SEnji Cooper 32257718be8SEnji Cooper ATF_TC_BODY(expf_inf_pos, tc) 32357718be8SEnji Cooper { 32457718be8SEnji Cooper const float x = 1.0L / 0.0L; 32557718be8SEnji Cooper float y = expf(x); 32657718be8SEnji Cooper 32757718be8SEnji Cooper if (isinf(y) == 0 || signbit(y) != 0) 32857718be8SEnji Cooper atf_tc_fail_nonfatal("expf(+Inf) != +Inf"); 32957718be8SEnji Cooper } 33057718be8SEnji Cooper 33157718be8SEnji Cooper ATF_TC(expf_product); 33257718be8SEnji Cooper ATF_TC_HEAD(expf_product, tc) 33357718be8SEnji Cooper { 33457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test some selected expf(x)"); 33557718be8SEnji Cooper } 33657718be8SEnji Cooper 33757718be8SEnji Cooper ATF_TC_BODY(expf_product, tc) 33857718be8SEnji Cooper { 33957718be8SEnji Cooper float eps; 34057718be8SEnji Cooper float x; 34157718be8SEnji Cooper float y; 34257718be8SEnji Cooper size_t i; 34357718be8SEnji Cooper 34457718be8SEnji Cooper for (i = 0; i < __arraycount(exp_values); i++) { 34557718be8SEnji Cooper x = exp_values[i].x; 34657718be8SEnji Cooper y = exp_values[i].y; 34757718be8SEnji Cooper eps = 1e-6 * exp_values[i].e; 34857718be8SEnji Cooper 34957718be8SEnji Cooper if (fabsf(expf(x) - y) > eps) 35057718be8SEnji Cooper atf_tc_fail_nonfatal("expf(%0.01f) != %18.18e", x, y); 35157718be8SEnji Cooper } 35257718be8SEnji Cooper } 35357718be8SEnji Cooper 35457718be8SEnji Cooper ATF_TC(expf_zero_neg); 35557718be8SEnji Cooper ATF_TC_HEAD(expf_zero_neg, tc) 35657718be8SEnji Cooper { 35757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expf(-0.0) == 1.0"); 35857718be8SEnji Cooper } 35957718be8SEnji Cooper 36057718be8SEnji Cooper ATF_TC_BODY(expf_zero_neg, tc) 36157718be8SEnji Cooper { 36257718be8SEnji Cooper const float x = -0.0L; 36357718be8SEnji Cooper 36457718be8SEnji Cooper if (fabsf(expf(x) - 1.0f) > 0.0) 36557718be8SEnji Cooper atf_tc_fail_nonfatal("expf(-0.0) != 1.0"); 36657718be8SEnji Cooper } 36757718be8SEnji Cooper 36857718be8SEnji Cooper ATF_TC(expf_zero_pos); 36957718be8SEnji Cooper ATF_TC_HEAD(expf_zero_pos, tc) 37057718be8SEnji Cooper { 37157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expf(+0.0) == 1.0"); 37257718be8SEnji Cooper } 37357718be8SEnji Cooper 37457718be8SEnji Cooper ATF_TC_BODY(expf_zero_pos, tc) 37557718be8SEnji Cooper { 37657718be8SEnji Cooper const float x = 0.0L; 37757718be8SEnji Cooper 37857718be8SEnji Cooper if (fabsf(expf(x) - 1.0f) > 0.0) 37957718be8SEnji Cooper atf_tc_fail_nonfatal("expf(+0.0) != 1.0"); 38057718be8SEnji Cooper } 38157718be8SEnji Cooper 38257718be8SEnji Cooper /* 38357718be8SEnji Cooper * expm1(3) 38457718be8SEnji Cooper */ 38557718be8SEnji Cooper ATF_TC(expm1_nan); 38657718be8SEnji Cooper ATF_TC_HEAD(expm1_nan, tc) 38757718be8SEnji Cooper { 38857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expm1(NaN) == NaN"); 38957718be8SEnji Cooper } 39057718be8SEnji Cooper 39157718be8SEnji Cooper ATF_TC_BODY(expm1_nan, tc) 39257718be8SEnji Cooper { 39357718be8SEnji Cooper const double x = 0.0L / 0.0L; 39457718be8SEnji Cooper 39557718be8SEnji Cooper if (isnan(expm1(x)) == 0) 39657718be8SEnji Cooper atf_tc_fail_nonfatal("expm1(NaN) != NaN"); 39757718be8SEnji Cooper } 39857718be8SEnji Cooper 39957718be8SEnji Cooper ATF_TC(expm1_inf_neg); 40057718be8SEnji Cooper ATF_TC_HEAD(expm1_inf_neg, tc) 40157718be8SEnji Cooper { 40257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expm1(-Inf) == -1"); 40357718be8SEnji Cooper } 40457718be8SEnji Cooper 40557718be8SEnji Cooper ATF_TC_BODY(expm1_inf_neg, tc) 40657718be8SEnji Cooper { 40757718be8SEnji Cooper const double x = -1.0L / 0.0L; 40857718be8SEnji Cooper 40957718be8SEnji Cooper if (expm1(x) != -1.0) 41057718be8SEnji Cooper atf_tc_fail_nonfatal("expm1(-Inf) != -1.0"); 41157718be8SEnji Cooper } 41257718be8SEnji Cooper 41357718be8SEnji Cooper ATF_TC(expm1_inf_pos); 41457718be8SEnji Cooper ATF_TC_HEAD(expm1_inf_pos, tc) 41557718be8SEnji Cooper { 41657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expm1(+Inf) == +Inf"); 41757718be8SEnji Cooper } 41857718be8SEnji Cooper 41957718be8SEnji Cooper ATF_TC_BODY(expm1_inf_pos, tc) 42057718be8SEnji Cooper { 42157718be8SEnji Cooper const double x = 1.0L / 0.0L; 42257718be8SEnji Cooper double y = expm1(x); 42357718be8SEnji Cooper 42457718be8SEnji Cooper if (isinf(y) == 0 || signbit(y) != 0) 42557718be8SEnji Cooper atf_tc_fail_nonfatal("expm1(+Inf) != +Inf"); 42657718be8SEnji Cooper } 42757718be8SEnji Cooper 42857718be8SEnji Cooper ATF_TC(expm1_zero_neg); 42957718be8SEnji Cooper ATF_TC_HEAD(expm1_zero_neg, tc) 43057718be8SEnji Cooper { 43157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expm1(-0.0) == -0.0"); 43257718be8SEnji Cooper } 43357718be8SEnji Cooper 43457718be8SEnji Cooper ATF_TC_BODY(expm1_zero_neg, tc) 43557718be8SEnji Cooper { 43657718be8SEnji Cooper const double x = -0.0L; 43757718be8SEnji Cooper double y = expm1(x); 43857718be8SEnji Cooper 43957718be8SEnji Cooper if (fabs(y) > 0.0 || signbit(y) == 0) 44057718be8SEnji Cooper atf_tc_fail_nonfatal("expm1(-0.0) != -0.0"); 44157718be8SEnji Cooper } 44257718be8SEnji Cooper 44357718be8SEnji Cooper ATF_TC(expm1_zero_pos); 44457718be8SEnji Cooper ATF_TC_HEAD(expm1_zero_pos, tc) 44557718be8SEnji Cooper { 44657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expm1(+0.0) == 1.0"); 44757718be8SEnji Cooper } 44857718be8SEnji Cooper 44957718be8SEnji Cooper ATF_TC_BODY(expm1_zero_pos, tc) 45057718be8SEnji Cooper { 45157718be8SEnji Cooper const double x = 0.0L; 45257718be8SEnji Cooper double y = expm1(x); 45357718be8SEnji Cooper 45457718be8SEnji Cooper if (fabs(y) > 0.0 || signbit(y) != 0) 45557718be8SEnji Cooper atf_tc_fail_nonfatal("expm1(+0.0) != +0.0"); 45657718be8SEnji Cooper } 45757718be8SEnji Cooper 45857718be8SEnji Cooper /* 45957718be8SEnji Cooper * expm1f(3) 46057718be8SEnji Cooper */ 46157718be8SEnji Cooper ATF_TC(expm1f_nan); 46257718be8SEnji Cooper ATF_TC_HEAD(expm1f_nan, tc) 46357718be8SEnji Cooper { 46457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expm1f(NaN) == NaN"); 46557718be8SEnji Cooper } 46657718be8SEnji Cooper 46757718be8SEnji Cooper ATF_TC_BODY(expm1f_nan, tc) 46857718be8SEnji Cooper { 46957718be8SEnji Cooper const float x = 0.0L / 0.0L; 47057718be8SEnji Cooper 47157718be8SEnji Cooper if (isnan(expm1f(x)) == 0) 47257718be8SEnji Cooper atf_tc_fail_nonfatal("expm1f(NaN) != NaN"); 47357718be8SEnji Cooper } 47457718be8SEnji Cooper 47557718be8SEnji Cooper ATF_TC(expm1f_inf_neg); 47657718be8SEnji Cooper ATF_TC_HEAD(expm1f_inf_neg, tc) 47757718be8SEnji Cooper { 47857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expm1f(-Inf) == -1"); 47957718be8SEnji Cooper } 48057718be8SEnji Cooper 48157718be8SEnji Cooper ATF_TC_BODY(expm1f_inf_neg, tc) 48257718be8SEnji Cooper { 48357718be8SEnji Cooper const float x = -1.0L / 0.0L; 48457718be8SEnji Cooper 48557718be8SEnji Cooper if (expm1f(x) != -1.0) 48657718be8SEnji Cooper atf_tc_fail_nonfatal("expm1f(-Inf) != -1.0"); 48757718be8SEnji Cooper } 48857718be8SEnji Cooper 48957718be8SEnji Cooper ATF_TC(expm1f_inf_pos); 49057718be8SEnji Cooper ATF_TC_HEAD(expm1f_inf_pos, tc) 49157718be8SEnji Cooper { 49257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expm1f(+Inf) == +Inf"); 49357718be8SEnji Cooper } 49457718be8SEnji Cooper 49557718be8SEnji Cooper ATF_TC_BODY(expm1f_inf_pos, tc) 49657718be8SEnji Cooper { 49757718be8SEnji Cooper const float x = 1.0L / 0.0L; 49857718be8SEnji Cooper float y = expm1f(x); 49957718be8SEnji Cooper 50057718be8SEnji Cooper if (isinf(y) == 0 || signbit(y) != 0) 50157718be8SEnji Cooper atf_tc_fail_nonfatal("expm1f(+Inf) != +Inf"); 50257718be8SEnji Cooper } 50357718be8SEnji Cooper 50457718be8SEnji Cooper ATF_TC(expm1f_zero_neg); 50557718be8SEnji Cooper ATF_TC_HEAD(expm1f_zero_neg, tc) 50657718be8SEnji Cooper { 50757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expm1f(-0.0) == -0.0"); 50857718be8SEnji Cooper } 50957718be8SEnji Cooper 51057718be8SEnji Cooper ATF_TC_BODY(expm1f_zero_neg, tc) 51157718be8SEnji Cooper { 51257718be8SEnji Cooper const float x = -0.0L; 51357718be8SEnji Cooper float y = expm1f(x); 51457718be8SEnji Cooper 51557718be8SEnji Cooper if (fabsf(y) > 0.0 || signbit(y) == 0) 51657718be8SEnji Cooper atf_tc_fail_nonfatal("expm1f(-0.0) != -0.0"); 51757718be8SEnji Cooper } 51857718be8SEnji Cooper 51957718be8SEnji Cooper ATF_TC(expm1f_zero_pos); 52057718be8SEnji Cooper ATF_TC_HEAD(expm1f_zero_pos, tc) 52157718be8SEnji Cooper { 52257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test expm1f(+0.0) == 1.0"); 52357718be8SEnji Cooper } 52457718be8SEnji Cooper 52557718be8SEnji Cooper ATF_TC_BODY(expm1f_zero_pos, tc) 52657718be8SEnji Cooper { 52757718be8SEnji Cooper const float x = 0.0L; 52857718be8SEnji Cooper float y = expm1f(x); 52957718be8SEnji Cooper 53057718be8SEnji Cooper if (fabsf(y) > 0.0 || signbit(y) != 0) 53157718be8SEnji Cooper atf_tc_fail_nonfatal("expm1f(+0.0) != +0.0"); 53257718be8SEnji Cooper } 53357718be8SEnji Cooper 53457718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 53557718be8SEnji Cooper { 53657718be8SEnji Cooper 53757718be8SEnji Cooper ATF_TP_ADD_TC(tp, exp2_is_nan); 53857718be8SEnji Cooper ATF_TP_ADD_TC(tp, exp2_is_plus_zero); 53957718be8SEnji Cooper ATF_TP_ADD_TC(tp, exp2_values); 54057718be8SEnji Cooper ATF_TP_ADD_TC(tp, exp2_powers); 54157718be8SEnji Cooper 54257718be8SEnji Cooper ATF_TP_ADD_TC(tp, exp_nan); 54357718be8SEnji Cooper ATF_TP_ADD_TC(tp, exp_inf_neg); 54457718be8SEnji Cooper ATF_TP_ADD_TC(tp, exp_inf_pos); 54557718be8SEnji Cooper ATF_TP_ADD_TC(tp, exp_product); 54657718be8SEnji Cooper ATF_TP_ADD_TC(tp, exp_zero_neg); 54757718be8SEnji Cooper ATF_TP_ADD_TC(tp, exp_zero_pos); 54857718be8SEnji Cooper 54957718be8SEnji Cooper ATF_TP_ADD_TC(tp, expf_nan); 55057718be8SEnji Cooper ATF_TP_ADD_TC(tp, expf_inf_neg); 55157718be8SEnji Cooper ATF_TP_ADD_TC(tp, expf_inf_pos); 55257718be8SEnji Cooper ATF_TP_ADD_TC(tp, expf_product); 55357718be8SEnji Cooper ATF_TP_ADD_TC(tp, expf_zero_neg); 55457718be8SEnji Cooper ATF_TP_ADD_TC(tp, expf_zero_pos); 55557718be8SEnji Cooper 55657718be8SEnji Cooper ATF_TP_ADD_TC(tp, expm1_nan); 55757718be8SEnji Cooper ATF_TP_ADD_TC(tp, expm1_inf_neg); 55857718be8SEnji Cooper ATF_TP_ADD_TC(tp, expm1_inf_pos); 55957718be8SEnji Cooper ATF_TP_ADD_TC(tp, expm1_zero_neg); 56057718be8SEnji Cooper ATF_TP_ADD_TC(tp, expm1_zero_pos); 56157718be8SEnji Cooper 56257718be8SEnji Cooper ATF_TP_ADD_TC(tp, expm1f_nan); 56357718be8SEnji Cooper ATF_TP_ADD_TC(tp, expm1f_inf_neg); 56457718be8SEnji Cooper ATF_TP_ADD_TC(tp, expm1f_inf_pos); 56557718be8SEnji Cooper ATF_TP_ADD_TC(tp, expm1f_zero_neg); 56657718be8SEnji Cooper ATF_TP_ADD_TC(tp, expm1f_zero_pos); 56757718be8SEnji Cooper 56857718be8SEnji Cooper return atf_no_error(); 56957718be8SEnji Cooper } 570