(PR#3979) Re: [Rd] Re: R 1.7.x and inaccurate log1p() on OpenBSD

beebe at math.utah.edu beebe at math.utah.edu
Mon Aug 25 23:30:12 MEST 2003


Brian Ripley writes today:

>> There is already a usable log1p implementation in src/nmath/log1p, for 
>> platforms without it.  All we need to do is to arrange to use it on those 
>> systems with broken versions.  That's not easy without access to such a 
>> platform to test it, though.

I need the same kind of test in my own software, so I made some
experiments and came up with the code below for configure.in.  I've
tested it so far only on NetBSD 1.6 and Sun Solaris 9; it produced the
expected settings

	#define HAVE_BROKEN_LOG1P 1
	#define HAVE_LOG1P 1

on NetBSD and

	/* #undef HAVE_BROKEN_LOG1P */
	#define HAVE_LOG1P 1

on Solaris.  Notice that the test code checks arguments over a range
of powers of two suitable for IEEE 754 with support for subnormals,
but will bail out early if necessary.  It should therefore work as
intended on VAX OpenVMS and IBM S/390; I only rarely have access to
such systems.

AH_TEMPLATE(HAVE_BROKEN_LOG1P,		[Define if log1p() is broken.])
AH_TEMPLATE(HAVE_LOG1P,			[Define if log1p() is available.])
...
AC_SEARCH_LIBS(log1p,          [m], AC_DEFINE(HAVE_LOG1P))
...

dnl Check for broken log1p() implementations
if test "$ac_cv_search_log1p" = "none required"
then
	AC_MSG_CHECKING(for apparently-accurate log1p())
	AC_TRY_RUN(
	[
#include <stdio.h>
#include <math.h>

int
main(void)
{
    int k;
    double d;
    double x;

    /* log(1+x) = x - (1/2)x^2 + (1/3)x^3 - (1/4)x^4 ... */
    /*          = x for x sufficiently small */
    for (k = -54; k > -1074; --k)
    {	
	x = pow(2.0, (double)(k));
	if (x == 0.0)
	    return (0);			/* OK: reached underflow limit */
	d = log1p(x);
	if (d == 0.0)
	    return (1);			/* ERROR: inaccurate log1p() */
	if (d != x)
	    return (1);			/* ERROR: inaccurate log1p() */
    }	
    
    return (0);
}
	],
	[
	    AC_MSG_RESULT(yes)
	],
	[
	    AC_MSG_RESULT(no)
	    AC_DEFINE(HAVE_BROKEN_LOG1P)
	]
	)
fi

-------------------------------------------------------------------------------
- Nelson H. F. Beebe                    Tel: +1 801 581 5254                  -
- Center for Scientific Computing       FAX: +1 801 581 4148                  -
- University of Utah                    Internet e-mail: beebe at math.utah.edu  -
- Department of Mathematics, 110 LCB        beebe at acm.org  beebe at computer.org -
- 155 S 1400 E RM 233                       beebe at ieee.org                    -
- Salt Lake City, UT 84112-0090, USA    URL: http://www.math.utah.edu/~beebe  -



More information about the R-devel mailing list