Latest commit

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

*********************************
* 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, 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, 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 y0();
printf("y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example1.c libm.a
% a.out
y0: TLOSS error
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 y0();
_LIB_VERSION = _IEEE_;
printf("IEEE: y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _XOPEN_;
printf("XOPEN y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _POSIX_;
printf("POSIX y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _SVID_;
printf("SVID y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example2.c libm.a
% a.out
IEEE: y0(1e300) = -1.36813604503424810557e-151
XOPEN y0(1e300) = 0.00000000000000000000e+00
POSIX y0(1e300) = 0.00000000000000000000e+00
y0: TLOSS error
SVID 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 scalb(double,double)	(1)	SVID3 defined
double 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

About

BITS deps/fdlibm submodule

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

*********************************
* 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, 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, 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 y0();
printf("y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example1.c libm.a
% a.out
y0: TLOSS error
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 y0();
_LIB_VERSION = _IEEE_;
printf("IEEE: y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _XOPEN_;
printf("XOPEN y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _POSIX_;
printf("POSIX y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _SVID_;
printf("SVID y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example2.c libm.a
% a.out
IEEE: y0(1e300) = -1.36813604503424810557e-151
XOPEN y0(1e300) = 0.00000000000000000000e+00
POSIX y0(1e300) = 0.00000000000000000000e+00
y0: TLOSS error
SVID 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 scalb(double,double)	(1)	SVID3 defined
double 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

About

BITS deps/fdlibm submodule

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

*********************************
* 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, 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, 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 y0();
printf("y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example1.c libm.a
% a.out
y0: TLOSS error
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 y0();
_LIB_VERSION = _IEEE_;
printf("IEEE: y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _XOPEN_;
printf("XOPEN y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _POSIX_;
printf("POSIX y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _SVID_;
printf("SVID y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example2.c libm.a
% a.out
IEEE: y0(1e300) = -1.36813604503424810557e-151
XOPEN y0(1e300) = 0.00000000000000000000e+00
POSIX y0(1e300) = 0.00000000000000000000e+00
y0: TLOSS error
SVID 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 scalb(double,double)	(1)	SVID3 defined
double 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

About

BITS deps/fdlibm submodule

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

*********************************
* 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, 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, 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 y0();
printf("y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example1.c libm.a
% a.out
y0: TLOSS error
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 y0();
_LIB_VERSION = _IEEE_;
printf("IEEE: y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _XOPEN_;
printf("XOPEN y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _POSIX_;
printf("POSIX y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _SVID_;
printf("SVID y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example2.c libm.a
% a.out
IEEE: y0(1e300) = -1.36813604503424810557e-151
XOPEN y0(1e300) = 0.00000000000000000000e+00
POSIX y0(1e300) = 0.00000000000000000000e+00
y0: TLOSS error
SVID 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 scalb(double,double)	(1)	SVID3 defined
double 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

About

BITS deps/fdlibm submodule

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

*********************************
* 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, 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, 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 y0();
printf("y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example1.c libm.a
% a.out
y0: TLOSS error
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 y0();
_LIB_VERSION = _IEEE_;
printf("IEEE: y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _XOPEN_;
printf("XOPEN y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _POSIX_;
printf("POSIX y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _SVID_;
printf("SVID y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example2.c libm.a
% a.out
IEEE: y0(1e300) = -1.36813604503424810557e-151
XOPEN y0(1e300) = 0.00000000000000000000e+00
POSIX y0(1e300) = 0.00000000000000000000e+00
y0: TLOSS error
SVID 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 scalb(double,double)	(1)	SVID3 defined
double 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

About

BITS deps/fdlibm submodule

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

*********************************
* 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, 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, 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 y0();
printf("y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example1.c libm.a
% a.out
y0: TLOSS error
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 y0();
_LIB_VERSION = _IEEE_;
printf("IEEE: y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _XOPEN_;
printf("XOPEN y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _POSIX_;
printf("POSIX y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _SVID_;
printf("SVID y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example2.c libm.a
% a.out
IEEE: y0(1e300) = -1.36813604503424810557e-151
XOPEN y0(1e300) = 0.00000000000000000000e+00
POSIX y0(1e300) = 0.00000000000000000000e+00
y0: TLOSS error
SVID 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 scalb(double,double)	(1)	SVID3 defined
double 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

About

BITS deps/fdlibm submodule

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

*********************************
* 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, 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, 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 y0();
printf("y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example1.c libm.a
% a.out
y0: TLOSS error
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 y0();
_LIB_VERSION = _IEEE_;
printf("IEEE: y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _XOPEN_;
printf("XOPEN y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _POSIX_;
printf("POSIX y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _SVID_;
printf("SVID y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example2.c libm.a
% a.out
IEEE: y0(1e300) = -1.36813604503424810557e-151
XOPEN y0(1e300) = 0.00000000000000000000e+00
POSIX y0(1e300) = 0.00000000000000000000e+00
y0: TLOSS error
SVID 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 scalb(double,double)	(1)	SVID3 defined
double 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

About

BITS deps/fdlibm submodule

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

*********************************
* 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, 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, 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 y0();
printf("y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example1.c libm.a
% a.out
y0: TLOSS error
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 y0();
_LIB_VERSION = _IEEE_;
printf("IEEE: y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _XOPEN_;
printf("XOPEN y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _POSIX_;
printf("POSIX y0(1e300) = %1.20e\n",y0(1e300));
_LIB_VERSION = _SVID_;
printf("SVID y0(1e300) = %1.20e\n",y0(1e300));
exit(0);
}
% cc example2.c libm.a
% a.out
IEEE: y0(1e300) = -1.36813604503424810557e-151
XOPEN y0(1e300) = 0.00000000000000000000e+00
POSIX y0(1e300) = 0.00000000000000000000e+00
y0: TLOSS error
SVID 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 scalb(double,double)	(1)	SVID3 defined
double 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

About

BITS deps/fdlibm submodule

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages