mirror of
https://git.FreeBSD.org/src.git
synced 2024-10-20 02:38:43 +00:00
Implement fpclassify():
o Add a MD header private to libc called _fpmath.h; this header contains bitfield layouts of MD floating-point types. o Add a MI header private to libc called fpmath.h; this header contains bitfield layouts of MI floating-point types. o Add private libc variables to lib/libc/$arch/gen/infinity.c for storing NaN values. o Add __double_t and __float_t to <machine/_types.h>, and provide double_t and float_t typedefs in <math.h>. o Add some C99 manifest constants (FP_ILOGB0, FP_ILOGBNAN, HUGE_VALF, HUGE_VALL, INFINITY, NAN, and return values for fpclassify()) to <math.h> and others (FLT_EVAL_METHOD, DECIMAL_DIG) to <float.h> via <machine/float.h>. o Add C99 macro fpclassify() which calls __fpclassify{d,f,l}() based on the size of its argument. __fpclassifyl() is never called on alpha because (sizeof(long double) == sizeof(double)), which is good since __fpclassifyl() can't deal with such a small `long double'. This was developed by David Schultz and myself with input from bde and fenner. PR: 23103 Submitted by: David Schultz <dschultz@uclink.Berkeley.EDU> (significant portions) Reviewed by: bde, fenner (earlier versions)
This commit is contained in:
parent
856417ebfd
commit
8cf5ed5125
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=110566
@ -10,8 +10,8 @@
|
||||
# system call stubs.
|
||||
LIB=c
|
||||
SHLIB_MAJOR= 5
|
||||
CFLAGS+=-I${.CURDIR}/include -I${.CURDIR}/../../include
|
||||
AINC= -I${.CURDIR}/${MACHINE_ARCH}
|
||||
CFLAGS+=-I${.CURDIR}/include -I${.CURDIR}/../../include ${AINC}
|
||||
CLEANFILES+=tags
|
||||
INSTALL_PIC_ARCHIVE= yes
|
||||
PRECIOUSLIB= yes
|
||||
|
39
lib/libc/alpha/_fpmath.h
Normal file
39
lib/libc/alpha/_fpmath.h
Normal file
@ -0,0 +1,39 @@
|
||||
/*-
|
||||
* Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
union IEEEl2bits {
|
||||
long double e;
|
||||
struct {
|
||||
unsigned int manl :32;
|
||||
unsigned int manh :20;
|
||||
unsigned int exp :11;
|
||||
unsigned int sign :1;
|
||||
} bits;
|
||||
};
|
||||
|
||||
#define mask_nbit_l(u) ((void)0)
|
@ -34,3 +34,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
/* bytes for +Infinity on an Alpha (IEEE double format) */
|
||||
const union __infinity_un __infinity = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } };
|
||||
|
||||
/* bytes for NaN */
|
||||
const union __nan_un __nan = { { 0, 0, 0xc0, 0xff } };
|
||||
|
40
lib/libc/amd64/_fpmath.h
Normal file
40
lib/libc/amd64/_fpmath.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*-
|
||||
* Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
union IEEEl2bits {
|
||||
long double e;
|
||||
struct {
|
||||
unsigned int manl :32;
|
||||
unsigned int manh :32;
|
||||
unsigned int exp :15;
|
||||
unsigned int sign :1;
|
||||
unsigned int junk :16;
|
||||
} bits;
|
||||
};
|
||||
|
||||
#define mask_nbit_l(u) ((u).bits.manh &= 0x7fffffff)
|
@ -9,3 +9,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
/* bytes for +Infinity on a 387 */
|
||||
const union __infinity_un __infinity = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } };
|
||||
|
||||
/* bytes for NaN */
|
||||
const union __nan_un __nan = { { 0, 0, 0xc0, 0xff } };
|
||||
|
@ -9,7 +9,7 @@ SRCS+= __xuname.c _pthread_stubs.c _rand48.c _spinlock_stub.c _thread_init.c \
|
||||
clock.c closedir.c confstr.c \
|
||||
crypt.c ctermid.c daemon.c devname.c dirname.c disklabel.c \
|
||||
dlfcn.c dlfunc.c drand48.c erand48.c err.c errlst.c errno.c \
|
||||
exec.c fmtcheck.c fmtmsg.c fnmatch.c fstab.c ftok.c fts.c \
|
||||
exec.c fmtcheck.c fmtmsg.c fnmatch.c fpclassify.c fstab.c ftok.c fts.c \
|
||||
getbootfile.c getbsize.c \
|
||||
getcap.c getcwd.c getdomainname.c getgrent.c getgrouplist.c \
|
||||
gethostname.c getloadavg.c getlogin.c getmntinfo.c getnetgrent.c \
|
||||
@ -40,7 +40,8 @@ MAN+= alarm.3 arc4random.3 \
|
||||
basename.3 check_utility_compat.3 clock.3 \
|
||||
confstr.3 ctermid.3 daemon.3 \
|
||||
devname.3 directory.3 dirname.3 dladdr.3 dllockinit.3 dlopen.3 \
|
||||
err.3 exec.3 fmtcheck.3 fmtmsg.3 fnmatch.3 frexp.3 ftok.3 fts.3 \
|
||||
err.3 exec.3 fmtcheck.3 fmtmsg.3 fnmatch.3 fpclassify.3 frexp.3 \
|
||||
ftok.3 fts.3 \
|
||||
getbootfile.3 getbsize.3 getcap.3 getcontext.3 getcwd.3 \
|
||||
getdiskbyname.3 getdomainname.3 getfsent.3 \
|
||||
getgrent.3 getgrouplist.3 gethostname.3 getloadavg.3 \
|
||||
|
81
lib/libc/gen/fpclassify.3
Normal file
81
lib/libc/gen/fpclassify.3
Normal file
@ -0,0 +1,81 @@
|
||||
.\" Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd February 8, 2003
|
||||
.Dt FPCLASSIFY 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm fpclassify
|
||||
.Nd "classify a floating-point number"
|
||||
.Sh LIBRARY
|
||||
.Lb libc
|
||||
.Sh SYNOPSIS
|
||||
.In math.h
|
||||
.Ft int
|
||||
.Fn fpclassify "real-floating x"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fn fpclassify
|
||||
macro takes an argument of
|
||||
.Va x
|
||||
and returns one of the following manifest constants.
|
||||
.Bl -tag -width ".Dv FP_SUBNORMAL"
|
||||
.It Dv FP_INFINITE
|
||||
Indicates that
|
||||
.Va x
|
||||
is an infinite number.
|
||||
.It Dv FP_NAN
|
||||
Indicates that
|
||||
.Va x
|
||||
is not a number (NaN).
|
||||
.It Dv FP_NORMAL
|
||||
Indicates that
|
||||
.Va x
|
||||
is a normalized number.
|
||||
.It Dv FP_SUBNORMAL
|
||||
Indicates that
|
||||
.Va x
|
||||
is a denormalized number.
|
||||
.It Dv FP_ZERO
|
||||
Indicates that
|
||||
.Va x
|
||||
is zero (0 or -0).
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr math 3
|
||||
.Sh STANDARDS
|
||||
The
|
||||
.Fn fpclassify
|
||||
macro conforms to
|
||||
.St -isoC-99 .
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Fn fpclassify
|
||||
macro was added in
|
||||
.Fx 5.1 .
|
||||
.Sh BUGS
|
||||
By default, the DEC Alpha architecture does not support IEEE rounding.
|
||||
See compiler documentation for additional details.
|
93
lib/libc/gen/fpclassify.c
Normal file
93
lib/libc/gen/fpclassify.c
Normal file
@ -0,0 +1,93 @@
|
||||
/*-
|
||||
* Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
|
||||
* Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <sys/endian.h>
|
||||
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "fpmath.h"
|
||||
|
||||
int
|
||||
__fpclassifyf(float f)
|
||||
{
|
||||
union IEEEf2bits u;
|
||||
|
||||
u.f = f;
|
||||
if (u.bits.exp == 0) {
|
||||
if (u.bits.man == 0)
|
||||
return (FP_ZERO);
|
||||
return (FP_SUBNORMAL);
|
||||
}
|
||||
if (u.bits.exp == 255) {
|
||||
if (u.bits.man == 0)
|
||||
return (FP_INFINITE);
|
||||
return (FP_NAN);
|
||||
}
|
||||
return (FP_NORMAL);
|
||||
}
|
||||
|
||||
int
|
||||
__fpclassifyd(double d)
|
||||
{
|
||||
union IEEEd2bits u;
|
||||
|
||||
u.d = d;
|
||||
if (u.bits.exp == 0) {
|
||||
if ((u.bits.manl | u.bits.manh) == 0)
|
||||
return (FP_ZERO);
|
||||
return (FP_SUBNORMAL);
|
||||
}
|
||||
if (u.bits.exp == 2047) {
|
||||
if ((u.bits.manl | u.bits.manh) == 0)
|
||||
return (FP_INFINITE);
|
||||
return (FP_NAN);
|
||||
}
|
||||
return (FP_NORMAL);
|
||||
}
|
||||
|
||||
int
|
||||
__fpclassifyl(long double e)
|
||||
{
|
||||
union IEEEl2bits u;
|
||||
|
||||
u.e = e;
|
||||
if (u.bits.exp == 0) {
|
||||
if ((u.bits.manl | u.bits.manh) == 0)
|
||||
return (FP_ZERO);
|
||||
return (FP_SUBNORMAL);
|
||||
}
|
||||
mask_nbit_l(u); /* Mask normalization bit if applicable. */
|
||||
if (u.bits.exp == 32767) {
|
||||
if ((u.bits.manl | u.bits.manh) == 0)
|
||||
return (FP_INFINITE);
|
||||
return (FP_NAN);
|
||||
}
|
||||
return (FP_NORMAL);
|
||||
}
|
40
lib/libc/i386/_fpmath.h
Normal file
40
lib/libc/i386/_fpmath.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*-
|
||||
* Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
union IEEEl2bits {
|
||||
long double e;
|
||||
struct {
|
||||
unsigned int manl :32;
|
||||
unsigned int manh :32;
|
||||
unsigned int exp :15;
|
||||
unsigned int sign :1;
|
||||
unsigned int junk :16;
|
||||
} bits;
|
||||
};
|
||||
|
||||
#define mask_nbit_l(u) ((u).bits.manh &= 0x7fffffff)
|
@ -9,3 +9,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
/* bytes for +Infinity on a 387 */
|
||||
const union __infinity_un __infinity = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } };
|
||||
|
||||
/* bytes for NaN */
|
||||
const union __nan_un __nan = { { 0, 0, 0xc0, 0xff } };
|
||||
|
40
lib/libc/ia64/_fpmath.h
Normal file
40
lib/libc/ia64/_fpmath.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*-
|
||||
* Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
|
||||
* Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
union IEEEl2bits {
|
||||
long double e;
|
||||
struct {
|
||||
unsigned long manl :64;
|
||||
unsigned long manh :48;
|
||||
unsigned int exp :15;
|
||||
unsigned int sign :1;
|
||||
} bits;
|
||||
};
|
||||
|
||||
#define mask_nbit_l(u) ((u).bits.manl &= 0x7fffffffffffffff)
|
@ -34,3 +34,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
/* bytes for +Infinity on an ia64 (IEEE double format) */
|
||||
const union __infinity_un __infinity = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } };
|
||||
|
||||
/* bytes for NaN */
|
||||
const union __nan_un __nan = { { 0, 0, 0xc0, 0xff } };
|
||||
|
63
lib/libc/include/fpmath.h
Normal file
63
lib/libc/include/fpmath.h
Normal file
@ -0,0 +1,63 @@
|
||||
/*-
|
||||
* Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
|
||||
* Copyright (c) 2002 David Schultz <dschultz@uclink.Berkeley.EDU>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <sys/endian.h>
|
||||
#include "_fpmath.h"
|
||||
|
||||
union IEEEf2bits {
|
||||
float f;
|
||||
struct {
|
||||
#if _BYTE_ORDER == _LITTLE_ENDIAN
|
||||
unsigned int man :23;
|
||||
unsigned int exp :8;
|
||||
unsigned int sign :1;
|
||||
#else /* _BIG_ENDIAN */
|
||||
unsigned int sign :1;
|
||||
unsigned int exp :8;
|
||||
unsigned int man :23;
|
||||
#endif
|
||||
} bits;
|
||||
};
|
||||
|
||||
union IEEEd2bits {
|
||||
double d;
|
||||
struct {
|
||||
#if _BYTE_ORDER == _LITTLE_ENDIAN
|
||||
unsigned int manl :32;
|
||||
unsigned int manh :20;
|
||||
unsigned int exp :11;
|
||||
unsigned int sign :1;
|
||||
#else /* _BIG_ENDIAN */
|
||||
unsigned int sign :1;
|
||||
unsigned int exp :11;
|
||||
unsigned int manh :20;
|
||||
unsigned int manl :32;
|
||||
#endif
|
||||
} bits;
|
||||
};
|
40
lib/libc/powerpc/_fpmath.h
Normal file
40
lib/libc/powerpc/_fpmath.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*-
|
||||
* Copyright (c) 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
union IEEEl2bits {
|
||||
long double e;
|
||||
struct {
|
||||
unsigned int sign :1;
|
||||
unsigned int exp :15;
|
||||
unsigned long manh :48;
|
||||
unsigned long manl :64;
|
||||
} bits;
|
||||
};
|
||||
|
||||
/* XXX does powerpc have a normalization bit? */
|
||||
#define mask_nbit_l(u) ((void)0)
|
@ -12,3 +12,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
/* bytes for +Infinity on powerpc */
|
||||
const union __infinity_un __infinity = { { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 } };
|
||||
|
||||
/* bytes for NaN */
|
||||
const union __nan_un __nan = { { 0xff, 0xc0, 0, 0 } };
|
||||
|
40
lib/libc/sparc64/_fpmath.h
Normal file
40
lib/libc/sparc64/_fpmath.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*-
|
||||
* Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
|
||||
* Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
union IEEEl2bits {
|
||||
long double e;
|
||||
struct {
|
||||
unsigned int sign :1;
|
||||
unsigned int exp :15;
|
||||
unsigned long manh :48;
|
||||
unsigned long manl :64;
|
||||
} bits;
|
||||
};
|
||||
|
||||
#define mask_nbit_l(u) ((void)0)
|
@ -12,3 +12,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
/* bytes for +Infinity on a sparc */
|
||||
const union __infinity_un __infinity = { { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 } };
|
||||
|
||||
/* bytes for NaN */
|
||||
const union __nan_un __nan = { { 0xff, 0xc0, 0, 0 } };
|
||||
|
@ -17,6 +17,8 @@
|
||||
#ifndef _MATH_H_
|
||||
#define _MATH_H_
|
||||
|
||||
#include <sys/_types.h>
|
||||
|
||||
/*
|
||||
* ANSI/POSIX
|
||||
*/
|
||||
@ -24,7 +26,33 @@ extern const union __infinity_un {
|
||||
unsigned char __uc[8];
|
||||
double __ud;
|
||||
} __infinity;
|
||||
|
||||
extern const union __nan_un {
|
||||
unsigned char __uc[sizeof(float)];
|
||||
float __uf;
|
||||
} __nan;
|
||||
|
||||
#define FP_ILOGB0 (-0x7fffffff - 1) /* INT_MIN */
|
||||
#define FP_ILOGBNAN 0x7fffffff /* INT_MAX */
|
||||
#define HUGE_VAL (__infinity.__ud)
|
||||
#define HUGE_VALF (float)HUGE_VAL
|
||||
#define HUGE_VALL (long double)HUGE_VAL
|
||||
#define INFINITY HUGE_VALF
|
||||
#define NAN (__nan.__uf)
|
||||
|
||||
/* Symbolic constants to classify floating point numbers. */
|
||||
#define FP_INFINITE 1
|
||||
#define FP_NAN 2
|
||||
#define FP_NORMAL 3
|
||||
#define FP_SUBNORMAL 4
|
||||
#define FP_ZERO 5
|
||||
#define fpclassify(x) \
|
||||
((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
|
||||
: (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
|
||||
: __fpclassifyl(x))
|
||||
|
||||
typedef __double_t double_t;
|
||||
typedef __float_t float_t;
|
||||
|
||||
/*
|
||||
* XOPEN/SVID
|
||||
@ -116,6 +144,10 @@ __BEGIN_DECLS
|
||||
/*
|
||||
* ANSI/POSIX
|
||||
*/
|
||||
int __fpclassifyd(double);
|
||||
int __fpclassifyf(float);
|
||||
int __fpclassifyl(long double);
|
||||
|
||||
double acos(double);
|
||||
double asin(double);
|
||||
double atan(double);
|
||||
|
@ -56,6 +56,8 @@ typedef unsigned long __uint64_t;
|
||||
*/
|
||||
typedef __int32_t __clock_t; /* clock()... */
|
||||
typedef __int64_t __critical_t;
|
||||
typedef double __double_t;
|
||||
typedef float __float_t;
|
||||
typedef __int64_t __intfptr_t;
|
||||
typedef __int64_t __intmax_t;
|
||||
typedef __int64_t __intptr_t;
|
||||
|
@ -45,6 +45,8 @@ __END_DECLS
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS __flt_rounds()
|
||||
#define FLT_EVAL_METHOD 0 /* no promotions */
|
||||
#define DECIMAL_DIG 17 /* max precision in decimal digits */
|
||||
|
||||
#define FLT_MANT_DIG 24 /* p */
|
||||
#define FLT_EPSILON 1.19209290E-07F /* b**(1-p) */
|
||||
|
@ -39,6 +39,8 @@
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
||||
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
||||
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
||||
|
||||
#define FLT_MANT_DIG 24 /* p */
|
||||
#define FLT_EPSILON 1.19209290E-07F /* b**(1-p) */
|
||||
|
@ -69,6 +69,8 @@ typedef unsigned long long __uint64_t;
|
||||
*/
|
||||
typedef unsigned long __clock_t; /* clock()... */
|
||||
typedef __int32_t __critical_t;
|
||||
typedef double __double_t;
|
||||
typedef double __float_t;
|
||||
typedef __int32_t __intfptr_t;
|
||||
typedef __int64_t __intmax_t;
|
||||
typedef __int32_t __intptr_t;
|
||||
|
@ -39,6 +39,8 @@
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
||||
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
||||
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
||||
|
||||
#define FLT_MANT_DIG 24 /* p */
|
||||
#define FLT_EPSILON 1.19209290E-07F /* b**(1-p) */
|
||||
|
@ -56,6 +56,8 @@ typedef unsigned long __uint64_t;
|
||||
*/
|
||||
typedef __int32_t __clock_t; /* clock()... */
|
||||
typedef __int64_t __critical_t;
|
||||
typedef double __double_t;
|
||||
typedef float __float_t;
|
||||
typedef __int64_t __intfptr_t;
|
||||
typedef __int64_t __intmax_t;
|
||||
typedef __int64_t __intptr_t;
|
||||
|
@ -41,6 +41,8 @@
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
||||
#define FLT_EVAL_METHOD 0 /* no promotions */
|
||||
#define DECIMAL_DIG 35 /* max precision in decimal digits */
|
||||
|
||||
#define FLT_MANT_DIG 24 /* p */
|
||||
#define FLT_EPSILON 1.19209290E-07F /* b**(1-p) */
|
||||
|
@ -69,6 +69,8 @@ typedef unsigned long long __uint64_t;
|
||||
*/
|
||||
typedef __uint32_t __clock_t; /* clock()... */
|
||||
typedef __int32_t __critical_t;
|
||||
typedef double __double_t;
|
||||
typedef double __float_t;
|
||||
typedef __int32_t __intfptr_t;
|
||||
typedef __int64_t __intmax_t;
|
||||
typedef __int32_t __intptr_t;
|
||||
|
@ -40,6 +40,8 @@
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
||||
#define FLT_EVAL_METHOD 1 /* operands promoted to double */
|
||||
#define DECIMAL_DIG 35 /* max precision in decimal digits */
|
||||
|
||||
#define FLT_MANT_DIG 24 /* p */
|
||||
#define FLT_EPSILON 1.19209290E-07F /* b**(1-p) */
|
||||
|
@ -56,6 +56,8 @@ typedef unsigned long __uint64_t;
|
||||
*/
|
||||
typedef __int32_t __clock_t; /* clock()... */
|
||||
typedef __int64_t __critical_t;
|
||||
typedef double __double_t;
|
||||
typedef float __float_t;
|
||||
typedef __int64_t __intfptr_t;
|
||||
typedef __int64_t __intmax_t;
|
||||
typedef __int64_t __intptr_t;
|
||||
|
@ -55,6 +55,8 @@ __END_DECLS
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS __flt_rounds()
|
||||
#define FLT_EVAL_METHOD 0 /* no promotion */
|
||||
#define DECIMAL_DIG 35 /* max precision in decimal digits */
|
||||
|
||||
#define FLT_MANT_DIG 24 /* p */
|
||||
#define FLT_EPSILON 1.19209290E-7F /* b**(1-p) */
|
||||
|
Loading…
Reference in New Issue
Block a user