standards/175811: libstdc++ needs complex support in order use C99
David Schultz
das at FreeBSD.ORG
Thu May 30 16:56:14 UTC 2013
On Thu, May 30, 2013, Warner Losh wrote:
>
> On May 30, 2013, at 12:46 AM, David Schultz wrote:
> > On Fri, Feb 22, 2013, David Chisnall wrote:
> > I was wondering if you could explain a bit about what your goal is
> > here, though. Is there some kind of certification you are trying
> > to achieve? Why can't you just comment out the few missing
> > functions? You've been adamant about this issue ever since
> > joining the Project, even suggesting that we commit bogus
> > implementations just for the sake of having the symbols. I
> > completely agree with you that the lack of progress is
> > unacceptable, and I'm sorry I haven't had more time to work on
> > this stuff myself, but I also don't understand the source of your
> > urgency.
>
> More and more projects are refusing to work around our
> gridlock. We have to report R each new release because they have
> taken out the checks for the missing symbols. It is really an
> embarrassment to the project. We've let the perfect be the enemy
> of the good. There are R scripts that run elsewhere and not on
> FreeBSD. R is the one I know most about since I've been using R
> a lot to crunch numbers for work, but there are others.
>
> The urgency is we'd like to have this stuff done for 10, if at
> all possible. And if not done, then a lot closer to done than
> where we are today.
It looks like the R in ports just wants logl(), which isn't
surprising, and there's already code for that. So getting that in
for 10 is achievable.
> > The reason I'm asking is that I'm pushing to get a lot of stuff
> > into the tree quickly, but realistically, in the short term we're
> > only going to get 95% of the way there. I doubt good
> > implementations of complicated functions that nobody uses, such as
> > erfcl() and tgammal(), are going to appear overnight. Thus, I
> > would like to know whether the last 5% is needed quickly, and if
> > so, why.
>
> I'm all for getting everything we can into the tree that
> produces an answer that's not perfect, but close. What's the
> error that would be generated with the naive implementation of
>
> long double tgammal(long double f) { return tgamma(f); }
>
> But assuming that, for some reason, produces errors larger than
> difference in precision between double and long double due to
> extreme non-linearity of these functions, having only a couple
> of stragglers is a far better position to be in than we are
> today.
Whether this is acceptable depends a lot on who needs it in the
first place, which is part of why I was asking. For many years,
the only software that cared was libstdc++, and libstdc++ only
wanted to wrap it.
Here are some of my notes on the status of things:
long double log2l(long double); -- bde
long double logl(long double); -- bde
long double log1pl(long double); -- bde
Bruce has these written. We can commit them with a little cleanup.
long double acoshl(long double); -- sgk
long double asinhl(long double); -- sgk
long double atanhl(long double); -- sgk
long double log10l(long double); -- bde
These are trivial given the first three. I believe Bruce and Steve
have the code for them already.
long double expl(long double); -- sgk
long double expm1l(long double); -- sgk
Steve has perfectly committable patches that I've already approved
(and furthermore, he doesn't need my approval anymore!)
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);
These are easy given expl() and expm1l().
long double powl(long double, long double);
This is not so easy, but important, so we can make it a priority.
long double lgammal(long double);
long double tgammal(long double);
These are neither easy nor important; this gets back to my question.
float complex clogf(float complex); -- bde
double complex clog(double complex); -- bde
Bruce has code for these, which should be straightforward to turn
into something committable.
float complex cpowf(float complex, float complex);
double complex cpow(double complex, double complex);
This one is tough to do well and even tougher to test -- lots of
nasty corner cases.
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);
long double complex cacosl(long double complex);
long double complex cacoshl(long double complex);
long double complex casinl(long double complex);
long double complex casinhl(long double complex);
long double complex catanl(long double complex);
long double complex catanhl(long double complex);
long double complex clogl(long double complex);
long double complex cpowl(long double complex, long double complex);
The long double versions of the complex math functions are trivial
once the long double versions of the corresponding real functions
are written.
More information about the freebsd-numerics
mailing list