This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: long double (was "strtold?")


Ken Werner wrote:
On Tuesday 07 April 2009 00:30:19 Jeff Johnston wrote:
Hi Ken,

A number of comments:

1) Use _LONG_DOUBLE instead of long double everywhere
The PPC SPE for example redefines _LONG_DOUBLE to be double in
sys/config.h
Other platforms are allowed to do this.

Changing the type of the arguments of the long double functions alters their signature. That means these functions aren't POSIX compliant anymore.
True POSIX compliance isn't an issue with lots of embedded platforms as much as being able to run existing code, but I do see the point that any code that is ported and using the functions has a good chance of putting the results into a long double local variable as opposed to a _LONG_DOUBLE so the long double type has to be supported. This differs from the printf scenario which may just want access to the format specifiers to allow some code to run even though long double isn't really supported.
The former patch guards the implementation by _LDBL_EQ_DBL which is only true if the compiler supports C99 or C++. A strict ansi or pre C99 compiler wouldn't see that code.
I agree with Craig that having an automake conditional which skips the sources would be nice. Since AC_TYPE_LONG_DOUBLE isn't available with the autoconf version used by newlib (2.59) it took me a while to find a way to do it. I think something like that could be (I'm still struggling with the autotools):
AC_CACHE_CHECK([Checking long double support], [acnewlib_cv_type_long_double],
[AC_TRY_COMPILE([], [long double foo = 0.0L;],
[acnewlib_cv_type_long_double = yes;],
[acnewlib_cv_type_long_double = no;])])
AM_CONDITIONAL(HAVE_LONG_DOUBLE, test x"$acnewlib_cv_type_long_double" = x"yes")


2) Put the _LDBL_EQ_DBL check in libc/include/machine/ieeefp.h

Done. I moved the check from _ansi.h to machine/ieeefp.h and included <machine/ieeefp.h> from stdlib.h.


(fix the SPE to manually #undef and then #define it to true in
sys/config.h)

What is the reason for that? Do you expect a compile time speedup? The _LDBL_EQ_DBL check that has just moved into machine/ieeefp.h seems to provide a more generic solution. I guess I miss something here.


No need for this now. I wasn't sure if the SPE was doing this manually because the long double type
doesn't exist or has been redefined somewhere.
3) Add a license for the new files. If it is copied from a file without
a license, then mention which
file it is copied from or add the Red Hat license from
COPYING.NEWLIB which is the
default license

Done.


4) If these functions will ever be implemented, they will probably end
up in libm/math, not libm/common
If Craig doesn't mind doing this when he implements them, I have no
objections.

For now the files are still placed in the libm/common directory but I'm happy to change that if required.


Ok for now.
5) Some docs would be nice at least to state the group is only available
when long double == double

Where are these things documented?


Look at libm/libm.texinfo and just add a brief paragraph about long double functions.
-- Jeff J.

Attached is the reworked version of the patch (gzipped due to size limits).


Ken

newlib/ChangeLog:

2009-04-07 Ken Werner <ken.werner@de.ibm.com>

* libc/include/machine/ieeefp.h: Add _LDBL_EQ_DBL define.
* libc/include/stdlib.h: Include <machine/ieeefp.h>.
(strtold, wcstold): Declare.
* libc/stdlib/strtold.c: New File.
* libc/stdlib/wcstold.c: Likewise.
* libc/configure.in: Add long double check. * libc/configure: Regenerate.
* libc/stdlib/Makefile.am: Add strtold.c and wcstold.c.
* libc/stdlib/Makefile.in: Regenerate.
* libc/include/math.h (atanl, cosl, sinl, tanl, tanhl, frexpl, modfl, ceill, fabsl, floorl, log1pl, expm1l, acosl, asinl, atan2l, coshl, sinhl, expl, ldexpl, logl, log10l, powl, sqrtl, fmodl, hypotl, copysignl, nanl, ilogbl, asinhl, cbrt, nextafterl, rintl, scalbnl, exp2l, scalblnl, tgammal, nearbyintl, lrintl, llrintl, roundl, lroundl, llround, llroundl, truncl, remquol, fdiml, fmaxl, fminl,
fmal, acoshl, atanhl, remainderl, lgammal, erfl, erfcl): Declare.
* libm/common/atanl.c: New File.
* libm/common/cosl.c: Likewise.
* libm/common/sinl.c: Likewise.
* libm/common/modfl.c: Likewise.
* libm/common/frexpl.c: Likewise.
* libm/common/tanhl.c: Likewise.
* libm/common/tanl.c: Likewise.
* libm/common/expm1l.c: Likewise.
* libm/common/log1pl.c: Likewise.
* libm/common/ceill.c: Likewise.
* libm/common/fabsl.c: Likewise.
* common/floorl.c: Likewise.
* libm/common/acosl.c: Likewise.
* libm/common/asinl.c: Likewise.
* libm/common/atan2l.c: Likewise.
* libm/common/coshl.c: Likewise.
* libm/common/expl.c: Likewise.
* libm/common/fmodl.c: Likewise.
* libm/common/hypotl.c: Likewise.
* libm/common/ldexpl.c: Likewise.
* libm/common/log10l.c: Likewise.
* libm/common/logl.c: Likewise.
* libm/common/powl.c: Likewise.
* libm/common/sqrtl.c: Likewise.
* libm/common/copysignl.c: Likewise.
* libm/common/ilogbl.c: Likewise.
* libm/common/nanl.c: Likewise.
* libm/common/cbrtl.c: Likewise.
* libm/common/asinhl.c: Likewise.
* libm/common/nextafterl.c: Likewise.
* libm/common/rintl.c: Likewise.
* libm/common/scalbnl.c: Likewise.
* libm/common/exp2l.c: Likewise.
* libm/common/fdiml.c: Likewise.
* libm/common/fmal.c: Likewise.
* libm/common/fmaxl.c: Likewise.
* libm/common/fminl.c: Likewise.
* libm/common/lrintl.c: Likewise.
* libm/common/lroundl.c: Likewise.
* libm/common/nearbyintl.c: Likewise.
* libm/common/remquol.c: Likewise.
* libm/common/roundl.c: Likewise.
* libm/common/scalblnl.c: Likewise.
* libm/common/truncl.c: Likewise.
* libm/common/acoshl.c: Likewise.
* libm/common/atanhl.c: Likewise.
* libm/common/erfcl.c: Likewise.
* libm/common/erfl.c: Likewise.
* libm/common/lgammal.c: Likewise.
* libm/common/remainderl.c: Likewise.
* libm/common/tgammal.c: Likewise.
* libm/common/sinhl.c: Likewise.
* libm/common/llroundl.c: Likewise.
* libm/configure.in: Add long double check.
* libm/configure: Regenerate.
* libm/common/Makefile.am: Add new files.
* libm/common/Makefile.in: Regenerate.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]