zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

math.h (49309B) - Raw


      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the mingw-w64 runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 #ifndef _MATH_H_
      7 #define _MATH_H_
      8 
      9 #ifdef __GNUC__
     10 #pragma GCC system_header
     11 #endif /* __GNUC__ */
     12 
     13 #include <crtdefs.h>
     14 
     15 struct _exception;
     16 
     17 #pragma pack(push,_CRT_PACKING)
     18 
     19 #define	_DOMAIN		1	/* domain error in argument */
     20 #define	_SING		2	/* singularity */
     21 #define	_OVERFLOW	3	/* range overflow */
     22 #define	_UNDERFLOW	4	/* range underflow */
     23 #define	_TLOSS		5	/* total loss of precision */
     24 #define	_PLOSS		6	/* partial loss of precision */
     25 
     26 #ifndef __STRICT_ANSI__
     27 #ifndef	NO_OLDNAMES
     28 
     29 #define	DOMAIN		_DOMAIN
     30 #define	SING		_SING
     31 #define	OVERFLOW	_OVERFLOW
     32 #define	UNDERFLOW	_UNDERFLOW
     33 #define	TLOSS		_TLOSS
     34 #define	PLOSS		_PLOSS
     35 
     36 #endif
     37 #endif
     38 
     39 #if !defined(__STRICT_ANSI__) || defined(_POSIX_C_SOURCE) || defined(_POSIX_SOURCE) || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_USE_MATH_DEFINES)
     40 #define M_E		2.7182818284590452354
     41 #define M_LOG2E		1.4426950408889634074
     42 #define M_LOG10E	0.43429448190325182765
     43 #define M_LN2		0.69314718055994530942
     44 #define M_LN10		2.30258509299404568402
     45 #define M_PI		3.14159265358979323846
     46 #define M_PI_2		1.57079632679489661923
     47 #define M_PI_4		0.78539816339744830962
     48 #define M_1_PI		0.31830988618379067154
     49 #define M_2_PI		0.63661977236758134308
     50 #define M_2_SQRTPI	1.12837916709551257390
     51 #define M_SQRT2		1.41421356237309504880
     52 #define M_SQRT1_2	0.70710678118654752440
     53 #endif
     54 
     55 /* See also float.h  */
     56 #ifndef __MINGW_FPCLASS_DEFINED
     57 #define __MINGW_FPCLASS_DEFINED 1
     58 /* IEEE 754 classication */
     59 #define	_FPCLASS_SNAN	0x0001	/* Signaling "Not a Number" */
     60 #define	_FPCLASS_QNAN	0x0002	/* Quiet "Not a Number" */
     61 #define	_FPCLASS_NINF	0x0004	/* Negative Infinity */
     62 #define	_FPCLASS_NN	0x0008	/* Negative Normal */
     63 #define	_FPCLASS_ND	0x0010	/* Negative Denormal */
     64 #define	_FPCLASS_NZ	0x0020	/* Negative Zero */
     65 #define	_FPCLASS_PZ	0x0040	/* Positive Zero */
     66 #define	_FPCLASS_PD	0x0080	/* Positive Denormal */
     67 #define	_FPCLASS_PN	0x0100	/* Positive Normal */
     68 #define	_FPCLASS_PINF	0x0200	/* Positive Infinity */
     69 #endif
     70 
     71 #ifndef RC_INVOKED
     72 
     73 #ifndef __mingw_types_compatible_p
     74 #ifdef __cplusplus
     75 extern "C++" {
     76 template <typename type1, typename type2> struct __mingw_types_compatible_p {
     77   static const bool result = false;
     78 };
     79 
     80 template <typename type1> struct __mingw_types_compatible_p<type1, type1> {
     81  static const bool result = true;
     82 };
     83 
     84 template <typename type1> struct __mingw_types_compatible_p<const type1, type1> {
     85   static const bool result = true;
     86 };
     87 
     88 template <typename type1> struct __mingw_types_compatible_p<type1, const type1> {
     89   static const bool result = true;
     90 };
     91 }
     92 
     93 #define __mingw_types_compatible_p(type1, type2) __mingw_types_compatible_p <type1, type2>::result
     94 #else
     95 #define __mingw_types_compatible_p(type1, type2) __builtin_types_compatible_p (type1, type2)
     96 #endif
     97 #endif
     98 
     99 #ifndef __mingw_choose_expr
    100 #ifdef __cplusplus
    101 #define __mingw_choose_expr(C, E1, E2) ((C) ? E1 : E2)
    102 #else
    103 #define __mingw_choose_expr __builtin_choose_expr
    104 #endif
    105 #endif
    106 
    107 
    108 #ifdef __cplusplus
    109 extern "C" {
    110 #endif
    111 
    112 #ifndef __MINGW_SOFTMATH
    113 #define __MINGW_SOFTMATH
    114 
    115 /* IEEE float/double type shapes.  */
    116 
    117   typedef union __mingw_dbl_type_t {
    118     double x;
    119     unsigned long long val;
    120     __C89_NAMELESS struct {
    121       unsigned int low, high;
    122     } lh;
    123   } __mingw_dbl_type_t;
    124 
    125   typedef union __mingw_flt_type_t {
    126     float x;
    127     unsigned int val;
    128   } __mingw_flt_type_t;
    129 
    130   typedef union __mingw_ldbl_type_t
    131   {
    132     long double x;
    133     __C89_NAMELESS struct {
    134       unsigned int low, high;
    135       int sign_exponent : 16;
    136       int res1 : 16;
    137       int res0 : 32;
    138     } lh;
    139   } __mingw_ldbl_type_t;
    140 
    141 #endif
    142 
    143 #ifndef _HUGE
    144   extern double * __MINGW_IMP_SYMBOL(_HUGE);
    145 #define _HUGE	(* __MINGW_IMP_SYMBOL(_HUGE))
    146 #endif
    147 
    148 #ifdef __GNUC__
    149 #define	HUGE_VAL __builtin_huge_val()
    150 #else
    151 #define HUGE_VAL _HUGE
    152 #endif /* __GNUC__ */
    153 
    154 #ifndef _EXCEPTION_DEFINED
    155 #define _EXCEPTION_DEFINED
    156   struct _exception {
    157     int type;
    158     const char *name;
    159     double arg1;
    160     double arg2;
    161     double retval;
    162   };
    163 
    164   void __mingw_raise_matherr (int typ, const char *name, double a1, double a2,
    165 			      double rslt);
    166   void __mingw_setusermatherr (int (__cdecl *)(struct _exception *));
    167   _CRTIMP void __setusermatherr(int (__cdecl *)(struct _exception *));
    168   #define __setusermatherr __mingw_setusermatherr
    169 #endif
    170 
    171   double __cdecl sin(double _X);
    172   double __cdecl cos(double _X);
    173   double __cdecl tan(double _X);
    174   double __cdecl sinh(double _X);
    175   double __cdecl cosh(double _X);
    176   double __cdecl tanh(double _X);
    177   double __cdecl asin(double _X);
    178   double __cdecl acos(double _X);
    179   double __cdecl atan(double _X);
    180   double __cdecl atan2(double _Y,double _X);
    181   double __cdecl exp(double _X);
    182   double __cdecl log(double _X);
    183   double __cdecl log10(double _X);
    184   double __cdecl pow(double _X,double _Y);
    185   double __cdecl sqrt(double _X);
    186   double __cdecl ceil(double _X);
    187   double __cdecl floor(double _X);
    188 
    189 /* 7.12.7.2 The fabs functions: Double in C89 */
    190   extern  float __cdecl fabsf (float x);
    191   extern long double __cdecl fabsl (long double);
    192   extern double __cdecl fabs (double _X);
    193 
    194 #ifndef __CRT__NO_INLINE
    195 #if !defined (__ia64__)
    196   __CRT_INLINE float __cdecl fabsf (float x)
    197   {
    198 #if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)
    199     return __builtin_fabsf (x);
    200 #else
    201     float res = 0.0F;
    202     __asm__ __volatile__ ("fabs;" : "=t" (res) : "0" (x));
    203     return res;
    204 #endif
    205   }
    206 
    207   __CRT_INLINE long double __cdecl fabsl (long double x)
    208   {
    209 #if __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__
    210     return __builtin_fabsl (x);
    211 #else
    212     long double res = 0.0l;
    213     __asm__ __volatile__ ("fabs;" : "=t" (res) : "0" (x));
    214     return res;
    215 #endif
    216   }
    217 
    218   __CRT_INLINE double __cdecl fabs (double x)
    219   {
    220 #if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)
    221     return __builtin_fabs (x);
    222 #else
    223     double res = 0.0;
    224     __asm__ __volatile__ ("fabs;" : "=t" (res) : "0" (x));
    225     return res;
    226 #endif
    227   }
    228 #endif
    229 #endif
    230 
    231   double __cdecl ldexp(double _X,int _Y);
    232   double __cdecl frexp(double _X,int *_Y);
    233   double __cdecl modf(double _X,double *_Y);
    234   double __cdecl fmod(double _X,double _Y);
    235 
    236   void __cdecl sincos (double __x, double *p_sin, double *p_cos);
    237   void __cdecl sincosl (long double __x, long double *p_sin, long double *p_cos);
    238   void __cdecl sincosf (float __x, float *p_sin, float *p_cos);
    239 
    240 #ifndef _CRT_ABS_DEFINED
    241 #define _CRT_ABS_DEFINED
    242   int __cdecl abs(int _X);
    243   long __cdecl labs(long _X);
    244 #endif
    245 #ifndef _CRT_ATOF_DEFINED
    246 #define _CRT_ATOF_DEFINED
    247   double __cdecl atof(const char *_String);
    248   double __cdecl _atof_l(const char *_String,_locale_t _Locale);
    249 #endif
    250 
    251 #define EDOM 33
    252 #define ERANGE 34
    253 
    254 #ifndef _COMPLEX_DEFINED
    255 #define _COMPLEX_DEFINED
    256   struct _complex {
    257     double x;
    258     double y;
    259   };
    260 #endif
    261 
    262   double __cdecl _cabs(struct _complex _ComplexA); /* Overridden to use our cabs.  */
    263   double __cdecl _hypot(double _X,double _Y);
    264   _CRTIMP double __cdecl _j0(double _X);
    265   _CRTIMP double __cdecl _j1(double _X);
    266   _CRTIMP double __cdecl _jn(int _X,double _Y);
    267   _CRTIMP double __cdecl _y0(double _X);
    268   _CRTIMP double __cdecl _y1(double _X);
    269   _CRTIMP double __cdecl _yn(int _X,double _Y);
    270 #ifndef _CRT_MATHERR_DEFINED
    271 #define _CRT_MATHERR_DEFINED
    272   _CRTIMP int __cdecl _matherr (struct _exception *);
    273 #endif
    274 
    275 /* These are also declared in Mingw float.h; needed here as well to work 
    276    around GCC build issues.  */
    277 /* BEGIN FLOAT.H COPY */
    278 /*
    279  * IEEE recommended functions
    280  */
    281 #ifndef _SIGN_DEFINED
    282 #define _SIGN_DEFINED
    283   _CRTIMP double __cdecl _chgsign (double _X);
    284   _CRTIMP double __cdecl _copysign (double _Number,double _Sign);
    285   _CRTIMP double __cdecl _logb (double);
    286   _CRTIMP double __cdecl _nextafter (double, double);
    287   _CRTIMP double __cdecl _scalb (double, long);
    288   _CRTIMP int __cdecl _finite (double);
    289   _CRTIMP int __cdecl _fpclass (double);
    290   _CRTIMP int __cdecl _isnan (double);
    291 #endif
    292 
    293 /* END FLOAT.H COPY */
    294 
    295 #if !defined(__STRICT_ANSI__) || defined(_POSIX_C_SOURCE) || defined(_POSIX_SOURCE) || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
    296 
    297 _CRTIMP double __cdecl j0 (double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
    298 _CRTIMP double __cdecl j1 (double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
    299 _CRTIMP double __cdecl jn (int, double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
    300 _CRTIMP double __cdecl y0 (double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
    301 _CRTIMP double __cdecl y1 (double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
    302 _CRTIMP double __cdecl yn (int, double) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
    303 
    304 #if !defined(NO_OLDNAMES)
    305 
    306 _CRTIMP double __cdecl chgsign (double);
    307 /*
    308  * scalb() is a GCC built-in.
    309  * Exclude this _scalb() stub; the semantics are incompatible
    310  * with the built-in implementation.
    311  *
    312 _CRTIMP double __cdecl scalb (double, long);
    313  *
    314  */
    315   _CRTIMP int __cdecl finite (double);
    316   _CRTIMP int __cdecl fpclass (double);
    317 
    318 #define FP_SNAN    _FPCLASS_SNAN
    319 #define FP_QNAN    _FPCLASS_QNAN
    320 #define FP_NINF    _FPCLASS_NINF
    321 #define FP_PINF    _FPCLASS_PINF
    322 #define FP_NDENORM _FPCLASS_ND
    323 #define FP_PDENORM _FPCLASS_PD
    324 #define FP_NZERO   _FPCLASS_NZ
    325 #define FP_PZERO   _FPCLASS_PZ
    326 #define FP_NNORM   _FPCLASS_NN
    327 #define FP_PNORM   _FPCLASS_PN
    328 
    329 #endif /* !define (NO_OLDNAMES) */
    330 #endif
    331 
    332 #if(defined(_X86_) && !defined(__x86_64))
    333   _CRTIMP int __cdecl _set_SSE2_enable(int _Flag);
    334 #endif
    335 
    336 #ifndef __NO_ISOCEXT
    337 #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \
    338 	|| !defined __STRICT_ANSI__ || defined __cplusplus
    339 
    340 #ifdef __GNUC__
    341 #define HUGE_VALF	__builtin_huge_valf()
    342 #define HUGE_VALL	__builtin_huge_vall()
    343 #define INFINITY	__builtin_inff()
    344 #define NAN		__builtin_nanf("")
    345 #else
    346 extern const float __INFF;
    347 #define HUGE_VALF __INFF
    348 extern const long double  __INFL;
    349 #define HUGE_VALL __INFL
    350 #define INFINITY HUGE_VALF
    351 extern const double __QNANF;
    352 #define NAN __QNANF
    353 #endif /* __GNUC__ */
    354 
    355 /* Use the compiler's builtin define for FLT_EVAL_METHOD to
    356    set float_t and double_t.  */
    357 #if defined (__x86_64__) || defined(__FLT_EVAL_METHOD__)  
    358 # if defined (__x86_64__) || ( __FLT_EVAL_METHOD__== 0)
    359 typedef float float_t;
    360 typedef double double_t;
    361 # elif (__FLT_EVAL_METHOD__ == 1)
    362 typedef double float_t;
    363 typedef double double_t;
    364 # else /* (__FLT_EVAL_METHOD__ == 2) default ix87 FPU */
    365 typedef long double float_t;
    366 typedef long double double_t;
    367 #endif
    368 #else /* ix87 FPU default */
    369 typedef long double float_t;
    370 typedef long double double_t;
    371 #endif
    372 
    373 /* 7.12.3.1 */
    374 /*
    375    Return values for fpclassify.
    376    These are based on Intel x87 fpu condition codes
    377    in the high byte of status word and differ from
    378    the return values for MS IEEE 754 extension _fpclass()
    379 */
    380 #define FP_NAN		0x0100
    381 #define FP_NORMAL	0x0400
    382 #define FP_INFINITE	(FP_NAN | FP_NORMAL)
    383 #define FP_ZERO		0x4000
    384 #define FP_SUBNORMAL	(FP_NORMAL | FP_ZERO)
    385 /* 0x0200 is signbit mask */
    386 
    387 /*
    388   We can't inline float or double, because we want to ensure truncation
    389   to semantic type before classification. 
    390   (A normal long double value might become subnormal when 
    391   converted to double, and zero when converted to float.)
    392 */
    393 
    394   extern int __cdecl __fpclassifyl (long double);
    395   extern int __cdecl __fpclassifyf (float);
    396   extern int __cdecl __fpclassify (double);
    397 
    398 #ifndef __CRT__NO_INLINE
    399   __CRT_INLINE int __cdecl __fpclassifyl (long double x) {
    400 #if __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__
    401     return __fpclassify(x);
    402 #elif defined(__x86_64__) || defined(_AMD64_)
    403     __mingw_ldbl_type_t hlp;
    404     unsigned int e;
    405     hlp.x = x;
    406     e = hlp.lh.sign_exponent & 0x7fff;
    407     if (!e)
    408       {
    409         unsigned int h = hlp.lh.high;
    410         if (!(hlp.lh.low | h))
    411           return FP_ZERO;
    412         else if (!(h & 0x80000000))
    413           return FP_SUBNORMAL;
    414       }
    415     else if (e == 0x7fff)
    416       return (((hlp.lh.high & 0x7fffffff) | hlp.lh.low) == 0 ?
    417               FP_INFINITE : FP_NAN);
    418     return FP_NORMAL;
    419 #elif defined(__i386__) || defined(_X86_)
    420     unsigned short sw;
    421     __asm__ __volatile__ ("fxam; fstsw %%ax;" : "=a" (sw): "t" (x));
    422     return sw & (FP_NAN | FP_NORMAL | FP_ZERO );
    423 #endif
    424   }
    425   __CRT_INLINE int __cdecl __fpclassify (double x) {
    426 #if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
    427     __mingw_dbl_type_t hlp;
    428     unsigned int l, h;
    429 
    430     hlp.x = x;
    431     h = hlp.lh.high;
    432     l = hlp.lh.low | (h & 0xfffff);
    433     h &= 0x7ff00000;
    434     if ((h | l) == 0)
    435       return FP_ZERO;
    436     if (!h)
    437       return FP_SUBNORMAL;
    438     if (h == 0x7ff00000)
    439       return (l ? FP_NAN : FP_INFINITE);
    440     return FP_NORMAL;
    441 #elif defined(__i386__) || defined(_X86_)
    442     unsigned short sw;
    443     __asm__ __volatile__ ("fxam; fstsw %%ax;" : "=a" (sw): "t" (x));
    444     return sw & (FP_NAN | FP_NORMAL | FP_ZERO );
    445 #endif
    446   }
    447   __CRT_INLINE int __cdecl __fpclassifyf (float x) {
    448 #if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
    449     __mingw_flt_type_t hlp;
    450 
    451     hlp.x = x;
    452     hlp.val &= 0x7fffffff;
    453     if (hlp.val == 0)
    454       return FP_ZERO;
    455     if (hlp.val < 0x800000)
    456       return FP_SUBNORMAL;
    457     if (hlp.val >= 0x7f800000)
    458       return (hlp.val > 0x7f800000 ? FP_NAN : FP_INFINITE);
    459     return FP_NORMAL;
    460 #elif defined(__i386__) || defined(_X86_)
    461     unsigned short sw;
    462     __asm__ __volatile__ ("fxam; fstsw %%ax;" : "=a" (sw): "t" (x));
    463     return sw & (FP_NAN | FP_NORMAL | FP_ZERO );
    464 #endif
    465   }
    466 #endif
    467 
    468 #ifdef __STDC_WANT_DEC_FP__
    469 #define __dfp_expansion(__call,__fin,x) \
    470 __mingw_choose_expr (                                  \
    471       __mingw_types_compatible_p (__typeof__ (x), _Decimal32),    \
    472         __call##d32(x),                                         \
    473     __mingw_choose_expr (                                     \
    474       __mingw_types_compatible_p (__typeof__ (x), _Decimal64),    \
    475         __call##d64(x),                                         \
    476     __mingw_choose_expr (                                     \
    477       __mingw_types_compatible_p (__typeof__ (x), _Decimal128),   \
    478         __call##d128(x),                                        \
    479 __fin)))
    480 #else
    481 #define __dfp_expansion(__call,__fin,x) __fin
    482 #endif
    483 
    484 #define fpclassify(x) \
    485 __mingw_choose_expr (                                         \
    486   __mingw_types_compatible_p (__typeof__ (x), double),            \
    487     __fpclassify(x),                                            \
    488     __mingw_choose_expr (                                     \
    489       __mingw_types_compatible_p (__typeof__ (x), float),         \
    490         __fpclassifyf(x),                                       \
    491     __mingw_choose_expr (                                     \
    492       __mingw_types_compatible_p (__typeof__ (x), long double),   \
    493         __fpclassifyl(x),                                       \
    494     __dfp_expansion(__fpclassify,(__builtin_trap(),0),x))))
    495 
    496 
    497 /* 7.12.3.2 */
    498 #define isfinite(x) ((fpclassify(x) & FP_NAN) == 0)
    499 
    500 /* 7.12.3.3 */
    501 #define isinf(x) (fpclassify(x) == FP_INFINITE)
    502 
    503 /* 7.12.3.4 */
    504 /* We don't need to worry about truncation here:
    505    A NaN stays a NaN. */
    506 
    507   extern int __cdecl __isnan (double);
    508   extern int __cdecl __isnanf (float);
    509   extern int __cdecl __isnanl (long double);
    510 
    511 #ifndef __CRT__NO_INLINE
    512   __CRT_INLINE int __cdecl __isnan (double _x)
    513   {
    514 #if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
    515     __mingw_dbl_type_t hlp;
    516     unsigned int l, h;
    517 
    518     hlp.x = _x;
    519     l = hlp.lh.low;
    520     h = hlp.lh.high & 0x7fffffff;
    521     h |= (l | -l) >> 31;
    522     h = 0x7ff00000 - h;
    523     return (int) h >> 31;
    524 #elif defined(__i386__) || defined(_X86_)
    525     unsigned short sw;
    526     __asm__ __volatile__ ("fxam;"
    527       "fstsw %%ax": "=a" (sw) : "t" (_x));
    528     return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
    529       == FP_NAN;
    530 #endif
    531   }
    532 
    533   __CRT_INLINE int __cdecl __isnanf (float _x)
    534   {
    535 #if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
    536     __mingw_flt_type_t hlp;
    537     unsigned int i;
    538     
    539     hlp.x = _x;
    540     i = hlp.val & 0x7fffffff;
    541     i = 0x7f800000 - i;
    542     return (int) (i >> 31);
    543 #elif defined(__i386__) || defined(_X86_)
    544     unsigned short sw;
    545     __asm__ __volatile__ ("fxam;"
    546       "fstsw %%ax": "=a" (sw) : "t" (_x));
    547     return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
    548       == FP_NAN;
    549 #endif
    550   }
    551 
    552   __CRT_INLINE int __cdecl __isnanl (long double _x)
    553   {
    554 #if __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__
    555     return __isnan(_x);
    556 #elif defined(__x86_64__) || defined(_AMD64_)
    557     __mingw_ldbl_type_t ld;
    558     unsigned int xx, signexp;
    559 
    560     ld.x = _x;
    561     signexp = (ld.lh.sign_exponent & 0x7fff) << 1;
    562     xx = ld.lh.low | (ld.lh.high & 0x7fffffffu);
    563     signexp |= (xx | (-xx)) >> 31;
    564     signexp = 0xfffe - signexp;
    565     return (int) signexp >> 16;
    566 #elif defined(__i386__) || defined(_X86_)
    567     unsigned short sw;
    568     __asm__ __volatile__ ("fxam;"
    569       "fstsw %%ax": "=a" (sw) : "t" (_x));
    570     return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
    571       == FP_NAN;
    572 #endif
    573   }
    574 #endif
    575 
    576 
    577 
    578 #define isnan(x) \
    579 __mingw_choose_expr (                                         \
    580   __mingw_types_compatible_p (__typeof__ (x), double),            \
    581     __isnan((double)(x)),                                         \
    582     __mingw_choose_expr (                                     \
    583       __mingw_types_compatible_p (__typeof__ (x), float),         \
    584         __isnanf((float)(x)),                                     \
    585     __mingw_choose_expr (                                     \
    586       __mingw_types_compatible_p (__typeof__ (x), long double),   \
    587         __isnanl((long double)(x)),                               \
    588     __dfp_expansion(__isnan,(__builtin_trap(),(int)0),x))))
    589 
    590 /* 7.12.3.5 */
    591 #define isnormal(x) (fpclassify(x) == FP_NORMAL)
    592 
    593 /* 7.12.3.6 The signbit macro */
    594   extern int __cdecl __signbit (double);
    595   extern int __cdecl __signbitf (float);
    596   extern int __cdecl __signbitl (long double);
    597 #ifndef __CRT__NO_INLINE
    598   __CRT_INLINE int __cdecl __signbit (double x) {
    599 #if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
    600     __mingw_dbl_type_t hlp;
    601 
    602     hlp.x = x;
    603     return ((hlp.lh.high & 0x80000000) != 0);
    604 #elif defined(__i386__) || defined(_X86_)
    605     unsigned short stw;
    606     __asm__ __volatile__ ( "fxam; fstsw %%ax;": "=a" (stw) : "t" (x));
    607     return stw & 0x0200;
    608 #endif
    609   }
    610 
    611   __CRT_INLINE int __cdecl __signbitf (float x) {
    612 #if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
    613     __mingw_flt_type_t hlp;
    614     hlp.x = x;
    615     return ((hlp.val & 0x80000000) != 0);
    616 #elif defined(__i386__) || defined(_X86_)
    617     unsigned short stw;
    618     __asm__ __volatile__ ("fxam; fstsw %%ax;": "=a" (stw) : "t" (x));
    619     return stw & 0x0200;
    620 #endif
    621   }
    622 
    623   __CRT_INLINE int __cdecl __signbitl (long double x) {
    624 #if __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__
    625     return __signbit(x);
    626 #elif defined(__x86_64__) || defined(_AMD64_)
    627     __mingw_ldbl_type_t ld;
    628     ld.x = x;
    629     return ((ld.lh.sign_exponent & 0x8000) != 0);
    630 #elif defined(__i386__) || defined(_X86_)
    631     unsigned short stw;
    632     __asm__ __volatile__ ("fxam; fstsw %%ax;": "=a" (stw) : "t" (x));
    633     return stw & 0x0200;
    634 #endif
    635   }
    636 #endif
    637 
    638 #define signbit(x) \
    639 __mingw_choose_expr (                                         \
    640   __mingw_types_compatible_p (__typeof__ (x), double),            \
    641     __signbit(x),                                               \
    642     __mingw_choose_expr (                                     \
    643       __mingw_types_compatible_p (__typeof__ (x), float),         \
    644         __signbitf(x),                                          \
    645     __mingw_choose_expr (                                     \
    646       __mingw_types_compatible_p (__typeof__ (x), long double),   \
    647         __signbitl(x),                                          \
    648      __dfp_expansion(__signbit,(__builtin_trap(),x),x))))
    649 
    650 /* 7.12.4 Trigonometric functions: Double in C89 */
    651   extern float __cdecl sinf(float _X);
    652   extern long double __cdecl sinl(long double);
    653 
    654   extern float __cdecl cosf(float _X);
    655   extern long double __cdecl cosl(long double);
    656 
    657   extern float __cdecl tanf(float _X);
    658   extern long double __cdecl tanl(long double);
    659   extern float __cdecl asinf(float _X);
    660   extern long double __cdecl asinl(long double);
    661 
    662   extern float __cdecl acosf (float);
    663   extern long double __cdecl acosl (long double);
    664 
    665   extern float __cdecl atanf (float);
    666   extern long double __cdecl atanl (long double);
    667 
    668   extern float __cdecl atan2f (float, float);
    669   extern long double __cdecl atan2l (long double, long double);
    670 
    671 /* 7.12.5 Hyperbolic functions: Double in C89  */
    672   extern float __cdecl sinhf(float _X);
    673 #if !defined(__CRT__NO_INLINE) && !defined(_UCRT)
    674   __CRT_INLINE float sinhf(float _X) { return ((float)sinh((double)_X)); }
    675 #endif
    676   extern long double __cdecl sinhl(long double);
    677 
    678   extern float __cdecl coshf(float _X);
    679 #if !defined(__CRT__NO_INLINE) && !defined(_UCRT)
    680   __CRT_INLINE float coshf(float _X) { return ((float)cosh((double)_X)); }
    681 #endif
    682   extern long double __cdecl coshl(long double);
    683 
    684   extern float __cdecl tanhf(float _X);
    685 #if !defined(__CRT__NO_INLINE) && !defined(_UCRT)
    686   __CRT_INLINE float tanhf(float _X) { return ((float)tanh((double)_X)); }
    687 #endif
    688   extern long double __cdecl tanhl(long double);
    689 
    690 /* Inverse hyperbolic trig functions  */ 
    691 /* 7.12.5.1 */
    692   extern double __cdecl acosh (double);
    693   extern float __cdecl acoshf (float);
    694   extern long double __cdecl acoshl (long double);
    695 
    696 /* 7.12.5.2 */
    697   extern double __cdecl asinh (double);
    698   extern float __cdecl asinhf (float);
    699   extern long double __cdecl asinhl (long double);
    700 
    701 /* 7.12.5.3 */
    702   extern double __cdecl atanh (double);
    703   extern float __cdecl atanhf  (float);
    704   extern long double __cdecl atanhl (long double);
    705 
    706 /* Exponentials and logarithms  */
    707 /* 7.12.6.1 Double in C89 */
    708   extern float __cdecl expf(float _X);
    709 #if !defined(__CRT__NO_INLINE) && !defined(_UCRT)
    710   __CRT_INLINE float expf(float _X) { return ((float)exp((double)_X)); }
    711 #endif
    712   extern long double __cdecl expl(long double);
    713 
    714 /* 7.12.6.2 */
    715   extern double __cdecl exp2(double);
    716   extern float __cdecl exp2f(float);
    717   extern long double __cdecl exp2l(long double);
    718 
    719 /* 7.12.6.3 The expm1 functions */
    720 /* TODO: These could be inlined */
    721   extern double __cdecl expm1(double);
    722   extern float __cdecl expm1f(float);
    723   extern long double __cdecl expm1l(long double);
    724 
    725 /* 7.12.6.4 Double in C89 */
    726   extern float frexpf(float _X,int *_Y);
    727 #if !defined(__CRT__NO_INLINE) && !defined(_UCRT)
    728   __CRT_INLINE float frexpf(float _X,int *_Y) { return ((float)frexp((double)_X,_Y)); }
    729 #endif
    730   extern long double __cdecl frexpl(long double,int *);
    731 
    732 /* 7.12.6.5 */
    733 #define FP_ILOGB0 ((int)0x80000000)
    734 #define FP_ILOGBNAN ((int)0x7fffffff)
    735   extern int __cdecl ilogb (double);
    736   extern int __cdecl ilogbf (float);
    737   extern int __cdecl ilogbl (long double);
    738 
    739 /* 7.12.6.6  Double in C89 */
    740   extern float __cdecl ldexpf(float _X,int _Y);
    741 #if !defined(__CRT__NO_INLINE) && !defined(_UCRT)
    742   __CRT_INLINE float __cdecl ldexpf (float x, int expn) { return (float) ldexp ((double)x, expn); }
    743 #endif
    744   extern long double __cdecl ldexpl (long double, int);
    745 
    746 /* 7.12.6.7 Double in C89 */
    747   extern float __cdecl logf (float);
    748   extern long double __cdecl logl(long double);
    749 
    750 /* 7.12.6.8 Double in C89 */
    751   extern float __cdecl log10f (float);
    752   extern long double __cdecl log10l(long double);
    753 
    754 /* 7.12.6.9 */
    755   extern double __cdecl log1p(double);
    756   extern float __cdecl log1pf(float);
    757   extern long double __cdecl log1pl(long double);
    758 
    759 /* 7.12.6.10 */
    760   extern double __cdecl log2 (double);
    761   extern float __cdecl log2f (float);
    762   extern long double __cdecl log2l (long double);
    763 
    764 /* 7.12.6.11 */
    765   extern double __cdecl logb (double);
    766   extern float __cdecl logbf (float);
    767   extern long double __cdecl logbl (long double);
    768 
    769 /* 7.12.6.12  Double in C89 */
    770   extern float __cdecl modff (float, float*);
    771   extern long double __cdecl modfl (long double, long double*);
    772 
    773 /* 7.12.6.13 */
    774   extern double __cdecl scalbn (double, int);
    775   extern float __cdecl scalbnf (float, int);
    776   extern long double __cdecl scalbnl (long double, int);
    777 
    778   extern double __cdecl scalbln (double, long);
    779   extern float __cdecl scalblnf (float, long);
    780   extern long double __cdecl scalblnl (long double, long);
    781 
    782 /* 7.12.7.1 */
    783 /* Implementations adapted from Cephes versions */ 
    784   extern double __cdecl cbrt (double);
    785   extern float __cdecl cbrtf (float);
    786   extern long double __cdecl cbrtl (long double);
    787 
    788 /* 7.12.7.3  */
    789   extern double __cdecl hypot (double, double) __MINGW_ATTRIB_DEPRECATED_MSVC2005; /* in libmoldname.a */
    790   extern float __cdecl hypotf (float x, float y);
    791 #if !defined(__CRT__NO_INLINE) && !defined(_UCRT)
    792   __CRT_INLINE float __cdecl hypotf (float x, float y) { return (float) hypot ((double)x, (double)y);}
    793 #endif
    794   extern long double __cdecl hypotl (long double, long double);
    795 
    796 /* 7.12.7.4 The pow functions. Double in C89 */
    797   extern float __cdecl powf(float _X,float _Y);
    798 #if !defined(__CRT__NO_INLINE) && !defined(_UCRT)
    799   __CRT_INLINE float powf(float _X,float _Y) { return ((float)pow((double)_X,(double)_Y)); }
    800 #endif
    801   extern long double __cdecl powl (long double, long double);
    802 
    803 /* 7.12.7.5 The sqrt functions. Double in C89. */
    804   extern float __cdecl sqrtf (float);
    805   extern long double sqrtl(long double);
    806 
    807 /* 7.12.8.1 The erf functions  */
    808   extern double __cdecl erf (double);
    809   extern float __cdecl erff (float);
    810   extern long double __cdecl erfl (long double);
    811 
    812 /* 7.12.8.2 The erfc functions  */
    813   extern double __cdecl erfc (double);
    814   extern float __cdecl erfcf (float);
    815   extern long double __cdecl erfcl (long double);
    816 
    817 /* 7.12.8.3 The lgamma functions */
    818   extern double __cdecl lgamma (double);
    819   extern float __cdecl lgammaf (float);
    820   extern long double __cdecl lgammal (long double);
    821 
    822   extern int signgam;
    823 
    824 /* 7.12.8.4 The tgamma functions */
    825   extern double __cdecl tgamma (double);
    826   extern float __cdecl tgammaf (float);
    827   extern long double __cdecl tgammal (long double);
    828 
    829 /* 7.12.9.1 Double in C89 */
    830   extern float __cdecl ceilf (float);
    831   extern long double __cdecl ceill (long double);
    832 
    833 /* 7.12.9.2 Double in C89 */
    834   extern float __cdecl floorf (float);
    835   extern long double __cdecl floorl (long double);
    836 
    837 /* 7.12.9.3 */
    838   extern double __cdecl nearbyint ( double);
    839   extern float __cdecl nearbyintf (float);
    840   extern long double __cdecl nearbyintl (long double);
    841 
    842 /* 7.12.9.4 */
    843 /* round, using fpu control word settings */
    844 extern double __cdecl rint (double);
    845 extern float __cdecl rintf (float);
    846 extern long double __cdecl rintl (long double);
    847 
    848 /* 7.12.9.5 */
    849 extern long __cdecl lrint (double);
    850 extern long __cdecl lrintf (float);
    851 extern long __cdecl lrintl (long double);
    852 
    853 __MINGW_EXTENSION long long __cdecl llrint (double);
    854 __MINGW_EXTENSION long long __cdecl llrintf (float);
    855 __MINGW_EXTENSION long long __cdecl llrintl (long double);
    856 
    857 /* 7.12.9.6 */
    858 /* round away from zero, regardless of fpu control word settings */
    859   extern double __cdecl round (double);
    860   extern float __cdecl roundf (float);
    861   extern long double __cdecl roundl (long double);
    862 
    863 /* 7.12.9.7  */
    864   extern long __cdecl lround (double);
    865   extern long __cdecl lroundf (float);
    866   extern long __cdecl lroundl (long double);
    867   __MINGW_EXTENSION long long __cdecl llround (double);
    868   __MINGW_EXTENSION long long __cdecl llroundf (float);
    869   __MINGW_EXTENSION long long __cdecl llroundl (long double);
    870   
    871 /* 7.12.9.8 */
    872 /* round towards zero, regardless of fpu control word settings */
    873   extern double __cdecl trunc (double);
    874   extern float __cdecl truncf (float);
    875   extern long double __cdecl truncl (long double);
    876 
    877 /* 7.12.10.1 Double in C89 */
    878   extern float __cdecl fmodf (float, float);
    879   extern long double __cdecl fmodl (long double, long double);
    880 
    881 /* 7.12.10.2 */ 
    882   extern double __cdecl remainder (double, double);
    883   extern float __cdecl remainderf (float, float);
    884   extern long double __cdecl remainderl (long double, long double);
    885 
    886 /* 7.12.10.3 */
    887   extern double __cdecl remquo(double, double, int *);
    888   extern float __cdecl remquof(float, float, int *);
    889   extern long double __cdecl remquol(long double, long double, int *);
    890 
    891 /* 7.12.11.1 */
    892   extern double __cdecl copysign (double, double); /* in libmoldname.a */
    893   extern float __cdecl copysignf (float, float);
    894   extern long double __cdecl copysignl (long double, long double);
    895 
    896 #ifndef __CRT__NO_INLINE
    897 #if !defined (__ia64__)
    898   __CRT_INLINE double __cdecl copysign (double x, double y)
    899   {
    900     __mingw_dbl_type_t hx, hy;
    901     hx.x = x; hy.x = y;
    902     hx.lh.high = (hx.lh.high & 0x7fffffff) | (hy.lh.high & 0x80000000);
    903     return hx.x;
    904   }
    905   __CRT_INLINE float __cdecl copysignf (float x, float y)
    906   {
    907     __mingw_flt_type_t hx, hy;
    908     hx.x = x; hy.x = y;
    909     hx.val = (hx.val & 0x7fffffff) | (hy.val & 0x80000000);
    910     return hx.x;
    911   }
    912 #endif
    913 #endif
    914 
    915 /* 7.12.11.2 Return a NaN */
    916   extern double __cdecl nan(const char *tagp);
    917   extern float __cdecl nanf(const char *tagp);
    918   extern long double __cdecl nanl(const char *tagp);
    919 
    920 #ifndef __STRICT_ANSI__
    921 #define _nan() nan("")
    922 #define _nanf() nanf("")
    923 #define _nanl() nanl("")
    924 #endif
    925 
    926 /* 7.12.11.3 */
    927   extern double __cdecl nextafter (double, double); /* in libmoldname.a */
    928   extern float __cdecl nextafterf (float, float);
    929   extern long double __cdecl nextafterl (long double, long double);
    930 
    931 /* 7.12.11.4 The nexttoward functions */
    932   extern double __cdecl nexttoward (double,  long double);
    933   extern float __cdecl nexttowardf (float,  long double);
    934   extern long double __cdecl nexttowardl (long double, long double);
    935 
    936 /* 7.12.12.1 */
    937 /*  x > y ? (x - y) : 0.0  */
    938   extern double __cdecl fdim (double x, double y);
    939   extern float __cdecl fdimf (float x, float y);
    940   extern long double __cdecl fdiml (long double x, long double y);
    941 
    942 /* fmax and fmin.
    943    NaN arguments are treated as missing data: if one argument is a NaN
    944    and the other numeric, then these functions choose the numeric
    945    value. */
    946 
    947 /* 7.12.12.2 */
    948   extern double __cdecl fmax  (double, double);
    949   extern float __cdecl fmaxf (float, float);
    950   extern long double __cdecl fmaxl (long double, long double);
    951 
    952 /* 7.12.12.3 */
    953   extern double __cdecl fmin (double, double);
    954   extern float __cdecl fminf (float, float);
    955   extern long double __cdecl fminl (long double, long double);
    956 
    957 /* 7.12.13.1 */
    958 /* return x * y + z as a ternary op */ 
    959   extern double __cdecl fma (double, double, double);
    960   extern float __cdecl fmaf (float, float, float);
    961   extern long double __cdecl fmal (long double, long double, long double);
    962 
    963 /* 7.12.14 */
    964 /* 
    965  *  With these functions, comparisons involving quiet NaNs set the FP
    966  *  condition code to "unordered".  The IEEE floating-point spec
    967  *  dictates that the result of floating-point comparisons should be
    968  *  false whenever a NaN is involved, with the exception of the != op, 
    969  *  which always returns true: yes, (NaN != NaN) is true).
    970  */
    971 
    972 #ifdef __GNUC__
    973 
    974 #define isgreater(x, y) __builtin_isgreater(x, y)
    975 #define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
    976 #define isless(x, y) __builtin_isless(x, y)
    977 #define islessequal(x, y) __builtin_islessequal(x, y)
    978 #define islessgreater(x, y) __builtin_islessgreater(x, y)
    979 #define isunordered(x, y) __builtin_isunordered(x, y)
    980 
    981 #else
    982 /*  helper  */
    983 #ifndef __CRT__NO_INLINE
    984   __CRT_INLINE int  __cdecl
    985     __fp_unordered_compare (long double x, long double y){
    986       unsigned short retval;
    987       __asm__ __volatile__ ("fucom %%st(1);"
    988 	"fnstsw;": "=a" (retval) : "t" (x), "u" (y));
    989       return retval;
    990   }
    991 #endif /* __GNUC__ */
    992 
    993 #define isgreater(x, y) ((__fp_unordered_compare(x, y)  & 0x4500) == 0)
    994 #define isless(x, y) ((__fp_unordered_compare (y, x)  & 0x4500) == 0)
    995 #define isgreaterequal(x, y) ((__fp_unordered_compare (x, y)  & FP_INFINITE) == 0)
    996 #define islessequal(x, y) ((__fp_unordered_compare(y, x)  & FP_INFINITE) == 0)
    997 #define islessgreater(x, y) ((__fp_unordered_compare(x, y)  & FP_SUBNORMAL) == 0)
    998 #define isunordered(x, y) ((__fp_unordered_compare(x, y)  & 0x4500) == 0x4500)
    999 
   1000 #endif
   1001 
   1002 #endif /* __STDC_VERSION__ >= 199901L */
   1003 #endif /* __NO_ISOCEXT */
   1004 
   1005 #if defined(_X86_) && !defined(__x86_64)
   1006   _CRTIMP float __cdecl _hypotf(float _X,float _Y);
   1007 #endif
   1008 
   1009 #if !defined(__ia64__)
   1010    _CRTIMP float __cdecl _copysignf (float _Number,float _Sign);
   1011    _CRTIMP float __cdecl _chgsignf (float _X);
   1012    _CRTIMP float __cdecl _logbf(float _X);
   1013    _CRTIMP float __cdecl _nextafterf(float _X,float _Y);
   1014    _CRTIMP int __cdecl _finitef(float _X);
   1015    _CRTIMP int __cdecl _isnanf(float _X);
   1016    _CRTIMP int __cdecl _fpclassf(float _X);
   1017 #endif
   1018 
   1019 #ifdef _SIGN_DEFINED
   1020    extern long double __cdecl _chgsignl (long double);
   1021 #define _copysignl copysignl
   1022 #endif /* _SIGN_DEFINED */
   1023 
   1024 #define _hypotl hypotl
   1025 
   1026 #ifndef	NO_OLDNAMES
   1027 #define matherr _matherr
   1028 #define HUGE	_HUGE
   1029 #endif
   1030 
   1031 /* Documentation on decimal float math
   1032    http://h21007.www2.hp.com/portal/site/dspp/menuitem.863c3e4cbcdc3f3515b49c108973a801?ciid=8cf166fedd1aa110VgnVCM100000a360ea10RCRD 
   1033  */
   1034 #ifdef __STDC_WANT_DEC_FP__
   1035 
   1036 #define DEC_INFINITY __builtin_infd32()
   1037 #define DEC_NAN __builtin_nand32("")
   1038 
   1039   extern int __cdecl __isnand32(_Decimal32 x);
   1040   extern int __cdecl __isnand64(_Decimal64 x);
   1041   extern int __cdecl __isnand128(_Decimal128 x);
   1042   extern int __cdecl __fpclassifyd32 (_Decimal32);
   1043   extern int __cdecl __fpclassifyd64 (_Decimal64);
   1044   extern int __cdecl __fpclassifyd128 (_Decimal128);
   1045   extern int __cdecl __signbitd32 (_Decimal32);
   1046   extern int __cdecl __signbitd64 (_Decimal64);
   1047   extern int __cdecl __signbitd128 (_Decimal128);
   1048 
   1049 #ifndef __CRT__NO_INLINE
   1050   __CRT_INLINE int __cdecl __isnand32(_Decimal32 x){
   1051     return __builtin_isnand32(x);
   1052   }
   1053 
   1054   __CRT_INLINE int __cdecl __isnand64(_Decimal64 x){
   1055     return __builtin_isnand64(x);
   1056   }
   1057 
   1058   __CRT_INLINE int __cdecl __isnand128(_Decimal128 x){
   1059     return __builtin_isnand128(x);
   1060   }
   1061 
   1062   __CRT_INLINE int __cdecl __signbitd32 (_Decimal32 x){
   1063     return __builtin_signbitd32(x);
   1064   }
   1065 
   1066   __CRT_INLINE int __cdecl __signbitd64 (_Decimal64 x){
   1067     return __builtin_signbitd64(x);
   1068   }
   1069 
   1070   __CRT_INLINE int __cdecl __signbitd128 (_Decimal128 x){
   1071     return __builtin_signbitd128(x);
   1072   }
   1073 
   1074 #endif
   1075 
   1076 /* Still missing 
   1077 #define HUGE_VAL_D32
   1078 #define HUGE_VAL_D64
   1079 #define HUGE_VAL_D128
   1080 */
   1081 
   1082 /*** exponentials ***/
   1083 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/expd64.3m.htm */
   1084 _Decimal64 __cdecl expd64(_Decimal64 _X);
   1085 _Decimal128 __cdecl expd128(_Decimal128 _X);
   1086 _Decimal32 __cdecl expd32(_Decimal32 _X);
   1087 
   1088 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/exp2d64.3m.htm */
   1089 _Decimal64 __cdecl exp2d64(_Decimal64 _X);
   1090 _Decimal128 __cdecl exp2d128(_Decimal128 _X);
   1091 _Decimal32 __cdecl exp2d32(_Decimal32 _X);
   1092 
   1093 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/exp10d64.3m.htm */
   1094 _Decimal64 __cdecl exp10d64(_Decimal64 _X);
   1095 _Decimal128 __cdecl exp10d128(_Decimal128 _X);
   1096 _Decimal32 __cdecl exp10d32(_Decimal32 _X);
   1097 
   1098 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/expm1d64.3m.htm */
   1099 _Decimal64 __cdecl expm1d64(_Decimal64 _X);
   1100 _Decimal128 __cdecl expm1d128(_Decimal128 _X);
   1101 _Decimal32 __cdecl expm1d32(_Decimal32 _X);
   1102 
   1103 /*** logarithms ***/
   1104 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/logd64.3m.htm */
   1105 _Decimal64 __cdecl logd64(_Decimal64 _X);
   1106 _Decimal128 __cdecl logd128(_Decimal128 _X);
   1107 _Decimal32 __cdecl logd32(_Decimal32 _X);
   1108 
   1109 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/log2d64.3m.htm */
   1110 _Decimal64 __cdecl log2d64(_Decimal64 _X);
   1111 _Decimal128 __cdecl log2d128(_Decimal128 _X);
   1112 _Decimal32 __cdecl log2d32(_Decimal32 _X);
   1113 
   1114 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/log10d64.3m.htm */
   1115 _Decimal64 __cdecl log10d64(_Decimal64 _X);
   1116 _Decimal128 __cdecl log10d128(_Decimal128 _X);
   1117 _Decimal32 __cdecl log10d32(_Decimal32 _X);
   1118 
   1119 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/log1pd64.3m.htm */
   1120 _Decimal64 __cdecl log1pd64(_Decimal64 _X);
   1121 _Decimal128 __cdecl log1pd128(_Decimal128 _X);
   1122 _Decimal32 __cdecl log1pd32(_Decimal32 _X);
   1123 
   1124 /*** trigonometrics ***/
   1125 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/cosd64.3m.htm */
   1126 _Decimal64 __cdecl cosd64(_Decimal64 _X);
   1127 _Decimal128 __cdecl cosd128(_Decimal128 _X);
   1128 _Decimal32 __cdecl cosd32(_Decimal32 _X);
   1129 
   1130 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/sind64.3m.htm */
   1131 _Decimal64 __cdecl sind64(_Decimal64 _X);
   1132 _Decimal128 __cdecl sind128(_Decimal128 _X);
   1133 _Decimal32 __cdecl sind32(_Decimal32 _X);
   1134 
   1135 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/tand64.3m.htm */
   1136 _Decimal64 __cdecl tand64(_Decimal64 _X);
   1137 _Decimal128 __cdecl tand128(_Decimal128 _X);
   1138 _Decimal32 __cdecl tand32(_Decimal32 _X);
   1139 
   1140 /*** inverse trigonometrics ***/
   1141 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/acosd64.3m.htm */
   1142 _Decimal64 __cdecl acosd64(_Decimal64 _X);
   1143 _Decimal128 __cdecl acosd128(_Decimal128 _X);
   1144 _Decimal32 __cdecl acosd32(_Decimal32 _X);
   1145 
   1146 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/asind64.3m.htm */
   1147 _Decimal64 __cdecl asind64(_Decimal64 _X);
   1148 _Decimal128 __cdecl asind128(_Decimal128 _X);
   1149 _Decimal32 __cdecl asind32(_Decimal32 _X);
   1150 
   1151 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/atand64.3m.htm */
   1152 _Decimal64 __cdecl atand64(_Decimal64 _X);
   1153 _Decimal128 __cdecl atand128(_Decimal128 _X);
   1154 _Decimal32 __cdecl atand32(_Decimal32 _X);
   1155 
   1156 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/atan2d64.3m.htm */
   1157 _Decimal64 __cdecl atan2d64(_Decimal64 _X, _Decimal64 _Y);
   1158 _Decimal128 __cdecl atan2d128(_Decimal128 _X, _Decimal128 _Y);
   1159 _Decimal32 __cdecl atan2d32(_Decimal32 _X, _Decimal32 _Y);
   1160 
   1161 /*** hyperbolics ***/
   1162 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/coshd64.3m.htm */
   1163 _Decimal64 __cdecl coshd64(_Decimal64 _X);
   1164 _Decimal128 __cdecl coshd128(_Decimal128 _X);
   1165 _Decimal32 __cdecl coshd32(_Decimal32 _X);
   1166 
   1167 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/sinhd64.3m.htm */
   1168 _Decimal64 __cdecl sinhd64(_Decimal64 _X);
   1169 _Decimal128 __cdecl sinhd128(_Decimal128 _X);
   1170 _Decimal32 __cdecl sinhd32(_Decimal32 _X);
   1171 
   1172 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/tanhd64.3m.htm */
   1173 _Decimal64 __cdecl tanhd64(_Decimal64 _X);
   1174 _Decimal128 __cdecl tanhd128(_Decimal128 _X);
   1175 _Decimal32 __cdecl tanhd32(_Decimal32 _X);
   1176 
   1177 /*** inverse hyperbolics ***/
   1178 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/acoshd64.3m.htm */
   1179 _Decimal64 __cdecl acoshd64(_Decimal64 _X);
   1180 _Decimal128 __cdecl acoshd128(_Decimal128 _X);
   1181 _Decimal32 __cdecl acoshd32(_Decimal32 _X);
   1182 
   1183 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/asinhd64.3m.htm */
   1184 _Decimal64 __cdecl asinhd64(_Decimal64 _X);
   1185 _Decimal128 __cdecl asinhd128(_Decimal128 _X);
   1186 _Decimal32 __cdecl asinhd32(_Decimal32 _X);
   1187 
   1188 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/atanhd64.3m.htm */
   1189 _Decimal64 __cdecl atanhd64(_Decimal64 _X);
   1190 _Decimal128 __cdecl atanhd128(_Decimal128 _X);
   1191 _Decimal32 __cdecl atanhd32(_Decimal32 _X);
   1192 
   1193 /*** square & cube roots, hypotenuse ***/
   1194 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/sqrtd64.3m.htm */
   1195 _Decimal64 __cdecl sqrtd64(_Decimal64 _X);
   1196 _Decimal128 __cdecl sqrtd128(_Decimal128 _X);
   1197 _Decimal32 __cdecl sqrtd32(_Decimal32 _X);
   1198 
   1199 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/cbrtd64.3m.htm */
   1200 _Decimal64 __cdecl cbrtd64(_Decimal64 _X);
   1201 _Decimal128 __cdecl cbrtd128(_Decimal128 _X);
   1202 _Decimal32 __cdecl cbrtd32(_Decimal32 _X);
   1203 
   1204 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/hypotd64.3m.htm */
   1205 _Decimal64 __cdecl hypotd64(_Decimal64 _X, _Decimal64 _Y);
   1206 _Decimal128 __cdecl hypotd128(_Decimal128 _X, _Decimal128 _Y);
   1207 _Decimal32 __cdecl hypotd32(_Decimal32 _X, _Decimal32 _Y);
   1208 
   1209 /*** floating multiply-add ***/
   1210 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/fmad64.3m.htm */
   1211 _Decimal64 __cdecl fmad64(_Decimal64 _X, _Decimal64 y, _Decimal64 _Z);
   1212 _Decimal128 __cdecl fmad128(_Decimal128 _X, _Decimal128 y, _Decimal128 _Z);
   1213 _Decimal32 __cdecl fmad32(_Decimal32 _X, _Decimal32 y, _Decimal32 _Z);
   1214 
   1215 /*** exponent/significand ***/
   1216 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/logbd64.3m.htm */
   1217 _Decimal64 __cdecl logbd64(_Decimal64 _X);
   1218 _Decimal128 __cdecl logbd128(_Decimal128 _X);
   1219 _Decimal32 __cdecl logbd32(_Decimal32 _X);
   1220 
   1221 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/ilogbd64.3m.htm */
   1222 int __cdecl ilogbd64(_Decimal64 _X);
   1223 int __cdecl ilogbd128(_Decimal128 _X);
   1224 int __cdecl ilogbd32(_Decimal32 _X);
   1225 
   1226 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/frexpd64.3m.htm */
   1227 _Decimal64 __cdecl frexpd64(_Decimal64 _X, int *_Y);
   1228 _Decimal128 __cdecl frexpd128(_Decimal128 _X, int *_Y);
   1229 _Decimal32 __cdecl frexpd32(_Decimal32 _X, int *_Y);
   1230 
   1231 /*** quantum ***/
   1232 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/quantized64.3m.htm */
   1233 _Decimal64 __cdecl quantized64(_Decimal64 _X, _Decimal64 _Y);
   1234 _Decimal128 __cdecl quantized128(_Decimal128 _X, _Decimal128 _Y);
   1235 _Decimal32 __cdecl quantized32(_Decimal32 _X, _Decimal32 _Y);
   1236 
   1237 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/samequantumd64.3m.htm */
   1238 _Bool __cdecl samequantumd64(_Decimal64 _X, _Decimal64 _Y);
   1239 _Bool __cdecl samequantumd128(_Decimal128 _X, _Decimal128 _Y);
   1240 _Bool __cdecl samequantumd32(_Decimal32 _X, _Decimal32 _Y);
   1241 
   1242 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/quantexpd64.3m.htm */
   1243 int __cdecl quantexpd64(_Decimal64 _X);
   1244 int __cdecl quantexpd128(_Decimal128 _X);
   1245 int __cdecl quantexpd32(_Decimal32 _X);
   1246 
   1247 /*** scaling ***/
   1248 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/scalbnd64.3m.htm */
   1249 _Decimal64 __cdecl scalbnd64(_Decimal64 _X, int _Y);
   1250 _Decimal128 __cdecl scalbnd128(_Decimal128 _X, int _Y);
   1251 _Decimal32 __cdecl scalbnd32(_Decimal32 _X, int _Y);
   1252 
   1253 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/scalblnd64.3m.htm */
   1254 _Decimal64 __cdecl scalblnd64(_Decimal64 _X, long int _Y);
   1255 _Decimal128 __cdecl scalblnd128(_Decimal128 _X, long int _Y);
   1256 _Decimal32 __cdecl scalblnd32(_Decimal32 _X, long int _Y);
   1257 
   1258 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/ldexpd64.3m.htm */
   1259 _Decimal64 __cdecl ldexpd64(_Decimal64 _X, int _Y);
   1260 _Decimal128 __cdecl ldexpd128(_Decimal128 _X, int _Y);
   1261 _Decimal32 __cdecl ldexpd32(_Decimal32 _X, int _Y);
   1262 
   1263 /*** rounding to integral floating ***/
   1264 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/ceild64.3m.htm */
   1265 _Decimal64 __cdecl ceild64(_Decimal64 _X);
   1266 _Decimal128 __cdecl ceild128(_Decimal128 _X);
   1267 _Decimal32 __cdecl ceild32(_Decimal32 _X);
   1268 
   1269 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/floord64.3m.htm */
   1270 _Decimal64 __cdecl floord64(_Decimal64 _X);
   1271 _Decimal128 __cdecl floord128(_Decimal128 _X);
   1272 _Decimal32 __cdecl floord32(_Decimal32 _X);
   1273 
   1274 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/truncd64.3m.htm */
   1275 _Decimal64 __cdecl truncd64(_Decimal64 _X);
   1276 _Decimal128 __cdecl truncd128(_Decimal128 _X);
   1277 _Decimal32 __cdecl truncd32(_Decimal32 _X);
   1278 
   1279 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/roundd64.3m.htm */
   1280 _Decimal64 __cdecl roundd64(_Decimal64 _X);
   1281 _Decimal128 __cdecl roundd128(_Decimal128 _X);
   1282 _Decimal32 __cdecl roundd32(_Decimal32 _X);
   1283 
   1284 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/rintd64.3m.htm */
   1285 _Decimal64 __cdecl rintd64(_Decimal64 _X);
   1286 _Decimal128 __cdecl rintd128(_Decimal128 _X);
   1287 _Decimal32 __cdecl rintd32(_Decimal32 _X);
   1288 
   1289 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/nearbyintd64.3m.htm */
   1290 _Decimal64 __cdecl nearbyintd64(_Decimal64 _X);
   1291 _Decimal128 __cdecl nearbyintd128(_Decimal128 _X);
   1292 _Decimal32 __cdecl nearbyintd32(_Decimal32 _X);
   1293 
   1294 /*** rounding to integer ***/
   1295 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/lroundd64.3m.htm */
   1296 long int __cdecl lroundd64(_Decimal64 _X);
   1297 long int __cdecl lroundd128(_Decimal128 _X);
   1298 long int __cdecl lroundd32(_Decimal32 _X);
   1299 
   1300 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/llroundd64.3m.htm */
   1301 long long int __cdecl llroundd64(_Decimal64 _X);
   1302 long long int __cdecl llroundd128(_Decimal128 _X);
   1303 long long int __cdecl llroundd32(_Decimal32 _X);
   1304 
   1305 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/lrintd64.3m.htm */
   1306 long int __cdecl lrintd64(_Decimal64 _X);
   1307 long int __cdecl lrintd128(_Decimal128 _X);
   1308 long int __cdecl lrintd32(_Decimal32 _X);
   1309 
   1310 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/llrintd64.3m.htm */
   1311 long long int __cdecl llrintd64(_Decimal64 _X);
   1312 long long int __cdecl llrintd128(_Decimal128 _X);
   1313 long long int __cdecl llrintd32(_Decimal32 _X);
   1314 
   1315 /*** integral and fractional parts ***/
   1316 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/modfd64.3m.htm */
   1317 _Decimal64 __cdecl modfd64(_Decimal64 _X, _Decimal64 *_Y);
   1318 _Decimal128 __cdecl modfd128(_Decimal128 _X, _Decimal128 *_Y);
   1319 _Decimal32 __cdecl modfd32(_Decimal32 _X, _Decimal32 *_Y);
   1320 
   1321 /** remainder/mod ***/
   1322 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/remainderd64.3m.htm */
   1323 _Decimal64 __cdecl remainderd64(_Decimal64 _X, _Decimal64 _Y);
   1324 _Decimal128 __cdecl remainderd128(_Decimal128 _X, _Decimal128 _Y);
   1325 _Decimal32 __cdecl remainderd32(_Decimal32 _X, _Decimal32 _Y);
   1326 
   1327 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/fmodd64.3m.htm */
   1328 _Decimal64 __cdecl fmodd64(_Decimal64 _X, _Decimal64 _Y);
   1329 _Decimal128 __cdecl fmodd128(_Decimal128 _X, _Decimal128 _Y);
   1330 _Decimal32 __cdecl fmodd32(_Decimal32 _X, _Decimal32 _Y);
   1331 
   1332 /*** error functions ***/
   1333 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/erfd64.3m.htm */
   1334 _Decimal64 __cdecl erfd64(_Decimal64 _X);
   1335 _Decimal128 __cdecl erfd128(_Decimal128 _X);
   1336 _Decimal32 __cdecl erfd32(_Decimal32 _X);
   1337 _Decimal64 __cdecl erfcd64(_Decimal64 _X);
   1338 _Decimal128 __cdecl erfcd128(_Decimal128 _X);
   1339 _Decimal32 __cdecl erfcd32(_Decimal32 _X);
   1340 
   1341 /*** gamma functions ***/
   1342 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/lgammad64.3m.htm */
   1343 _Decimal64 __cdecl lgammad64(_Decimal64 _X);
   1344 _Decimal128 __cdecl lgammad128(_Decimal128 _X);
   1345 _Decimal32 __cdecl lgammad32(_Decimal32 _X);
   1346 
   1347 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/tgammad64.3m.htm */
   1348 _Decimal64 __cdecl tgammad64(_Decimal64 _X);
   1349 _Decimal128 __cdecl tgammad128(_Decimal128 _X);
   1350 _Decimal32 __cdecl tgammad32(_Decimal32 _X);
   1351 
   1352 /*** next value ***/
   1353 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/nextafterd64.3m.htm */
   1354 _Decimal64 __cdecl nextafterd64(_Decimal64 _X, _Decimal64 _Y);
   1355 _Decimal128 __cdecl nextafterd128(_Decimal128 _X, _Decimal128 _Y);
   1356 _Decimal32 __cdecl nextafterd32(_Decimal32 _X, _Decimal32 _Y);
   1357 _Decimal64 __cdecl nexttowardd64(_Decimal64 _X, _Decimal128 _Y);
   1358 _Decimal128 __cdecl nexttowardd128(_Decimal128 _X, _Decimal128 _Y);
   1359 _Decimal32 __cdecl nexttowardd32(_Decimal32 _X, _Decimal128 _Y);
   1360 
   1361 /*** absolute value, copy sign ***/
   1362 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/fabsd64.3m.htm */
   1363 _Decimal64 __cdecl fabsd64(_Decimal64 _X);
   1364 _Decimal128 __cdecl fabsd128(_Decimal128 _X);
   1365 _Decimal32 __cdecl fabsd32(_Decimal32 _X);
   1366 
   1367 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/copysignd64.3m.htm */
   1368 _Decimal64 __cdecl copysignd64(_Decimal64 _X, _Decimal64 _Y);
   1369 _Decimal128 __cdecl copysignd128(_Decimal128 _X, _Decimal128 _Y);
   1370 _Decimal32 __cdecl copysignd32(_Decimal32 _X, _Decimal32 _Y);
   1371 
   1372 /*** max, min, positive difference ***/
   1373 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/fmaxd64.3m.htm */
   1374 _Decimal64 __cdecl fmaxd64(_Decimal64 _X, _Decimal64 y_Y);
   1375 _Decimal128 __cdecl fmaxd128(_Decimal128 _X, _Decimal128 _Y);
   1376 _Decimal32 __cdecl fmaxd32(_Decimal32 _X, _Decimal32 _Y);
   1377 
   1378 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/fmind64.3m.htm */
   1379 _Decimal64 __cdecl fmind64(_Decimal64 _X, _Decimal64 _Y);
   1380 _Decimal128 __cdecl fmind128(_Decimal128 _X, _Decimal128 _Y);
   1381 _Decimal32 __cdecl fmind32(_Decimal32 _X, _Decimal32 _Y);
   1382 
   1383 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/fdimd64.3m.htm */
   1384 _Decimal64 __cdecl fdimd64(_Decimal64 _X, _Decimal64 _Y);
   1385 _Decimal128 __cdecl fdimd128(_Decimal128 _X, _Decimal128 _Y);
   1386 _Decimal32 __cdecl fdimd32(_Decimal32 _X, _Decimal32 _Y);
   1387 
   1388 /*** not-a-number ***/
   1389 /* http://h21007.www2.hp.com/portal/download/files/unprot/fp/manpages/nand64.3m.htm */
   1390 _Decimal64 __cdecl nand64(__UNUSED_PARAM(const char *_X));
   1391 _Decimal128 __cdecl nand128(__UNUSED_PARAM(const char *_X));
   1392 _Decimal32 __cdecl nand32(__UNUSED_PARAM(const char *_X));
   1393 
   1394 /*** classifiers ***/
   1395 int __cdecl isinfd64(_Decimal64 _X);
   1396 int __cdecl isinfd128(_Decimal128 _X);
   1397 int __cdecl isinfd32(_Decimal32 _X);
   1398 int __cdecl isnand64(_Decimal64 _X);
   1399 int __cdecl isnand128(_Decimal128 _X);
   1400 int __cdecl isnand32(_Decimal32 _X);
   1401 
   1402 #endif /* __STDC_WANT_DEC_FP__ */
   1403 
   1404 #ifdef __cplusplus
   1405 }
   1406 #endif
   1407 
   1408 #endif	/* Not RC_INVOKED */
   1409 
   1410 #pragma pack(pop)
   1411 
   1412 #endif /* End _MATH_H_ */
   1413