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