100db7afdSDavid E. O'Brien /* Configuration data for libmath subpart of libstdc++. */ 200db7afdSDavid E. O'Brien 300db7afdSDavid E. O'Brien /* Copyright (C) 1997-1999, 2000, 2001 Free Software Foundation, Inc. 400db7afdSDavid E. O'Brien 500db7afdSDavid E. O'Brien This file is part of the GNU ISO C++ Library. This library is free 600db7afdSDavid E. O'Brien software; you can redistribute it and/or modify it under the 700db7afdSDavid E. O'Brien terms of the GNU General Public License as published by the 800db7afdSDavid E. O'Brien Free Software Foundation; either version 2, or (at your option) 900db7afdSDavid E. O'Brien any later version. 1000db7afdSDavid E. O'Brien 1100db7afdSDavid E. O'Brien This library is distributed in the hope that it will be useful, 1200db7afdSDavid E. O'Brien but WITHOUT ANY WARRANTY; without even the implied warranty of 1300db7afdSDavid E. O'Brien MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1400db7afdSDavid E. O'Brien GNU General Public License for more details. 1500db7afdSDavid E. O'Brien 1600db7afdSDavid E. O'Brien You should have received a copy of the GNU General Public License along 1700db7afdSDavid E. O'Brien with this library; see the file COPYING. If not, write to the Free 18*f8a1b7d9SAlexander Kabaev Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 1900db7afdSDavid E. O'Brien USA. 2000db7afdSDavid E. O'Brien 2100db7afdSDavid E. O'Brien As a special exception, you may use this file as part of a free software 2200db7afdSDavid E. O'Brien library without restriction. Specifically, if other files instantiate 2300db7afdSDavid E. O'Brien templates or use macros or inline functions from this file, or you compile 2400db7afdSDavid E. O'Brien this file and link it with other files to produce an executable, this 2500db7afdSDavid E. O'Brien file does not by itself cause the resulting executable to be covered by 2600db7afdSDavid E. O'Brien the GNU General Public License. This exception does not however 2700db7afdSDavid E. O'Brien invalidate any other reasons why the executable file might be covered by 2800db7afdSDavid E. O'Brien the GNU General Public License. */ 2900db7afdSDavid E. O'Brien 3000db7afdSDavid E. O'Brien 3100db7afdSDavid E. O'Brien #include <config.h> 3200db7afdSDavid E. O'Brien 3300db7afdSDavid E. O'Brien #ifdef HAVE_ENDIAN_H 3400db7afdSDavid E. O'Brien # include <endian.h> 3500db7afdSDavid E. O'Brien #else 3600db7afdSDavid E. O'Brien # ifdef HAVE_MACHINE_ENDIAN_H 3700db7afdSDavid E. O'Brien # ifdef HAVE_SYS_TYPES_H 3800db7afdSDavid E. O'Brien # include <sys/types.h> 3900db7afdSDavid E. O'Brien # endif 4000db7afdSDavid E. O'Brien # include <machine/endian.h> 4100db7afdSDavid E. O'Brien # else 4200db7afdSDavid E. O'Brien # ifdef HAVE_SYS_MACHINE_H 4300db7afdSDavid E. O'Brien # include <sys/machine.h> 4400db7afdSDavid E. O'Brien # else 4500db7afdSDavid E. O'Brien # if defined HAVE_SYS_ISA_DEFS_H || defined HAVE_MACHINE_PARAM_H 4600db7afdSDavid E. O'Brien /* This is on Solaris. */ 4700db7afdSDavid E. O'Brien # ifdef HAVE_SYS_ISA_DEFS_H 4800db7afdSDavid E. O'Brien # include <sys/isa_defs.h> 4900db7afdSDavid E. O'Brien # endif 5000db7afdSDavid E. O'Brien # ifdef HAVE_MACHINE_PARAM_H 5100db7afdSDavid E. O'Brien # include <machine/param.h> 5200db7afdSDavid E. O'Brien # endif 5300db7afdSDavid E. O'Brien # ifdef _LITTLE_ENDIAN 5400db7afdSDavid E. O'Brien # define LITTLE_ENDIAN 1 5500db7afdSDavid E. O'Brien # endif 5600db7afdSDavid E. O'Brien # ifdef _BIG_ENDIAN 5700db7afdSDavid E. O'Brien # define BIG_ENDIAN 1 5800db7afdSDavid E. O'Brien # endif 5900db7afdSDavid E. O'Brien # define BYTE_ORDER 1 6000db7afdSDavid E. O'Brien # else 6100db7afdSDavid E. O'Brien /* We have to rely on the AC_C_BIGENDIAN test. */ 6200db7afdSDavid E. O'Brien # ifdef WORDS_BIGENDIAN 6300db7afdSDavid E. O'Brien # define BIG_ENDIAN 1 6400db7afdSDavid E. O'Brien # else 6500db7afdSDavid E. O'Brien # define LITTLE_ENDIAN 1 6600db7afdSDavid E. O'Brien # endif 6700db7afdSDavid E. O'Brien # define BYTE_ORDER 1 6800db7afdSDavid E. O'Brien # endif 6900db7afdSDavid E. O'Brien # endif 7000db7afdSDavid E. O'Brien # endif 7100db7afdSDavid E. O'Brien #endif 7200db7afdSDavid E. O'Brien 7300db7afdSDavid E. O'Brien typedef unsigned int U_int32_t __attribute ((mode (SI))); 7400db7afdSDavid E. O'Brien typedef int Int32_t __attribute ((mode (SI))); 7500db7afdSDavid E. O'Brien typedef unsigned int U_int64_t __attribute ((mode (DI))); 7600db7afdSDavid E. O'Brien typedef int Int64_t __attribute ((mode (DI))); 7700db7afdSDavid E. O'Brien 7800db7afdSDavid E. O'Brien #ifdef HAVE_NAN_H 7900db7afdSDavid E. O'Brien # include <nan.h> 8000db7afdSDavid E. O'Brien #endif 8100db7afdSDavid E. O'Brien 8200db7afdSDavid E. O'Brien #ifdef HAVE_IEEEFP_H 8300db7afdSDavid E. O'Brien # include <ieeefp.h> 8400db7afdSDavid E. O'Brien #endif 8500db7afdSDavid E. O'Brien 8600db7afdSDavid E. O'Brien #ifdef HAVE_FP_H 8700db7afdSDavid E. O'Brien # include <fp.h> 8800db7afdSDavid E. O'Brien #endif 8900db7afdSDavid E. O'Brien 9000db7afdSDavid E. O'Brien #ifdef HAVE_FLOAT_H 9100db7afdSDavid E. O'Brien # include <float.h> 9200db7afdSDavid E. O'Brien #endif 9300db7afdSDavid E. O'Brien 9400db7afdSDavid E. O'Brien /* `float' variant of HUGE_VAL. */ 9500db7afdSDavid E. O'Brien #ifndef HUGE_VALF 9600db7afdSDavid E. O'Brien # ifdef HUGE_VALf 9700db7afdSDavid E. O'Brien # define HUGE_VALF HUGE_VALf 9800db7afdSDavid E. O'Brien # else 9900db7afdSDavid E. O'Brien # define HUGE_VALF HUGE_VAL 10000db7afdSDavid E. O'Brien # endif 10100db7afdSDavid E. O'Brien #endif 10200db7afdSDavid E. O'Brien 10300db7afdSDavid E. O'Brien /* `long double' variant of HUGE_VAL. */ 10400db7afdSDavid E. O'Brien #ifndef HUGE_VALL 10500db7afdSDavid E. O'Brien # ifdef HUGE_VALl 10600db7afdSDavid E. O'Brien # define HUGE_VALL HUGE_VALl 10700db7afdSDavid E. O'Brien # else 10800db7afdSDavid E. O'Brien # define HUGE_VALL HUGE_VAL 10900db7afdSDavid E. O'Brien # endif 11000db7afdSDavid E. O'Brien #endif 11100db7afdSDavid E. O'Brien 11200db7afdSDavid E. O'Brien /* Make sure that at least HUGE_VAL is defined. */ 11300db7afdSDavid E. O'Brien #ifndef HUGE_VAL 11400db7afdSDavid E. O'Brien # ifdef HUGE 11500db7afdSDavid E. O'Brien # define HUGE_VAL HUGE 11600db7afdSDavid E. O'Brien # else 11700db7afdSDavid E. O'Brien # ifdef MAXFLOAT 11800db7afdSDavid E. O'Brien # define HUGE_VAL MAXFLOAT 11900db7afdSDavid E. O'Brien # else 12000db7afdSDavid E. O'Brien # error "We need HUGE_VAL!" 12100db7afdSDavid E. O'Brien # endif 12200db7afdSDavid E. O'Brien # endif 12300db7afdSDavid E. O'Brien #endif 12400db7afdSDavid E. O'Brien 12500db7afdSDavid E. O'Brien #ifndef M_PI 12600db7afdSDavid E. O'Brien # define M_PI 3.14159265358979323846 12700db7afdSDavid E. O'Brien #endif 12800db7afdSDavid E. O'Brien 12900db7afdSDavid E. O'Brien 13000db7afdSDavid E. O'Brien #ifdef __cplusplus 13100db7afdSDavid E. O'Brien extern "C" { 13200db7afdSDavid E. O'Brien #endif 13300db7afdSDavid E. O'Brien 13400db7afdSDavid E. O'Brien /* signbit is a macro in ISO C99. */ 13500db7afdSDavid E. O'Brien #ifndef signbit 13600db7afdSDavid E. O'Brien extern int __signbitf (float); 13700db7afdSDavid E. O'Brien extern int __signbit (double); 13800db7afdSDavid E. O'Brien extern int __signbitl (long double); 13900db7afdSDavid E. O'Brien 14000db7afdSDavid E. O'Brien # define signbit(x) \ 14100db7afdSDavid E. O'Brien (sizeof (x) == sizeof (float) ? \ 14200db7afdSDavid E. O'Brien __signbitf (x) \ 14300db7afdSDavid E. O'Brien : sizeof (x) == sizeof (double) ? \ 14400db7afdSDavid E. O'Brien __signbit (x) : __signbitl (x)) 14500db7afdSDavid E. O'Brien #endif 14600db7afdSDavid E. O'Brien 14700db7afdSDavid E. O'Brien #if BYTE_ORDER == BIG_ENDIAN 14800db7afdSDavid E. O'Brien typedef union 14900db7afdSDavid E. O'Brien { 15000db7afdSDavid E. O'Brien double value; 15100db7afdSDavid E. O'Brien struct 15200db7afdSDavid E. O'Brien { 15300db7afdSDavid E. O'Brien U_int32_t msw; 15400db7afdSDavid E. O'Brien U_int32_t lsw; 15500db7afdSDavid E. O'Brien } parts; 15600db7afdSDavid E. O'Brien } ieee_double_shape_type; 15700db7afdSDavid E. O'Brien #endif 15800db7afdSDavid E. O'Brien #if BYTE_ORDER == LITTLE_ENDIAN 15900db7afdSDavid E. O'Brien typedef union 16000db7afdSDavid E. O'Brien { 16100db7afdSDavid E. O'Brien double value; 16200db7afdSDavid E. O'Brien struct 16300db7afdSDavid E. O'Brien { 16400db7afdSDavid E. O'Brien U_int32_t lsw; 16500db7afdSDavid E. O'Brien U_int32_t msw; 16600db7afdSDavid E. O'Brien } parts; 16700db7afdSDavid E. O'Brien } ieee_double_shape_type; 16800db7afdSDavid E. O'Brien #endif 16900db7afdSDavid E. O'Brien /* Get the more significant 32 bit int from a double. */ 17000db7afdSDavid E. O'Brien #define GET_HIGH_WORD(i,d) \ 17100db7afdSDavid E. O'Brien do { \ 17200db7afdSDavid E. O'Brien ieee_double_shape_type gh_u; \ 17300db7afdSDavid E. O'Brien gh_u.value = (d); \ 17400db7afdSDavid E. O'Brien (i) = gh_u.parts.msw; \ 17500db7afdSDavid E. O'Brien } while (0) 17600db7afdSDavid E. O'Brien 17700db7afdSDavid E. O'Brien 17800db7afdSDavid E. O'Brien typedef union 17900db7afdSDavid E. O'Brien { 18000db7afdSDavid E. O'Brien float value; 18100db7afdSDavid E. O'Brien U_int32_t word; 18200db7afdSDavid E. O'Brien } ieee_float_shape_type; 18300db7afdSDavid E. O'Brien /* Get a 32 bit int from a float. */ 18400db7afdSDavid E. O'Brien #define GET_FLOAT_WORD(i,d) \ 18500db7afdSDavid E. O'Brien do { \ 18600db7afdSDavid E. O'Brien ieee_float_shape_type gf_u; \ 18700db7afdSDavid E. O'Brien gf_u.value = (d); \ 18800db7afdSDavid E. O'Brien (i) = gf_u.word; \ 18900db7afdSDavid E. O'Brien } while (0) 19000db7afdSDavid E. O'Brien 19100db7afdSDavid E. O'Brien 19200db7afdSDavid E. O'Brien #if BYTE_ORDER == BIG_ENDIAN 19300db7afdSDavid E. O'Brien typedef union 19400db7afdSDavid E. O'Brien { 19500db7afdSDavid E. O'Brien long double value; 19600db7afdSDavid E. O'Brien struct 19700db7afdSDavid E. O'Brien { 19800db7afdSDavid E. O'Brien unsigned int sign_exponent:16; 19900db7afdSDavid E. O'Brien unsigned int empty:16; 20000db7afdSDavid E. O'Brien U_int32_t msw; 20100db7afdSDavid E. O'Brien U_int32_t lsw; 20200db7afdSDavid E. O'Brien } parts; 20300db7afdSDavid E. O'Brien } ieee_long_double_shape_type; 20400db7afdSDavid E. O'Brien #endif 20500db7afdSDavid E. O'Brien #if BYTE_ORDER == LITTLE_ENDIAN 20600db7afdSDavid E. O'Brien typedef union 20700db7afdSDavid E. O'Brien { 20800db7afdSDavid E. O'Brien long double value; 20900db7afdSDavid E. O'Brien struct 21000db7afdSDavid E. O'Brien { 21100db7afdSDavid E. O'Brien U_int32_t lsw; 21200db7afdSDavid E. O'Brien U_int32_t msw; 21300db7afdSDavid E. O'Brien unsigned int sign_exponent:16; 21400db7afdSDavid E. O'Brien unsigned int empty:16; 21500db7afdSDavid E. O'Brien } parts; 21600db7afdSDavid E. O'Brien } ieee_long_double_shape_type; 21700db7afdSDavid E. O'Brien #endif 21800db7afdSDavid E. O'Brien /* Get int from the exponent of a long double. */ 21900db7afdSDavid E. O'Brien #define GET_LDOUBLE_EXP(exp,d) \ 22000db7afdSDavid E. O'Brien do { \ 22100db7afdSDavid E. O'Brien ieee_long_double_shape_type ge_u; \ 22200db7afdSDavid E. O'Brien ge_u.value = (d); \ 22300db7afdSDavid E. O'Brien (exp) = ge_u.parts.sign_exponent; \ 22400db7afdSDavid E. O'Brien } while (0) 22500db7afdSDavid E. O'Brien 22600db7afdSDavid E. O'Brien #if BYTE_ORDER == BIG_ENDIAN 22700db7afdSDavid E. O'Brien typedef union 22800db7afdSDavid E. O'Brien { 22900db7afdSDavid E. O'Brien long double value; 23000db7afdSDavid E. O'Brien struct 23100db7afdSDavid E. O'Brien { 23200db7afdSDavid E. O'Brien U_int64_t msw; 23300db7afdSDavid E. O'Brien U_int64_t lsw; 23400db7afdSDavid E. O'Brien } parts64; 23500db7afdSDavid E. O'Brien struct 23600db7afdSDavid E. O'Brien { 23700db7afdSDavid E. O'Brien U_int32_t w0, w1, w2, w3; 23800db7afdSDavid E. O'Brien } parts32; 23900db7afdSDavid E. O'Brien } ieee_quad_double_shape_type; 24000db7afdSDavid E. O'Brien #endif 24100db7afdSDavid E. O'Brien #if BYTE_ORDER == LITTLE_ENDIAN 24200db7afdSDavid E. O'Brien typedef union 24300db7afdSDavid E. O'Brien { 24400db7afdSDavid E. O'Brien long double value; 24500db7afdSDavid E. O'Brien struct 24600db7afdSDavid E. O'Brien { 24700db7afdSDavid E. O'Brien U_int64_t lsw; 24800db7afdSDavid E. O'Brien U_int64_t msw; 24900db7afdSDavid E. O'Brien } parts64; 25000db7afdSDavid E. O'Brien struct 25100db7afdSDavid E. O'Brien { 25200db7afdSDavid E. O'Brien U_int32_t w3, w2, w1, w0; 25300db7afdSDavid E. O'Brien } parts32; 25400db7afdSDavid E. O'Brien } ieee_quad_double_shape_type; 25500db7afdSDavid E. O'Brien #endif 25600db7afdSDavid E. O'Brien /* Get most significant 64 bit int from a quad long double. */ 25700db7afdSDavid E. O'Brien #define GET_LDOUBLE_MSW64(msw,d) \ 25800db7afdSDavid E. O'Brien do { \ 25900db7afdSDavid E. O'Brien ieee_quad_double_shape_type qw_u; \ 26000db7afdSDavid E. O'Brien qw_u.value = (d); \ 26100db7afdSDavid E. O'Brien (msw) = qw_u.parts64.msw; \ 26200db7afdSDavid E. O'Brien } while (0) 26300db7afdSDavid E. O'Brien 26400db7afdSDavid E. O'Brien 26500db7afdSDavid E. O'Brien /* Replacement for non-existing float functions. */ 26600db7afdSDavid E. O'Brien #if !defined(HAVE_FABSF) && !defined(HAVE___BUILTIN_FABSF) 26700db7afdSDavid E. O'Brien # define fabsf(x) fabs (x) 26800db7afdSDavid E. O'Brien #endif 26900db7afdSDavid E. O'Brien #if !defined(HAVE_COSF) && !defined(HAVE___BUILTIN_COSF) 27000db7afdSDavid E. O'Brien # define cosf(x) cos (x) 27100db7afdSDavid E. O'Brien #endif 27200db7afdSDavid E. O'Brien #ifndef HAVE_COSHF 27300db7afdSDavid E. O'Brien # define coshf(x) cosh (x) 27400db7afdSDavid E. O'Brien #endif 27500db7afdSDavid E. O'Brien #ifndef HAVE_EXPF 27600db7afdSDavid E. O'Brien # define expf(x) expf (x) 27700db7afdSDavid E. O'Brien #endif 27800db7afdSDavid E. O'Brien #ifndef HAVE_LOGF 27900db7afdSDavid E. O'Brien # define logf(x) log(x) 28000db7afdSDavid E. O'Brien #endif 28100db7afdSDavid E. O'Brien #ifndef HAVE_LOG10F 28200db7afdSDavid E. O'Brien # define log10f(x) log10 (x) 28300db7afdSDavid E. O'Brien #endif 28400db7afdSDavid E. O'Brien #ifndef HAVE_POWF 28500db7afdSDavid E. O'Brien # define powf(x, y) pow (x, y) 28600db7afdSDavid E. O'Brien #endif 28700db7afdSDavid E. O'Brien #if !defined(HAVE_SINF) && !defined(HAVE___BUILTIN_SINF) 28800db7afdSDavid E. O'Brien # define sinf(x) sin (x) 28900db7afdSDavid E. O'Brien #endif 29000db7afdSDavid E. O'Brien #ifndef HAVE_SINHF 29100db7afdSDavid E. O'Brien # define sinhf(x) sinh (x) 29200db7afdSDavid E. O'Brien #endif 29300db7afdSDavid E. O'Brien #if !defined(HAVE_SQRTF) && !defined(HAVE___BUILTIN_SQRTF) 29400db7afdSDavid E. O'Brien # define sqrtf(x) sqrt (x) 29500db7afdSDavid E. O'Brien #endif 29600db7afdSDavid E. O'Brien #ifndef HAVE_TANF 29700db7afdSDavid E. O'Brien # define tanf(x) tan (x) 29800db7afdSDavid E. O'Brien #endif 29900db7afdSDavid E. O'Brien #ifndef HAVE_TANHF 30000db7afdSDavid E. O'Brien # define tanhf(x) tanh (x) 30100db7afdSDavid E. O'Brien #endif 30200db7afdSDavid E. O'Brien #ifndef HAVE_STRTOF 30300db7afdSDavid E. O'Brien # define strtof(s, e) strtod (s, e) 30400db7afdSDavid E. O'Brien #endif 30500db7afdSDavid E. O'Brien 30600db7afdSDavid E. O'Brien #ifdef __cplusplus 30700db7afdSDavid E. O'Brien } 30800db7afdSDavid E. O'Brien #endif 30900db7afdSDavid E. O'Brien 310