Re: Use of C99 extra long double math functions after r236148

From: David Schultz <das_at_FreeBSD.ORG>
Date: Tue, 10 Jul 2012 18:58:01 -0400
On Tue, Jul 10, 2012, Rainer Hurling wrote:
> On 10.07.2012 17:11 (UTC+2), David Schultz wrote:
> >On Tue, Jul 10, 2012, Rainer Hurling wrote:
> >>On 10.07.2012 16:02 (UTC+2), Warner Losh wrote:
> >>>
> >>>On Jul 10, 2012, at 3:10 AM, Rainer Hurling wrote:
> >>>>As far as I understand from discussions on R mailing list
> >>>>(r-devel_at_r-project.org), they plan to reduce the emulation and/or
> >>>>workaround of long and complex math functions for FreeBSD and other
> >>>>systems with their next releases of R devel. So we could really need 
> >>>>some
> >>>>progress with our C99 conform math functions ;-)
> >>>
> >>>Not having R would be a bit pain in my backside.  That's one of the
> >>>practical considerations that I was talking about.  It is very real, and
> >>>if I have to, I'll commit the #define junk I railed against to get it
> >>>back.  Please, let's get some progress.  I have some time to help.
> >>
> >>Yes, thank you Warner, that is also my problem. As I wrote some weeks
> >>ago (05/28/2012) when starting this thread, I am using FreeBSD as a
> >>scientific desktop because of its good scaling properties. For some
> >>years now, FreeBSD fits all our needs with R, SAGA GIS, PostgreSQL and
> >>some more.
> >>
> >>If I would not be able to run upcoming versions of R on FreeBSD any
> >>more, that would be really, really hard :-(
> >
> >Do you have a list of the essential functions here?  There are 17 long
> >double functions and some complex functions missing, but only a
> >handful of those are of general interest.  The reason I ask is that if
> >R is just looking for a few missing functions that are already mostly
> >implemented, then the best solution is probably to finish that work.
> >But if it's expecting us to have something arcane like long double
> >Bessel functions of the first kind, then we need to pursue a workaround
> >in the short term.
> >
> 
> That is, what I found by grepping the sources of a recent R development 
> version:
> 
> expl:   src/nmath/pnchisq.c
> 
> logl:   src/nmath/dnbeta.c
>         src/nmath/pnbeta.c

Bruce has versions of these that could be committed with some cleanup.
It's a matter of sorting through about 1200 emails from him and 3
source trees to find the most up-to-date patches, then cleaning them
up and testing and committing them.  I have no time right now, but I
will do at least the first step as soon as I can, and try to get the
patches to someone willing to do the final few steps.

> log10l: src/extra/trio/trio.c
> 
> log1pl: src/nmath/pnbeta.c

If Bruce doesn't already have implementations of these, they are easy
wrappers around logl() or some internal k_logl in Bruce's implementation.

> powl:   src/extra/trio/triostr.c
>         src/extra/trio/trio.c
>         src/main/format.c

It's hard to do a good job on powl(), but the simple approach
(exp(log(x)*y)) plus a few special cases may suffice for many uses.

> NEWS:l2044
> The C99 functions acosh, asinh, atanh, snprintf and vsnprintf are
> now required.

We have had them forever.

> NEWS:l3032
> The C99 double complex type is now required.
> The C99 complex trigonometric functions (such as csin) are not
> currently required (FreeBSD lacks most of them): substitutes are
> used if they are missing.

We have these (but not the inverse trig functions).

> NEWS:l3277
> Complex arithmetic (notably z^n for complex z and integer n) gave
> incorrect results since R 2.10.0 on platforms without C99 complex
> support.  This and some lesser issues in trigonometric functions
> have been corrected.
> Such platforms were rare (we know of Cygwin and FreeBSD).
> However, because of new compiler optimizations in the way complex
> arguments are handled, the same code was selected on x86_64 Linux
> with gcc 4.5.x at the default -O2 optimization (but not at -O).

Not sure if this is relevant.

> BTW: There seems to be a discrepancy about missing functions listed in
> http://wiki.freebsd.org/MissingMathStuff and in
> http://svnweb.freebsd.org/base/head/lib/msun/src/math.h?r1=227472&r2=236148&pathrev=236148. 
> So the wiki is a bit outdated now?

My list:

REAL FUNCTIONS (17):

long double     log2l(long double);
long double     logl(long double);
long double     log1pl(long double);
  long double     acoshl(long double);
  long double     asinhl(long double);
  long double     atanhl(long double);
  long double     log10l(long double);

long double     expl(long double);
long double     expm1l(long double);
  long double     coshl(long double);
  long double     sinhl(long double);
  long double     tanhl(long double);
  long double     erfcl(long double);
  long double     erfl(long double);

long double     powl(long double, long double);

long double     lgammal(long double);
long double     tgammal(long double);


COMPLEX FUNCTIONS (37):

long double complex cexpl(long double complex);
long double complex ccosl(long double complex);
  long double complex ccoshl(long double complex);
long double complex csinl(long double complex);
  long double complex csinhl(long double complex);
long double complex ctanl(long double complex);
  long double complex ctanhl(long double complex);


float complex cacosf(float complex);
  float complex cacoshf(float complex);
double complex cacos(double complex);
  double complex cacosh(double complex);
long double complex cacosl(long double complex);
  long double complex cacoshl(long double complex);

float complex casinf(float complex);
  float complex casinhf(float complex);
double complex casin(double complex);
  double complex casinh(double complex);
long double complex casinl(long double complex);
  long double complex casinhl(long double complex);

float complex catanf(float complex);
  float complex catanhf(float complex);
double complex catan(double complex);
  double complex catanh(double complex);
long double complex catanl(long double complex);
  long double complex catanhl(long double complex);

float complex clogf(float complex);
double complex clog(double complex);
long double complex clogl(long double complex);

float complex cpowf(float complex, float complex);
double complex cpow(double complex, double complex);
long double complex cpowl(long double complex, long double complex);
Received on Tue Jul 10 2012 - 20:58:04 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:28 UTC