You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sandy 5629dff5f1 PL280 release code 4 years ago
..
Android.bp PL280 release code 4 years ago
CleanSpec.mk PL280 release code 4 years ago
MD5 PL280 release code 4 years ago
MODULE_LICENSE_BSD_LIKE PL280 release code 4 years ago
NOTICE PL280 release code 4 years ago
OWNERS PL280 release code 4 years ago
changes PL280 release code 4 years ago
configure PL280 release code 4 years ago
configure.in PL280 release code 4 years ago
e_acos.c PL280 release code 4 years ago
e_acosh.c PL280 release code 4 years ago
e_asin.c PL280 release code 4 years ago
e_atan2.c PL280 release code 4 years ago
e_atanh.c PL280 release code 4 years ago
e_cosh.c PL280 release code 4 years ago
e_exp.c PL280 release code 4 years ago
e_fmod.c PL280 release code 4 years ago
e_gamma.c PL280 release code 4 years ago
e_gamma_r.c PL280 release code 4 years ago
e_hypot.c PL280 release code 4 years ago
e_j0.c PL280 release code 4 years ago
e_j1.c PL280 release code 4 years ago
e_jn.c PL280 release code 4 years ago
e_lgamma.c PL280 release code 4 years ago
e_lgamma_r.c PL280 release code 4 years ago
e_log.c PL280 release code 4 years ago
e_log10.c PL280 release code 4 years ago
e_pow.c PL280 release code 4 years ago
e_rem_pio2.c PL280 release code 4 years ago
e_remainder.c PL280 release code 4 years ago
e_scalb.c PL280 release code 4 years ago
e_sinh.c PL280 release code 4 years ago
e_sqrt.c PL280 release code 4 years ago
fdlibm.h PL280 release code 4 years ago
index PL280 release code 4 years ago
index.html PL280 release code 4 years ago
k_cos.c PL280 release code 4 years ago
k_rem_pio2.c PL280 release code 4 years ago
k_sin.c PL280 release code 4 years ago
k_standard.c PL280 release code 4 years ago
k_tan.c PL280 release code 4 years ago
makefile.in PL280 release code 4 years ago
readme PL280 release code 4 years ago
s_asinh.c PL280 release code 4 years ago
s_atan.c PL280 release code 4 years ago
s_cbrt.c PL280 release code 4 years ago
s_ceil.c PL280 release code 4 years ago
s_copysign.c PL280 release code 4 years ago
s_cos.c PL280 release code 4 years ago
s_erf.c PL280 release code 4 years ago
s_expm1.c PL280 release code 4 years ago
s_fabs.c PL280 release code 4 years ago
s_finite.c PL280 release code 4 years ago
s_floor.c PL280 release code 4 years ago
s_frexp.c PL280 release code 4 years ago
s_ilogb.c PL280 release code 4 years ago
s_isnan.c PL280 release code 4 years ago
s_ldexp.c PL280 release code 4 years ago
s_lib_version.c PL280 release code 4 years ago
s_log1p.c PL280 release code 4 years ago
s_logb.c PL280 release code 4 years ago
s_matherr.c PL280 release code 4 years ago
s_modf.c PL280 release code 4 years ago
s_nextafter.c PL280 release code 4 years ago
s_rint.c PL280 release code 4 years ago
s_scalbn.c PL280 release code 4 years ago
s_signgam.c PL280 release code 4 years ago
s_significand.c PL280 release code 4 years ago
s_sin.c PL280 release code 4 years ago
s_tan.c PL280 release code 4 years ago
s_tanh.c PL280 release code 4 years ago
w_acos.c PL280 release code 4 years ago
w_acosh.c PL280 release code 4 years ago
w_asin.c PL280 release code 4 years ago
w_atan2.c PL280 release code 4 years ago
w_atanh.c PL280 release code 4 years ago
w_cosh.c PL280 release code 4 years ago
w_exp.c PL280 release code 4 years ago
w_fmod.c PL280 release code 4 years ago
w_gamma.c PL280 release code 4 years ago
w_gamma_r.c PL280 release code 4 years ago
w_hypot.c PL280 release code 4 years ago
w_j0.c PL280 release code 4 years ago
w_j1.c PL280 release code 4 years ago
w_jn.c PL280 release code 4 years ago
w_lgamma.c PL280 release code 4 years ago
w_lgamma_r.c PL280 release code 4 years ago
w_log.c PL280 release code 4 years ago
w_log10.c PL280 release code 4 years ago
w_pow.c PL280 release code 4 years ago
w_remainder.c PL280 release code 4 years ago
w_scalb.c PL280 release code 4 years ago
w_sinh.c PL280 release code 4 years ago
w_sqrt.c PL280 release code 4 years ago

readme


*********************************
* Announcing FDLIBM Version 5.3 *
*********************************
============================================================
FDLIBM
============================================================
developed at Sun Microsystems, Inc.

What's new in FDLIBM 5.3?

CONFIGURE
To build FDLIBM, edit the supplied Makefile or create
a local Makefile by running "sh configure"
using the supplied configure script contributed by Nelson Beebe

BUGS FIXED

1. e_pow.c incorrect results when
x is very close to -1.0 and y is very large, e.g.
pow(-1.0000000000000002e+00,4.5035996273704970e+15) = 0
pow(-9.9999999999999978e-01,4.5035996273704970e+15) = 0
Correct results are close to -e and -1/e.

2. k_tan.c error was > 1 ulp target for FDLIBM
5.2: Worst error at least 1.45 ulp at
tan(1.7765241907548024E+269) = 1.7733884462610958E+16
5.3: Worst error 0.96 ulp

NOT FIXED YET

3. Compiler failure on non-standard code
Statements like
*(1+(int*)&t1) = 0;
are not standard C and cause some optimizing compilers (e.g. GCC)
to generate bad code under optimization. These cases
are to be addressed in the next release.

FDLIBM (Freely Distributable LIBM) is a C math library
for machines that support IEEE 754 floating-point arithmetic.
In this release, only double precision is supported.

FDLIBM is intended to provide a reasonably portable (see
assumptions below), reference quality (below one ulp for
major functions like sin,cos,exp,log) math library
(libm.a). For a copy of FDLIBM, please see
http://www.netlib.org/fdlibm/
or
http://www.validlab.com/software/

--------------
1. ASSUMPTIONS
--------------
FDLIBM (double precision version) assumes:
a. IEEE 754 style (if not precise compliance) arithmetic;
b. 32 bit 2's complement integer arithmetic;
c. Each double precision floating-point number must be in IEEE 754
double format, and that each number can be retrieved as two 32-bit
integers through the using of pointer bashing as in the example
below:

Example: let y = 2.0
double fp number y: 2.0
IEEE double format: 0x4000000000000000

Referencing y as two integers:
*(int*)&y,*(1+(int*)&y) = {0x40000000,0x0} (on sparc)
{0x0,0x40000000} (on 386)

Note: Four macros are defined in fdlibm.h to handle this kind of
retrieving:

__HI(x) the high part of a double x
(sign,exponent,the first 21 significant bits)
__LO(x) the least 32 significant bits of x
__HIp(x) same as __HI except that the argument is a pointer
to a double
__LOp(x) same as __LO except that the argument is a pointer
to a double

To ensure obtaining correct ordering, one must define __LITTLE_ENDIAN
during compilation for little endian machine (like 386,486). The
default is big endian.

If the behavior of pointer bashing is undefined, one may hack on the
macro in fdlibm.h.

d. IEEE exceptions may trigger "signals" as is common in Unix
implementations.

-------------------
2. EXCEPTION CASES
-------------------
All exception cases in the FDLIBM functions will be mapped
to one of the following four exceptions:

+-huge*huge, +-tiny*tiny, +-1.0/0.0, +-0.0/0.0
(overflow) (underflow) (divided-by-zero) (invalid)

For example, ieee_log(0) is a singularity and is thus mapped to
-1.0/0.0 = -infinity.
That is, FDLIBM's log will compute -one/zero and return the
computed value. On an IEEE machine, this will trigger the
divided-by-zero exception and a negative infinity is returned by
default.

Similarly, ieee_exp(-huge) will be mapped to tiny*tiny to generate
an underflow signal.


--------------------------------
3. STANDARD CONFORMANCE WRAPPER
--------------------------------
The default FDLIBM functions (compiled with -D_IEEE_LIBM flag)
are in "IEEE spirit" (i.e., return the most reasonable result in
floating-point arithmetic). If one wants FDLIBM to comply with
standards like SVID, X/OPEN, or POSIX/ANSI, then one can
create a multi-standard compliant FDLIBM. In this case, each
function in FDLIBM is actually a standard compliant wrapper
function.

