aboutsummaryrefslogtreecommitdiff
path: root/readme
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 18:28:23 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 18:28:23 -0800
commitf177c949113889342d74aee8011a86bd4f589841 (patch)
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904 /readme
parent74aa530c6ca9c2f10a0e3635b4211f1438b972b2 (diff)
downloadfdlibm-f177c949113889342d74aee8011a86bd4f589841.tar.gz
auto import from //depot/cupcake/@135843
Diffstat (limited to 'readme')
-rw-r--r--readme261
1 files changed, 0 insertions, 261 deletions
diff --git a/readme b/readme
deleted file mode 100644
index a0d5623..0000000
--- a/readme
+++ /dev/null
@@ -1,261 +0,0 @@
-
- *********************************
- * 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
-