1*1ec3feb6SAlex Richardson /* $NetBSD: t_log.c,v 1.14 2018/11/07 03:59:36 riastradh 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 #include <sys/cdefs.h>
32*1ec3feb6SAlex Richardson __RCSID("$NetBSD: t_log.c,v 1.14 2018/11/07 03:59:36 riastradh Exp $");
3357718be8SEnji Cooper
3457718be8SEnji Cooper #include <atf-c.h>
3557718be8SEnji Cooper
36*1ec3feb6SAlex Richardson #include <float.h>
3757718be8SEnji Cooper #include <math.h>
3857718be8SEnji Cooper #include <stdio.h>
3957718be8SEnji Cooper #include <string.h>
4057718be8SEnji Cooper
4157718be8SEnji Cooper /*
4257718be8SEnji Cooper * log10(3)
4357718be8SEnji Cooper */
4457718be8SEnji Cooper ATF_TC(log10_base);
ATF_TC_HEAD(log10_base,tc)4557718be8SEnji Cooper ATF_TC_HEAD(log10_base, tc)
4657718be8SEnji Cooper {
4757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10(10) == 1");
4857718be8SEnji Cooper }
4957718be8SEnji Cooper
ATF_TC_BODY(log10_base,tc)5057718be8SEnji Cooper ATF_TC_BODY(log10_base, tc)
5157718be8SEnji Cooper {
5257718be8SEnji Cooper ATF_CHECK(log10(10.0) == 1.0);
5357718be8SEnji Cooper }
5457718be8SEnji Cooper
5557718be8SEnji Cooper ATF_TC(log10_nan);
ATF_TC_HEAD(log10_nan,tc)5657718be8SEnji Cooper ATF_TC_HEAD(log10_nan, tc)
5757718be8SEnji Cooper {
5857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10(NaN) == NaN");
5957718be8SEnji Cooper }
6057718be8SEnji Cooper
ATF_TC_BODY(log10_nan,tc)6157718be8SEnji Cooper ATF_TC_BODY(log10_nan, tc)
6257718be8SEnji Cooper {
6357718be8SEnji Cooper const double x = 0.0L / 0.0L;
6457718be8SEnji Cooper
6557718be8SEnji Cooper ATF_CHECK(isnan(x) != 0);
6657718be8SEnji Cooper ATF_CHECK(isnan(log10(x)) != 0);
6757718be8SEnji Cooper }
6857718be8SEnji Cooper
6957718be8SEnji Cooper ATF_TC(log10_inf_neg);
ATF_TC_HEAD(log10_inf_neg,tc)7057718be8SEnji Cooper ATF_TC_HEAD(log10_inf_neg, tc)
7157718be8SEnji Cooper {
7257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10(-Inf) == NaN");
7357718be8SEnji Cooper }
7457718be8SEnji Cooper
ATF_TC_BODY(log10_inf_neg,tc)7557718be8SEnji Cooper ATF_TC_BODY(log10_inf_neg, tc)
7657718be8SEnji Cooper {
7757718be8SEnji Cooper const double x = -1.0L / 0.0L;
7857718be8SEnji Cooper const double y = log10(x);
7957718be8SEnji Cooper
8057718be8SEnji Cooper ATF_CHECK(isnan(y) != 0);
8157718be8SEnji Cooper }
8257718be8SEnji Cooper
8357718be8SEnji Cooper ATF_TC(log10_inf_pos);
ATF_TC_HEAD(log10_inf_pos,tc)8457718be8SEnji Cooper ATF_TC_HEAD(log10_inf_pos, tc)
8557718be8SEnji Cooper {
8657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10(+Inf) == +Inf");
8757718be8SEnji Cooper }
8857718be8SEnji Cooper
ATF_TC_BODY(log10_inf_pos,tc)8957718be8SEnji Cooper ATF_TC_BODY(log10_inf_pos, tc)
9057718be8SEnji Cooper {
9157718be8SEnji Cooper const double x = 1.0L / 0.0L;
9257718be8SEnji Cooper
9357718be8SEnji Cooper ATF_CHECK(log10(x) == x);
9457718be8SEnji Cooper }
9557718be8SEnji Cooper
9657718be8SEnji Cooper ATF_TC(log10_one_pos);
ATF_TC_HEAD(log10_one_pos,tc)9757718be8SEnji Cooper ATF_TC_HEAD(log10_one_pos, tc)
9857718be8SEnji Cooper {
9957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10(1.0) == +0.0");
10057718be8SEnji Cooper }
10157718be8SEnji Cooper
ATF_TC_BODY(log10_one_pos,tc)10257718be8SEnji Cooper ATF_TC_BODY(log10_one_pos, tc)
10357718be8SEnji Cooper {
10457718be8SEnji Cooper const double x = log10(1.0);
10557718be8SEnji Cooper const double y = 0.0L;
10657718be8SEnji Cooper
10757718be8SEnji Cooper ATF_CHECK(x == y);
10857718be8SEnji Cooper ATF_CHECK(signbit(x) == 0);
10957718be8SEnji Cooper ATF_CHECK(signbit(y) == 0);
11057718be8SEnji Cooper }
11157718be8SEnji Cooper
11257718be8SEnji Cooper ATF_TC(log10_zero_neg);
ATF_TC_HEAD(log10_zero_neg,tc)11357718be8SEnji Cooper ATF_TC_HEAD(log10_zero_neg, tc)
11457718be8SEnji Cooper {
11557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10(-0.0) == -HUGE_VAL");
11657718be8SEnji Cooper }
11757718be8SEnji Cooper
ATF_TC_BODY(log10_zero_neg,tc)11857718be8SEnji Cooper ATF_TC_BODY(log10_zero_neg, tc)
11957718be8SEnji Cooper {
12057718be8SEnji Cooper const double x = -0.0L;
12157718be8SEnji Cooper
12257718be8SEnji Cooper ATF_CHECK(log10(x) == -HUGE_VAL);
12357718be8SEnji Cooper }
12457718be8SEnji Cooper
12557718be8SEnji Cooper ATF_TC(log10_zero_pos);
ATF_TC_HEAD(log10_zero_pos,tc)12657718be8SEnji Cooper ATF_TC_HEAD(log10_zero_pos, tc)
12757718be8SEnji Cooper {
12857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10(+0.0) == -HUGE_VAL");
12957718be8SEnji Cooper }
13057718be8SEnji Cooper
ATF_TC_BODY(log10_zero_pos,tc)13157718be8SEnji Cooper ATF_TC_BODY(log10_zero_pos, tc)
13257718be8SEnji Cooper {
13357718be8SEnji Cooper const double x = 0.0L;
13457718be8SEnji Cooper
13557718be8SEnji Cooper ATF_CHECK(log10(x) == -HUGE_VAL);
13657718be8SEnji Cooper }
13757718be8SEnji Cooper
13857718be8SEnji Cooper /*
13957718be8SEnji Cooper * log10f(3)
14057718be8SEnji Cooper */
14157718be8SEnji Cooper ATF_TC(log10f_base);
ATF_TC_HEAD(log10f_base,tc)14257718be8SEnji Cooper ATF_TC_HEAD(log10f_base, tc)
14357718be8SEnji Cooper {
14457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10f(10) == 1");
14557718be8SEnji Cooper }
14657718be8SEnji Cooper
ATF_TC_BODY(log10f_base,tc)14757718be8SEnji Cooper ATF_TC_BODY(log10f_base, tc)
14857718be8SEnji Cooper {
14957718be8SEnji Cooper ATF_CHECK(log10f(10.0) == 1.0);
15057718be8SEnji Cooper }
15157718be8SEnji Cooper
15257718be8SEnji Cooper ATF_TC(log10f_nan);
ATF_TC_HEAD(log10f_nan,tc)15357718be8SEnji Cooper ATF_TC_HEAD(log10f_nan, tc)
15457718be8SEnji Cooper {
15557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10f(NaN) == NaN");
15657718be8SEnji Cooper }
15757718be8SEnji Cooper
ATF_TC_BODY(log10f_nan,tc)15857718be8SEnji Cooper ATF_TC_BODY(log10f_nan, tc)
15957718be8SEnji Cooper {
16057718be8SEnji Cooper const float x = 0.0L / 0.0L;
16157718be8SEnji Cooper
16257718be8SEnji Cooper ATF_CHECK(isnan(x) != 0);
16357718be8SEnji Cooper ATF_CHECK(isnan(log10f(x)) != 0);
16457718be8SEnji Cooper }
16557718be8SEnji Cooper
16657718be8SEnji Cooper ATF_TC(log10f_inf_neg);
ATF_TC_HEAD(log10f_inf_neg,tc)16757718be8SEnji Cooper ATF_TC_HEAD(log10f_inf_neg, tc)
16857718be8SEnji Cooper {
16957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10f(-Inf) == NaN");
17057718be8SEnji Cooper }
17157718be8SEnji Cooper
ATF_TC_BODY(log10f_inf_neg,tc)17257718be8SEnji Cooper ATF_TC_BODY(log10f_inf_neg, tc)
17357718be8SEnji Cooper {
17457718be8SEnji Cooper const float x = -1.0L / 0.0L;
17557718be8SEnji Cooper const float y = log10f(x);
17657718be8SEnji Cooper
17757718be8SEnji Cooper ATF_CHECK(isnan(y) != 0);
17857718be8SEnji Cooper }
17957718be8SEnji Cooper
18057718be8SEnji Cooper ATF_TC(log10f_inf_pos);
ATF_TC_HEAD(log10f_inf_pos,tc)18157718be8SEnji Cooper ATF_TC_HEAD(log10f_inf_pos, tc)
18257718be8SEnji Cooper {
18357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10f(+Inf) == +Inf");
18457718be8SEnji Cooper }
18557718be8SEnji Cooper
ATF_TC_BODY(log10f_inf_pos,tc)18657718be8SEnji Cooper ATF_TC_BODY(log10f_inf_pos, tc)
18757718be8SEnji Cooper {
18857718be8SEnji Cooper const float x = 1.0L / 0.0L;
18957718be8SEnji Cooper
19057718be8SEnji Cooper ATF_CHECK(log10f(x) == x);
19157718be8SEnji Cooper }
19257718be8SEnji Cooper
19357718be8SEnji Cooper ATF_TC(log10f_one_pos);
ATF_TC_HEAD(log10f_one_pos,tc)19457718be8SEnji Cooper ATF_TC_HEAD(log10f_one_pos, tc)
19557718be8SEnji Cooper {
19657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10f(1.0) == +0.0");
19757718be8SEnji Cooper }
19857718be8SEnji Cooper
ATF_TC_BODY(log10f_one_pos,tc)19957718be8SEnji Cooper ATF_TC_BODY(log10f_one_pos, tc)
20057718be8SEnji Cooper {
20157718be8SEnji Cooper const float x = log10f(1.0);
20257718be8SEnji Cooper const float y = 0.0L;
20357718be8SEnji Cooper
20457718be8SEnji Cooper ATF_CHECK(x == y);
20557718be8SEnji Cooper ATF_CHECK(signbit(x) == 0);
20657718be8SEnji Cooper ATF_CHECK(signbit(y) == 0);
20757718be8SEnji Cooper }
20857718be8SEnji Cooper
20957718be8SEnji Cooper ATF_TC(log10f_zero_neg);
ATF_TC_HEAD(log10f_zero_neg,tc)21057718be8SEnji Cooper ATF_TC_HEAD(log10f_zero_neg, tc)
21157718be8SEnji Cooper {
21257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10f(-0.0) == -HUGE_VALF");
21357718be8SEnji Cooper }
21457718be8SEnji Cooper
ATF_TC_BODY(log10f_zero_neg,tc)21557718be8SEnji Cooper ATF_TC_BODY(log10f_zero_neg, tc)
21657718be8SEnji Cooper {
21757718be8SEnji Cooper const float x = -0.0L;
21857718be8SEnji Cooper
21957718be8SEnji Cooper ATF_CHECK(log10f(x) == -HUGE_VALF);
22057718be8SEnji Cooper }
22157718be8SEnji Cooper
22257718be8SEnji Cooper ATF_TC(log10f_zero_pos);
ATF_TC_HEAD(log10f_zero_pos,tc)22357718be8SEnji Cooper ATF_TC_HEAD(log10f_zero_pos, tc)
22457718be8SEnji Cooper {
22557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log10f(+0.0) == -HUGE_VALF");
22657718be8SEnji Cooper }
22757718be8SEnji Cooper
ATF_TC_BODY(log10f_zero_pos,tc)22857718be8SEnji Cooper ATF_TC_BODY(log10f_zero_pos, tc)
22957718be8SEnji Cooper {
23057718be8SEnji Cooper const float x = 0.0L;
23157718be8SEnji Cooper
23257718be8SEnji Cooper ATF_CHECK(log10f(x) == -HUGE_VALF);
23357718be8SEnji Cooper }
23457718be8SEnji Cooper
23557718be8SEnji Cooper /*
23657718be8SEnji Cooper * log1p(3)
23757718be8SEnji Cooper */
23857718be8SEnji Cooper ATF_TC(log1p_nan);
ATF_TC_HEAD(log1p_nan,tc)23957718be8SEnji Cooper ATF_TC_HEAD(log1p_nan, tc)
24057718be8SEnji Cooper {
24157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1p(NaN) == NaN");
24257718be8SEnji Cooper }
24357718be8SEnji Cooper
ATF_TC_BODY(log1p_nan,tc)24457718be8SEnji Cooper ATF_TC_BODY(log1p_nan, tc)
24557718be8SEnji Cooper {
24657718be8SEnji Cooper const double x = 0.0L / 0.0L;
24757718be8SEnji Cooper
24857718be8SEnji Cooper ATF_CHECK(isnan(x) != 0);
24957718be8SEnji Cooper ATF_CHECK(isnan(log1p(x)) != 0);
25057718be8SEnji Cooper }
25157718be8SEnji Cooper
25257718be8SEnji Cooper ATF_TC(log1p_inf_neg);
ATF_TC_HEAD(log1p_inf_neg,tc)25357718be8SEnji Cooper ATF_TC_HEAD(log1p_inf_neg, tc)
25457718be8SEnji Cooper {
25557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1p(-Inf) == NaN");
25657718be8SEnji Cooper }
25757718be8SEnji Cooper
ATF_TC_BODY(log1p_inf_neg,tc)25857718be8SEnji Cooper ATF_TC_BODY(log1p_inf_neg, tc)
25957718be8SEnji Cooper {
26057718be8SEnji Cooper const double x = -1.0L / 0.0L;
26157718be8SEnji Cooper const double y = log1p(x);
26257718be8SEnji Cooper
26357718be8SEnji Cooper if (isnan(y) == 0) {
26457718be8SEnji Cooper atf_tc_expect_fail("PR lib/45362");
26557718be8SEnji Cooper atf_tc_fail("log1p(-Inf) != NaN");
26657718be8SEnji Cooper }
26757718be8SEnji Cooper }
26857718be8SEnji Cooper
26957718be8SEnji Cooper ATF_TC(log1p_inf_pos);
ATF_TC_HEAD(log1p_inf_pos,tc)27057718be8SEnji Cooper ATF_TC_HEAD(log1p_inf_pos, tc)
27157718be8SEnji Cooper {
27257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1p(+Inf) == +Inf");
27357718be8SEnji Cooper }
27457718be8SEnji Cooper
ATF_TC_BODY(log1p_inf_pos,tc)27557718be8SEnji Cooper ATF_TC_BODY(log1p_inf_pos, tc)
27657718be8SEnji Cooper {
27757718be8SEnji Cooper const double x = 1.0L / 0.0L;
27857718be8SEnji Cooper
27957718be8SEnji Cooper ATF_CHECK(log1p(x) == x);
28057718be8SEnji Cooper }
28157718be8SEnji Cooper
28257718be8SEnji Cooper ATF_TC(log1p_one_neg);
ATF_TC_HEAD(log1p_one_neg,tc)28357718be8SEnji Cooper ATF_TC_HEAD(log1p_one_neg, tc)
28457718be8SEnji Cooper {
28557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1p(-1.0) == -HUGE_VAL");
28657718be8SEnji Cooper }
28757718be8SEnji Cooper
ATF_TC_BODY(log1p_one_neg,tc)28857718be8SEnji Cooper ATF_TC_BODY(log1p_one_neg, tc)
28957718be8SEnji Cooper {
29057718be8SEnji Cooper const double x = log1p(-1.0);
29157718be8SEnji Cooper
29257718be8SEnji Cooper if (x != -HUGE_VAL) {
29357718be8SEnji Cooper atf_tc_expect_fail("PR lib/45362");
29457718be8SEnji Cooper atf_tc_fail("log1p(-1.0) != -HUGE_VAL");
29557718be8SEnji Cooper }
29657718be8SEnji Cooper }
29757718be8SEnji Cooper
29857718be8SEnji Cooper ATF_TC(log1p_zero_neg);
ATF_TC_HEAD(log1p_zero_neg,tc)29957718be8SEnji Cooper ATF_TC_HEAD(log1p_zero_neg, tc)
30057718be8SEnji Cooper {
30157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1p(-0.0) == -0.0");
30257718be8SEnji Cooper }
30357718be8SEnji Cooper
ATF_TC_BODY(log1p_zero_neg,tc)30457718be8SEnji Cooper ATF_TC_BODY(log1p_zero_neg, tc)
30557718be8SEnji Cooper {
30657718be8SEnji Cooper const double x = -0.0L;
30757718be8SEnji Cooper
30857718be8SEnji Cooper ATF_CHECK(log1p(x) == x);
30957718be8SEnji Cooper }
31057718be8SEnji Cooper
31157718be8SEnji Cooper ATF_TC(log1p_zero_pos);
ATF_TC_HEAD(log1p_zero_pos,tc)31257718be8SEnji Cooper ATF_TC_HEAD(log1p_zero_pos, tc)
31357718be8SEnji Cooper {
31457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1p(+0.0) == +0.0");
31557718be8SEnji Cooper }
31657718be8SEnji Cooper
ATF_TC_BODY(log1p_zero_pos,tc)31757718be8SEnji Cooper ATF_TC_BODY(log1p_zero_pos, tc)
31857718be8SEnji Cooper {
31957718be8SEnji Cooper const double x = 0.0L;
32057718be8SEnji Cooper
32157718be8SEnji Cooper ATF_CHECK(log1p(x) == x);
32257718be8SEnji Cooper }
32357718be8SEnji Cooper
32457718be8SEnji Cooper /*
32557718be8SEnji Cooper * log1pf(3)
32657718be8SEnji Cooper */
32757718be8SEnji Cooper ATF_TC(log1pf_nan);
ATF_TC_HEAD(log1pf_nan,tc)32857718be8SEnji Cooper ATF_TC_HEAD(log1pf_nan, tc)
32957718be8SEnji Cooper {
33057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1pf(NaN) == NaN");
33157718be8SEnji Cooper }
33257718be8SEnji Cooper
ATF_TC_BODY(log1pf_nan,tc)33357718be8SEnji Cooper ATF_TC_BODY(log1pf_nan, tc)
33457718be8SEnji Cooper {
33557718be8SEnji Cooper const float x = 0.0L / 0.0L;
33657718be8SEnji Cooper
33757718be8SEnji Cooper ATF_CHECK(isnan(x) != 0);
33857718be8SEnji Cooper ATF_CHECK(isnan(log1pf(x)) != 0);
33957718be8SEnji Cooper }
34057718be8SEnji Cooper
34157718be8SEnji Cooper ATF_TC(log1pf_inf_neg);
ATF_TC_HEAD(log1pf_inf_neg,tc)34257718be8SEnji Cooper ATF_TC_HEAD(log1pf_inf_neg, tc)
34357718be8SEnji Cooper {
34457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1pf(-Inf) == NaN");
34557718be8SEnji Cooper }
34657718be8SEnji Cooper
ATF_TC_BODY(log1pf_inf_neg,tc)34757718be8SEnji Cooper ATF_TC_BODY(log1pf_inf_neg, tc)
34857718be8SEnji Cooper {
34957718be8SEnji Cooper const float x = -1.0L / 0.0L;
35057718be8SEnji Cooper const float y = log1pf(x);
35157718be8SEnji Cooper
35257718be8SEnji Cooper if (isnan(y) == 0) {
35357718be8SEnji Cooper atf_tc_expect_fail("PR lib/45362");
35457718be8SEnji Cooper atf_tc_fail("log1pf(-Inf) != NaN");
35557718be8SEnji Cooper }
35657718be8SEnji Cooper }
35757718be8SEnji Cooper
35857718be8SEnji Cooper ATF_TC(log1pf_inf_pos);
ATF_TC_HEAD(log1pf_inf_pos,tc)35957718be8SEnji Cooper ATF_TC_HEAD(log1pf_inf_pos, tc)
36057718be8SEnji Cooper {
36157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1pf(+Inf) == +Inf");
36257718be8SEnji Cooper }
36357718be8SEnji Cooper
ATF_TC_BODY(log1pf_inf_pos,tc)36457718be8SEnji Cooper ATF_TC_BODY(log1pf_inf_pos, tc)
36557718be8SEnji Cooper {
36657718be8SEnji Cooper const float x = 1.0L / 0.0L;
36757718be8SEnji Cooper
36857718be8SEnji Cooper ATF_CHECK(log1pf(x) == x);
36957718be8SEnji Cooper }
37057718be8SEnji Cooper
37157718be8SEnji Cooper ATF_TC(log1pf_one_neg);
ATF_TC_HEAD(log1pf_one_neg,tc)37257718be8SEnji Cooper ATF_TC_HEAD(log1pf_one_neg, tc)
37357718be8SEnji Cooper {
37457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1pf(-1.0) == -HUGE_VALF");
37557718be8SEnji Cooper }
37657718be8SEnji Cooper
ATF_TC_BODY(log1pf_one_neg,tc)37757718be8SEnji Cooper ATF_TC_BODY(log1pf_one_neg, tc)
37857718be8SEnji Cooper {
37957718be8SEnji Cooper const float x = log1pf(-1.0);
38057718be8SEnji Cooper
38157718be8SEnji Cooper if (x != -HUGE_VALF) {
38257718be8SEnji Cooper atf_tc_expect_fail("PR lib/45362");
38357718be8SEnji Cooper atf_tc_fail("log1pf(-1.0) != -HUGE_VALF");
38457718be8SEnji Cooper }
38557718be8SEnji Cooper }
38657718be8SEnji Cooper
38757718be8SEnji Cooper ATF_TC(log1pf_zero_neg);
ATF_TC_HEAD(log1pf_zero_neg,tc)38857718be8SEnji Cooper ATF_TC_HEAD(log1pf_zero_neg, tc)
38957718be8SEnji Cooper {
39057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1pf(-0.0) == -0.0");
39157718be8SEnji Cooper }
39257718be8SEnji Cooper
ATF_TC_BODY(log1pf_zero_neg,tc)39357718be8SEnji Cooper ATF_TC_BODY(log1pf_zero_neg, tc)
39457718be8SEnji Cooper {
39557718be8SEnji Cooper const float x = -0.0L;
39657718be8SEnji Cooper
39757718be8SEnji Cooper ATF_CHECK(log1pf(x) == x);
39857718be8SEnji Cooper }
39957718be8SEnji Cooper
40057718be8SEnji Cooper ATF_TC(log1pf_zero_pos);
ATF_TC_HEAD(log1pf_zero_pos,tc)40157718be8SEnji Cooper ATF_TC_HEAD(log1pf_zero_pos, tc)
40257718be8SEnji Cooper {
40357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log1pf(+0.0) == +0.0");
40457718be8SEnji Cooper }
40557718be8SEnji Cooper
ATF_TC_BODY(log1pf_zero_pos,tc)40657718be8SEnji Cooper ATF_TC_BODY(log1pf_zero_pos, tc)
40757718be8SEnji Cooper {
40857718be8SEnji Cooper const float x = 0.0L;
40957718be8SEnji Cooper
41057718be8SEnji Cooper ATF_CHECK(log1pf(x) == x);
41157718be8SEnji Cooper }
41257718be8SEnji Cooper
41357718be8SEnji Cooper /*
41457718be8SEnji Cooper * log2(3)
41557718be8SEnji Cooper */
41657718be8SEnji Cooper ATF_TC(log2_base);
ATF_TC_HEAD(log2_base,tc)41757718be8SEnji Cooper ATF_TC_HEAD(log2_base, tc)
41857718be8SEnji Cooper {
41957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2(2) == 1");
42057718be8SEnji Cooper }
42157718be8SEnji Cooper
ATF_TC_BODY(log2_base,tc)42257718be8SEnji Cooper ATF_TC_BODY(log2_base, tc)
42357718be8SEnji Cooper {
42457718be8SEnji Cooper ATF_CHECK(log2(2.0) == 1.0);
42557718be8SEnji Cooper }
42657718be8SEnji Cooper
42757718be8SEnji Cooper ATF_TC(log2_nan);
ATF_TC_HEAD(log2_nan,tc)42857718be8SEnji Cooper ATF_TC_HEAD(log2_nan, tc)
42957718be8SEnji Cooper {
43057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2(NaN) == NaN");
43157718be8SEnji Cooper }
43257718be8SEnji Cooper
ATF_TC_BODY(log2_nan,tc)43357718be8SEnji Cooper ATF_TC_BODY(log2_nan, tc)
43457718be8SEnji Cooper {
43557718be8SEnji Cooper const double x = 0.0L / 0.0L;
43657718be8SEnji Cooper
43757718be8SEnji Cooper ATF_CHECK(isnan(x) != 0);
43857718be8SEnji Cooper ATF_CHECK(isnan(log2(x)) != 0);
43957718be8SEnji Cooper }
44057718be8SEnji Cooper
44157718be8SEnji Cooper ATF_TC(log2_inf_neg);
ATF_TC_HEAD(log2_inf_neg,tc)44257718be8SEnji Cooper ATF_TC_HEAD(log2_inf_neg, tc)
44357718be8SEnji Cooper {
44457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2(-Inf) == NaN");
44557718be8SEnji Cooper }
44657718be8SEnji Cooper
ATF_TC_BODY(log2_inf_neg,tc)44757718be8SEnji Cooper ATF_TC_BODY(log2_inf_neg, tc)
44857718be8SEnji Cooper {
44957718be8SEnji Cooper const double x = -1.0L / 0.0L;
45057718be8SEnji Cooper const double y = log2(x);
45157718be8SEnji Cooper
45257718be8SEnji Cooper ATF_CHECK(isnan(y) != 0);
45357718be8SEnji Cooper }
45457718be8SEnji Cooper
45557718be8SEnji Cooper ATF_TC(log2_inf_pos);
ATF_TC_HEAD(log2_inf_pos,tc)45657718be8SEnji Cooper ATF_TC_HEAD(log2_inf_pos, tc)
45757718be8SEnji Cooper {
45857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2(+Inf) == +Inf");
45957718be8SEnji Cooper }
46057718be8SEnji Cooper
ATF_TC_BODY(log2_inf_pos,tc)46157718be8SEnji Cooper ATF_TC_BODY(log2_inf_pos, tc)
46257718be8SEnji Cooper {
46357718be8SEnji Cooper const double x = 1.0L / 0.0L;
46457718be8SEnji Cooper
46557718be8SEnji Cooper ATF_CHECK(log2(x) == x);
46657718be8SEnji Cooper }
46757718be8SEnji Cooper
46857718be8SEnji Cooper ATF_TC(log2_one_pos);
ATF_TC_HEAD(log2_one_pos,tc)46957718be8SEnji Cooper ATF_TC_HEAD(log2_one_pos, tc)
47057718be8SEnji Cooper {
47157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2(1.0) == +0.0");
47257718be8SEnji Cooper }
47357718be8SEnji Cooper
ATF_TC_BODY(log2_one_pos,tc)47457718be8SEnji Cooper ATF_TC_BODY(log2_one_pos, tc)
47557718be8SEnji Cooper {
47657718be8SEnji Cooper const double x = log2(1.0);
47757718be8SEnji Cooper const double y = 0.0L;
47857718be8SEnji Cooper
47957718be8SEnji Cooper ATF_CHECK(x == y);
48057718be8SEnji Cooper ATF_CHECK(signbit(x) == 0);
48157718be8SEnji Cooper ATF_CHECK(signbit(y) == 0);
48257718be8SEnji Cooper }
48357718be8SEnji Cooper
48457718be8SEnji Cooper ATF_TC(log2_zero_neg);
ATF_TC_HEAD(log2_zero_neg,tc)48557718be8SEnji Cooper ATF_TC_HEAD(log2_zero_neg, tc)
48657718be8SEnji Cooper {
48757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2(-0.0) == -HUGE_VAL");
48857718be8SEnji Cooper }
48957718be8SEnji Cooper
ATF_TC_BODY(log2_zero_neg,tc)49057718be8SEnji Cooper ATF_TC_BODY(log2_zero_neg, tc)
49157718be8SEnji Cooper {
49257718be8SEnji Cooper const double x = -0.0L;
49357718be8SEnji Cooper
49457718be8SEnji Cooper ATF_CHECK(log2(x) == -HUGE_VAL);
49557718be8SEnji Cooper }
49657718be8SEnji Cooper
49757718be8SEnji Cooper ATF_TC(log2_zero_pos);
ATF_TC_HEAD(log2_zero_pos,tc)49857718be8SEnji Cooper ATF_TC_HEAD(log2_zero_pos, tc)
49957718be8SEnji Cooper {
50057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2(+0.0) == -HUGE_VAL");
50157718be8SEnji Cooper }
50257718be8SEnji Cooper
ATF_TC_BODY(log2_zero_pos,tc)50357718be8SEnji Cooper ATF_TC_BODY(log2_zero_pos, tc)
50457718be8SEnji Cooper {
50557718be8SEnji Cooper const double x = 0.0L;
50657718be8SEnji Cooper
50757718be8SEnji Cooper ATF_CHECK(log2(x) == -HUGE_VAL);
50857718be8SEnji Cooper }
50957718be8SEnji Cooper
51057718be8SEnji Cooper /*
51157718be8SEnji Cooper * log2f(3)
51257718be8SEnji Cooper */
51357718be8SEnji Cooper ATF_TC(log2f_base);
ATF_TC_HEAD(log2f_base,tc)51457718be8SEnji Cooper ATF_TC_HEAD(log2f_base, tc)
51557718be8SEnji Cooper {
51657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2f(2) == 1");
51757718be8SEnji Cooper }
51857718be8SEnji Cooper
ATF_TC_BODY(log2f_base,tc)51957718be8SEnji Cooper ATF_TC_BODY(log2f_base, tc)
52057718be8SEnji Cooper {
52157718be8SEnji Cooper ATF_CHECK(log2f(2.0) == 1.0);
52257718be8SEnji Cooper }
52357718be8SEnji Cooper
52457718be8SEnji Cooper ATF_TC(log2f_nan);
ATF_TC_HEAD(log2f_nan,tc)52557718be8SEnji Cooper ATF_TC_HEAD(log2f_nan, tc)
52657718be8SEnji Cooper {
52757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2f(NaN) == NaN");
52857718be8SEnji Cooper }
52957718be8SEnji Cooper
ATF_TC_BODY(log2f_nan,tc)53057718be8SEnji Cooper ATF_TC_BODY(log2f_nan, tc)
53157718be8SEnji Cooper {
53257718be8SEnji Cooper const float x = 0.0L / 0.0L;
53357718be8SEnji Cooper
53457718be8SEnji Cooper ATF_CHECK(isnan(x) != 0);
53557718be8SEnji Cooper ATF_CHECK(isnan(log2f(x)) != 0);
53657718be8SEnji Cooper }
53757718be8SEnji Cooper
53857718be8SEnji Cooper ATF_TC(log2f_inf_neg);
ATF_TC_HEAD(log2f_inf_neg,tc)53957718be8SEnji Cooper ATF_TC_HEAD(log2f_inf_neg, tc)
54057718be8SEnji Cooper {
54157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2f(-Inf) == NaN");
54257718be8SEnji Cooper }
54357718be8SEnji Cooper
ATF_TC_BODY(log2f_inf_neg,tc)54457718be8SEnji Cooper ATF_TC_BODY(log2f_inf_neg, tc)
54557718be8SEnji Cooper {
54657718be8SEnji Cooper const float x = -1.0L / 0.0L;
54757718be8SEnji Cooper const float y = log2f(x);
54857718be8SEnji Cooper
54957718be8SEnji Cooper ATF_CHECK(isnan(y) != 0);
55057718be8SEnji Cooper }
55157718be8SEnji Cooper
55257718be8SEnji Cooper ATF_TC(log2f_inf_pos);
ATF_TC_HEAD(log2f_inf_pos,tc)55357718be8SEnji Cooper ATF_TC_HEAD(log2f_inf_pos, tc)
55457718be8SEnji Cooper {
55557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2f(+Inf) == +Inf");
55657718be8SEnji Cooper }
55757718be8SEnji Cooper
ATF_TC_BODY(log2f_inf_pos,tc)55857718be8SEnji Cooper ATF_TC_BODY(log2f_inf_pos, tc)
55957718be8SEnji Cooper {
56057718be8SEnji Cooper const float x = 1.0L / 0.0L;
56157718be8SEnji Cooper
56257718be8SEnji Cooper ATF_CHECK(log2f(x) == x);
56357718be8SEnji Cooper }
56457718be8SEnji Cooper
56557718be8SEnji Cooper ATF_TC(log2f_one_pos);
ATF_TC_HEAD(log2f_one_pos,tc)56657718be8SEnji Cooper ATF_TC_HEAD(log2f_one_pos, tc)
56757718be8SEnji Cooper {
56857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2f(1.0) == +0.0");
56957718be8SEnji Cooper }
57057718be8SEnji Cooper
ATF_TC_BODY(log2f_one_pos,tc)57157718be8SEnji Cooper ATF_TC_BODY(log2f_one_pos, tc)
57257718be8SEnji Cooper {
57357718be8SEnji Cooper const float x = log2f(1.0);
57457718be8SEnji Cooper const float y = 0.0L;
57557718be8SEnji Cooper
57657718be8SEnji Cooper ATF_CHECK(x == y);
57757718be8SEnji Cooper ATF_CHECK(signbit(x) == 0);
57857718be8SEnji Cooper ATF_CHECK(signbit(y) == 0);
57957718be8SEnji Cooper }
58057718be8SEnji Cooper
58157718be8SEnji Cooper ATF_TC(log2f_zero_neg);
ATF_TC_HEAD(log2f_zero_neg,tc)58257718be8SEnji Cooper ATF_TC_HEAD(log2f_zero_neg, tc)
58357718be8SEnji Cooper {
58457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2f(-0.0) == -HUGE_VALF");
58557718be8SEnji Cooper }
58657718be8SEnji Cooper
ATF_TC_BODY(log2f_zero_neg,tc)58757718be8SEnji Cooper ATF_TC_BODY(log2f_zero_neg, tc)
58857718be8SEnji Cooper {
58957718be8SEnji Cooper const float x = -0.0L;
59057718be8SEnji Cooper
59157718be8SEnji Cooper ATF_CHECK(log2f(x) == -HUGE_VALF);
59257718be8SEnji Cooper }
59357718be8SEnji Cooper
59457718be8SEnji Cooper ATF_TC(log2f_zero_pos);
ATF_TC_HEAD(log2f_zero_pos,tc)59557718be8SEnji Cooper ATF_TC_HEAD(log2f_zero_pos, tc)
59657718be8SEnji Cooper {
59757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log2f(+0.0) == -HUGE_VALF");
59857718be8SEnji Cooper }
59957718be8SEnji Cooper
ATF_TC_BODY(log2f_zero_pos,tc)60057718be8SEnji Cooper ATF_TC_BODY(log2f_zero_pos, tc)
60157718be8SEnji Cooper {
60257718be8SEnji Cooper const float x = 0.0L;
60357718be8SEnji Cooper
60457718be8SEnji Cooper ATF_CHECK(log2f(x) == -HUGE_VALF);
60557718be8SEnji Cooper }
60657718be8SEnji Cooper
60757718be8SEnji Cooper /*
60857718be8SEnji Cooper * log(3)
60957718be8SEnji Cooper */
61057718be8SEnji Cooper ATF_TC(log_base);
ATF_TC_HEAD(log_base,tc)61157718be8SEnji Cooper ATF_TC_HEAD(log_base, tc)
61257718be8SEnji Cooper {
61357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log(e) == 1");
61457718be8SEnji Cooper }
61557718be8SEnji Cooper
ATF_TC_BODY(log_base,tc)61657718be8SEnji Cooper ATF_TC_BODY(log_base, tc)
61757718be8SEnji Cooper {
618*1ec3feb6SAlex Richardson const double eps = DBL_EPSILON;
61957718be8SEnji Cooper
620*1ec3feb6SAlex Richardson if (!(fabs(log(M_E) - 1.0) <= eps))
621*1ec3feb6SAlex Richardson atf_tc_fail_nonfatal("log(e) = %.17g != 1", log(M_E));
62257718be8SEnji Cooper }
62357718be8SEnji Cooper
62457718be8SEnji Cooper ATF_TC(log_nan);
ATF_TC_HEAD(log_nan,tc)62557718be8SEnji Cooper ATF_TC_HEAD(log_nan, tc)
62657718be8SEnji Cooper {
62757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log(NaN) == NaN");
62857718be8SEnji Cooper }
62957718be8SEnji Cooper
ATF_TC_BODY(log_nan,tc)63057718be8SEnji Cooper ATF_TC_BODY(log_nan, tc)
63157718be8SEnji Cooper {
63257718be8SEnji Cooper const double x = 0.0L / 0.0L;
63357718be8SEnji Cooper
63457718be8SEnji Cooper ATF_CHECK(isnan(x) != 0);
63557718be8SEnji Cooper ATF_CHECK(isnan(log(x)) != 0);
63657718be8SEnji Cooper }
63757718be8SEnji Cooper
63857718be8SEnji Cooper ATF_TC(log_inf_neg);
ATF_TC_HEAD(log_inf_neg,tc)63957718be8SEnji Cooper ATF_TC_HEAD(log_inf_neg, tc)
64057718be8SEnji Cooper {
64157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log(-Inf) == NaN");
64257718be8SEnji Cooper }
64357718be8SEnji Cooper
ATF_TC_BODY(log_inf_neg,tc)64457718be8SEnji Cooper ATF_TC_BODY(log_inf_neg, tc)
64557718be8SEnji Cooper {
64657718be8SEnji Cooper const double x = -1.0L / 0.0L;
64757718be8SEnji Cooper const double y = log(x);
64857718be8SEnji Cooper
64957718be8SEnji Cooper ATF_CHECK(isnan(y) != 0);
65057718be8SEnji Cooper }
65157718be8SEnji Cooper
65257718be8SEnji Cooper ATF_TC(log_inf_pos);
ATF_TC_HEAD(log_inf_pos,tc)65357718be8SEnji Cooper ATF_TC_HEAD(log_inf_pos, tc)
65457718be8SEnji Cooper {
65557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log(+Inf) == +Inf");
65657718be8SEnji Cooper }
65757718be8SEnji Cooper
ATF_TC_BODY(log_inf_pos,tc)65857718be8SEnji Cooper ATF_TC_BODY(log_inf_pos, tc)
65957718be8SEnji Cooper {
66057718be8SEnji Cooper const double x = 1.0L / 0.0L;
66157718be8SEnji Cooper
66257718be8SEnji Cooper ATF_CHECK(log(x) == x);
66357718be8SEnji Cooper }
66457718be8SEnji Cooper
66557718be8SEnji Cooper ATF_TC(log_one_pos);
ATF_TC_HEAD(log_one_pos,tc)66657718be8SEnji Cooper ATF_TC_HEAD(log_one_pos, tc)
66757718be8SEnji Cooper {
66857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log(1.0) == +0.0");
66957718be8SEnji Cooper }
67057718be8SEnji Cooper
ATF_TC_BODY(log_one_pos,tc)67157718be8SEnji Cooper ATF_TC_BODY(log_one_pos, tc)
67257718be8SEnji Cooper {
67357718be8SEnji Cooper const double x = log(1.0);
67457718be8SEnji Cooper const double y = 0.0L;
67557718be8SEnji Cooper
67657718be8SEnji Cooper ATF_CHECK(x == y);
67757718be8SEnji Cooper ATF_CHECK(signbit(x) == 0);
67857718be8SEnji Cooper ATF_CHECK(signbit(y) == 0);
67957718be8SEnji Cooper }
68057718be8SEnji Cooper
68157718be8SEnji Cooper ATF_TC(log_zero_neg);
ATF_TC_HEAD(log_zero_neg,tc)68257718be8SEnji Cooper ATF_TC_HEAD(log_zero_neg, tc)
68357718be8SEnji Cooper {
68457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log(-0.0) == -HUGE_VAL");
68557718be8SEnji Cooper }
68657718be8SEnji Cooper
ATF_TC_BODY(log_zero_neg,tc)68757718be8SEnji Cooper ATF_TC_BODY(log_zero_neg, tc)
68857718be8SEnji Cooper {
68957718be8SEnji Cooper const double x = -0.0L;
69057718be8SEnji Cooper
69157718be8SEnji Cooper ATF_CHECK(log(x) == -HUGE_VAL);
69257718be8SEnji Cooper }
69357718be8SEnji Cooper
69457718be8SEnji Cooper ATF_TC(log_zero_pos);
ATF_TC_HEAD(log_zero_pos,tc)69557718be8SEnji Cooper ATF_TC_HEAD(log_zero_pos, tc)
69657718be8SEnji Cooper {
69757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test log(+0.0) == -HUGE_VAL");
69857718be8SEnji Cooper }
69957718be8SEnji Cooper
ATF_TC_BODY(log_zero_pos,tc)70057718be8SEnji Cooper ATF_TC_BODY(log_zero_pos, tc)
70157718be8SEnji Cooper {
70257718be8SEnji Cooper const double x = 0.0L;
70357718be8SEnji Cooper
70457718be8SEnji Cooper ATF_CHECK(log(x) == -HUGE_VAL);
70557718be8SEnji Cooper }
70657718be8SEnji Cooper
70757718be8SEnji Cooper /*
70857718be8SEnji Cooper * logf(3)
70957718be8SEnji Cooper */
71057718be8SEnji Cooper ATF_TC(logf_base);
ATF_TC_HEAD(logf_base,tc)71157718be8SEnji Cooper ATF_TC_HEAD(logf_base, tc)
71257718be8SEnji Cooper {
71357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test logf(e) == 1");
71457718be8SEnji Cooper }
71557718be8SEnji Cooper
ATF_TC_BODY(logf_base,tc)71657718be8SEnji Cooper ATF_TC_BODY(logf_base, tc)
71757718be8SEnji Cooper {
718*1ec3feb6SAlex Richardson const float eps = FLT_EPSILON;
71957718be8SEnji Cooper
720*1ec3feb6SAlex Richardson if (!(fabsf(logf(M_E) - 1.0f) <= eps))
721*1ec3feb6SAlex Richardson atf_tc_fail_nonfatal("logf(e) = %.17g != 1",
722*1ec3feb6SAlex Richardson (double)logf(M_E));
72357718be8SEnji Cooper }
72457718be8SEnji Cooper
72557718be8SEnji Cooper ATF_TC(logf_nan);
ATF_TC_HEAD(logf_nan,tc)72657718be8SEnji Cooper ATF_TC_HEAD(logf_nan, tc)
72757718be8SEnji Cooper {
72857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test logf(NaN) == NaN");
72957718be8SEnji Cooper }
73057718be8SEnji Cooper
ATF_TC_BODY(logf_nan,tc)73157718be8SEnji Cooper ATF_TC_BODY(logf_nan, tc)
73257718be8SEnji Cooper {
73357718be8SEnji Cooper const float x = 0.0L / 0.0L;
73457718be8SEnji Cooper
73557718be8SEnji Cooper ATF_CHECK(isnan(x) != 0);
73657718be8SEnji Cooper ATF_CHECK(isnan(logf(x)) != 0);
73757718be8SEnji Cooper }
73857718be8SEnji Cooper
73957718be8SEnji Cooper ATF_TC(logf_inf_neg);
ATF_TC_HEAD(logf_inf_neg,tc)74057718be8SEnji Cooper ATF_TC_HEAD(logf_inf_neg, tc)
74157718be8SEnji Cooper {
74257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test logf(-Inf) == NaN");
74357718be8SEnji Cooper }
74457718be8SEnji Cooper
ATF_TC_BODY(logf_inf_neg,tc)74557718be8SEnji Cooper ATF_TC_BODY(logf_inf_neg, tc)
74657718be8SEnji Cooper {
74757718be8SEnji Cooper const float x = -1.0L / 0.0L;
74857718be8SEnji Cooper const float y = logf(x);
74957718be8SEnji Cooper
75057718be8SEnji Cooper ATF_CHECK(isnan(y) != 0);
75157718be8SEnji Cooper }
75257718be8SEnji Cooper
75357718be8SEnji Cooper ATF_TC(logf_inf_pos);
ATF_TC_HEAD(logf_inf_pos,tc)75457718be8SEnji Cooper ATF_TC_HEAD(logf_inf_pos, tc)
75557718be8SEnji Cooper {
75657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test logf(+Inf) == +Inf");
75757718be8SEnji Cooper }
75857718be8SEnji Cooper
ATF_TC_BODY(logf_inf_pos,tc)75957718be8SEnji Cooper ATF_TC_BODY(logf_inf_pos, tc)
76057718be8SEnji Cooper {
76157718be8SEnji Cooper const float x = 1.0L / 0.0L;
76257718be8SEnji Cooper
76357718be8SEnji Cooper ATF_CHECK(logf(x) == x);
76457718be8SEnji Cooper }
76557718be8SEnji Cooper
76657718be8SEnji Cooper ATF_TC(logf_one_pos);
ATF_TC_HEAD(logf_one_pos,tc)76757718be8SEnji Cooper ATF_TC_HEAD(logf_one_pos, tc)
76857718be8SEnji Cooper {
76957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test logf(1.0) == +0.0");
77057718be8SEnji Cooper }
77157718be8SEnji Cooper
ATF_TC_BODY(logf_one_pos,tc)77257718be8SEnji Cooper ATF_TC_BODY(logf_one_pos, tc)
77357718be8SEnji Cooper {
77457718be8SEnji Cooper const float x = logf(1.0);
77557718be8SEnji Cooper const float y = 0.0L;
77657718be8SEnji Cooper
77757718be8SEnji Cooper ATF_CHECK(x == y);
77857718be8SEnji Cooper ATF_CHECK(signbit(x) == 0);
77957718be8SEnji Cooper ATF_CHECK(signbit(y) == 0);
78057718be8SEnji Cooper }
78157718be8SEnji Cooper
78257718be8SEnji Cooper ATF_TC(logf_zero_neg);
ATF_TC_HEAD(logf_zero_neg,tc)78357718be8SEnji Cooper ATF_TC_HEAD(logf_zero_neg, tc)
78457718be8SEnji Cooper {
78557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test logf(-0.0) == -HUGE_VALF");
78657718be8SEnji Cooper }
78757718be8SEnji Cooper
ATF_TC_BODY(logf_zero_neg,tc)78857718be8SEnji Cooper ATF_TC_BODY(logf_zero_neg, tc)
78957718be8SEnji Cooper {
79057718be8SEnji Cooper const float x = -0.0L;
79157718be8SEnji Cooper
79257718be8SEnji Cooper ATF_CHECK(logf(x) == -HUGE_VALF);
79357718be8SEnji Cooper }
79457718be8SEnji Cooper
79557718be8SEnji Cooper ATF_TC(logf_zero_pos);
ATF_TC_HEAD(logf_zero_pos,tc)79657718be8SEnji Cooper ATF_TC_HEAD(logf_zero_pos, tc)
79757718be8SEnji Cooper {
79857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test logf(+0.0) == -HUGE_VALF");
79957718be8SEnji Cooper }
80057718be8SEnji Cooper
ATF_TC_BODY(logf_zero_pos,tc)80157718be8SEnji Cooper ATF_TC_BODY(logf_zero_pos, tc)
80257718be8SEnji Cooper {
80357718be8SEnji Cooper const float x = 0.0L;
80457718be8SEnji Cooper
80557718be8SEnji Cooper ATF_CHECK(logf(x) == -HUGE_VALF);
80657718be8SEnji Cooper }
80757718be8SEnji Cooper
ATF_TP_ADD_TCS(tp)80857718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
80957718be8SEnji Cooper {
81057718be8SEnji Cooper
81157718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10_base);
81257718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10_nan);
81357718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10_inf_neg);
81457718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10_inf_pos);
81557718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10_one_pos);
81657718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10_zero_neg);
81757718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10_zero_pos);
81857718be8SEnji Cooper
81957718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10f_base);
82057718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10f_nan);
82157718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10f_inf_neg);
82257718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10f_inf_pos);
82357718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10f_one_pos);
82457718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10f_zero_neg);
82557718be8SEnji Cooper ATF_TP_ADD_TC(tp, log10f_zero_pos);
82657718be8SEnji Cooper
82757718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1p_nan);
82857718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1p_inf_neg);
82957718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1p_inf_pos);
83057718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1p_one_neg);
83157718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1p_zero_neg);
83257718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1p_zero_pos);
83357718be8SEnji Cooper
83457718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1pf_nan);
83557718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1pf_inf_neg);
83657718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1pf_inf_pos);
83757718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1pf_one_neg);
83857718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1pf_zero_neg);
83957718be8SEnji Cooper ATF_TP_ADD_TC(tp, log1pf_zero_pos);
84057718be8SEnji Cooper
84157718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2_base);
84257718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2_nan);
84357718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2_inf_neg);
84457718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2_inf_pos);
84557718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2_one_pos);
84657718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2_zero_neg);
84757718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2_zero_pos);
84857718be8SEnji Cooper
84957718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2f_base);
85057718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2f_nan);
85157718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2f_inf_neg);
85257718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2f_inf_pos);
85357718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2f_one_pos);
85457718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2f_zero_neg);
85557718be8SEnji Cooper ATF_TP_ADD_TC(tp, log2f_zero_pos);
85657718be8SEnji Cooper
85757718be8SEnji Cooper ATF_TP_ADD_TC(tp, log_base);
85857718be8SEnji Cooper ATF_TP_ADD_TC(tp, log_nan);
85957718be8SEnji Cooper ATF_TP_ADD_TC(tp, log_inf_neg);
86057718be8SEnji Cooper ATF_TP_ADD_TC(tp, log_inf_pos);
86157718be8SEnji Cooper ATF_TP_ADD_TC(tp, log_one_pos);
86257718be8SEnji Cooper ATF_TP_ADD_TC(tp, log_zero_neg);
86357718be8SEnji Cooper ATF_TP_ADD_TC(tp, log_zero_pos);
86457718be8SEnji Cooper
86557718be8SEnji Cooper ATF_TP_ADD_TC(tp, logf_base);
86657718be8SEnji Cooper ATF_TP_ADD_TC(tp, logf_nan);
86757718be8SEnji Cooper ATF_TP_ADD_TC(tp, logf_inf_neg);
86857718be8SEnji Cooper ATF_TP_ADD_TC(tp, logf_inf_pos);
86957718be8SEnji Cooper ATF_TP_ADD_TC(tp, logf_one_pos);
87057718be8SEnji Cooper ATF_TP_ADD_TC(tp, logf_zero_neg);
87157718be8SEnji Cooper ATF_TP_ADD_TC(tp, logf_zero_pos);
87257718be8SEnji Cooper
87357718be8SEnji Cooper return atf_no_error();
87457718be8SEnji Cooper }
875