Home | History | Annotate | Line # | Download | only in libm
      1  1.19  riastrad /* $NetBSD: t_log.c,v 1.19 2024/07/17 14:52:13 riastradh Exp $ */
      2   1.1    jruoho 
      3   1.1    jruoho /*-
      4   1.1    jruoho  * Copyright (c) 2011 The NetBSD Foundation, Inc.
      5   1.1    jruoho  * All rights reserved.
      6   1.1    jruoho  *
      7   1.1    jruoho  * This code is derived from software contributed to The NetBSD Foundation
      8   1.1    jruoho  * by Jukka Ruohonen.
      9   1.1    jruoho  *
     10   1.1    jruoho  * Redistribution and use in source and binary forms, with or without
     11   1.1    jruoho  * modification, are permitted provided that the following conditions
     12   1.1    jruoho  * are met:
     13   1.1    jruoho  * 1. Redistributions of source code must retain the above copyright
     14   1.1    jruoho  *    notice, this list of conditions and the following disclaimer.
     15   1.1    jruoho  * 2. Redistributions in binary form must reproduce the above copyright
     16   1.1    jruoho  *    notice, this list of conditions and the following disclaimer in the
     17   1.1    jruoho  *    documentation and/or other materials provided with the distribution.
     18   1.1    jruoho  *
     19   1.1    jruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20   1.1    jruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21   1.1    jruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22   1.1    jruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23   1.1    jruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24   1.1    jruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25   1.1    jruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26   1.1    jruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27   1.1    jruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28   1.1    jruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29   1.1    jruoho  * POSSIBILITY OF SUCH DAMAGE.
     30   1.1    jruoho  */
     31   1.1    jruoho #include <sys/cdefs.h>
     32  1.19  riastrad __RCSID("$NetBSD: t_log.c,v 1.19 2024/07/17 14:52:13 riastradh Exp $");
     33  1.17  riastrad 
     34  1.17  riastrad #include <sys/types.h>
     35   1.1    jruoho 
     36   1.3    jruoho #include <atf-c.h>
     37   1.7    jruoho 
     38  1.16  riastrad #include <errno.h>
     39  1.14  riastrad #include <float.h>
     40   1.7    jruoho #include <math.h>
     41   1.3    jruoho #include <stdio.h>
     42   1.7    jruoho #include <string.h>
     43   1.1    jruoho 
     44  1.16  riastrad #define	CHECK_EQ(i, f, x, y)						      \
     45  1.16  riastrad 	ATF_CHECK_EQ_MSG(f(x), y,					      \
     46  1.16  riastrad 	    "[%u] %s(%a=%.17g)=%a=%.17g, expected %a=%.17g",		      \
     47  1.16  riastrad 	    (i), #f, (double)(x), (double)(x), f(x), f(x),		      \
     48  1.16  riastrad 	    (double)(y), (double)(y))
     49  1.16  riastrad 
     50  1.16  riastrad #define	CHECKL_EQ(i, f, x, y)						      \
     51  1.16  riastrad 	ATF_CHECK_EQ_MSG(f(x), y,					      \
     52  1.17  riastrad 	    "[%u] %s(%La=%.34Lg)=%La=%.34Lg, expected %La=%.34Lg",	      \
     53  1.16  riastrad 	    (i), #f, (long double)(x), (long double)(x), f(x), f(x),	      \
     54  1.16  riastrad 	    (long double)(y), (long double)(y))
     55  1.16  riastrad 
     56  1.16  riastrad #ifdef NAN
     57  1.16  riastrad 
     58  1.16  riastrad #define	CHECK_NAN(i, f, x)						      \
     59  1.16  riastrad 	ATF_CHECK_MSG(isnan(f(x)),					      \
     60  1.16  riastrad 	    "[%u] %s(%a=%.17g)=%a=%.17g, expected NaN",			      \
     61  1.16  riastrad 	    (i), #f, (x), (x), f(x), f(x))
     62  1.16  riastrad 
     63  1.16  riastrad #define	CHECKL_NAN(i, f, x)						      \
     64  1.16  riastrad 	ATF_CHECK_MSG(isnan(f(x)),					      \
     65  1.17  riastrad 	    "[%u] %s(%La=%.34Lg)=%La=%.34Lg, expected NaN",		      \
     66  1.16  riastrad 	    (i), #f, (long double)(x), (long double)(x), f(x), f(x))
     67  1.16  riastrad 
     68  1.16  riastrad #else  /* !defined(NAN) */
     69  1.16  riastrad 
     70  1.16  riastrad #define	CHECK_NAN(i, f, x) do						      \
     71  1.16  riastrad {									      \
     72  1.16  riastrad 	int _checknan_error;						      \
     73  1.16  riastrad 	double _checknan_result;					      \
     74  1.16  riastrad 	errno = 0;							      \
     75  1.16  riastrad 	_checknan_result = f(x);					      \
     76  1.16  riastrad 	_checknan_error = errno;					      \
     77  1.16  riastrad 	ATF_CHECK_EQ_MSG(errno, EDOM,					      \
     78  1.16  riastrad 	    "[%u] %s(%a=%.17g)=%a=%.17g errno=%d, expected EDOM=%d",	      \
     79  1.16  riastrad 	    (i), #f, (double)(x), (double)(x),				      \
     80  1.16  riastrad 	    _checknan_result, _checknan_result,				      \
     81  1.16  riastrad 	    _checknan_error, EDOM);					      \
     82  1.16  riastrad } while (0)
     83  1.16  riastrad 
     84  1.16  riastrad #define	CHECKL_NAN(i, f, x) do						      \
     85  1.16  riastrad {									      \
     86  1.16  riastrad 	int _checknan_error;						      \
     87  1.16  riastrad 	long double _checknan_result;					      \
     88  1.16  riastrad 	errno = 0;							      \
     89  1.16  riastrad 	_checknan_result = f(x);					      \
     90  1.16  riastrad 	_checknan_error = errno;					      \
     91  1.16  riastrad 	ATF_CHECK_EQ_MSG(errno, EDOM,					      \
     92  1.17  riastrad 	    "[%u] %s(%La=%.34Lg)=%La=%.34Lg errno=%d, expected EDOM=%d",      \
     93  1.16  riastrad 	    (i), #f, (long double)(x), (long double)(x),		      \
     94  1.16  riastrad 	    _checknan_result, _checknan_result,				      \
     95  1.16  riastrad 	    _checknan_error, EDOM);					      \
     96  1.16  riastrad } while (0)
     97  1.16  riastrad 
     98  1.16  riastrad #endif	/* NAN */
     99  1.16  riastrad 
    100  1.16  riastrad static const float logf_invalid[] = {
    101  1.16  riastrad #ifdef NAN
    102  1.16  riastrad 	NAN,
    103  1.16  riastrad #endif
    104  1.16  riastrad 	-HUGE_VALF,
    105  1.16  riastrad 	-FLT_MAX,
    106  1.16  riastrad 	-10,
    107  1.16  riastrad 	-1,
    108  1.16  riastrad 	-FLT_EPSILON,
    109  1.16  riastrad 	-FLT_MIN,
    110  1.16  riastrad #ifdef FLT_DENORM_MIN
    111  1.16  riastrad 	-FLT_DENORM_MIN,
    112  1.16  riastrad #endif
    113  1.16  riastrad };
    114  1.16  riastrad 
    115  1.16  riastrad static const double log_invalid[] = {
    116  1.16  riastrad #ifdef NAN
    117  1.16  riastrad 	NAN,
    118  1.16  riastrad #endif
    119  1.16  riastrad 	-HUGE_VAL,
    120  1.16  riastrad 	-DBL_MAX,
    121  1.16  riastrad 	-10,
    122  1.16  riastrad 	-1,
    123  1.16  riastrad 	-DBL_EPSILON,
    124  1.16  riastrad 	-DBL_MIN,
    125  1.16  riastrad #ifdef DBL_DENORM_MIN
    126  1.16  riastrad 	-DBL_DENORM_MIN,
    127  1.16  riastrad #endif
    128  1.16  riastrad };
    129  1.16  riastrad 
    130  1.16  riastrad static const long double logl_invalid[] = {
    131  1.16  riastrad #ifdef NAN
    132  1.16  riastrad 	NAN,
    133  1.16  riastrad #endif
    134  1.16  riastrad 	-HUGE_VALL,
    135  1.16  riastrad 	-LDBL_MAX,
    136  1.16  riastrad 	-10,
    137  1.16  riastrad 	-1,
    138  1.16  riastrad 	-LDBL_EPSILON,
    139  1.16  riastrad 	-LDBL_MIN,
    140  1.16  riastrad #ifdef LDBL_DENORM_MIN
    141  1.16  riastrad 	-LDBL_DENORM_MIN,
    142  1.16  riastrad #endif
    143  1.16  riastrad };
    144  1.16  riastrad 
    145  1.16  riastrad static const float log1pf_invalid[] = {
    146  1.16  riastrad #ifdef NAN
    147  1.16  riastrad 	NAN,
    148  1.16  riastrad #endif
    149  1.16  riastrad 	-HUGE_VALF,
    150  1.16  riastrad 	-FLT_MAX,
    151  1.16  riastrad 	-10,
    152  1.16  riastrad 	-1 - FLT_EPSILON,
    153  1.16  riastrad };
    154  1.16  riastrad 
    155  1.16  riastrad static const double log1p_invalid[] = {
    156  1.16  riastrad #ifdef NAN
    157  1.16  riastrad 	NAN,
    158  1.16  riastrad #endif
    159  1.16  riastrad 	-HUGE_VAL,
    160  1.16  riastrad 	-DBL_MAX,
    161  1.16  riastrad 	-10,
    162  1.16  riastrad 	-1 - DBL_EPSILON,
    163  1.16  riastrad };
    164  1.16  riastrad 
    165  1.16  riastrad static const long double log1pl_invalid[] = {
    166  1.16  riastrad #ifdef NAN
    167  1.16  riastrad 	NAN,
    168  1.16  riastrad #endif
    169  1.16  riastrad 	-HUGE_VALL,
    170  1.16  riastrad 	-LDBL_MAX,
    171  1.16  riastrad 	-10,
    172  1.16  riastrad 	-1 - LDBL_EPSILON,
    173  1.16  riastrad };
    174  1.16  riastrad 
    175   1.3    jruoho /*
    176   1.3    jruoho  * log10(3)
    177   1.3    jruoho  */
    178  1.16  riastrad static const struct {
    179  1.16  riastrad 	float x, y;
    180  1.16  riastrad } log10f_exact[] = {
    181  1.16  riastrad 	{ 1, 0 },
    182  1.16  riastrad 	{ 10, 1 },
    183  1.16  riastrad 	{ 100, 2 },
    184  1.16  riastrad };
    185   1.3    jruoho 
    186  1.16  riastrad ATF_TC(log10_invalid);
    187  1.16  riastrad ATF_TC_HEAD(log10_invalid, tc)
    188   1.5    jruoho {
    189  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log10/f/l on invalid inputs");
    190   1.5    jruoho }
    191  1.16  riastrad ATF_TC_BODY(log10_invalid, tc)
    192   1.5    jruoho {
    193  1.16  riastrad 	unsigned i;
    194   1.5    jruoho 
    195  1.16  riastrad 	for (i = 0; i < __arraycount(logf_invalid); i++) {
    196  1.16  riastrad 		CHECK_NAN(i, log10f, logf_invalid[i]);
    197  1.16  riastrad 		CHECK_NAN(i, log10, logf_invalid[i]);
    198  1.16  riastrad 		CHECKL_NAN(i, log10l, logf_invalid[i]);
    199  1.16  riastrad 	}
    200   1.3    jruoho 
    201  1.16  riastrad 	for (i = 0; i < __arraycount(log_invalid); i++) {
    202  1.16  riastrad 		CHECK_NAN(i, log10, log_invalid[i]);
    203  1.16  riastrad 		CHECKL_NAN(i, log10l, log_invalid[i]);
    204  1.16  riastrad 	}
    205   1.3    jruoho 
    206  1.16  riastrad 	for (i = 0; i < __arraycount(logl_invalid); i++) {
    207  1.16  riastrad 		CHECKL_NAN(i, log10l, logl_invalid[i]);
    208  1.16  riastrad 	}
    209   1.3    jruoho }
    210   1.3    jruoho 
    211  1.16  riastrad ATF_TC(log10_zero);
    212  1.16  riastrad ATF_TC_HEAD(log10_zero, tc)
    213   1.3    jruoho {
    214  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log10/f/l on zero");
    215   1.3    jruoho }
    216  1.16  riastrad ATF_TC_BODY(log10_zero, tc)
    217   1.3    jruoho {
    218   1.3    jruoho 
    219  1.16  riastrad 	CHECK_EQ(0, log10f, +0., -HUGE_VALF);
    220  1.16  riastrad 	CHECK_EQ(0, log10, +0., -HUGE_VAL);
    221  1.16  riastrad 	CHECKL_EQ(0, log10l, +0., -HUGE_VALL);
    222   1.3    jruoho 
    223  1.16  riastrad 	CHECK_EQ(1, log10f, -0., -HUGE_VALF);
    224  1.16  riastrad 	CHECK_EQ(1, log10, -0., -HUGE_VAL);
    225  1.16  riastrad 	CHECKL_EQ(1, log10l, -0., -HUGE_VALL);
    226   1.3    jruoho }
    227   1.3    jruoho 
    228  1.16  riastrad ATF_TC(log10_exact);
    229  1.16  riastrad ATF_TC_HEAD(log10_exact, tc)
    230   1.3    jruoho {
    231  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log10/f/l exact cases");
    232   1.3    jruoho }
    233  1.16  riastrad ATF_TC_BODY(log10_exact, tc)
    234   1.3    jruoho {
    235  1.16  riastrad 	unsigned i;
    236   1.3    jruoho 
    237  1.16  riastrad 	ATF_CHECK_EQ(signbit(log10f(1)), 0);
    238  1.16  riastrad 	ATF_CHECK_EQ(signbit(log10(1)), 0);
    239  1.16  riastrad 	ATF_CHECK_EQ(signbit(log10l(1)), 0);
    240   1.3    jruoho 
    241  1.16  riastrad 	for (i = 0; i < __arraycount(log10f_exact); i++) {
    242  1.16  riastrad 		const float x = log10f_exact[i].x;
    243  1.16  riastrad 		const float y = log10f_exact[i].y;
    244   1.3    jruoho 
    245  1.16  riastrad 		CHECK_EQ(i, log10f, x, y);
    246  1.16  riastrad 		CHECK_EQ(i, log10, x, y);
    247  1.16  riastrad 		CHECKL_EQ(i, log10l, x, y);
    248  1.16  riastrad 	}
    249   1.3    jruoho }
    250   1.3    jruoho 
    251  1.17  riastrad ATF_TC(log10_approx);
    252  1.17  riastrad ATF_TC_HEAD(log10_approx, tc)
    253  1.17  riastrad {
    254  1.17  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log10/f/l approximate cases");
    255  1.17  riastrad }
    256  1.17  riastrad ATF_TC_BODY(log10_approx, tc)
    257  1.17  riastrad {
    258  1.17  riastrad 	volatile long double e =
    259  1.17  riastrad 	    2.7182818284590452353602874713526624977572470937L;
    260  1.17  riastrad 	volatile long double e2 =
    261  1.17  riastrad 	    7.3890560989306502272304274605750078131803155705519L;
    262  1.17  riastrad 	volatile long double log10e =
    263  1.17  riastrad 	    0.43429448190325182765112891891660508229439700580367L;
    264  1.17  riastrad 	volatile long double log10e2 =
    265  1.17  riastrad 	    2*0.43429448190325182765112891891660508229439700580367L;
    266  1.17  riastrad 
    267  1.17  riastrad 	ATF_CHECK_MSG((fabsf((log10f(e) - (float)log10e)/(float)log10e) <
    268  1.17  riastrad 		2*FLT_EPSILON),
    269  1.17  riastrad 	    "log10f(e)=%a=%.8g expected %a=%.8g",
    270  1.17  riastrad 	    log10f(e), log10f(e), (float)log10e, (float)log10e);
    271  1.17  riastrad 	ATF_CHECK_MSG((fabs((log10(e) - (double)log10e)/(double)log10e) <
    272  1.17  riastrad 		2*DBL_EPSILON),
    273  1.17  riastrad 	    "log10(e)=%a=%.17g expected %a=%.17g",
    274  1.17  riastrad 	    log10(e), log10(e), (double)log10e, (double)log10e);
    275  1.17  riastrad 	ATF_CHECK_MSG((fabsl((log10l(e) - log10e)/log10e) < 2*LDBL_EPSILON),
    276  1.17  riastrad 	    "log10l(e)=%La=%.34Lg expected %La=%.34Lg",
    277  1.17  riastrad 	    log10l(e), log10l(e), log10e, log10e);
    278  1.17  riastrad 
    279  1.17  riastrad 	ATF_CHECK_MSG((fabsf((log10f(e2) - (float)log10e2)/(float)log10e2) <
    280  1.17  riastrad 		2*FLT_EPSILON),
    281  1.17  riastrad 	    "log10f(e^2)=%a=%.8g expected %a=%.8g",
    282  1.17  riastrad 	    log10f(e2), log10f(e2), (float)log10e2, (float)log10e2);
    283  1.17  riastrad 	ATF_CHECK_MSG((fabs((log10(e2) - (double)log10e2)/(double)log10e2) <
    284  1.17  riastrad 		2*DBL_EPSILON),
    285  1.17  riastrad 	    "log10(e^2)=%a=%.17g expected %a=%.17g",
    286  1.17  riastrad 	    log10(e2), log10(e2), (double)log10e2, (double)log10e2);
    287  1.17  riastrad 	ATF_CHECK_MSG((fabsl((log10l(e2) - log10e2)/log10e2) < 2*LDBL_EPSILON),
    288  1.17  riastrad 	    "log10l(e^2)=%La=%.34Lg expected %La=%.34Lg",
    289  1.17  riastrad 	    log10l(e2), log10l(e2), log10e2, log10e2);
    290  1.17  riastrad }
    291  1.17  riastrad 
    292  1.16  riastrad ATF_TC(log10_inf);
    293  1.16  riastrad ATF_TC_HEAD(log10_inf, tc)
    294   1.3    jruoho {
    295  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log10/f/l on +infinity");
    296   1.3    jruoho }
    297  1.16  riastrad ATF_TC_BODY(log10_inf, tc)
    298   1.3    jruoho {
    299   1.3    jruoho 
    300  1.16  riastrad 	if (!isinf(INFINITY))
    301  1.16  riastrad 		atf_tc_skip("no infinities on this architecture");
    302   1.3    jruoho 
    303  1.16  riastrad 	CHECK_EQ(0, log10f, INFINITY, INFINITY);
    304  1.16  riastrad 	CHECK_EQ(0, log10, INFINITY, INFINITY);
    305  1.16  riastrad 	CHECKL_EQ(0, log10l, INFINITY, INFINITY);
    306   1.3    jruoho }
    307   1.3    jruoho 
    308   1.3    jruoho /*
    309   1.3    jruoho  * log1p(3)
    310   1.3    jruoho  */
    311   1.3    jruoho 
    312  1.16  riastrad ATF_TC(log1p_invalid);
    313  1.16  riastrad ATF_TC_HEAD(log1p_invalid, tc)
    314   1.3    jruoho {
    315  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on invalid inputs");
    316   1.3    jruoho }
    317  1.16  riastrad ATF_TC_BODY(log1p_invalid, tc)
    318   1.3    jruoho {
    319  1.16  riastrad 	unsigned i;
    320   1.3    jruoho 
    321  1.16  riastrad 	for (i = 0; i < __arraycount(log1pf_invalid); i++) {
    322  1.16  riastrad 		CHECK_NAN(i, log1pf, log1pf_invalid[i]);
    323  1.16  riastrad 		CHECK_NAN(i, log1p, log1pf_invalid[i]);
    324  1.16  riastrad 		CHECKL_NAN(i, log1pl, log1pf_invalid[i]);
    325  1.16  riastrad 	}
    326   1.3    jruoho 
    327  1.16  riastrad 	for (i = 0; i < __arraycount(log1p_invalid); i++) {
    328  1.16  riastrad 		CHECK_NAN(i, log1p, log1p_invalid[i]);
    329  1.16  riastrad 		CHECKL_NAN(i, log1pl, log1p_invalid[i]);
    330  1.16  riastrad 	}
    331   1.3    jruoho 
    332  1.16  riastrad 	for (i = 0; i < __arraycount(log1pl_invalid); i++) {
    333  1.16  riastrad 		CHECKL_NAN(i, log1pl, log1pl_invalid[i]);
    334  1.16  riastrad 	}
    335   1.3    jruoho }
    336   1.3    jruoho 
    337  1.16  riastrad ATF_TC(log1p_neg_one);
    338  1.16  riastrad ATF_TC_HEAD(log1p_neg_one, tc)
    339   1.3    jruoho {
    340  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on -1");
    341   1.3    jruoho }
    342  1.16  riastrad ATF_TC_BODY(log1p_neg_one, tc)
    343   1.3    jruoho {
    344   1.3    jruoho 
    345  1.16  riastrad 	CHECK_EQ(0, log1pf, -1., -HUGE_VALF);
    346  1.16  riastrad 	CHECK_EQ(0, log1p, -1., -HUGE_VAL);
    347  1.16  riastrad 	CHECKL_EQ(0, log1pl, -1., -HUGE_VALL);
    348   1.3    jruoho }
    349   1.3    jruoho 
    350  1.16  riastrad ATF_TC(log1p_exact);
    351  1.16  riastrad ATF_TC_HEAD(log1p_exact, tc)
    352   1.3    jruoho {
    353  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log1p/f/l exact cases");
    354   1.3    jruoho }
    355  1.16  riastrad ATF_TC_BODY(log1p_exact, tc)
    356   1.3    jruoho {
    357   1.3    jruoho 
    358  1.17  riastrad 	CHECK_EQ(0, log1pf, -FLT_MIN, -FLT_MIN);
    359  1.17  riastrad 	CHECK_EQ(0, log1p, -DBL_MIN, -DBL_MIN);
    360  1.17  riastrad 	CHECKL_EQ(01, log1pl, -LDBL_MIN, -LDBL_MIN);
    361  1.17  riastrad 
    362  1.17  riastrad 	CHECK_EQ(1, log1pf, -0., 0);
    363  1.17  riastrad 	CHECK_EQ(1, log1p, -0., 0);
    364  1.17  riastrad 	CHECKL_EQ(1, log1pl, -0., 0);
    365  1.17  riastrad 
    366  1.17  riastrad 	CHECK_EQ(2, log1pf, +0., 0);
    367  1.17  riastrad 	CHECK_EQ(2, log1p, +0., 0);
    368  1.17  riastrad 	CHECKL_EQ(2, log1pl, +0., 0);
    369  1.17  riastrad 
    370  1.19  riastrad #ifdef __i386__
    371  1.19  riastrad 	atf_tc_expect_fail("PR port-i386/58434: single-float functions"
    372  1.19  riastrad 	    " sometimes return surprisingly much precision");
    373  1.19  riastrad #endif
    374  1.17  riastrad 	CHECK_EQ(3, log1pf, 1, logf(2));
    375  1.19  riastrad #ifdef __i386__
    376  1.19  riastrad 	atf_tc_expect_pass();
    377  1.19  riastrad #endif
    378  1.17  riastrad 	CHECK_EQ(3, log1p, 1, log(2));
    379  1.17  riastrad 	CHECKL_EQ(3, log1pl, 1, logl(2));
    380  1.17  riastrad }
    381  1.17  riastrad 
    382  1.17  riastrad ATF_TC(log1p_approx);
    383  1.17  riastrad ATF_TC_HEAD(log1p_approx, tc)
    384  1.17  riastrad {
    385  1.17  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log1p/f/l approximate cases");
    386  1.17  riastrad }
    387  1.17  riastrad ATF_TC_BODY(log1p_approx, tc)
    388  1.17  riastrad {
    389  1.17  riastrad 	volatile long double em1 =	/* exp(1) - 1 */
    390  1.17  riastrad 	    1.7182818284590452353602874713526624977572470937L;
    391  1.17  riastrad 	volatile long double e2m1 =	/* exp(2) - 1 */
    392  1.17  riastrad 	    6.3890560989306502272304274605750078131803155705519L;
    393  1.17  riastrad 
    394  1.16  riastrad 	/*
    395  1.17  riastrad 	 * Approximation is close enough that equality of the rounded
    396  1.17  riastrad 	 * output had better hold.
    397  1.16  riastrad 	 */
    398  1.16  riastrad #ifdef FLT_DENORM_MIN
    399  1.16  riastrad 	CHECK_EQ(0, log1pf, -FLT_DENORM_MIN, -FLT_DENORM_MIN);
    400  1.16  riastrad #endif
    401  1.16  riastrad #ifdef DBL_DENORM_MIN
    402  1.16  riastrad 	CHECK_EQ(0, log1p, -DBL_DENORM_MIN, -DBL_DENORM_MIN);
    403  1.16  riastrad #endif
    404  1.16  riastrad #ifdef LDBL_DENORM_MIN
    405  1.16  riastrad 	CHECKL_EQ(0, log1pl, -LDBL_DENORM_MIN, -LDBL_DENORM_MIN);
    406  1.16  riastrad #endif
    407   1.3    jruoho 
    408  1.17  riastrad 	ATF_CHECK_MSG(fabsf((log1pf(em1) - 1)/1) < 2*FLT_EPSILON,
    409  1.17  riastrad 	    "log1pf(e)=%a=%.8g", log1pf(em1), log1pf(em1));
    410  1.17  riastrad 	ATF_CHECK_MSG(fabs((log1p(em1) - 1)/1) < 2*DBL_EPSILON,
    411  1.17  riastrad 	    "log1p(e)=%a=%.17g", log1p(em1), log1p(em1));
    412  1.17  riastrad 	ATF_CHECK_MSG(fabsl((log1pl(em1) - 1)/1) < 2*LDBL_EPSILON,
    413  1.17  riastrad 	    "log1pl(e)=%La=%.34Lg", log1pl(em1), log1pl(em1));
    414  1.17  riastrad 
    415  1.17  riastrad 	ATF_CHECK_MSG(fabsf((log1pf(e2m1) - 2)/2) < 2*FLT_EPSILON,
    416  1.17  riastrad 	    "log1pf(e^2)=%a=%.8g", log1pf(em1), log1pf(em1));
    417  1.17  riastrad 	ATF_CHECK_MSG(fabs((log1p(e2m1) - 2)/2) < 2*DBL_EPSILON,
    418  1.17  riastrad 	    "log1p(e^2)=%a=%.17g", log1p(em1), log1p(em1));
    419  1.17  riastrad 	ATF_CHECK_MSG(fabsl((log1pl(e2m1) - 2)/2) < 2*LDBL_EPSILON,
    420  1.17  riastrad 	    "log1pl(e^2)=%La=%.34Lg", log1pl(em1), log1pl(em1));
    421   1.3    jruoho }
    422   1.3    jruoho 
    423  1.16  riastrad ATF_TC(log1p_inf);
    424  1.16  riastrad ATF_TC_HEAD(log1p_inf, tc)
    425   1.3    jruoho {
    426  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on +infinity");
    427   1.3    jruoho }
    428  1.16  riastrad ATF_TC_BODY(log1p_inf, tc)
    429   1.3    jruoho {
    430   1.3    jruoho 
    431  1.16  riastrad 	if (!isinf(INFINITY))
    432  1.16  riastrad 		atf_tc_skip("no infinities on this architecture");
    433   1.3    jruoho 
    434  1.16  riastrad 	CHECK_EQ(0, log1pf, INFINITY, INFINITY);
    435  1.16  riastrad 	CHECK_EQ(0, log1p, INFINITY, INFINITY);
    436  1.16  riastrad 	CHECKL_EQ(0, log1pl, INFINITY, INFINITY);
    437   1.3    jruoho }
    438   1.3    jruoho 
    439   1.3    jruoho /*
    440   1.3    jruoho  * log2(3)
    441   1.3    jruoho  */
    442  1.16  riastrad static const struct {
    443  1.16  riastrad 	float x, y;
    444  1.16  riastrad } log2f_exact[] = {
    445  1.16  riastrad #ifdef FLT_DENORM_MIN
    446  1.16  riastrad 	{ FLT_DENORM_MIN, FLT_MIN_EXP - FLT_MANT_DIG },
    447  1.16  riastrad #endif
    448  1.16  riastrad 	{ FLT_MIN, FLT_MIN_EXP - 1 },
    449  1.16  riastrad 	{ 0.25, -2 },
    450  1.16  riastrad 	{ 0.5, -1 },
    451  1.16  riastrad 	{ 1, 0 },
    452  1.16  riastrad 	{ 2, 1 },
    453  1.16  riastrad 	{ 4, 2 },
    454  1.16  riastrad 	{ 8, 3 },
    455  1.16  riastrad 	{ 1 << FLT_MANT_DIG, FLT_MANT_DIG },
    456  1.16  riastrad 	{ (float)(1 << FLT_MANT_DIG) * (1 << FLT_MANT_DIG),
    457  1.16  riastrad 	  2*FLT_MANT_DIG },
    458  1.16  riastrad };
    459  1.16  riastrad static const struct {
    460  1.16  riastrad 	double x, y;
    461  1.16  riastrad } log2_exact[] = {
    462  1.16  riastrad #ifdef DBL_DENORM_MIN
    463  1.16  riastrad 	{ DBL_DENORM_MIN, DBL_MIN_EXP - DBL_MANT_DIG },
    464  1.16  riastrad #endif
    465  1.16  riastrad 	{ DBL_MIN, DBL_MIN_EXP - 1 },
    466  1.16  riastrad 	{ (uint64_t)1 << DBL_MANT_DIG, DBL_MANT_DIG },
    467  1.16  riastrad 	{ ((double)((uint64_t)1 << DBL_MANT_DIG) *
    468  1.16  riastrad 		    ((uint64_t)1 << DBL_MANT_DIG)),
    469  1.16  riastrad 	  2*DBL_MANT_DIG },
    470  1.16  riastrad };
    471  1.16  riastrad 
    472  1.16  riastrad static const struct {
    473  1.16  riastrad 	long double x, y;
    474  1.16  riastrad } log2l_exact[] = {
    475  1.16  riastrad #ifdef LDBL_DENORM_MIN
    476  1.16  riastrad 	{ LDBL_DENORM_MIN, LDBL_MIN_EXP - LDBL_MANT_DIG },
    477  1.16  riastrad #endif
    478  1.16  riastrad 	{ LDBL_MIN, LDBL_MIN_EXP - 1 },
    479  1.16  riastrad 	{ ((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) *
    480  1.16  riastrad 		    ((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2))),
    481  1.16  riastrad 	  LDBL_MANT_DIG },
    482  1.16  riastrad 	{ (((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) *
    483  1.16  riastrad 			((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2))) *
    484  1.16  riastrad 		    ((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) *
    485  1.16  riastrad 			((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2)))),
    486  1.16  riastrad 	  2*LDBL_MANT_DIG },
    487  1.16  riastrad };
    488  1.16  riastrad 
    489  1.16  riastrad ATF_TC(log2_invalid);
    490  1.16  riastrad ATF_TC_HEAD(log2_invalid, tc)
    491  1.16  riastrad {
    492  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log2/f/l on invalid inputs");
    493  1.16  riastrad }
    494  1.16  riastrad ATF_TC_BODY(log2_invalid, tc)
    495  1.16  riastrad {
    496  1.16  riastrad 	unsigned i;
    497  1.16  riastrad 
    498  1.16  riastrad 	for (i = 0; i < __arraycount(logf_invalid); i++) {
    499  1.16  riastrad 		CHECK_NAN(i, log2f, logf_invalid[i]);
    500  1.16  riastrad 		CHECK_NAN(i, log2, logf_invalid[i]);
    501  1.16  riastrad 		CHECKL_NAN(i, log2l, logf_invalid[i]);
    502  1.16  riastrad 	}
    503  1.16  riastrad 
    504  1.16  riastrad 	for (i = 0; i < __arraycount(log_invalid); i++) {
    505  1.16  riastrad 		CHECK_NAN(i, log2, log_invalid[i]);
    506  1.16  riastrad 		CHECKL_NAN(i, log2l, log_invalid[i]);
    507  1.16  riastrad 	}
    508  1.16  riastrad 
    509  1.16  riastrad 	for (i = 0; i < __arraycount(logl_invalid); i++) {
    510  1.16  riastrad 		CHECKL_NAN(i, log2l, logl_invalid[i]);
    511  1.16  riastrad 	}
    512  1.16  riastrad }
    513  1.16  riastrad 
    514  1.16  riastrad ATF_TC(log2_zero);
    515  1.16  riastrad ATF_TC_HEAD(log2_zero, tc)
    516  1.16  riastrad {
    517  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log2/f/l on zero");
    518  1.16  riastrad }
    519  1.16  riastrad ATF_TC_BODY(log2_zero, tc)
    520  1.16  riastrad {
    521  1.16  riastrad 
    522  1.16  riastrad 	CHECK_EQ(0, log2f, +0., -HUGE_VALF);
    523  1.16  riastrad 	CHECK_EQ(0, log2, +0., -HUGE_VAL);
    524  1.16  riastrad 	CHECKL_EQ(0, log2l, +0., -HUGE_VALL);
    525  1.16  riastrad 
    526  1.16  riastrad 	CHECK_EQ(1, log2f, -0., -HUGE_VALF);
    527  1.16  riastrad 	CHECK_EQ(1, log2, -0., -HUGE_VAL);
    528  1.16  riastrad 	CHECKL_EQ(1, log2l, -0., -HUGE_VALL);
    529  1.16  riastrad }
    530  1.16  riastrad 
    531  1.16  riastrad ATF_TC(log2_exact);
    532  1.16  riastrad ATF_TC_HEAD(log2_exact, tc)
    533  1.16  riastrad {
    534  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log2/f/l exact cases");
    535  1.16  riastrad }
    536  1.16  riastrad ATF_TC_BODY(log2_exact, tc)
    537  1.16  riastrad {
    538  1.16  riastrad 	unsigned i;
    539  1.16  riastrad 
    540  1.16  riastrad 	ATF_CHECK_EQ(signbit(log2f(1)), 0);
    541  1.16  riastrad 	ATF_CHECK_EQ(signbit(log2(1)), 0);
    542  1.16  riastrad 	ATF_CHECK_EQ(signbit(log2l(1)), 0);
    543  1.16  riastrad 
    544  1.16  riastrad 	for (i = 0; i < __arraycount(log2f_exact); i++) {
    545  1.16  riastrad 		const float x = log2f_exact[i].x;
    546  1.16  riastrad 		const float y = log2f_exact[i].y;
    547  1.16  riastrad 
    548  1.16  riastrad 		CHECK_EQ(i, log2f, x, y);
    549  1.16  riastrad 		CHECK_EQ(i, log2, x, y);
    550  1.16  riastrad 		CHECKL_EQ(i, log2l, x, y);
    551  1.16  riastrad 	}
    552  1.16  riastrad 
    553  1.16  riastrad 	for (i = 0; i < __arraycount(log2_exact); i++) {
    554  1.16  riastrad 		const double x = log2_exact[i].x;
    555  1.16  riastrad 		const double y = log2_exact[i].y;
    556  1.16  riastrad 
    557  1.16  riastrad 		CHECK_EQ(i, log2, x, y);
    558  1.16  riastrad 		CHECKL_EQ(i, log2l, x, y);
    559  1.16  riastrad 	}
    560  1.16  riastrad 
    561  1.16  riastrad 	for (i = 0; i < __arraycount(log2l_exact); i++) {
    562  1.16  riastrad 		const long double x = log2l_exact[i].x;
    563  1.16  riastrad 		const long double y = log2l_exact[i].y;
    564  1.16  riastrad 
    565  1.16  riastrad 		CHECKL_EQ(i, log2l, x, y);
    566  1.16  riastrad 	}
    567  1.16  riastrad }
    568  1.16  riastrad 
    569  1.17  riastrad ATF_TC(log2_approx);
    570  1.17  riastrad ATF_TC_HEAD(log2_approx, tc)
    571  1.17  riastrad {
    572  1.17  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log2/f/l approximate cases");
    573  1.17  riastrad }
    574  1.17  riastrad ATF_TC_BODY(log2_approx, tc)
    575  1.17  riastrad {
    576  1.17  riastrad 	volatile long double e =
    577  1.17  riastrad 	    2.7182818284590452353602874713526624977572470937L;
    578  1.17  riastrad 	volatile long double e2 =
    579  1.17  riastrad 	    7.3890560989306502272304274605750078131803155705519L;
    580  1.17  riastrad 	volatile long double log2e =
    581  1.17  riastrad 	    1.442695040888963407359924681001892137426645954153L;
    582  1.17  riastrad 	volatile long double log2e2 =
    583  1.17  riastrad 	    2*1.442695040888963407359924681001892137426645954153L;
    584  1.17  riastrad 
    585  1.17  riastrad 	ATF_CHECK_MSG((fabsf((log2f(e) - (float)log2e)/(float)log2e) <
    586  1.17  riastrad 		2*FLT_EPSILON),
    587  1.17  riastrad 	    "log2f(e)=%a=%.8g expected %a=%.8g",
    588  1.17  riastrad 	    log2f(e), log2f(e), (float)log2e, (float)log2e);
    589  1.17  riastrad 	ATF_CHECK_MSG((fabs((log2(e) - (double)log2e)/(double)log2e) <
    590  1.17  riastrad 		2*DBL_EPSILON),
    591  1.17  riastrad 	    "log2(e)=%a=%.17g expected %a=%.17g",
    592  1.17  riastrad 	    log2(e), log2(e), (double)log2e, (double)log2e);
    593  1.17  riastrad 	ATF_CHECK_MSG((fabsl((log2l(e) - log2e)/log2e) < 2*LDBL_EPSILON),
    594  1.17  riastrad 	    "log2l(e)=%La=%.34Lg expected %La=%.34Lg",
    595  1.17  riastrad 	    log2l(e), log2l(e), log2e, log2e);
    596  1.17  riastrad 
    597  1.17  riastrad 	ATF_CHECK_MSG((fabsf((log2f(e2) - (float)log2e2)/(float)log2e2) <
    598  1.17  riastrad 		2*FLT_EPSILON),
    599  1.17  riastrad 	    "log2f(e^2)=%a=%.8g expected %a=%.8g",
    600  1.17  riastrad 	    log2f(e2), log2f(e2), (float)log2e2, (float)log2e2);
    601  1.17  riastrad 	ATF_CHECK_MSG((fabs((log2(e2) - (double)log2e2)/(double)log2e2) <
    602  1.17  riastrad 		2*DBL_EPSILON),
    603  1.17  riastrad 	    "log2(e^2)=%a=%.17g expected %a=%.17g",
    604  1.17  riastrad 	    log2(e2), log2(e2), (double)log2e2, (double)log2e2);
    605  1.17  riastrad 	ATF_CHECK_MSG((fabsl((log2l(e2) - log2e2)/log2e2) < 2*LDBL_EPSILON),
    606  1.17  riastrad 	    "log2l(e^2)=%La=%.34Lg expected %La=%.34Lg",
    607  1.17  riastrad 	    log2l(e2), log2l(e2), log2e2, log2e2);
    608  1.17  riastrad }
    609  1.17  riastrad 
    610  1.16  riastrad ATF_TC(log2_inf);
    611  1.16  riastrad ATF_TC_HEAD(log2_inf, tc)
    612  1.16  riastrad {
    613  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log2/f/l on +infinity");
    614  1.16  riastrad }
    615  1.16  riastrad ATF_TC_BODY(log2_inf, tc)
    616  1.16  riastrad {
    617  1.16  riastrad 
    618  1.16  riastrad 	if (!isinf(INFINITY))
    619  1.16  riastrad 		atf_tc_skip("no infinities on this architecture");
    620  1.16  riastrad 
    621  1.16  riastrad 	CHECK_EQ(0, log2f, INFINITY, INFINITY);
    622  1.16  riastrad 	CHECK_EQ(0, log2, INFINITY, INFINITY);
    623  1.16  riastrad 	CHECKL_EQ(0, log2l, INFINITY, INFINITY);
    624   1.3    jruoho }
    625   1.1    jruoho 
    626   1.3    jruoho /*
    627   1.3    jruoho  * log(3)
    628   1.3    jruoho  */
    629   1.1    jruoho 
    630  1.16  riastrad ATF_TC(log_invalid);
    631  1.16  riastrad ATF_TC_HEAD(log_invalid, tc)
    632   1.1    jruoho {
    633  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log/f/l on invalid inputs");
    634   1.3    jruoho }
    635  1.16  riastrad ATF_TC_BODY(log_invalid, tc)
    636   1.3    jruoho {
    637  1.16  riastrad 	unsigned i;
    638   1.3    jruoho 
    639  1.16  riastrad 	for (i = 0; i < __arraycount(logf_invalid); i++) {
    640  1.16  riastrad 		CHECK_NAN(i, logf, logf_invalid[i]);
    641  1.16  riastrad 		CHECK_NAN(i, log, logf_invalid[i]);
    642  1.16  riastrad 		CHECKL_NAN(i, logl, logf_invalid[i]);
    643  1.16  riastrad 	}
    644   1.3    jruoho 
    645  1.16  riastrad 	for (i = 0; i < __arraycount(log_invalid); i++) {
    646  1.16  riastrad 		CHECK_NAN(i, log, log_invalid[i]);
    647  1.16  riastrad 		CHECKL_NAN(i, logl, log_invalid[i]);
    648  1.16  riastrad 	}
    649   1.1    jruoho 
    650  1.16  riastrad 	for (i = 0; i < __arraycount(logl_invalid); i++) {
    651  1.16  riastrad 		CHECKL_NAN(i, logl, logl_invalid[i]);
    652  1.16  riastrad 	}
    653   1.3    jruoho }
    654   1.3    jruoho 
    655  1.16  riastrad ATF_TC(log_zero);
    656  1.16  riastrad ATF_TC_HEAD(log_zero, tc)
    657   1.3    jruoho {
    658  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log/f/l on zero");
    659   1.3    jruoho }
    660  1.16  riastrad ATF_TC_BODY(log_zero, tc)
    661   1.3    jruoho {
    662   1.1    jruoho 
    663  1.16  riastrad 	CHECK_EQ(0, logf, +0., -HUGE_VALF);
    664  1.16  riastrad 	CHECK_EQ(0, log, +0., -HUGE_VAL);
    665  1.16  riastrad 	CHECKL_EQ(0, logl, +0., -HUGE_VALL);
    666   1.1    jruoho 
    667  1.16  riastrad 	CHECK_EQ(1, logf, -0., -HUGE_VALF);
    668  1.16  riastrad 	CHECK_EQ(1, log, -0., -HUGE_VAL);
    669  1.16  riastrad 	CHECKL_EQ(1, logl, -0., -HUGE_VALL);
    670   1.3    jruoho }
    671   1.1    jruoho 
    672  1.17  riastrad ATF_TC(log_exact);
    673  1.17  riastrad ATF_TC_HEAD(log_exact, tc)
    674   1.3    jruoho {
    675  1.17  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log/f/l exact cases");
    676   1.3    jruoho }
    677  1.17  riastrad ATF_TC_BODY(log_exact, tc)
    678   1.3    jruoho {
    679   1.3    jruoho 
    680  1.16  riastrad 	CHECK_EQ(0, logf, 1, 0);
    681  1.16  riastrad 	CHECK_EQ(0, log, 1, 0);
    682  1.16  riastrad 	CHECKL_EQ(0, logl, 1, 0);
    683   1.3    jruoho 
    684  1.16  riastrad 	ATF_CHECK_EQ(signbit(logf(1)), 0);
    685  1.16  riastrad 	ATF_CHECK_EQ(signbit(log(1)), 0);
    686  1.16  riastrad 	ATF_CHECK_EQ(signbit(logl(1)), 0);
    687  1.17  riastrad }
    688  1.17  riastrad 
    689  1.17  riastrad ATF_TC(log_approx);
    690  1.17  riastrad ATF_TC_HEAD(log_approx, tc)
    691  1.17  riastrad {
    692  1.17  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log/f/l approximate cases");
    693  1.17  riastrad }
    694  1.17  riastrad ATF_TC_BODY(log_approx, tc)
    695  1.17  riastrad {
    696  1.17  riastrad 	volatile long double e =
    697  1.17  riastrad 	    2.7182818284590452353602874713526624977572470937L;
    698  1.17  riastrad 	volatile long double e2 =
    699  1.17  riastrad 	    7.3890560989306502272304274605750078131803155705519L;
    700  1.17  riastrad 	volatile long double log_2 =
    701  1.17  riastrad 	    0.69314718055994530941723212145817656807550013436025L;
    702  1.17  riastrad 	volatile long double log_10 =
    703  1.17  riastrad 	    2.30258509299404568401799145468436420760110148862875L;
    704  1.17  riastrad 
    705  1.17  riastrad 	ATF_CHECK_MSG(fabsf((logf(2) - log_2)/log_2) < 2*FLT_EPSILON,
    706  1.17  riastrad 	    "logf(2)=%a=%.8g expected %a=%.8g",
    707  1.17  riastrad 	    logf(2), logf(2), (float)log_2, (float)log_2);
    708  1.17  riastrad 	ATF_CHECK_MSG(fabs((log(2) - log_2)/log_2) < 2*DBL_EPSILON,
    709  1.17  riastrad 	    "log(2)=%a=%.17g expected %a=%.17g",
    710  1.17  riastrad 	    log(2), log(2), (double)log_2, (double)log_2);
    711  1.17  riastrad 	ATF_CHECK_MSG(fabsl((logl(2) - log_2)/log_2) < 2*LDBL_EPSILON,
    712  1.17  riastrad 	    "logl(2)=%La=%.34Lg expected %La=%.34Lg",
    713  1.17  riastrad 	    logl(2), logl(2), log_2, log_2);
    714   1.3    jruoho 
    715  1.17  riastrad 	ATF_CHECK_MSG(fabsf((logf(e) - 1)/1) < 2*FLT_EPSILON,
    716  1.16  riastrad 	    "logf(e)=%a=%.8g", logf(e), logf(e));
    717  1.17  riastrad 	ATF_CHECK_MSG(fabs((log(e) - 1)/1) < 2*DBL_EPSILON,
    718  1.16  riastrad 	    "log(e)=%a=%.17g", log(e), log(e));
    719  1.17  riastrad 	ATF_CHECK_MSG(fabsl((logl(e) - 1)/1) < 2*LDBL_EPSILON,
    720  1.16  riastrad 	    "logl(e)=%La=%.34Lg", logl(e), logl(e));
    721  1.17  riastrad 
    722  1.17  riastrad 	ATF_CHECK_MSG(fabsf((logf(e2) - 2)/2) < 2*FLT_EPSILON,
    723  1.17  riastrad 	    "logf(e)=%a=%.8g", logf(e2), logf(e2));
    724  1.17  riastrad 	ATF_CHECK_MSG(fabs((log(e2) - 2)/2) < 2*DBL_EPSILON,
    725  1.17  riastrad 	    "log(e)=%a=%.17g", log(e2), log(e2));
    726  1.17  riastrad 	ATF_CHECK_MSG(fabsl((logl(e2) - 2)/2) < 2*LDBL_EPSILON,
    727  1.17  riastrad 	    "logl(e)=%La=%.34Lg", logl(e2), logl(e2));
    728  1.17  riastrad 
    729  1.17  riastrad 	ATF_CHECK_MSG(fabsf((logf(10) - log_10)/log_10) < 2*FLT_EPSILON,
    730  1.17  riastrad 	    "logf(10)=%a=%.8g expected %a=%.8g",
    731  1.17  riastrad 	    logf(10), logf(10), (float)log_10, (float)log_10);
    732  1.17  riastrad 	ATF_CHECK_MSG(fabs((log(10) - log_10)/log_10) < 2*DBL_EPSILON,
    733  1.17  riastrad 	    "log(10)=%a=%.17g expected %a=%.17g",
    734  1.17  riastrad 	    log(10), log(10), (double)log_10, (double)log_10);
    735  1.17  riastrad 	ATF_CHECK_MSG(fabsl((logl(10) - log_10)/log_10) < 2*LDBL_EPSILON,
    736  1.17  riastrad 	    "logl(10)=%La=%.34Lg expected %La=%.34Lg",
    737  1.17  riastrad 	    logl(10), logl(10), log_10, log_10);
    738   1.5    jruoho }
    739   1.5    jruoho 
    740  1.16  riastrad ATF_TC(log_inf);
    741  1.16  riastrad ATF_TC_HEAD(log_inf, tc)
    742   1.5    jruoho {
    743  1.16  riastrad 	atf_tc_set_md_var(tc, "descr", "Test log/f/l on +infinity");
    744   1.5    jruoho }
    745  1.16  riastrad ATF_TC_BODY(log_inf, tc)
    746   1.3    jruoho {
    747   1.3    jruoho 
    748  1.16  riastrad 	if (!isinf(INFINITY))
    749  1.16  riastrad 		atf_tc_skip("no infinities on this architecture");
    750   1.3    jruoho 
    751  1.16  riastrad 	CHECK_EQ(0, logf, INFINITY, INFINITY);
    752  1.16  riastrad 	CHECK_EQ(0, log, INFINITY, INFINITY);
    753  1.16  riastrad 	CHECKL_EQ(0, logl, INFINITY, INFINITY);
    754   1.1    jruoho }
    755   1.1    jruoho 
    756   1.1    jruoho ATF_TP_ADD_TCS(tp)
    757   1.1    jruoho {
    758   1.1    jruoho 
    759  1.16  riastrad 	ATF_TP_ADD_TC(tp, log10_invalid);
    760  1.16  riastrad 	ATF_TP_ADD_TC(tp, log10_zero);
    761  1.16  riastrad 	ATF_TP_ADD_TC(tp, log10_exact);
    762  1.17  riastrad 	ATF_TP_ADD_TC(tp, log10_approx);
    763  1.16  riastrad 	ATF_TP_ADD_TC(tp, log10_inf);
    764  1.16  riastrad 
    765  1.16  riastrad 	ATF_TP_ADD_TC(tp, log1p_invalid);
    766  1.16  riastrad 	ATF_TP_ADD_TC(tp, log1p_neg_one);
    767  1.16  riastrad 	ATF_TP_ADD_TC(tp, log1p_exact);
    768  1.17  riastrad 	ATF_TP_ADD_TC(tp, log1p_approx);
    769  1.16  riastrad 	ATF_TP_ADD_TC(tp, log1p_inf);
    770  1.16  riastrad 
    771  1.16  riastrad 	ATF_TP_ADD_TC(tp, log2_invalid);
    772  1.16  riastrad 	ATF_TP_ADD_TC(tp, log2_zero);
    773  1.16  riastrad 	ATF_TP_ADD_TC(tp, log2_exact);
    774  1.17  riastrad 	ATF_TP_ADD_TC(tp, log2_approx);
    775  1.16  riastrad 	ATF_TP_ADD_TC(tp, log2_inf);
    776  1.16  riastrad 
    777  1.16  riastrad 	ATF_TP_ADD_TC(tp, log_invalid);
    778  1.16  riastrad 	ATF_TP_ADD_TC(tp, log_zero);
    779  1.17  riastrad 	ATF_TP_ADD_TC(tp, log_exact);
    780  1.17  riastrad 	ATF_TP_ADD_TC(tp, log_approx);
    781  1.16  riastrad 	ATF_TP_ADD_TC(tp, log_inf);
    782   1.1    jruoho 
    783   1.1    jruoho 	return atf_no_error();
    784   1.1    jruoho }
    785