File organization:
1. For FDLIBM's kernel (internal) function,
File name Entry point
---------------------------
k_sin.c __kernel_sin
k_tan.c __kernel_tan
---------------------------
2. For functions that have no standards conflict
File name Entry point
---------------------------
s_sin.c sin
s_erf.c erf
---------------------------
3. Ieee754 core functions
File name Entry point
---------------------------
e_exp.c __ieee754_exp
e_sinh.c __ieee754_sinh
---------------------------
4. Wrapper functions
File name Entry point
---------------------------
w_exp.c exp
w_sinh.c sinh
---------------------------

Wrapper functions will twist the result of the ieee754
function to comply to the standard specified by the value
of _LIB_VERSION
if _LIB_VERSION = _IEEE_, return the ieee754 result;
if _LIB_VERSION = _SVID_, return SVID result;
if _LIB_VERSION = _XOPEN_, return XOPEN result;
if _LIB_VERSION = _POSIX_, return POSIX/ANSI result.
(These are macros, see fdlibm.h for their definition.)


--------------------------------
4. HOW TO CREATE FDLIBM's libm.a
--------------------------------
There are two types of libm.a. One is IEEE only, and the other is
multi-standard compliant (supports IEEE,XOPEN,POSIX/ANSI,SVID).

To create the IEEE only libm.a, use
make "CFLAGS = -D_IEEE_LIBM"
This will create an IEEE libm.a, which is smaller in size, and
somewhat faster.

To create a multi-standard compliant libm, use
make "CFLAGS = -D_IEEE_MODE" --- multi-standard fdlibm: default
to IEEE
make "CFLAGS = -D_XOPEN_MODE" --- multi-standard fdlibm: default
to X/OPEN
make "CFLAGS = -D_POSIX_MODE" --- multi-standard fdlibm: default
to POSIX/ANSI
make "CFLAGS = -D_SVID3_MODE" --- multi-standard fdlibm: default
to SVID


Here is how one makes a SVID compliant libm.
Make the library by
make "CFLAGS = -D_SVID3_MODE".
The libm.a of FDLIBM will be multi-standard compliant and
_LIB_VERSION is initialized to the value _SVID_ .

example1:
---------
main()
{
double ieee_y0();
printf("y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}

% cc example1.c libm.a
% a.out
y0: TLOSS error
ieee_y0(1e300) = 0.00000000000000000000e+00


It is possible to change the default standard in multi-standard
fdlibm. Here is an example of how to do it:
example2:
---------
#include "fdlibm.h" /* must include FDLIBM's fdlibm.h */
main()
{
double ieee_y0();
_LIB_VERSION = _IEEE_;
printf("IEEE: ieee_y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _XOPEN_;
printf("XOPEN ieee_y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _POSIX_;
printf("POSIX ieee_y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _SVID_;
printf("SVID ieee_y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}

% cc example2.c libm.a
% a.out
IEEE: ieee_y0(1e300) = -1.36813604503424810557e-151
XOPEN ieee_y0(1e300) = 0.00000000000000000000e+00
POSIX ieee_y0(1e300) = 0.00000000000000000000e+00
y0: TLOSS error
SVID ieee_y0(1e300) = 0.00000000000000000000e+00

Note: Here _LIB_VERSION is a global variable. If global variables
are forbidden, then one should modify fdlibm.h to change
_LIB_VERSION to be a global constant. In this case, one
may not change the value of _LIB_VERSION as in example2.

---------------------------
5. NOTES ON PORTING FDLIBM
---------------------------
Care must be taken when installing FDLIBM over existing
libm.a.
All co-existing function prototypes must agree, otherwise
users will encounter mysterious failures.

So far, the only known likely conflict is the declaration
of the IEEE recommended function scalb:

double ieee_scalb(double,double) (1) SVID3 defined
double ieee_scalb(double,int) (2) IBM,DEC,...

FDLIBM follows Sun definition and use (1) as default.
If one's existing libm.a uses (2), then one may raise
the flags _SCALB_INT during the compilation of FDLIBM
to get the correct function prototype.
(E.g., make "CFLAGS = -D_IEEE_LIBM -D_SCALB_INT".)
NOTE that if -D_SCALB_INT is raised, it won't be SVID3
conformant.

--------------
6. PROBLEMS ?
--------------
Please send comments and bug reports to the electronic mail address
suggested by:
fdlibm-comments AT sun.com