Use Gnulib's isnan' and isinf' modules.
This updates Gnulib to v0.0-4219-g84cdd8b. * m4/gnulib-cache.m4: Add `isinf' and `isnan'. * configure.ac: Remove checks for `floatingpoint.h', `ieeefp.h', and `nan.h'. * libguile/gen-scmconfig.c (main): Remove definitions of `SCM_HAVE_FLOATINGPOINT_H', `SCM_HAVE_IEEEFP_H', and `SCM_HAVE_NAN_H'. * libguile/numbers.c (isnan)[SCO && !HAVE_ISNAN]: Remove. (isinf)[SCO && !HAVE_ISINF]: Remove. (xisinf, xisnan): Remove. Change callers to use `isinf' and `isnan'. (guile_ieee_init): Remove the `defined HAVE_ISINF' and `define HAVE_ISNAN' conditions. * libguile/numbers.h: Remove code conditional on `SCM_HAVE_FLOATINGPOINT_H', `SCM_HAVE_IEEEFP_H', or `SCM_HAVE_NAN_H'.
This commit is contained in:
parent
18f2d5aa4d
commit
2e65b52f8a
24 changed files with 2350 additions and 129 deletions
144
lib/Makefile.am
144
lib/Makefile.am
|
|
@ -9,7 +9,7 @@
|
|||
# the same distribution terms as the rest of that program.
|
||||
#
|
||||
# Generated by gnulib-tool.
|
||||
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=3 --libtool --macro-prefix=gl --no-vc-files alignof alloca-opt announce-gen autobuild byteswap canonicalize-lgpl duplocale environ extensions flock fpieee full-read full-write func gendocs getaddrinfo git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton lib-symbol-versions lib-symbol-visibility libunistring locale maintainer-makefile putenv stat-time stdlib strcase strftime striconveh string sys_stat verify version-etc-fsf vsnprintf warnings
|
||||
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=3 --libtool --macro-prefix=gl --no-vc-files alignof alloca-opt announce-gen autobuild byteswap canonicalize-lgpl duplocale environ extensions flock fpieee full-read full-write func gendocs getaddrinfo git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isinf isnan lib-symbol-versions lib-symbol-visibility libunistring locale maintainer-makefile putenv stat-time stdlib strcase strftime striconveh string sys_stat verify version-etc-fsf vsnprintf warnings
|
||||
|
||||
AUTOMAKE_OPTIONS = 1.5 gnits subdir-objects
|
||||
|
||||
|
|
@ -488,6 +488,42 @@ EXTRA_libgnu_la_SOURCES += inet_pton.c
|
|||
|
||||
## end gnulib module inet_pton
|
||||
|
||||
## begin gnulib module isinf
|
||||
|
||||
|
||||
EXTRA_DIST += isinf.c
|
||||
|
||||
EXTRA_libgnu_la_SOURCES += isinf.c
|
||||
|
||||
## end gnulib module isinf
|
||||
|
||||
## begin gnulib module isnand
|
||||
|
||||
|
||||
EXTRA_DIST += float+.h isnan.c isnand.c
|
||||
|
||||
EXTRA_libgnu_la_SOURCES += isnan.c isnand.c
|
||||
|
||||
## end gnulib module isnand
|
||||
|
||||
## begin gnulib module isnanf
|
||||
|
||||
|
||||
EXTRA_DIST += float+.h isnan.c isnanf.c
|
||||
|
||||
EXTRA_libgnu_la_SOURCES += isnan.c isnanf.c
|
||||
|
||||
## end gnulib module isnanf
|
||||
|
||||
## begin gnulib module isnanl
|
||||
|
||||
|
||||
EXTRA_DIST += float+.h isnan.c isnanl.c
|
||||
|
||||
EXTRA_libgnu_la_SOURCES += isnan.c isnanl.c
|
||||
|
||||
## end gnulib module isnanl
|
||||
|
||||
## begin gnulib module lib-symbol-visibility
|
||||
|
||||
# The value of $(CFLAG_VISIBILITY) needs to be added to the CFLAGS for the
|
||||
|
|
@ -639,6 +675,112 @@ EXTRA_DIST += malloca.h malloca.valgrind
|
|||
|
||||
## end gnulib module malloca
|
||||
|
||||
## begin gnulib module math
|
||||
|
||||
BUILT_SOURCES += math.h
|
||||
|
||||
# We need the following in order to create <math.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
math.h: math.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
|
||||
sed -e 's|@''INCLUDE_NEXT_AS_FIRST_DIRECTIVE''@|$(INCLUDE_NEXT_AS_FIRST_DIRECTIVE)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
-e 's|@''NEXT_AS_FIRST_DIRECTIVE_MATH_H''@|$(NEXT_AS_FIRST_DIRECTIVE_MATH_H)|g' \
|
||||
-e 's|@''GNULIB_ACOSL''@|$(GNULIB_ACOSL)|g' \
|
||||
-e 's|@''GNULIB_ASINL''@|$(GNULIB_ASINL)|g' \
|
||||
-e 's|@''GNULIB_ATANL''@|$(GNULIB_ATANL)|g' \
|
||||
-e 's|@''GNULIB_CEILF''@|$(GNULIB_CEILF)|g' \
|
||||
-e 's|@''GNULIB_CEILL''@|$(GNULIB_CEILL)|g' \
|
||||
-e 's|@''GNULIB_COSL''@|$(GNULIB_COSL)|g' \
|
||||
-e 's|@''GNULIB_EXPL''@|$(GNULIB_EXPL)|g' \
|
||||
-e 's|@''GNULIB_FLOORF''@|$(GNULIB_FLOORF)|g' \
|
||||
-e 's|@''GNULIB_FLOORL''@|$(GNULIB_FLOORL)|g' \
|
||||
-e 's|@''GNULIB_FREXP''@|$(GNULIB_FREXP)|g' \
|
||||
-e 's|@''GNULIB_FREXPL''@|$(GNULIB_FREXPL)|g' \
|
||||
-e 's|@''GNULIB_ISFINITE''@|$(GNULIB_ISFINITE)|g' \
|
||||
-e 's|@''GNULIB_ISINF''@|$(GNULIB_ISINF)|g' \
|
||||
-e 's|@''GNULIB_ISNAN''@|$(GNULIB_ISNAN)|g' \
|
||||
-e 's|@''GNULIB_ISNANF''@|$(GNULIB_ISNANF)|g' \
|
||||
-e 's|@''GNULIB_ISNAND''@|$(GNULIB_ISNAND)|g' \
|
||||
-e 's|@''GNULIB_ISNANL''@|$(GNULIB_ISNANL)|g' \
|
||||
-e 's|@''GNULIB_LDEXPL''@|$(GNULIB_LDEXPL)|g' \
|
||||
-e 's|@''GNULIB_LOGB''@|$(GNULIB_LOGB)|g' \
|
||||
-e 's|@''GNULIB_LOGL''@|$(GNULIB_LOGL)|g' \
|
||||
-e 's|@''GNULIB_ROUND''@|$(GNULIB_ROUND)|g' \
|
||||
-e 's|@''GNULIB_ROUNDF''@|$(GNULIB_ROUNDF)|g' \
|
||||
-e 's|@''GNULIB_ROUNDL''@|$(GNULIB_ROUNDL)|g' \
|
||||
-e 's|@''GNULIB_SIGNBIT''@|$(GNULIB_SIGNBIT)|g' \
|
||||
-e 's|@''GNULIB_SINL''@|$(GNULIB_SINL)|g' \
|
||||
-e 's|@''GNULIB_SQRTL''@|$(GNULIB_SQRTL)|g' \
|
||||
-e 's|@''GNULIB_TANL''@|$(GNULIB_TANL)|g' \
|
||||
-e 's|@''GNULIB_TRUNC''@|$(GNULIB_TRUNC)|g' \
|
||||
-e 's|@''GNULIB_TRUNCF''@|$(GNULIB_TRUNCF)|g' \
|
||||
-e 's|@''GNULIB_TRUNCL''@|$(GNULIB_TRUNCL)|g' \
|
||||
-e 's|@''HAVE_ACOSL''@|$(HAVE_ACOSL)|g' \
|
||||
-e 's|@''HAVE_ASINL''@|$(HAVE_ASINL)|g' \
|
||||
-e 's|@''HAVE_ATANL''@|$(HAVE_ATANL)|g' \
|
||||
-e 's|@''HAVE_COSL''@|$(HAVE_COSL)|g' \
|
||||
-e 's|@''HAVE_EXPL''@|$(HAVE_EXPL)|g' \
|
||||
-e 's|@''HAVE_ISNANF''@|$(HAVE_ISNANF)|g' \
|
||||
-e 's|@''HAVE_ISNAND''@|$(HAVE_ISNAND)|g' \
|
||||
-e 's|@''HAVE_ISNANL''@|$(HAVE_ISNANL)|g' \
|
||||
-e 's|@''HAVE_LOGL''@|$(HAVE_LOGL)|g' \
|
||||
-e 's|@''HAVE_SINL''@|$(HAVE_SINL)|g' \
|
||||
-e 's|@''HAVE_SQRTL''@|$(HAVE_SQRTL)|g' \
|
||||
-e 's|@''HAVE_TANL''@|$(HAVE_TANL)|g' \
|
||||
-e 's|@''HAVE_DECL_ACOSL''@|$(HAVE_DECL_ACOSL)|g' \
|
||||
-e 's|@''HAVE_DECL_ASINL''@|$(HAVE_DECL_ASINL)|g' \
|
||||
-e 's|@''HAVE_DECL_ATANL''@|$(HAVE_DECL_ATANL)|g' \
|
||||
-e 's|@''HAVE_DECL_CEILF''@|$(HAVE_DECL_CEILF)|g' \
|
||||
-e 's|@''HAVE_DECL_CEILL''@|$(HAVE_DECL_CEILL)|g' \
|
||||
-e 's|@''HAVE_DECL_COSL''@|$(HAVE_DECL_COSL)|g' \
|
||||
-e 's|@''HAVE_DECL_EXPL''@|$(HAVE_DECL_EXPL)|g' \
|
||||
-e 's|@''HAVE_DECL_FLOORF''@|$(HAVE_DECL_FLOORF)|g' \
|
||||
-e 's|@''HAVE_DECL_FLOORL''@|$(HAVE_DECL_FLOORL)|g' \
|
||||
-e 's|@''HAVE_DECL_FREXPL''@|$(HAVE_DECL_FREXPL)|g' \
|
||||
-e 's|@''HAVE_DECL_LDEXPL''@|$(HAVE_DECL_LDEXPL)|g' \
|
||||
-e 's|@''HAVE_DECL_LOGB''@|$(HAVE_DECL_LOGB)|g' \
|
||||
-e 's|@''HAVE_DECL_LOGL''@|$(HAVE_DECL_LOGL)|g' \
|
||||
-e 's|@''HAVE_DECL_ROUND''@|$(HAVE_DECL_ROUND)|g' \
|
||||
-e 's|@''HAVE_DECL_ROUNDF''@|$(HAVE_DECL_ROUNDF)|g' \
|
||||
-e 's|@''HAVE_DECL_ROUNDL''@|$(HAVE_DECL_ROUNDL)|g' \
|
||||
-e 's|@''HAVE_DECL_SINL''@|$(HAVE_DECL_SINL)|g' \
|
||||
-e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \
|
||||
-e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \
|
||||
-e 's|@''HAVE_DECL_TRUNC''@|$(HAVE_DECL_TRUNC)|g' \
|
||||
-e 's|@''HAVE_DECL_TRUNCF''@|$(HAVE_DECL_TRUNCF)|g' \
|
||||
-e 's|@''HAVE_DECL_TRUNCL''@|$(HAVE_DECL_TRUNCL)|g' \
|
||||
-e 's|@''REPLACE_CEILF''@|$(REPLACE_CEILF)|g' \
|
||||
-e 's|@''REPLACE_CEILL''@|$(REPLACE_CEILL)|g' \
|
||||
-e 's|@''REPLACE_FLOORF''@|$(REPLACE_FLOORF)|g' \
|
||||
-e 's|@''REPLACE_FLOORL''@|$(REPLACE_FLOORL)|g' \
|
||||
-e 's|@''REPLACE_FREXP''@|$(REPLACE_FREXP)|g' \
|
||||
-e 's|@''REPLACE_FREXPL''@|$(REPLACE_FREXPL)|g' \
|
||||
-e 's|@''REPLACE_HUGE_VAL''@|$(REPLACE_HUGE_VAL)|g' \
|
||||
-e 's|@''REPLACE_ISFINITE''@|$(REPLACE_ISFINITE)|g' \
|
||||
-e 's|@''REPLACE_ISINF''@|$(REPLACE_ISINF)|g' \
|
||||
-e 's|@''REPLACE_ISNAN''@|$(REPLACE_ISNAN)|g' \
|
||||
-e 's|@''REPLACE_LDEXPL''@|$(REPLACE_LDEXPL)|g' \
|
||||
-e 's|@''REPLACE_NAN''@|$(REPLACE_NAN)|g' \
|
||||
-e 's|@''REPLACE_ROUND''@|$(REPLACE_ROUND)|g' \
|
||||
-e 's|@''REPLACE_ROUNDF''@|$(REPLACE_ROUNDF)|g' \
|
||||
-e 's|@''REPLACE_ROUNDL''@|$(REPLACE_ROUNDL)|g' \
|
||||
-e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \
|
||||
-e 's|@''REPLACE_SIGNBIT_USING_GCC''@|$(REPLACE_SIGNBIT_USING_GCC)|g' \
|
||||
-e 's|@''REPLACE_TRUNCL''@|$(REPLACE_TRUNCL)|g' \
|
||||
-e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
|
||||
-e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
|
||||
-e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
|
||||
< $(srcdir)/math.in.h; \
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += math.h math.h-t
|
||||
|
||||
EXTRA_DIST += math.in.h
|
||||
|
||||
## end gnulib module math
|
||||
|
||||
## begin gnulib module mbrlen
|
||||
|
||||
|
||||
|
|
|
|||
37
lib/isinf.c
Normal file
37
lib/isinf.c
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
/* Test for positive or negative infinity.
|
||||
Copyright (C) 2007-2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
/* Written by Ben Pfaff <blp@gnu.org>, 2008. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <float.h>
|
||||
|
||||
int gl_isinff (float x)
|
||||
{
|
||||
return x < -FLT_MAX || x > FLT_MAX;
|
||||
}
|
||||
|
||||
int gl_isinfd (double x)
|
||||
{
|
||||
return x < -DBL_MAX || x > DBL_MAX;
|
||||
}
|
||||
|
||||
int gl_isinfl (long double x)
|
||||
{
|
||||
return x < -LDBL_MAX || x > LDBL_MAX;
|
||||
}
|
||||
173
lib/isnan.c
Normal file
173
lib/isnan.c
Normal file
|
|
@ -0,0 +1,173 @@
|
|||
/* Test for NaN that does not need libm.
|
||||
Copyright (C) 2007-2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#ifdef USE_LONG_DOUBLE
|
||||
/* Specification found in math.h or isnanl-nolibm.h. */
|
||||
extern int rpl_isnanl (long double x);
|
||||
#elif ! defined USE_FLOAT
|
||||
/* Specification found in math.h or isnand-nolibm.h. */
|
||||
extern int rpl_isnand (double x);
|
||||
#else /* defined USE_FLOAT */
|
||||
/* Specification found in math.h or isnanf-nolibm.h. */
|
||||
extern int rpl_isnanf (float x);
|
||||
#endif
|
||||
|
||||
#include <float.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "float+.h"
|
||||
|
||||
#ifdef USE_LONG_DOUBLE
|
||||
# define FUNC rpl_isnanl
|
||||
# define DOUBLE long double
|
||||
# define MAX_EXP LDBL_MAX_EXP
|
||||
# define MIN_EXP LDBL_MIN_EXP
|
||||
# if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
|
||||
# define KNOWN_EXPBIT0_LOCATION
|
||||
# define EXPBIT0_WORD LDBL_EXPBIT0_WORD
|
||||
# define EXPBIT0_BIT LDBL_EXPBIT0_BIT
|
||||
# endif
|
||||
# define SIZE SIZEOF_LDBL
|
||||
# define L_(literal) literal##L
|
||||
#elif ! defined USE_FLOAT
|
||||
# define FUNC rpl_isnand
|
||||
# define DOUBLE double
|
||||
# define MAX_EXP DBL_MAX_EXP
|
||||
# define MIN_EXP DBL_MIN_EXP
|
||||
# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
|
||||
# define KNOWN_EXPBIT0_LOCATION
|
||||
# define EXPBIT0_WORD DBL_EXPBIT0_WORD
|
||||
# define EXPBIT0_BIT DBL_EXPBIT0_BIT
|
||||
# endif
|
||||
# define SIZE SIZEOF_DBL
|
||||
# define L_(literal) literal
|
||||
#else /* defined USE_FLOAT */
|
||||
# define FUNC rpl_isnanf
|
||||
# define DOUBLE float
|
||||
# define MAX_EXP FLT_MAX_EXP
|
||||
# define MIN_EXP FLT_MIN_EXP
|
||||
# if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
|
||||
# define KNOWN_EXPBIT0_LOCATION
|
||||
# define EXPBIT0_WORD FLT_EXPBIT0_WORD
|
||||
# define EXPBIT0_BIT FLT_EXPBIT0_BIT
|
||||
# endif
|
||||
# define SIZE SIZEOF_FLT
|
||||
# define L_(literal) literal##f
|
||||
#endif
|
||||
|
||||
#define EXP_MASK ((MAX_EXP - MIN_EXP) | 7)
|
||||
|
||||
#define NWORDS \
|
||||
((sizeof (DOUBLE) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
|
||||
typedef union { DOUBLE value; unsigned int word[NWORDS]; } memory_double;
|
||||
|
||||
int
|
||||
FUNC (DOUBLE x)
|
||||
{
|
||||
#ifdef KNOWN_EXPBIT0_LOCATION
|
||||
# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
|
||||
/* Special CPU dependent code is needed to treat bit patterns outside the
|
||||
IEEE 754 specification (such as Pseudo-NaNs, Pseudo-Infinities,
|
||||
Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals) as NaNs.
|
||||
These bit patterns are:
|
||||
- exponent = 0x0001..0x7FFF, mantissa bit 63 = 0,
|
||||
- exponent = 0x0000, mantissa bit 63 = 1.
|
||||
The NaN bit pattern is:
|
||||
- exponent = 0x7FFF, mantissa >= 0x8000000000000001. */
|
||||
memory_double m;
|
||||
unsigned int exponent;
|
||||
|
||||
m.value = x;
|
||||
exponent = (m.word[EXPBIT0_WORD] >> EXPBIT0_BIT) & EXP_MASK;
|
||||
# ifdef WORDS_BIGENDIAN
|
||||
/* Big endian: EXPBIT0_WORD = 0, EXPBIT0_BIT = 16. */
|
||||
if (exponent == 0)
|
||||
return 1 & (m.word[0] >> 15);
|
||||
else if (exponent == EXP_MASK)
|
||||
return (((m.word[0] ^ 0x8000U) << 16) | m.word[1] | (m.word[2] >> 16)) != 0;
|
||||
else
|
||||
return 1 & ~(m.word[0] >> 15);
|
||||
# else
|
||||
/* Little endian: EXPBIT0_WORD = 2, EXPBIT0_BIT = 0. */
|
||||
if (exponent == 0)
|
||||
return (m.word[1] >> 31);
|
||||
else if (exponent == EXP_MASK)
|
||||
return ((m.word[1] ^ 0x80000000U) | m.word[0]) != 0;
|
||||
else
|
||||
return (m.word[1] >> 31) ^ 1;
|
||||
# endif
|
||||
# else
|
||||
/* Be careful to not do any floating-point operation on x, such as x == x,
|
||||
because x may be a signaling NaN. */
|
||||
# if defined __SUNPRO_C || defined __DECC || (defined __sgi && !defined __GNUC__)
|
||||
/* The Sun C 5.0 compilers and the Compaq (ex-DEC) 6.4 compilers don't
|
||||
recognize the initializers as constant expressions. The latter compiler
|
||||
also fails when constant-folding 0.0 / 0.0 even when constant-folding is
|
||||
not required. The SGI MIPSpro C compiler complains about "floating-point
|
||||
operation result is out of range". */
|
||||
static DOUBLE zero = L_(0.0);
|
||||
memory_double nan;
|
||||
DOUBLE plus_inf = L_(1.0) / L_(0.0);
|
||||
DOUBLE minus_inf = -L_(1.0) / L_(0.0);
|
||||
nan.value = zero / zero;
|
||||
# else
|
||||
static memory_double nan = { L_(0.0) / L_(0.0) };
|
||||
static DOUBLE plus_inf = L_(1.0) / L_(0.0);
|
||||
static DOUBLE minus_inf = -L_(1.0) / L_(0.0);
|
||||
# endif
|
||||
{
|
||||
memory_double m;
|
||||
|
||||
/* A NaN can be recognized through its exponent. But exclude +Infinity and
|
||||
-Infinity, which have the same exponent. */
|
||||
m.value = x;
|
||||
if (((m.word[EXPBIT0_WORD] ^ nan.word[EXPBIT0_WORD])
|
||||
& (EXP_MASK << EXPBIT0_BIT))
|
||||
== 0)
|
||||
return (memcmp (&m.value, &plus_inf, SIZE) != 0
|
||||
&& memcmp (&m.value, &minus_inf, SIZE) != 0);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
# endif
|
||||
#else
|
||||
/* The configuration did not find sufficient information. Give up about
|
||||
the signaling NaNs, handle only the quiet NaNs. */
|
||||
if (x == x)
|
||||
{
|
||||
# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_))
|
||||
/* Detect any special bit patterns that pass ==; see comment above. */
|
||||
memory_double m1;
|
||||
memory_double m2;
|
||||
|
||||
memset (&m1.value, 0, SIZE);
|
||||
memset (&m2.value, 0, SIZE);
|
||||
m1.value = x;
|
||||
m2.value = x + (x ? 0.0L : -0.0L);
|
||||
if (memcmp (&m1.value, &m2.value, SIZE) != 0)
|
||||
return 1;
|
||||
# endif
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
19
lib/isnand.c
Normal file
19
lib/isnand.c
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/* Test for NaN that does not need libm.
|
||||
Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
|
||||
|
||||
#include "isnan.c"
|
||||
20
lib/isnanf.c
Normal file
20
lib/isnanf.c
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/* Test for NaN that does not need libm.
|
||||
Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
|
||||
|
||||
#define USE_FLOAT
|
||||
#include "isnan.c"
|
||||
20
lib/isnanl.c
Normal file
20
lib/isnanl.c
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/* Test for NaN that does not need libm.
|
||||
Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
|
||||
|
||||
#define USE_LONG_DOUBLE
|
||||
#include "isnan.c"
|
||||
750
lib/math.in.h
Normal file
750
lib/math.in.h
Normal file
|
|
@ -0,0 +1,750 @@
|
|||
/* A GNU-like <math.h>.
|
||||
|
||||
Copyright (C) 2002-2003, 2007-2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _GL_MATH_H
|
||||
|
||||
#if __GNUC__ >= 3
|
||||
@PRAGMA_SYSTEM_HEADER@
|
||||
#endif
|
||||
|
||||
/* The include_next requires a split double-inclusion guard. */
|
||||
#@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
|
||||
|
||||
#ifndef _GL_MATH_H
|
||||
#define _GL_MATH_H
|
||||
|
||||
|
||||
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
||||
|
||||
/* The definition of _GL_ARG_NONNULL is copied here. */
|
||||
|
||||
/* The definition of _GL_WARN_ON_USE is copied here. */
|
||||
|
||||
/* Helper macros to define a portability warning for the
|
||||
classification macro FUNC called with VALUE. POSIX declares the
|
||||
classification macros with an argument of real-floating (that is,
|
||||
one of float, double, or long double). */
|
||||
#define _GL_WARN_REAL_FLOATING_DECL(func) \
|
||||
static inline int \
|
||||
rpl_ ## func ## f (float f) \
|
||||
{ \
|
||||
return func (f); \
|
||||
} \
|
||||
static inline int \
|
||||
rpl_ ## func ## d (double d) \
|
||||
{ \
|
||||
return func (d); \
|
||||
} \
|
||||
static inline int \
|
||||
rpl_ ## func ## l (long double l) \
|
||||
{ \
|
||||
return func (l); \
|
||||
} \
|
||||
_GL_WARN_ON_USE (rpl_ ## func ## f, #func " is unportable - " \
|
||||
"use gnulib module " #func " for portability"); \
|
||||
_GL_WARN_ON_USE (rpl_ ## func ## d, #func " is unportable - " \
|
||||
"use gnulib module " #func " for portability"); \
|
||||
_GL_WARN_ON_USE (rpl_ ## func ## l, #func " is unportable - " \
|
||||
"use gnulib module " #func " for portability")
|
||||
#define _GL_WARN_REAL_FLOATING_IMPL(func, value) \
|
||||
(sizeof (value) == sizeof (float) ? rpl_ ## func ## f (value) \
|
||||
: sizeof (value) == sizeof (double) ? rpl_ ## func ## d (value) \
|
||||
: rpl_ ## func ## l (value))
|
||||
|
||||
|
||||
/* POSIX allows platforms that don't support NAN. But all major
|
||||
machines in the past 15 years have supported something close to
|
||||
IEEE NaN, so we define this unconditionally. We also must define
|
||||
it on platforms like Solaris 10, where NAN is present but defined
|
||||
as a function pointer rather than a floating point constant. */
|
||||
#if !defined NAN || @REPLACE_NAN@
|
||||
# undef NAN
|
||||
/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */
|
||||
# ifdef __DECC
|
||||
static float
|
||||
_NaN ()
|
||||
{
|
||||
static float zero = 0.0f;
|
||||
return zero / zero;
|
||||
}
|
||||
# define NAN (_NaN())
|
||||
# else
|
||||
# define NAN (0.0f / 0.0f)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Solaris 10 defines HUGE_VAL, but as a function pointer rather
|
||||
than a floating point constant. */
|
||||
#if @REPLACE_HUGE_VAL@
|
||||
# undef HUGE_VAL
|
||||
# define HUGE_VAL (1.0 / 0.0)
|
||||
#endif
|
||||
|
||||
|
||||
/* Write x as
|
||||
x = mantissa * 2^exp
|
||||
where
|
||||
If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
|
||||
If x is zero: mantissa = x, exp = 0.
|
||||
If x is infinite or NaN: mantissa = x, exp unspecified.
|
||||
Store exp in *EXPPTR and return mantissa. */
|
||||
#if @GNULIB_FREXP@
|
||||
# if @REPLACE_FREXP@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# define frexp rpl_frexp
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (frexp, double, (double x, int *expptr) _GL_ARG_NONNULL ((2)));
|
||||
_GL_CXXALIAS_RPL (frexp, double, (double x, int *expptr));
|
||||
# else
|
||||
_GL_CXXALIAS_SYS (frexp, double, (double x, int *expptr));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (frexp);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef frexp
|
||||
/* Assume frexp is always declared. */
|
||||
_GL_WARN_ON_USE (frexp, "frexp is unportable - "
|
||||
"use gnulib module frexp for portability");
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_LOGB@
|
||||
# if !@HAVE_DECL_LOGB@
|
||||
_GL_EXTERN_C double logb (double x);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef logb
|
||||
# if HAVE_RAW_DECL_LOGB
|
||||
_GL_WARN_ON_USE (logb, "logb is unportable - "
|
||||
"use gnulib module logb for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_ACOSL@
|
||||
# if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@
|
||||
_GL_FUNCDECL_SYS (acosl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (acosl, long double, (long double x));
|
||||
_GL_CXXALIASWARN (acosl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef acosl
|
||||
# if HAVE_RAW_DECL_ACOSL
|
||||
_GL_WARN_ON_USE (acosl, "acosl is unportable - "
|
||||
"use gnulib module mathl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_ASINL@
|
||||
# if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@
|
||||
_GL_FUNCDECL_SYS (asinl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (asinl, long double, (long double x));
|
||||
_GL_CXXALIASWARN (asinl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef asinl
|
||||
# if HAVE_RAW_DECL_ASINL
|
||||
_GL_WARN_ON_USE (asinl, "asinl is unportable - "
|
||||
"use gnulib module mathl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_ATANL@
|
||||
# if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@
|
||||
_GL_FUNCDECL_SYS (atanl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (atanl, long double, (long double x));
|
||||
_GL_CXXALIASWARN (atanl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef atanl
|
||||
# if HAVE_RAW_DECL_ATANL
|
||||
_GL_WARN_ON_USE (atanl, "atanl is unportable - "
|
||||
"use gnulib module mathl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_CEILF@
|
||||
# if @REPLACE_CEILF@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# define ceilf rpl_ceilf
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (ceilf, float, (float x));
|
||||
_GL_CXXALIAS_RPL (ceilf, float, (float x));
|
||||
# else
|
||||
# if !@HAVE_DECL_CEILF@
|
||||
_GL_FUNCDECL_SYS (ceilf, float, (float x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (ceilf, float, (float x));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (ceilf);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef ceilf
|
||||
# if HAVE_RAW_DECL_CEILF
|
||||
_GL_WARN_ON_USE (ceilf, "ceilf is unportable - "
|
||||
"use gnulib module ceilf for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_CEILL@
|
||||
# if @REPLACE_CEILL@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# define ceill rpl_ceill
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (ceill, long double, (long double x));
|
||||
_GL_CXXALIAS_RPL (ceill, long double, (long double x));
|
||||
# else
|
||||
# if !@HAVE_DECL_CEILL@
|
||||
_GL_FUNCDECL_SYS (ceill, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (ceill, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (ceill);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef ceill
|
||||
# if HAVE_RAW_DECL_CEILL
|
||||
_GL_WARN_ON_USE (ceill, "ceill is unportable - "
|
||||
"use gnulib module ceill for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_COSL@
|
||||
# if !@HAVE_COSL@ || !@HAVE_DECL_COSL@
|
||||
_GL_FUNCDECL_SYS (cosl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (cosl, long double, (long double x));
|
||||
_GL_CXXALIASWARN (cosl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef cosl
|
||||
# if HAVE_RAW_DECL_COSL
|
||||
_GL_WARN_ON_USE (cosl, "cosl is unportable - "
|
||||
"use gnulib module mathl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_EXPL@
|
||||
# if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@
|
||||
_GL_FUNCDECL_SYS (expl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (expl, long double, (long double x));
|
||||
_GL_CXXALIASWARN (expl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef expl
|
||||
# if HAVE_RAW_DECL_EXPL
|
||||
_GL_WARN_ON_USE (expl, "expl is unportable - "
|
||||
"use gnulib module mathl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_FLOORF@
|
||||
# if @REPLACE_FLOORF@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# define floorf rpl_floorf
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (floorf, float, (float x));
|
||||
_GL_CXXALIAS_RPL (floorf, float, (float x));
|
||||
#else
|
||||
# if !@HAVE_DECL_FLOORF@
|
||||
_GL_FUNCDECL_SYS (floorf, float, (float x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (floorf, float, (float x));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (floorf);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef floorf
|
||||
# if HAVE_RAW_DECL_FLOORF
|
||||
_GL_WARN_ON_USE (floorf, "floorf is unportable - "
|
||||
"use gnulib module floorf for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_FLOORL@
|
||||
# if @REPLACE_FLOORL@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# define floorl rpl_floorl
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (floorl, long double, (long double x));
|
||||
_GL_CXXALIAS_RPL (floorl, long double, (long double x));
|
||||
# else
|
||||
# if !@HAVE_DECL_FLOORL@
|
||||
_GL_FUNCDECL_SYS (floorl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (floorl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (floorl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef floorl
|
||||
# if HAVE_RAW_DECL_FLOORL
|
||||
_GL_WARN_ON_USE (floorl, "floorl is unportable - "
|
||||
"use gnulib module floorl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* Write x as
|
||||
x = mantissa * 2^exp
|
||||
where
|
||||
If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
|
||||
If x is zero: mantissa = x, exp = 0.
|
||||
If x is infinite or NaN: mantissa = x, exp unspecified.
|
||||
Store exp in *EXPPTR and return mantissa. */
|
||||
#if @GNULIB_FREXPL@ && @REPLACE_FREXPL@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# define frexpl rpl_frexpl
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (frexpl, long double,
|
||||
(long double x, int *expptr) _GL_ARG_NONNULL ((2)));
|
||||
_GL_CXXALIAS_RPL (frexpl, long double, (long double x, int *expptr));
|
||||
#else
|
||||
# if !@HAVE_DECL_FREXPL@
|
||||
_GL_FUNCDECL_SYS (frexpl, long double,
|
||||
(long double x, int *expptr) _GL_ARG_NONNULL ((2)));
|
||||
# endif
|
||||
# if @GNULIB_FREXPL@
|
||||
_GL_CXXALIAS_SYS (frexpl, long double, (long double x, int *expptr));
|
||||
# endif
|
||||
#endif
|
||||
#if @GNULIB_FREXPL@ && !(@REPLACE_FREXPL@ && !@HAVE_DECL_FREXPL@)
|
||||
_GL_CXXALIASWARN (frexpl);
|
||||
#endif
|
||||
#if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK
|
||||
# undef frexpl
|
||||
# if HAVE_RAW_DECL_FREXPL
|
||||
_GL_WARN_ON_USE (frexpl, "frexpl is unportable - "
|
||||
"use gnulib module frexpl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* Return x * 2^exp. */
|
||||
#if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# define ldexpl rpl_ldexpl
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (ldexpl, long double, (long double x, int exp));
|
||||
_GL_CXXALIAS_RPL (ldexpl, long double, (long double x, int exp));
|
||||
#else
|
||||
# if !@HAVE_DECL_LDEXPL@
|
||||
_GL_FUNCDECL_SYS (ldexpl, long double, (long double x, int exp));
|
||||
# endif
|
||||
# if @GNULIB_LDEXPL@
|
||||
_GL_CXXALIAS_SYS (ldexpl, long double, (long double x, int exp));
|
||||
# endif
|
||||
#endif
|
||||
#if @GNULIB_LDEXPL@
|
||||
_GL_CXXALIASWARN (ldexpl);
|
||||
#endif
|
||||
#if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK
|
||||
# undef ldexpl
|
||||
# if HAVE_RAW_DECL_LDEXPL
|
||||
_GL_WARN_ON_USE (ldexpl, "ldexpl is unportable - "
|
||||
"use gnulib module ldexpl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_LOGL@
|
||||
# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@
|
||||
_GL_FUNCDECL_SYS (logl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (logl, long double, (long double x));
|
||||
_GL_CXXALIASWARN (logl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef logl
|
||||
# if HAVE_RAW_DECL_LOGL
|
||||
_GL_WARN_ON_USE (logl, "logl is unportable - "
|
||||
"use gnulib module mathl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_ROUNDF@
|
||||
# if @REPLACE_ROUNDF@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef roundf
|
||||
# define roundf rpl_roundf
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (roundf, float, (float x));
|
||||
_GL_CXXALIAS_RPL (roundf, float, (float x));
|
||||
# else
|
||||
# if !@HAVE_DECL_ROUNDF@
|
||||
_GL_FUNCDECL_SYS (roundf, float, (float x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (roundf, float, (float x));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (roundf);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef roundf
|
||||
# if HAVE_RAW_DECL_ROUNDF
|
||||
_GL_WARN_ON_USE (roundf, "roundf is unportable - "
|
||||
"use gnulib module roundf for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_ROUND@
|
||||
# if @REPLACE_ROUND@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef round
|
||||
# define round rpl_round
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (round, double, (double x));
|
||||
_GL_CXXALIAS_RPL (round, double, (double x));
|
||||
# else
|
||||
# if !@HAVE_DECL_ROUND@
|
||||
_GL_FUNCDECL_SYS (round, double, (double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (round, double, (double x));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (round);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef round
|
||||
# if HAVE_RAW_DECL_ROUND
|
||||
_GL_WARN_ON_USE (round, "round is unportable - "
|
||||
"use gnulib module round for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_ROUNDL@
|
||||
# if @REPLACE_ROUNDL@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef roundl
|
||||
# define roundl rpl_roundl
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (roundl, long double, (long double x));
|
||||
_GL_CXXALIAS_RPL (roundl, long double, (long double x));
|
||||
# else
|
||||
# if !@HAVE_DECL_ROUNDL@
|
||||
_GL_FUNCDECL_SYS (roundl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (roundl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (roundl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef roundl
|
||||
# if HAVE_RAW_DECL_ROUNDL
|
||||
_GL_WARN_ON_USE (roundl, "roundl is unportable - "
|
||||
"use gnulib module roundl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_SINL@
|
||||
# if !@HAVE_SINL@ || !@HAVE_DECL_SINL@
|
||||
_GL_FUNCDECL_SYS (sinl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (sinl, long double, (long double x));
|
||||
_GL_CXXALIASWARN (sinl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef sinl
|
||||
# if HAVE_RAW_DECL_SINL
|
||||
_GL_WARN_ON_USE (sinl, "sinl is unportable - "
|
||||
"use gnulib module mathl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_SQRTL@
|
||||
# if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@
|
||||
_GL_FUNCDECL_SYS (sqrtl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (sqrtl, long double, (long double x));
|
||||
_GL_CXXALIASWARN (sqrtl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef sqrtl
|
||||
# if HAVE_RAW_DECL_SQRTL
|
||||
_GL_WARN_ON_USE (sqrtl, "sqrtl is unportable - "
|
||||
"use gnulib module mathl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_TANL@
|
||||
# if !@HAVE_TANL@ || !@HAVE_DECL_TANL@
|
||||
_GL_FUNCDECL_SYS (tanl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (tanl, long double, (long double x));
|
||||
_GL_CXXALIASWARN (tanl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef tanl
|
||||
# if HAVE_RAW_DECL_TANL
|
||||
_GL_WARN_ON_USE (tanl, "tanl is unportable - "
|
||||
"use gnulib module mathl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_TRUNCF@
|
||||
# if !@HAVE_DECL_TRUNCF@
|
||||
_GL_FUNCDECL_SYS (truncf, float, (float x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (truncf, float, (float x));
|
||||
_GL_CXXALIASWARN (truncf);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef truncf
|
||||
# if HAVE_RAW_DECL_TRUNCF
|
||||
_GL_WARN_ON_USE (truncf, "truncf is unportable - "
|
||||
"use gnulib module truncf for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_TRUNC@
|
||||
# if !@HAVE_DECL_TRUNC@
|
||||
_GL_FUNCDECL_SYS (trunc, double, (double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (trunc, double, (double x));
|
||||
_GL_CXXALIASWARN (trunc);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef trunc
|
||||
# if HAVE_RAW_DECL_TRUNC
|
||||
_GL_WARN_ON_USE (trunc, "trunc is unportable - "
|
||||
"use gnulib module trunc for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_TRUNCL@
|
||||
# if @REPLACE_TRUNCL@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef truncl
|
||||
# define truncl rpl_truncl
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (truncl, long double, (long double x));
|
||||
_GL_CXXALIAS_RPL (truncl, long double, (long double x));
|
||||
# else
|
||||
# if !@HAVE_DECL_TRUNCL@
|
||||
_GL_FUNCDECL_SYS (truncl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (truncl, long double, (long double x));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (truncl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef truncl
|
||||
# if HAVE_RAW_DECL_TRUNCL
|
||||
_GL_WARN_ON_USE (truncl, "truncl is unportable - "
|
||||
"use gnulib module truncl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_ISFINITE@
|
||||
# if @REPLACE_ISFINITE@
|
||||
_GL_EXTERN_C int gl_isfinitef (float x);
|
||||
_GL_EXTERN_C int gl_isfinited (double x);
|
||||
_GL_EXTERN_C int gl_isfinitel (long double x);
|
||||
# undef isfinite
|
||||
# define isfinite(x) \
|
||||
(sizeof (x) == sizeof (long double) ? gl_isfinitel (x) : \
|
||||
sizeof (x) == sizeof (double) ? gl_isfinited (x) : \
|
||||
gl_isfinitef (x))
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# if defined isfinite
|
||||
_GL_WARN_REAL_FLOATING_DECL (isfinite);
|
||||
# undef isfinite
|
||||
# define isfinite(x) _GL_WARN_REAL_FLOATING_IMPL (isfinite, x)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_ISINF@
|
||||
# if @REPLACE_ISINF@
|
||||
_GL_EXTERN_C int gl_isinff (float x);
|
||||
_GL_EXTERN_C int gl_isinfd (double x);
|
||||
_GL_EXTERN_C int gl_isinfl (long double x);
|
||||
# undef isinf
|
||||
# define isinf(x) \
|
||||
(sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \
|
||||
sizeof (x) == sizeof (double) ? gl_isinfd (x) : \
|
||||
gl_isinff (x))
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# if defined isinf
|
||||
_GL_WARN_REAL_FLOATING_DECL (isinf);
|
||||
# undef isinf
|
||||
# define isinf(x) _GL_WARN_REAL_FLOATING_IMPL (isinf, x)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_ISNANF@
|
||||
/* Test for NaN for 'float' numbers. */
|
||||
# if @HAVE_ISNANF@
|
||||
/* The original <math.h> included above provides a declaration of isnan macro
|
||||
or (older) isnanf function. */
|
||||
# if __GNUC__ >= 4
|
||||
/* GCC 4.0 and newer provides three built-ins for isnan. */
|
||||
# undef isnanf
|
||||
# define isnanf(x) __builtin_isnanf ((float)(x))
|
||||
# elif defined isnan
|
||||
# undef isnanf
|
||||
# define isnanf(x) isnan ((float)(x))
|
||||
# endif
|
||||
# else
|
||||
/* Test whether X is a NaN. */
|
||||
# undef isnanf
|
||||
# define isnanf rpl_isnanf
|
||||
_GL_EXTERN_C int isnanf (float x);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_ISNAND@
|
||||
/* Test for NaN for 'double' numbers.
|
||||
This function is a gnulib extension, unlike isnan() which applied only
|
||||
to 'double' numbers earlier but now is a type-generic macro. */
|
||||
# if @HAVE_ISNAND@
|
||||
/* The original <math.h> included above provides a declaration of isnan macro. */
|
||||
# if __GNUC__ >= 4
|
||||
/* GCC 4.0 and newer provides three built-ins for isnan. */
|
||||
# undef isnand
|
||||
# define isnand(x) __builtin_isnan ((double)(x))
|
||||
# else
|
||||
# undef isnand
|
||||
# define isnand(x) isnan ((double)(x))
|
||||
# endif
|
||||
# else
|
||||
/* Test whether X is a NaN. */
|
||||
# undef isnand
|
||||
# define isnand rpl_isnand
|
||||
_GL_EXTERN_C int isnand (double x);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_ISNANL@
|
||||
/* Test for NaN for 'long double' numbers. */
|
||||
# if @HAVE_ISNANL@
|
||||
/* The original <math.h> included above provides a declaration of isnan macro or (older) isnanl function. */
|
||||
# if __GNUC__ >= 4
|
||||
/* GCC 4.0 and newer provides three built-ins for isnan. */
|
||||
# undef isnanl
|
||||
# define isnanl(x) __builtin_isnanl ((long double)(x))
|
||||
# elif defined isnan
|
||||
# undef isnanl
|
||||
# define isnanl(x) isnan ((long double)(x))
|
||||
# endif
|
||||
# else
|
||||
/* Test whether X is a NaN. */
|
||||
# undef isnanl
|
||||
# define isnanl rpl_isnanl
|
||||
_GL_EXTERN_C int isnanl (long double x);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL! */
|
||||
#if @GNULIB_ISNAN@
|
||||
# if @REPLACE_ISNAN@
|
||||
/* We can't just use the isnanf macro (e.g.) as exposed by
|
||||
isnanf.h (e.g.) here, because those may end up being macros
|
||||
that recursively expand back to isnan. So use the gnulib
|
||||
replacements for them directly. */
|
||||
# if @HAVE_ISNANF@ && __GNUC__ >= 4
|
||||
# define gl_isnan_f(x) __builtin_isnan ((float)(x))
|
||||
# else
|
||||
_GL_EXTERN_C int rpl_isnanf (float x);
|
||||
# define gl_isnan_f(x) rpl_isnanf (x)
|
||||
# endif
|
||||
# if @HAVE_ISNAND@ && __GNUC__ >= 4
|
||||
# define gl_isnan_d(x) __builtin_isnan ((double)(x))
|
||||
# else
|
||||
_GL_EXTERN_C int rpl_isnand (double x);
|
||||
# define gl_isnan_d(x) rpl_isnand (x)
|
||||
# endif
|
||||
# if @HAVE_ISNANL@ && __GNUC__ >= 4
|
||||
# define gl_isnan_l(x) __builtin_isnan ((long double)(x))
|
||||
# else
|
||||
_GL_EXTERN_C int rpl_isnanl (long double x);
|
||||
# define gl_isnan_l(x) rpl_isnanl (x)
|
||||
# endif
|
||||
# undef isnan
|
||||
# define isnan(x) \
|
||||
(sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
|
||||
sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
|
||||
gl_isnan_f (x))
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# if defined isnan
|
||||
_GL_WARN_REAL_FLOATING_DECL (isnan);
|
||||
# undef isnan
|
||||
# define isnan(x) _GL_WARN_REAL_FLOATING_IMPL (isnan, x)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_SIGNBIT@
|
||||
# if @REPLACE_SIGNBIT_USING_GCC@
|
||||
# undef signbit
|
||||
/* GCC 4.0 and newer provides three built-ins for signbit. */
|
||||
# define signbit(x) \
|
||||
(sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
|
||||
sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
|
||||
__builtin_signbitf (x))
|
||||
# endif
|
||||
# if @REPLACE_SIGNBIT@
|
||||
# undef signbit
|
||||
_GL_EXTERN_C int gl_signbitf (float arg);
|
||||
_GL_EXTERN_C int gl_signbitd (double arg);
|
||||
_GL_EXTERN_C int gl_signbitl (long double arg);
|
||||
# if __GNUC__ >= 2 && !__STRICT_ANSI__
|
||||
# if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
|
||||
# define gl_signbitf_OPTIMIZED_MACRO
|
||||
# define gl_signbitf(arg) \
|
||||
({ union { float _value; \
|
||||
unsigned int _word[(sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \
|
||||
} _m; \
|
||||
_m._value = (arg); \
|
||||
(_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \
|
||||
})
|
||||
# endif
|
||||
# if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd
|
||||
# define gl_signbitd_OPTIMIZED_MACRO
|
||||
# define gl_signbitd(arg) \
|
||||
({ union { double _value; \
|
||||
unsigned int _word[(sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \
|
||||
} _m; \
|
||||
_m._value = (arg); \
|
||||
(_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \
|
||||
})
|
||||
# endif
|
||||
# if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl
|
||||
# define gl_signbitl_OPTIMIZED_MACRO
|
||||
# define gl_signbitl(arg) \
|
||||
({ union { long double _value; \
|
||||
unsigned int _word[(sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \
|
||||
} _m; \
|
||||
_m._value = (arg); \
|
||||
(_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \
|
||||
})
|
||||
# endif
|
||||
# endif
|
||||
# define signbit(x) \
|
||||
(sizeof (x) == sizeof (long double) ? gl_signbitl (x) : \
|
||||
sizeof (x) == sizeof (double) ? gl_signbitd (x) : \
|
||||
gl_signbitf (x))
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# if defined signbit
|
||||
_GL_WARN_REAL_FLOATING_DECL (signbit);
|
||||
# undef signbit
|
||||
# define signbit(x) _GL_WARN_REAL_FLOATING_IMPL (signbit, x)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* _GL_MATH_H */
|
||||
#endif /* _GL_MATH_H */
|
||||
Loading…
Add table
Add a link
Reference in a new issue