Home | History | Annotate | Line # | Download | only in intrinsics
      1      1.1  mrg /* Implementation of various C99 functions
      2  1.1.1.3  mrg    Copyright (C) 2004-2022 Free Software Foundation, Inc.
      3      1.1  mrg 
      4      1.1  mrg This file is part of the GNU Fortran 95 runtime library (libgfortran).
      5      1.1  mrg 
      6      1.1  mrg Libgfortran is free software; you can redistribute it and/or
      7      1.1  mrg modify it under the terms of the GNU General Public
      8      1.1  mrg License as published by the Free Software Foundation; either
      9      1.1  mrg version 3 of the License, or (at your option) any later version.
     10      1.1  mrg 
     11      1.1  mrg Libgfortran is distributed in the hope that it will be useful,
     12      1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     13      1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14      1.1  mrg GNU General Public License for more details.
     15      1.1  mrg 
     16      1.1  mrg Under Section 7 of GPL version 3, you are granted additional
     17      1.1  mrg permissions described in the GCC Runtime Library Exception, version
     18      1.1  mrg 3.1, as published by the Free Software Foundation.
     19      1.1  mrg 
     20      1.1  mrg You should have received a copy of the GNU General Public License and
     21      1.1  mrg a copy of the GCC Runtime Library Exception along with this program;
     22      1.1  mrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23      1.1  mrg <http://www.gnu.org/licenses/>.  */
     24      1.1  mrg 
     25      1.1  mrg #include "config.h"
     26      1.1  mrg 
     27      1.1  mrg #define C99_PROTOS_H WE_DONT_WANT_PROTOS_NOW
     28      1.1  mrg #include "libgfortran.h"
     29      1.1  mrg 
     30      1.1  mrg /* On a C99 system "I" (with I*I = -1) should be defined in complex.h;
     31      1.1  mrg    if not, we define a fallback version here.  */
     32      1.1  mrg #ifndef I
     33      1.1  mrg # if defined(_Imaginary_I)
     34      1.1  mrg #   define I _Imaginary_I
     35      1.1  mrg # elif defined(_Complex_I)
     36      1.1  mrg #   define I _Complex_I
     37      1.1  mrg # else
     38      1.1  mrg #   define I (1.0fi)
     39      1.1  mrg # endif
     40      1.1  mrg #endif
     41      1.1  mrg 
     42      1.1  mrg /* Macros to get real and imaginary parts of a complex, and set
     43      1.1  mrg    a complex value.  */
     44      1.1  mrg #define REALPART(z) (__real__(z))
     45      1.1  mrg #define IMAGPART(z) (__imag__(z))
     46      1.1  mrg #define COMPLEX_ASSIGN(z_, r_, i_) {__real__(z_) = (r_); __imag__(z_) = (i_);}
     47      1.1  mrg 
     48      1.1  mrg 
     49      1.1  mrg /* Prototypes are included to silence -Wstrict-prototypes
     50      1.1  mrg    -Wmissing-prototypes.  */
     51      1.1  mrg 
     52      1.1  mrg 
     53      1.1  mrg /* Wrappers for systems without the various C99 single precision Bessel
     54      1.1  mrg    functions.  */
     55      1.1  mrg 
     56      1.1  mrg #if defined(HAVE_J0) && ! defined(HAVE_J0F)
     57      1.1  mrg #define HAVE_J0F 1
     58      1.1  mrg float j0f (float);
     59      1.1  mrg 
     60      1.1  mrg float
     61      1.1  mrg j0f (float x)
     62      1.1  mrg {
     63      1.1  mrg   return (float) j0 ((double) x);
     64      1.1  mrg }
     65      1.1  mrg #endif
     66      1.1  mrg 
     67      1.1  mrg #if defined(HAVE_J1) && !defined(HAVE_J1F)
     68      1.1  mrg #define HAVE_J1F 1
     69      1.1  mrg float j1f (float);
     70      1.1  mrg 
     71      1.1  mrg float j1f (float x)
     72      1.1  mrg {
     73      1.1  mrg   return (float) j1 ((double) x);
     74      1.1  mrg }
     75      1.1  mrg #endif
     76      1.1  mrg 
     77      1.1  mrg #if defined(HAVE_JN) && !defined(HAVE_JNF)
     78      1.1  mrg #define HAVE_JNF 1
     79      1.1  mrg float jnf (int, float);
     80      1.1  mrg 
     81      1.1  mrg float
     82      1.1  mrg jnf (int n, float x)
     83      1.1  mrg {
     84      1.1  mrg   return (float) jn (n, (double) x);
     85      1.1  mrg }
     86      1.1  mrg #endif
     87      1.1  mrg 
     88      1.1  mrg #if defined(HAVE_Y0) && !defined(HAVE_Y0F)
     89      1.1  mrg #define HAVE_Y0F 1
     90      1.1  mrg float y0f (float);
     91      1.1  mrg 
     92      1.1  mrg float
     93      1.1  mrg y0f (float x)
     94      1.1  mrg {
     95      1.1  mrg   return (float) y0 ((double) x);
     96      1.1  mrg }
     97      1.1  mrg #endif
     98      1.1  mrg 
     99      1.1  mrg #if defined(HAVE_Y1) && !defined(HAVE_Y1F)
    100      1.1  mrg #define HAVE_Y1F 1
    101      1.1  mrg float y1f (float);
    102      1.1  mrg 
    103      1.1  mrg float
    104      1.1  mrg y1f (float x)
    105      1.1  mrg {
    106      1.1  mrg   return (float) y1 ((double) x);
    107      1.1  mrg }
    108      1.1  mrg #endif
    109      1.1  mrg 
    110      1.1  mrg #if defined(HAVE_YN) && !defined(HAVE_YNF)
    111      1.1  mrg #define HAVE_YNF 1
    112      1.1  mrg float ynf (int, float);
    113      1.1  mrg 
    114      1.1  mrg float
    115      1.1  mrg ynf (int n, float x)
    116      1.1  mrg {
    117      1.1  mrg   return (float) yn (n, (double) x);
    118      1.1  mrg }
    119      1.1  mrg #endif
    120      1.1  mrg 
    121      1.1  mrg 
    122      1.1  mrg /* Wrappers for systems without the C99 erff() and erfcf() functions.  */
    123      1.1  mrg 
    124      1.1  mrg #if defined(HAVE_ERF) && !defined(HAVE_ERFF)
    125      1.1  mrg #define HAVE_ERFF 1
    126      1.1  mrg float erff (float);
    127      1.1  mrg 
    128      1.1  mrg float
    129      1.1  mrg erff (float x)
    130      1.1  mrg {
    131      1.1  mrg   return (float) erf ((double) x);
    132      1.1  mrg }
    133      1.1  mrg #endif
    134      1.1  mrg 
    135      1.1  mrg #if defined(HAVE_ERFC) && !defined(HAVE_ERFCF)
    136      1.1  mrg #define HAVE_ERFCF 1
    137      1.1  mrg float erfcf (float);
    138      1.1  mrg 
    139      1.1  mrg float
    140      1.1  mrg erfcf (float x)
    141      1.1  mrg {
    142      1.1  mrg   return (float) erfc ((double) x);
    143      1.1  mrg }
    144      1.1  mrg #endif
    145      1.1  mrg 
    146      1.1  mrg 
    147      1.1  mrg #ifndef HAVE_ACOSF
    148      1.1  mrg #define HAVE_ACOSF 1
    149      1.1  mrg float acosf (float x);
    150      1.1  mrg 
    151      1.1  mrg float
    152      1.1  mrg acosf (float x)
    153      1.1  mrg {
    154      1.1  mrg   return (float) acos (x);
    155      1.1  mrg }
    156      1.1  mrg #endif
    157      1.1  mrg 
    158      1.1  mrg #if HAVE_ACOSH && !HAVE_ACOSHF
    159      1.1  mrg float acoshf (float x);
    160      1.1  mrg 
    161      1.1  mrg float
    162      1.1  mrg acoshf (float x)
    163      1.1  mrg {
    164      1.1  mrg   return (float) acosh ((double) x);
    165      1.1  mrg }
    166      1.1  mrg #endif
    167      1.1  mrg 
    168      1.1  mrg #ifndef HAVE_ASINF
    169      1.1  mrg #define HAVE_ASINF 1
    170      1.1  mrg float asinf (float x);
    171      1.1  mrg 
    172      1.1  mrg float
    173      1.1  mrg asinf (float x)
    174      1.1  mrg {
    175      1.1  mrg   return (float) asin (x);
    176      1.1  mrg }
    177      1.1  mrg #endif
    178      1.1  mrg 
    179      1.1  mrg #if HAVE_ASINH && !HAVE_ASINHF
    180      1.1  mrg float asinhf (float x);
    181      1.1  mrg 
    182      1.1  mrg float
    183      1.1  mrg asinhf (float x)
    184      1.1  mrg {
    185      1.1  mrg   return (float) asinh ((double) x);
    186      1.1  mrg }
    187      1.1  mrg #endif
    188      1.1  mrg 
    189      1.1  mrg #ifndef HAVE_ATAN2F
    190      1.1  mrg #define HAVE_ATAN2F 1
    191      1.1  mrg float atan2f (float y, float x);
    192      1.1  mrg 
    193      1.1  mrg float
    194      1.1  mrg atan2f (float y, float x)
    195      1.1  mrg {
    196      1.1  mrg   return (float) atan2 (y, x);
    197      1.1  mrg }
    198      1.1  mrg #endif
    199      1.1  mrg 
    200      1.1  mrg #ifndef HAVE_ATANF
    201      1.1  mrg #define HAVE_ATANF 1
    202      1.1  mrg float atanf (float x);
    203      1.1  mrg 
    204      1.1  mrg float
    205      1.1  mrg atanf (float x)
    206      1.1  mrg {
    207      1.1  mrg   return (float) atan (x);
    208      1.1  mrg }
    209      1.1  mrg #endif
    210      1.1  mrg 
    211      1.1  mrg #if HAVE_ATANH && !HAVE_ATANHF
    212      1.1  mrg float atanhf (float x);
    213      1.1  mrg 
    214      1.1  mrg float
    215      1.1  mrg atanhf (float x)
    216      1.1  mrg {
    217      1.1  mrg   return (float) atanh ((double) x);
    218      1.1  mrg }
    219      1.1  mrg #endif
    220      1.1  mrg 
    221      1.1  mrg #ifndef HAVE_CEILF
    222      1.1  mrg #define HAVE_CEILF 1
    223      1.1  mrg float ceilf (float x);
    224      1.1  mrg 
    225      1.1  mrg float
    226      1.1  mrg ceilf (float x)
    227      1.1  mrg {
    228      1.1  mrg   return (float) ceil (x);
    229      1.1  mrg }
    230      1.1  mrg #endif
    231      1.1  mrg 
    232  1.1.1.2  mrg #if !defined(HAVE_COPYSIGN) && defined(HAVE_INLINE_BUILTIN_COPYSIGN)
    233  1.1.1.2  mrg #define HAVE_COPYSIGN 1
    234  1.1.1.2  mrg double copysign (double x, double y);
    235  1.1.1.2  mrg 
    236  1.1.1.2  mrg double
    237  1.1.1.2  mrg copysign (double x, double y)
    238  1.1.1.2  mrg {
    239  1.1.1.2  mrg   return __builtin_copysign (x, y);
    240  1.1.1.2  mrg }
    241  1.1.1.2  mrg #endif
    242  1.1.1.2  mrg 
    243      1.1  mrg #ifndef HAVE_COPYSIGNF
    244      1.1  mrg #define HAVE_COPYSIGNF 1
    245      1.1  mrg float copysignf (float x, float y);
    246      1.1  mrg 
    247      1.1  mrg float
    248      1.1  mrg copysignf (float x, float y)
    249      1.1  mrg {
    250      1.1  mrg   return (float) copysign (x, y);
    251      1.1  mrg }
    252      1.1  mrg #endif
    253      1.1  mrg 
    254  1.1.1.2  mrg #if !defined(HAVE_COPYSIGNL) && defined(HAVE_INLINE_BUILTIN_COPYSIGNL)
    255  1.1.1.2  mrg #define HAVE_COPYSIGNL 1
    256  1.1.1.2  mrg long double copysignl (long double x, long double y);
    257  1.1.1.2  mrg 
    258  1.1.1.2  mrg long double
    259  1.1.1.2  mrg copysignl (long double x, long double y)
    260  1.1.1.2  mrg {
    261  1.1.1.2  mrg   return __builtin_copysignl (x, y);
    262  1.1.1.2  mrg }
    263  1.1.1.2  mrg #endif
    264  1.1.1.2  mrg 
    265      1.1  mrg #ifndef HAVE_COSF
    266      1.1  mrg #define HAVE_COSF 1
    267      1.1  mrg float cosf (float x);
    268      1.1  mrg 
    269      1.1  mrg float
    270      1.1  mrg cosf (float x)
    271      1.1  mrg {
    272      1.1  mrg   return (float) cos (x);
    273      1.1  mrg }
    274      1.1  mrg #endif
    275      1.1  mrg 
    276      1.1  mrg #ifndef HAVE_COSHF
    277      1.1  mrg #define HAVE_COSHF 1
    278      1.1  mrg float coshf (float x);
    279      1.1  mrg 
    280      1.1  mrg float
    281      1.1  mrg coshf (float x)
    282      1.1  mrg {
    283      1.1  mrg   return (float) cosh (x);
    284      1.1  mrg }
    285      1.1  mrg #endif
    286      1.1  mrg 
    287      1.1  mrg #ifndef HAVE_EXPF
    288      1.1  mrg #define HAVE_EXPF 1
    289      1.1  mrg float expf (float x);
    290      1.1  mrg 
    291      1.1  mrg float
    292      1.1  mrg expf (float x)
    293      1.1  mrg {
    294      1.1  mrg   return (float) exp (x);
    295      1.1  mrg }
    296      1.1  mrg #endif
    297      1.1  mrg 
    298  1.1.1.2  mrg #if !defined(HAVE_FABS) && defined(HAVE_INLINE_BUILTIN_FABS)
    299  1.1.1.2  mrg #define HAVE_FABS 1
    300  1.1.1.2  mrg double fabs (double x);
    301  1.1.1.2  mrg 
    302  1.1.1.2  mrg double
    303  1.1.1.2  mrg fabs (double x)
    304  1.1.1.2  mrg {
    305  1.1.1.2  mrg   return __builtin_fabs (x);
    306  1.1.1.2  mrg }
    307  1.1.1.2  mrg #endif
    308  1.1.1.2  mrg 
    309      1.1  mrg #ifndef HAVE_FABSF
    310      1.1  mrg #define HAVE_FABSF 1
    311      1.1  mrg float fabsf (float x);
    312      1.1  mrg 
    313      1.1  mrg float
    314      1.1  mrg fabsf (float x)
    315      1.1  mrg {
    316      1.1  mrg   return (float) fabs (x);
    317      1.1  mrg }
    318      1.1  mrg #endif
    319      1.1  mrg 
    320  1.1.1.2  mrg #if !defined(HAVE_FABSL) && defined(HAVE_INLINE_BUILTIN_FABSL)
    321  1.1.1.2  mrg #define HAVE_FABSL 1
    322  1.1.1.2  mrg long double fabsl (long double x);
    323  1.1.1.2  mrg 
    324  1.1.1.2  mrg long double
    325  1.1.1.2  mrg fabsl (long double x)
    326  1.1.1.2  mrg {
    327  1.1.1.2  mrg   return __builtin_fabsl (x);
    328  1.1.1.2  mrg }
    329  1.1.1.2  mrg #endif
    330  1.1.1.2  mrg 
    331      1.1  mrg #ifndef HAVE_FLOORF
    332      1.1  mrg #define HAVE_FLOORF 1
    333      1.1  mrg float floorf (float x);
    334      1.1  mrg 
    335      1.1  mrg float
    336      1.1  mrg floorf (float x)
    337      1.1  mrg {
    338      1.1  mrg   return (float) floor (x);
    339      1.1  mrg }
    340      1.1  mrg #endif
    341      1.1  mrg 
    342      1.1  mrg #ifndef HAVE_FMODF
    343      1.1  mrg #define HAVE_FMODF 1
    344      1.1  mrg float fmodf (float x, float y);
    345      1.1  mrg 
    346      1.1  mrg float
    347      1.1  mrg fmodf (float x, float y)
    348      1.1  mrg {
    349      1.1  mrg   return (float) fmod (x, y);
    350      1.1  mrg }
    351      1.1  mrg #endif
    352      1.1  mrg 
    353      1.1  mrg #ifndef HAVE_FREXPF
    354      1.1  mrg #define HAVE_FREXPF 1
    355      1.1  mrg float frexpf (float x, int *exp);
    356      1.1  mrg 
    357      1.1  mrg float
    358      1.1  mrg frexpf (float x, int *exp)
    359      1.1  mrg {
    360      1.1  mrg   return (float) frexp (x, exp);
    361      1.1  mrg }
    362      1.1  mrg #endif
    363      1.1  mrg 
    364      1.1  mrg #ifndef HAVE_HYPOTF
    365      1.1  mrg #define HAVE_HYPOTF 1
    366      1.1  mrg float hypotf (float x, float y);
    367      1.1  mrg 
    368      1.1  mrg float
    369      1.1  mrg hypotf (float x, float y)
    370      1.1  mrg {
    371      1.1  mrg   return (float) hypot (x, y);
    372      1.1  mrg }
    373      1.1  mrg #endif
    374      1.1  mrg 
    375      1.1  mrg #ifndef HAVE_LOGF
    376      1.1  mrg #define HAVE_LOGF 1
    377      1.1  mrg float logf (float x);
    378      1.1  mrg 
    379      1.1  mrg float
    380      1.1  mrg logf (float x)
    381      1.1  mrg {
    382      1.1  mrg   return (float) log (x);
    383      1.1  mrg }
    384      1.1  mrg #endif
    385      1.1  mrg 
    386      1.1  mrg #ifndef HAVE_LOG10F
    387      1.1  mrg #define HAVE_LOG10F 1
    388      1.1  mrg float log10f (float x);
    389      1.1  mrg 
    390      1.1  mrg float
    391      1.1  mrg log10f (float x)
    392      1.1  mrg {
    393      1.1  mrg   return (float) log10 (x);
    394      1.1  mrg }
    395      1.1  mrg #endif
    396      1.1  mrg 
    397      1.1  mrg #ifndef HAVE_SCALBN
    398      1.1  mrg #define HAVE_SCALBN 1
    399      1.1  mrg double scalbn (double x, int y);
    400      1.1  mrg 
    401      1.1  mrg double
    402      1.1  mrg scalbn (double x, int y)
    403      1.1  mrg {
    404      1.1  mrg #if (FLT_RADIX == 2) && defined(HAVE_LDEXP)
    405      1.1  mrg   return ldexp (x, y);
    406      1.1  mrg #else
    407      1.1  mrg   return x * pow (FLT_RADIX, y);
    408      1.1  mrg #endif
    409      1.1  mrg }
    410      1.1  mrg #endif
    411      1.1  mrg 
    412      1.1  mrg #ifndef HAVE_SCALBNF
    413      1.1  mrg #define HAVE_SCALBNF 1
    414      1.1  mrg float scalbnf (float x, int y);
    415      1.1  mrg 
    416      1.1  mrg float
    417      1.1  mrg scalbnf (float x, int y)
    418      1.1  mrg {
    419      1.1  mrg   return (float) scalbn (x, y);
    420      1.1  mrg }
    421      1.1  mrg #endif
    422      1.1  mrg 
    423      1.1  mrg #ifndef HAVE_SINF
    424      1.1  mrg #define HAVE_SINF 1
    425      1.1  mrg float sinf (float x);
    426      1.1  mrg 
    427      1.1  mrg float
    428      1.1  mrg sinf (float x)
    429      1.1  mrg {
    430      1.1  mrg   return (float) sin (x);
    431      1.1  mrg }
    432      1.1  mrg #endif
    433      1.1  mrg 
    434      1.1  mrg #ifndef HAVE_SINHF
    435      1.1  mrg #define HAVE_SINHF 1
    436      1.1  mrg float sinhf (float x);
    437      1.1  mrg 
    438      1.1  mrg float
    439      1.1  mrg sinhf (float x)
    440      1.1  mrg {
    441      1.1  mrg   return (float) sinh (x);
    442      1.1  mrg }
    443      1.1  mrg #endif
    444      1.1  mrg 
    445      1.1  mrg #ifndef HAVE_SQRTF
    446      1.1  mrg #define HAVE_SQRTF 1
    447      1.1  mrg float sqrtf (float x);
    448      1.1  mrg 
    449      1.1  mrg float
    450      1.1  mrg sqrtf (float x)
    451      1.1  mrg {
    452      1.1  mrg   return (float) sqrt (x);
    453      1.1  mrg }
    454      1.1  mrg #endif
    455      1.1  mrg 
    456      1.1  mrg #ifndef HAVE_TANF
    457      1.1  mrg #define HAVE_TANF 1
    458      1.1  mrg float tanf (float x);
    459      1.1  mrg 
    460      1.1  mrg float
    461      1.1  mrg tanf (float x)
    462      1.1  mrg {
    463      1.1  mrg   return (float) tan (x);
    464      1.1  mrg }
    465      1.1  mrg #endif
    466      1.1  mrg 
    467      1.1  mrg #ifndef HAVE_TANHF
    468      1.1  mrg #define HAVE_TANHF 1
    469      1.1  mrg float tanhf (float x);
    470      1.1  mrg 
    471      1.1  mrg float
    472      1.1  mrg tanhf (float x)
    473      1.1  mrg {
    474      1.1  mrg   return (float) tanh (x);
    475      1.1  mrg }
    476      1.1  mrg #endif
    477      1.1  mrg 
    478      1.1  mrg #ifndef HAVE_TRUNC
    479      1.1  mrg #define HAVE_TRUNC 1
    480      1.1  mrg double trunc (double x);
    481      1.1  mrg 
    482      1.1  mrg double
    483      1.1  mrg trunc (double x)
    484      1.1  mrg {
    485      1.1  mrg   if (!isfinite (x))
    486      1.1  mrg     return x;
    487      1.1  mrg 
    488      1.1  mrg   if (x < 0.0)
    489      1.1  mrg     return - floor (-x);
    490      1.1  mrg   else
    491      1.1  mrg     return floor (x);
    492      1.1  mrg }
    493      1.1  mrg #endif
    494      1.1  mrg 
    495      1.1  mrg #ifndef HAVE_TRUNCF
    496      1.1  mrg #define HAVE_TRUNCF 1
    497      1.1  mrg float truncf (float x);
    498      1.1  mrg 
    499      1.1  mrg float
    500      1.1  mrg truncf (float x)
    501      1.1  mrg {
    502      1.1  mrg   return (float) trunc (x);
    503      1.1  mrg }
    504      1.1  mrg #endif
    505      1.1  mrg 
    506      1.1  mrg #ifndef HAVE_NEXTAFTERF
    507      1.1  mrg #define HAVE_NEXTAFTERF 1
    508      1.1  mrg /* This is a portable implementation of nextafterf that is intended to be
    509      1.1  mrg    independent of the floating point format or its in memory representation.
    510      1.1  mrg    This implementation works correctly with denormalized values.  */
    511      1.1  mrg float nextafterf (float x, float y);
    512      1.1  mrg 
    513      1.1  mrg float
    514      1.1  mrg nextafterf (float x, float y)
    515      1.1  mrg {
    516      1.1  mrg   /* This variable is marked volatile to avoid excess precision problems
    517      1.1  mrg      on some platforms, including IA-32.  */
    518      1.1  mrg   volatile float delta;
    519      1.1  mrg   float absx, denorm_min;
    520      1.1  mrg 
    521      1.1  mrg   if (isnan (x) || isnan (y))
    522      1.1  mrg     return x + y;
    523      1.1  mrg   if (x == y)
    524      1.1  mrg     return x;
    525      1.1  mrg   if (!isfinite (x))
    526      1.1  mrg     return x > 0 ? __FLT_MAX__ : - __FLT_MAX__;
    527      1.1  mrg 
    528      1.1  mrg   /* absx = fabsf (x);  */
    529      1.1  mrg   absx = (x < 0.0) ? -x : x;
    530      1.1  mrg 
    531      1.1  mrg   /* __FLT_DENORM_MIN__ is non-zero iff the target supports denormals.  */
    532      1.1  mrg   if (__FLT_DENORM_MIN__ == 0.0f)
    533      1.1  mrg     denorm_min = __FLT_MIN__;
    534      1.1  mrg   else
    535      1.1  mrg     denorm_min = __FLT_DENORM_MIN__;
    536      1.1  mrg 
    537      1.1  mrg   if (absx < __FLT_MIN__)
    538      1.1  mrg     delta = denorm_min;
    539      1.1  mrg   else
    540      1.1  mrg     {
    541      1.1  mrg       float frac;
    542      1.1  mrg       int exp;
    543      1.1  mrg 
    544      1.1  mrg       /* Discard the fraction from x.  */
    545      1.1  mrg       frac = frexpf (absx, &exp);
    546      1.1  mrg       delta = scalbnf (0.5f, exp);
    547      1.1  mrg 
    548      1.1  mrg       /* Scale x by the epsilon of the representation.  By rights we should
    549      1.1  mrg 	 have been able to combine this with scalbnf, but some targets don't
    550      1.1  mrg 	 get that correct with denormals.  */
    551      1.1  mrg       delta *= __FLT_EPSILON__;
    552      1.1  mrg 
    553      1.1  mrg       /* If we're going to be reducing the absolute value of X, and doing so
    554      1.1  mrg 	 would reduce the exponent of X, then the delta to be applied is
    555      1.1  mrg 	 one exponent smaller.  */
    556      1.1  mrg       if (frac == 0.5f && (y < x) == (x > 0))
    557      1.1  mrg 	delta *= 0.5f;
    558      1.1  mrg 
    559      1.1  mrg       /* If that underflows to zero, then we're back to the minimum.  */
    560      1.1  mrg       if (delta == 0.0f)
    561      1.1  mrg 	delta = denorm_min;
    562      1.1  mrg     }
    563      1.1  mrg 
    564      1.1  mrg   if (y < x)
    565      1.1  mrg     delta = -delta;
    566      1.1  mrg 
    567      1.1  mrg   return x + delta;
    568      1.1  mrg }
    569      1.1  mrg #endif
    570      1.1  mrg 
    571      1.1  mrg 
    572      1.1  mrg #ifndef HAVE_POWF
    573      1.1  mrg #define HAVE_POWF 1
    574      1.1  mrg float powf (float x, float y);
    575      1.1  mrg 
    576      1.1  mrg float
    577      1.1  mrg powf (float x, float y)
    578      1.1  mrg {
    579      1.1  mrg   return (float) pow (x, y);
    580      1.1  mrg }
    581      1.1  mrg #endif
    582      1.1  mrg 
    583      1.1  mrg 
    584      1.1  mrg #ifndef HAVE_ROUND
    585      1.1  mrg #define HAVE_ROUND 1
    586      1.1  mrg /* Round to nearest integral value.  If the argument is halfway between two
    587      1.1  mrg    integral values then round away from zero.  */
    588      1.1  mrg double round (double x);
    589      1.1  mrg 
    590      1.1  mrg double
    591      1.1  mrg round (double x)
    592      1.1  mrg {
    593      1.1  mrg    double t;
    594      1.1  mrg    if (!isfinite (x))
    595      1.1  mrg      return (x);
    596      1.1  mrg 
    597      1.1  mrg    if (x >= 0.0)
    598      1.1  mrg     {
    599      1.1  mrg       t = floor (x);
    600      1.1  mrg       if (t - x <= -0.5)
    601      1.1  mrg 	t += 1.0;
    602      1.1  mrg       return (t);
    603      1.1  mrg     }
    604      1.1  mrg    else
    605      1.1  mrg     {
    606      1.1  mrg       t = floor (-x);
    607      1.1  mrg       if (t + x <= -0.5)
    608      1.1  mrg 	t += 1.0;
    609      1.1  mrg       return (-t);
    610      1.1  mrg     }
    611      1.1  mrg }
    612      1.1  mrg #endif
    613      1.1  mrg 
    614      1.1  mrg 
    615      1.1  mrg /* Algorithm by Steven G. Kargl.  */
    616      1.1  mrg 
    617      1.1  mrg #if !defined(HAVE_ROUNDL)
    618      1.1  mrg #define HAVE_ROUNDL 1
    619      1.1  mrg long double roundl (long double x);
    620      1.1  mrg 
    621      1.1  mrg #if defined(HAVE_CEILL)
    622      1.1  mrg /* Round to nearest integral value.  If the argument is halfway between two
    623      1.1  mrg    integral values then round away from zero.  */
    624      1.1  mrg 
    625      1.1  mrg long double
    626      1.1  mrg roundl (long double x)
    627      1.1  mrg {
    628      1.1  mrg    long double t;
    629      1.1  mrg    if (!isfinite (x))
    630      1.1  mrg      return (x);
    631      1.1  mrg 
    632      1.1  mrg    if (x >= 0.0)
    633      1.1  mrg     {
    634      1.1  mrg       t = ceill (x);
    635      1.1  mrg       if (t - x > 0.5)
    636      1.1  mrg 	t -= 1.0;
    637      1.1  mrg       return (t);
    638      1.1  mrg     }
    639      1.1  mrg    else
    640      1.1  mrg     {
    641      1.1  mrg       t = ceill (-x);
    642      1.1  mrg       if (t + x > 0.5)
    643      1.1  mrg 	t -= 1.0;
    644      1.1  mrg       return (-t);
    645      1.1  mrg     }
    646      1.1  mrg }
    647      1.1  mrg #else
    648      1.1  mrg 
    649      1.1  mrg /* Poor version of roundl for system that don't have ceill.  */
    650      1.1  mrg long double
    651      1.1  mrg roundl (long double x)
    652      1.1  mrg {
    653      1.1  mrg   if (x > DBL_MAX || x < -DBL_MAX)
    654      1.1  mrg     {
    655      1.1  mrg #ifdef HAVE_NEXTAFTERL
    656      1.1  mrg       long double prechalf = nextafterl (0.5L, LDBL_MAX);
    657      1.1  mrg #else
    658      1.1  mrg       static long double prechalf = 0.5L;
    659      1.1  mrg #endif
    660      1.1  mrg       return (GFC_INTEGER_LARGEST) (x + (x > 0 ? prechalf : -prechalf));
    661      1.1  mrg     }
    662      1.1  mrg   else
    663      1.1  mrg     /* Use round().  */
    664      1.1  mrg     return round ((double) x);
    665      1.1  mrg }
    666      1.1  mrg 
    667      1.1  mrg #endif
    668      1.1  mrg #endif
    669      1.1  mrg 
    670      1.1  mrg #ifndef HAVE_ROUNDF
    671      1.1  mrg #define HAVE_ROUNDF 1
    672      1.1  mrg /* Round to nearest integral value.  If the argument is halfway between two
    673      1.1  mrg    integral values then round away from zero.  */
    674      1.1  mrg float roundf (float x);
    675      1.1  mrg 
    676      1.1  mrg float
    677      1.1  mrg roundf (float x)
    678      1.1  mrg {
    679      1.1  mrg    float t;
    680      1.1  mrg    if (!isfinite (x))
    681      1.1  mrg      return (x);
    682      1.1  mrg 
    683      1.1  mrg    if (x >= 0.0)
    684      1.1  mrg     {
    685      1.1  mrg       t = floorf (x);
    686      1.1  mrg       if (t - x <= -0.5)
    687      1.1  mrg 	t += 1.0;
    688      1.1  mrg       return (t);
    689      1.1  mrg     }
    690      1.1  mrg    else
    691      1.1  mrg     {
    692      1.1  mrg       t = floorf (-x);
    693      1.1  mrg       if (t + x <= -0.5)
    694      1.1  mrg 	t += 1.0;
    695      1.1  mrg       return (-t);
    696      1.1  mrg     }
    697      1.1  mrg }
    698      1.1  mrg #endif
    699      1.1  mrg 
    700      1.1  mrg 
    701      1.1  mrg /* lround{f,,l} and llround{f,,l} functions.  */
    702      1.1  mrg 
    703      1.1  mrg #if !defined(HAVE_LROUNDF) && defined(HAVE_ROUNDF)
    704      1.1  mrg #define HAVE_LROUNDF 1
    705      1.1  mrg long int lroundf (float x);
    706      1.1  mrg 
    707      1.1  mrg long int
    708      1.1  mrg lroundf (float x)
    709      1.1  mrg {
    710      1.1  mrg   return (long int) roundf (x);
    711      1.1  mrg }
    712      1.1  mrg #endif
    713      1.1  mrg 
    714      1.1  mrg #if !defined(HAVE_LROUND) && defined(HAVE_ROUND)
    715      1.1  mrg #define HAVE_LROUND 1
    716      1.1  mrg long int lround (double x);
    717      1.1  mrg 
    718      1.1  mrg long int
    719      1.1  mrg lround (double x)
    720      1.1  mrg {
    721      1.1  mrg   return (long int) round (x);
    722      1.1  mrg }
    723      1.1  mrg #endif
    724      1.1  mrg 
    725      1.1  mrg #if !defined(HAVE_LROUNDL) && defined(HAVE_ROUNDL)
    726      1.1  mrg #define HAVE_LROUNDL 1
    727      1.1  mrg long int lroundl (long double x);
    728      1.1  mrg 
    729      1.1  mrg long int
    730      1.1  mrg lroundl (long double x)
    731      1.1  mrg {
    732      1.1  mrg   return (long long int) roundl (x);
    733      1.1  mrg }
    734      1.1  mrg #endif
    735      1.1  mrg 
    736      1.1  mrg #if !defined(HAVE_LLROUNDF) && defined(HAVE_ROUNDF)
    737      1.1  mrg #define HAVE_LLROUNDF 1
    738      1.1  mrg long long int llroundf (float x);
    739      1.1  mrg 
    740      1.1  mrg long long int
    741      1.1  mrg llroundf (float x)
    742      1.1  mrg {
    743      1.1  mrg   return (long long int) roundf (x);
    744      1.1  mrg }
    745      1.1  mrg #endif
    746      1.1  mrg 
    747      1.1  mrg #if !defined(HAVE_LLROUND) && defined(HAVE_ROUND)
    748      1.1  mrg #define HAVE_LLROUND 1
    749      1.1  mrg long long int llround (double x);
    750      1.1  mrg 
    751      1.1  mrg long long int
    752      1.1  mrg llround (double x)
    753      1.1  mrg {
    754      1.1  mrg   return (long long int) round (x);
    755      1.1  mrg }
    756      1.1  mrg #endif
    757      1.1  mrg 
    758      1.1  mrg #if !defined(HAVE_LLROUNDL) && defined(HAVE_ROUNDL)
    759      1.1  mrg #define HAVE_LLROUNDL 1
    760      1.1  mrg long long int llroundl (long double x);
    761      1.1  mrg 
    762      1.1  mrg long long int
    763      1.1  mrg llroundl (long double x)
    764      1.1  mrg {
    765      1.1  mrg   return (long long int) roundl (x);
    766      1.1  mrg }
    767      1.1  mrg #endif
    768      1.1  mrg 
    769      1.1  mrg 
    770      1.1  mrg #ifndef HAVE_LOG10L
    771      1.1  mrg #define HAVE_LOG10L 1
    772      1.1  mrg /* log10 function for long double variables. The version provided here
    773      1.1  mrg    reduces the argument until it fits into a double, then use log10.  */
    774      1.1  mrg long double log10l (long double x);
    775      1.1  mrg 
    776      1.1  mrg long double
    777      1.1  mrg log10l (long double x)
    778      1.1  mrg {
    779      1.1  mrg #if LDBL_MAX_EXP > DBL_MAX_EXP
    780      1.1  mrg   if (x > DBL_MAX)
    781      1.1  mrg     {
    782      1.1  mrg       double val;
    783      1.1  mrg       int p2_result = 0;
    784      1.1  mrg       if (x > 0x1p16383L) { p2_result += 16383; x /= 0x1p16383L; }
    785      1.1  mrg       if (x > 0x1p8191L) { p2_result += 8191; x /= 0x1p8191L; }
    786      1.1  mrg       if (x > 0x1p4095L) { p2_result += 4095; x /= 0x1p4095L; }
    787      1.1  mrg       if (x > 0x1p2047L) { p2_result += 2047; x /= 0x1p2047L; }
    788      1.1  mrg       if (x > 0x1p1023L) { p2_result += 1023; x /= 0x1p1023L; }
    789      1.1  mrg       val = log10 ((double) x);
    790      1.1  mrg       return (val + p2_result * .30102999566398119521373889472449302L);
    791      1.1  mrg     }
    792      1.1  mrg #endif
    793      1.1  mrg #if LDBL_MIN_EXP < DBL_MIN_EXP
    794      1.1  mrg   if (x < DBL_MIN)
    795      1.1  mrg     {
    796      1.1  mrg       double val;
    797      1.1  mrg       int p2_result = 0;
    798      1.1  mrg       if (x < 0x1p-16380L) { p2_result += 16380; x /= 0x1p-16380L; }
    799      1.1  mrg       if (x < 0x1p-8189L) { p2_result += 8189; x /= 0x1p-8189L; }
    800      1.1  mrg       if (x < 0x1p-4093L) { p2_result += 4093; x /= 0x1p-4093L; }
    801      1.1  mrg       if (x < 0x1p-2045L) { p2_result += 2045; x /= 0x1p-2045L; }
    802      1.1  mrg       if (x < 0x1p-1021L) { p2_result += 1021; x /= 0x1p-1021L; }
    803      1.1  mrg       val = fabs (log10 ((double) x));
    804      1.1  mrg       return (- val - p2_result * .30102999566398119521373889472449302L);
    805      1.1  mrg     }
    806      1.1  mrg #endif
    807      1.1  mrg     return log10 (x);
    808      1.1  mrg }
    809      1.1  mrg #endif
    810      1.1  mrg 
    811      1.1  mrg 
    812      1.1  mrg #ifndef HAVE_FLOORL
    813      1.1  mrg #define HAVE_FLOORL 1
    814      1.1  mrg long double floorl (long double x);
    815      1.1  mrg 
    816      1.1  mrg long double
    817      1.1  mrg floorl (long double x)
    818      1.1  mrg {
    819      1.1  mrg   /* Zero, possibly signed.  */
    820      1.1  mrg   if (x == 0)
    821      1.1  mrg     return x;
    822      1.1  mrg 
    823      1.1  mrg   /* Large magnitude.  */
    824      1.1  mrg   if (x > DBL_MAX || x < (-DBL_MAX))
    825      1.1  mrg     return x;
    826      1.1  mrg 
    827      1.1  mrg   /* Small positive values.  */
    828      1.1  mrg   if (x >= 0 && x < DBL_MIN)
    829      1.1  mrg     return 0;
    830      1.1  mrg 
    831      1.1  mrg   /* Small negative values.  */
    832      1.1  mrg   if (x < 0 && x > (-DBL_MIN))
    833      1.1  mrg     return -1;
    834      1.1  mrg 
    835      1.1  mrg   return floor (x);
    836      1.1  mrg }
    837      1.1  mrg #endif
    838      1.1  mrg 
    839      1.1  mrg 
    840      1.1  mrg #ifndef HAVE_FMODL
    841      1.1  mrg #define HAVE_FMODL 1
    842      1.1  mrg long double fmodl (long double x, long double y);
    843      1.1  mrg 
    844      1.1  mrg long double
    845      1.1  mrg fmodl (long double x, long double y)
    846      1.1  mrg {
    847      1.1  mrg   if (y == 0.0L)
    848      1.1  mrg     return 0.0L;
    849      1.1  mrg 
    850      1.1  mrg   /* Need to check that the result has the same sign as x and magnitude
    851      1.1  mrg      less than the magnitude of y.  */
    852      1.1  mrg   return x - floorl (x / y) * y;
    853      1.1  mrg }
    854      1.1  mrg #endif
    855      1.1  mrg 
    856      1.1  mrg 
    857      1.1  mrg #if !defined(HAVE_CABSF)
    858      1.1  mrg #define HAVE_CABSF 1
    859      1.1  mrg float cabsf (float complex z);
    860      1.1  mrg 
    861      1.1  mrg float
    862      1.1  mrg cabsf (float complex z)
    863      1.1  mrg {
    864      1.1  mrg   return hypotf (REALPART (z), IMAGPART (z));
    865      1.1  mrg }
    866      1.1  mrg #endif
    867      1.1  mrg 
    868      1.1  mrg #if !defined(HAVE_CABS)
    869      1.1  mrg #define HAVE_CABS 1
    870      1.1  mrg double cabs (double complex z);
    871      1.1  mrg 
    872      1.1  mrg double
    873      1.1  mrg cabs (double complex z)
    874      1.1  mrg {
    875      1.1  mrg   return hypot (REALPART (z), IMAGPART (z));
    876      1.1  mrg }
    877      1.1  mrg #endif
    878      1.1  mrg 
    879      1.1  mrg #if !defined(HAVE_CABSL) && defined(HAVE_HYPOTL)
    880      1.1  mrg #define HAVE_CABSL 1
    881      1.1  mrg long double cabsl (long double complex z);
    882      1.1  mrg 
    883      1.1  mrg long double
    884      1.1  mrg cabsl (long double complex z)
    885      1.1  mrg {
    886      1.1  mrg   return hypotl (REALPART (z), IMAGPART (z));
    887      1.1  mrg }
    888      1.1  mrg #endif
    889      1.1  mrg 
    890      1.1  mrg 
    891      1.1  mrg #if !defined(HAVE_CARGF)
    892      1.1  mrg #define HAVE_CARGF 1
    893      1.1  mrg float cargf (float complex z);
    894      1.1  mrg 
    895      1.1  mrg float
    896      1.1  mrg cargf (float complex z)
    897      1.1  mrg {
    898      1.1  mrg   return atan2f (IMAGPART (z), REALPART (z));
    899      1.1  mrg }
    900      1.1  mrg #endif
    901      1.1  mrg 
    902      1.1  mrg #if !defined(HAVE_CARG)
    903      1.1  mrg #define HAVE_CARG 1
    904      1.1  mrg double carg (double complex z);
    905      1.1  mrg 
    906      1.1  mrg double
    907      1.1  mrg carg (double complex z)
    908      1.1  mrg {
    909      1.1  mrg   return atan2 (IMAGPART (z), REALPART (z));
    910      1.1  mrg }
    911      1.1  mrg #endif
    912      1.1  mrg 
    913      1.1  mrg #if !defined(HAVE_CARGL) && defined(HAVE_ATAN2L)
    914      1.1  mrg #define HAVE_CARGL 1
    915      1.1  mrg long double cargl (long double complex z);
    916      1.1  mrg 
    917      1.1  mrg long double
    918      1.1  mrg cargl (long double complex z)
    919      1.1  mrg {
    920      1.1  mrg   return atan2l (IMAGPART (z), REALPART (z));
    921      1.1  mrg }
    922      1.1  mrg #endif
    923      1.1  mrg 
    924      1.1  mrg 
    925      1.1  mrg /* exp(z) = exp(a)*(cos(b) + i sin(b))  */
    926      1.1  mrg #if !defined(HAVE_CEXPF)
    927      1.1  mrg #define HAVE_CEXPF 1
    928      1.1  mrg float complex cexpf (float complex z);
    929      1.1  mrg 
    930      1.1  mrg float complex
    931      1.1  mrg cexpf (float complex z)
    932      1.1  mrg {
    933      1.1  mrg   float a, b;
    934      1.1  mrg   float complex v;
    935      1.1  mrg 
    936      1.1  mrg   a = REALPART (z);
    937      1.1  mrg   b = IMAGPART (z);
    938      1.1  mrg   COMPLEX_ASSIGN (v, cosf (b), sinf (b));
    939      1.1  mrg   return expf (a) * v;
    940      1.1  mrg }
    941      1.1  mrg #endif
    942      1.1  mrg 
    943      1.1  mrg #if !defined(HAVE_CEXP)
    944      1.1  mrg #define HAVE_CEXP 1
    945      1.1  mrg double complex cexp (double complex z);
    946      1.1  mrg 
    947      1.1  mrg double complex
    948      1.1  mrg cexp (double complex z)
    949      1.1  mrg {
    950      1.1  mrg   double a, b;
    951      1.1  mrg   double complex v;
    952      1.1  mrg 
    953      1.1  mrg   a = REALPART (z);
    954      1.1  mrg   b = IMAGPART (z);
    955      1.1  mrg   COMPLEX_ASSIGN (v, cos (b), sin (b));
    956      1.1  mrg   return exp (a) * v;
    957      1.1  mrg }
    958      1.1  mrg #endif
    959      1.1  mrg 
    960      1.1  mrg #if !defined(HAVE_CEXPL) && defined(HAVE_COSL) && defined(HAVE_SINL) && defined(HAVE_EXPL)
    961      1.1  mrg #define HAVE_CEXPL 1
    962      1.1  mrg long double complex cexpl (long double complex z);
    963      1.1  mrg 
    964      1.1  mrg long double complex
    965      1.1  mrg cexpl (long double complex z)
    966      1.1  mrg {
    967      1.1  mrg   long double a, b;
    968      1.1  mrg   long double complex v;
    969      1.1  mrg 
    970      1.1  mrg   a = REALPART (z);
    971      1.1  mrg   b = IMAGPART (z);
    972      1.1  mrg   COMPLEX_ASSIGN (v, cosl (b), sinl (b));
    973      1.1  mrg   return expl (a) * v;
    974      1.1  mrg }
    975      1.1  mrg #endif
    976      1.1  mrg 
    977      1.1  mrg 
    978      1.1  mrg /* log(z) = log (cabs(z)) + i*carg(z)  */
    979      1.1  mrg #if !defined(HAVE_CLOGF)
    980      1.1  mrg #define HAVE_CLOGF 1
    981      1.1  mrg float complex clogf (float complex z);
    982      1.1  mrg 
    983      1.1  mrg float complex
    984      1.1  mrg clogf (float complex z)
    985      1.1  mrg {
    986      1.1  mrg   float complex v;
    987      1.1  mrg 
    988      1.1  mrg   COMPLEX_ASSIGN (v, logf (cabsf (z)), cargf (z));
    989      1.1  mrg   return v;
    990      1.1  mrg }
    991      1.1  mrg #endif
    992      1.1  mrg 
    993      1.1  mrg #if !defined(HAVE_CLOG)
    994      1.1  mrg #define HAVE_CLOG 1
    995      1.1  mrg double complex clog (double complex z);
    996      1.1  mrg 
    997      1.1  mrg double complex
    998      1.1  mrg clog (double complex z)
    999      1.1  mrg {
   1000      1.1  mrg   double complex v;
   1001      1.1  mrg 
   1002      1.1  mrg   COMPLEX_ASSIGN (v, log (cabs (z)), carg (z));
   1003      1.1  mrg   return v;
   1004      1.1  mrg }
   1005      1.1  mrg #endif
   1006      1.1  mrg 
   1007      1.1  mrg #if !defined(HAVE_CLOGL) && defined(HAVE_LOGL) && defined(HAVE_CABSL) && defined(HAVE_CARGL)
   1008      1.1  mrg #define HAVE_CLOGL 1
   1009      1.1  mrg long double complex clogl (long double complex z);
   1010      1.1  mrg 
   1011      1.1  mrg long double complex
   1012      1.1  mrg clogl (long double complex z)
   1013      1.1  mrg {
   1014      1.1  mrg   long double complex v;
   1015      1.1  mrg 
   1016      1.1  mrg   COMPLEX_ASSIGN (v, logl (cabsl (z)), cargl (z));
   1017      1.1  mrg   return v;
   1018      1.1  mrg }
   1019      1.1  mrg #endif
   1020      1.1  mrg 
   1021      1.1  mrg 
   1022      1.1  mrg /* log10(z) = log10 (cabs(z)) + i*carg(z)  */
   1023      1.1  mrg #if !defined(HAVE_CLOG10F)
   1024      1.1  mrg #define HAVE_CLOG10F 1
   1025      1.1  mrg float complex clog10f (float complex z);
   1026      1.1  mrg 
   1027      1.1  mrg float complex
   1028      1.1  mrg clog10f (float complex z)
   1029      1.1  mrg {
   1030      1.1  mrg   float complex v;
   1031      1.1  mrg 
   1032      1.1  mrg   COMPLEX_ASSIGN (v, log10f (cabsf (z)), cargf (z));
   1033      1.1  mrg   return v;
   1034      1.1  mrg }
   1035      1.1  mrg #endif
   1036      1.1  mrg 
   1037      1.1  mrg #if !defined(HAVE_CLOG10)
   1038      1.1  mrg #define HAVE_CLOG10 1
   1039      1.1  mrg double complex clog10 (double complex z);
   1040      1.1  mrg 
   1041      1.1  mrg double complex
   1042      1.1  mrg clog10 (double complex z)
   1043      1.1  mrg {
   1044      1.1  mrg   double complex v;
   1045      1.1  mrg 
   1046      1.1  mrg   COMPLEX_ASSIGN (v, log10 (cabs (z)), carg (z));
   1047      1.1  mrg   return v;
   1048      1.1  mrg }
   1049      1.1  mrg #endif
   1050      1.1  mrg 
   1051      1.1  mrg #if !defined(HAVE_CLOG10L) && defined(HAVE_LOG10L) && defined(HAVE_CABSL) && defined(HAVE_CARGL)
   1052      1.1  mrg #define HAVE_CLOG10L 1
   1053      1.1  mrg long double complex clog10l (long double complex z);
   1054      1.1  mrg 
   1055      1.1  mrg long double complex
   1056      1.1  mrg clog10l (long double complex z)
   1057      1.1  mrg {
   1058      1.1  mrg   long double complex v;
   1059      1.1  mrg 
   1060      1.1  mrg   COMPLEX_ASSIGN (v, log10l (cabsl (z)), cargl (z));
   1061      1.1  mrg   return v;
   1062      1.1  mrg }
   1063      1.1  mrg #endif
   1064      1.1  mrg 
   1065      1.1  mrg 
   1066      1.1  mrg /* pow(base, power) = cexp (power * clog (base))  */
   1067      1.1  mrg #if !defined(HAVE_CPOWF)
   1068      1.1  mrg #define HAVE_CPOWF 1
   1069      1.1  mrg float complex cpowf (float complex base, float complex power);
   1070      1.1  mrg 
   1071      1.1  mrg float complex
   1072      1.1  mrg cpowf (float complex base, float complex power)
   1073      1.1  mrg {
   1074      1.1  mrg   return cexpf (power * clogf (base));
   1075      1.1  mrg }
   1076      1.1  mrg #endif
   1077      1.1  mrg 
   1078      1.1  mrg #if !defined(HAVE_CPOW)
   1079      1.1  mrg #define HAVE_CPOW 1
   1080      1.1  mrg double complex cpow (double complex base, double complex power);
   1081      1.1  mrg 
   1082      1.1  mrg double complex
   1083      1.1  mrg cpow (double complex base, double complex power)
   1084      1.1  mrg {
   1085      1.1  mrg   return cexp (power * clog (base));
   1086      1.1  mrg }
   1087      1.1  mrg #endif
   1088      1.1  mrg 
   1089      1.1  mrg #if !defined(HAVE_CPOWL) && defined(HAVE_CEXPL) && defined(HAVE_CLOGL)
   1090      1.1  mrg #define HAVE_CPOWL 1
   1091      1.1  mrg long double complex cpowl (long double complex base, long double complex power);
   1092      1.1  mrg 
   1093      1.1  mrg long double complex
   1094      1.1  mrg cpowl (long double complex base, long double complex power)
   1095      1.1  mrg {
   1096      1.1  mrg   return cexpl (power * clogl (base));
   1097      1.1  mrg }
   1098      1.1  mrg #endif
   1099      1.1  mrg 
   1100      1.1  mrg 
   1101      1.1  mrg /* sqrt(z).  Algorithm pulled from glibc.  */
   1102      1.1  mrg #if !defined(HAVE_CSQRTF)
   1103      1.1  mrg #define HAVE_CSQRTF 1
   1104      1.1  mrg float complex csqrtf (float complex z);
   1105      1.1  mrg 
   1106      1.1  mrg float complex
   1107      1.1  mrg csqrtf (float complex z)
   1108      1.1  mrg {
   1109      1.1  mrg   float re, im;
   1110      1.1  mrg   float complex v;
   1111      1.1  mrg 
   1112      1.1  mrg   re = REALPART (z);
   1113      1.1  mrg   im = IMAGPART (z);
   1114      1.1  mrg   if (im == 0)
   1115      1.1  mrg     {
   1116      1.1  mrg       if (re < 0)
   1117      1.1  mrg         {
   1118      1.1  mrg           COMPLEX_ASSIGN (v, 0, copysignf (sqrtf (-re), im));
   1119      1.1  mrg         }
   1120      1.1  mrg       else
   1121      1.1  mrg         {
   1122      1.1  mrg           COMPLEX_ASSIGN (v, fabsf (sqrtf (re)), copysignf (0, im));
   1123      1.1  mrg         }
   1124      1.1  mrg     }
   1125      1.1  mrg   else if (re == 0)
   1126      1.1  mrg     {
   1127      1.1  mrg       float r;
   1128      1.1  mrg 
   1129      1.1  mrg       r = sqrtf (0.5 * fabsf (im));
   1130      1.1  mrg 
   1131      1.1  mrg       COMPLEX_ASSIGN (v, r, copysignf (r, im));
   1132      1.1  mrg     }
   1133      1.1  mrg   else
   1134      1.1  mrg     {
   1135      1.1  mrg       float d, r, s;
   1136      1.1  mrg 
   1137      1.1  mrg       d = hypotf (re, im);
   1138      1.1  mrg       /* Use the identity   2  Re res  Im res = Im x
   1139      1.1  mrg          to avoid cancellation error in  d +/- Re x.  */
   1140      1.1  mrg       if (re > 0)
   1141      1.1  mrg         {
   1142      1.1  mrg           r = sqrtf (0.5 * d + 0.5 * re);
   1143      1.1  mrg           s = (0.5 * im) / r;
   1144      1.1  mrg         }
   1145      1.1  mrg       else
   1146      1.1  mrg         {
   1147      1.1  mrg           s = sqrtf (0.5 * d - 0.5 * re);
   1148      1.1  mrg           r = fabsf ((0.5 * im) / s);
   1149      1.1  mrg         }
   1150      1.1  mrg 
   1151      1.1  mrg       COMPLEX_ASSIGN (v, r, copysignf (s, im));
   1152      1.1  mrg     }
   1153      1.1  mrg   return v;
   1154      1.1  mrg }
   1155      1.1  mrg #endif
   1156      1.1  mrg 
   1157      1.1  mrg #if !defined(HAVE_CSQRT)
   1158      1.1  mrg #define HAVE_CSQRT 1
   1159      1.1  mrg double complex csqrt (double complex z);
   1160      1.1  mrg 
   1161      1.1  mrg double complex
   1162      1.1  mrg csqrt (double complex z)
   1163      1.1  mrg {
   1164      1.1  mrg   double re, im;
   1165      1.1  mrg   double complex v;
   1166      1.1  mrg 
   1167      1.1  mrg   re = REALPART (z);
   1168      1.1  mrg   im = IMAGPART (z);
   1169      1.1  mrg   if (im == 0)
   1170      1.1  mrg     {
   1171      1.1  mrg       if (re < 0)
   1172      1.1  mrg         {
   1173      1.1  mrg           COMPLEX_ASSIGN (v, 0, copysign (sqrt (-re), im));
   1174      1.1  mrg         }
   1175      1.1  mrg       else
   1176      1.1  mrg         {
   1177      1.1  mrg           COMPLEX_ASSIGN (v, fabs (sqrt (re)), copysign (0, im));
   1178      1.1  mrg         }
   1179      1.1  mrg     }
   1180      1.1  mrg   else if (re == 0)
   1181      1.1  mrg     {
   1182      1.1  mrg       double r;
   1183      1.1  mrg 
   1184      1.1  mrg       r = sqrt (0.5 * fabs (im));
   1185      1.1  mrg 
   1186      1.1  mrg       COMPLEX_ASSIGN (v, r, copysign (r, im));
   1187      1.1  mrg     }
   1188      1.1  mrg   else
   1189      1.1  mrg     {
   1190      1.1  mrg       double d, r, s;
   1191      1.1  mrg 
   1192      1.1  mrg       d = hypot (re, im);
   1193      1.1  mrg       /* Use the identity   2  Re res  Im res = Im x
   1194      1.1  mrg          to avoid cancellation error in  d +/- Re x.  */
   1195      1.1  mrg       if (re > 0)
   1196      1.1  mrg         {
   1197      1.1  mrg           r = sqrt (0.5 * d + 0.5 * re);
   1198      1.1  mrg           s = (0.5 * im) / r;
   1199      1.1  mrg         }
   1200      1.1  mrg       else
   1201      1.1  mrg         {
   1202      1.1  mrg           s = sqrt (0.5 * d - 0.5 * re);
   1203      1.1  mrg           r = fabs ((0.5 * im) / s);
   1204      1.1  mrg         }
   1205      1.1  mrg 
   1206      1.1  mrg       COMPLEX_ASSIGN (v, r, copysign (s, im));
   1207      1.1  mrg     }
   1208      1.1  mrg   return v;
   1209      1.1  mrg }
   1210      1.1  mrg #endif
   1211      1.1  mrg 
   1212      1.1  mrg #if !defined(HAVE_CSQRTL) && defined(HAVE_COPYSIGNL) && defined(HAVE_SQRTL) && defined(HAVE_FABSL) && defined(HAVE_HYPOTL)
   1213      1.1  mrg #define HAVE_CSQRTL 1
   1214      1.1  mrg long double complex csqrtl (long double complex z);
   1215      1.1  mrg 
   1216      1.1  mrg long double complex
   1217      1.1  mrg csqrtl (long double complex z)
   1218      1.1  mrg {
   1219      1.1  mrg   long double re, im;
   1220      1.1  mrg   long double complex v;
   1221      1.1  mrg 
   1222      1.1  mrg   re = REALPART (z);
   1223      1.1  mrg   im = IMAGPART (z);
   1224      1.1  mrg   if (im == 0)
   1225      1.1  mrg     {
   1226      1.1  mrg       if (re < 0)
   1227      1.1  mrg         {
   1228      1.1  mrg           COMPLEX_ASSIGN (v, 0, copysignl (sqrtl (-re), im));
   1229      1.1  mrg         }
   1230      1.1  mrg       else
   1231      1.1  mrg         {
   1232      1.1  mrg           COMPLEX_ASSIGN (v, fabsl (sqrtl (re)), copysignl (0, im));
   1233      1.1  mrg         }
   1234      1.1  mrg     }
   1235      1.1  mrg   else if (re == 0)
   1236      1.1  mrg     {
   1237      1.1  mrg       long double r;
   1238      1.1  mrg 
   1239      1.1  mrg       r = sqrtl (0.5 * fabsl (im));
   1240      1.1  mrg 
   1241      1.1  mrg       COMPLEX_ASSIGN (v, copysignl (r, im), r);
   1242      1.1  mrg     }
   1243      1.1  mrg   else
   1244      1.1  mrg     {
   1245      1.1  mrg       long double d, r, s;
   1246      1.1  mrg 
   1247      1.1  mrg       d = hypotl (re, im);
   1248      1.1  mrg       /* Use the identity   2  Re res  Im res = Im x
   1249      1.1  mrg          to avoid cancellation error in  d +/- Re x.  */
   1250      1.1  mrg       if (re > 0)
   1251      1.1  mrg         {
   1252      1.1  mrg           r = sqrtl (0.5 * d + 0.5 * re);
   1253      1.1  mrg           s = (0.5 * im) / r;
   1254      1.1  mrg         }
   1255      1.1  mrg       else
   1256      1.1  mrg         {
   1257      1.1  mrg           s = sqrtl (0.5 * d - 0.5 * re);
   1258      1.1  mrg           r = fabsl ((0.5 * im) / s);
   1259      1.1  mrg         }
   1260      1.1  mrg 
   1261      1.1  mrg       COMPLEX_ASSIGN (v, r, copysignl (s, im));
   1262      1.1  mrg     }
   1263      1.1  mrg   return v;
   1264      1.1  mrg }
   1265      1.1  mrg #endif
   1266      1.1  mrg 
   1267      1.1  mrg 
   1268      1.1  mrg /* sinh(a + i b) = sinh(a) cos(b) + i cosh(a) sin(b)  */
   1269      1.1  mrg #if !defined(HAVE_CSINHF)
   1270      1.1  mrg #define HAVE_CSINHF 1
   1271      1.1  mrg float complex csinhf (float complex a);
   1272      1.1  mrg 
   1273      1.1  mrg float complex
   1274      1.1  mrg csinhf (float complex a)
   1275      1.1  mrg {
   1276      1.1  mrg   float r, i;
   1277      1.1  mrg   float complex v;
   1278      1.1  mrg 
   1279      1.1  mrg   r = REALPART (a);
   1280      1.1  mrg   i = IMAGPART (a);
   1281      1.1  mrg   COMPLEX_ASSIGN (v, sinhf (r) * cosf (i), coshf (r) * sinf (i));
   1282      1.1  mrg   return v;
   1283      1.1  mrg }
   1284      1.1  mrg #endif
   1285      1.1  mrg 
   1286      1.1  mrg #if !defined(HAVE_CSINH)
   1287      1.1  mrg #define HAVE_CSINH 1
   1288      1.1  mrg double complex csinh (double complex a);
   1289      1.1  mrg 
   1290      1.1  mrg double complex
   1291      1.1  mrg csinh (double complex a)
   1292      1.1  mrg {
   1293      1.1  mrg   double r, i;
   1294      1.1  mrg   double complex v;
   1295      1.1  mrg 
   1296      1.1  mrg   r = REALPART (a);
   1297      1.1  mrg   i = IMAGPART (a);
   1298      1.1  mrg   COMPLEX_ASSIGN (v, sinh (r) * cos (i), cosh (r) * sin (i));
   1299      1.1  mrg   return v;
   1300      1.1  mrg }
   1301      1.1  mrg #endif
   1302      1.1  mrg 
   1303      1.1  mrg #if !defined(HAVE_CSINHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
   1304      1.1  mrg #define HAVE_CSINHL 1
   1305      1.1  mrg long double complex csinhl (long double complex a);
   1306      1.1  mrg 
   1307      1.1  mrg long double complex
   1308      1.1  mrg csinhl (long double complex a)
   1309      1.1  mrg {
   1310      1.1  mrg   long double r, i;
   1311      1.1  mrg   long double complex v;
   1312      1.1  mrg 
   1313      1.1  mrg   r = REALPART (a);
   1314      1.1  mrg   i = IMAGPART (a);
   1315      1.1  mrg   COMPLEX_ASSIGN (v, sinhl (r) * cosl (i), coshl (r) * sinl (i));
   1316      1.1  mrg   return v;
   1317      1.1  mrg }
   1318      1.1  mrg #endif
   1319      1.1  mrg 
   1320      1.1  mrg 
   1321      1.1  mrg /* cosh(a + i b) = cosh(a) cos(b) + i sinh(a) sin(b)  */
   1322      1.1  mrg #if !defined(HAVE_CCOSHF)
   1323      1.1  mrg #define HAVE_CCOSHF 1
   1324      1.1  mrg float complex ccoshf (float complex a);
   1325      1.1  mrg 
   1326      1.1  mrg float complex
   1327      1.1  mrg ccoshf (float complex a)
   1328      1.1  mrg {
   1329      1.1  mrg   float r, i;
   1330      1.1  mrg   float complex v;
   1331      1.1  mrg 
   1332      1.1  mrg   r = REALPART (a);
   1333      1.1  mrg   i = IMAGPART (a);
   1334      1.1  mrg   COMPLEX_ASSIGN (v, coshf (r) * cosf (i), sinhf (r) * sinf (i));
   1335      1.1  mrg   return v;
   1336      1.1  mrg }
   1337      1.1  mrg #endif
   1338      1.1  mrg 
   1339      1.1  mrg #if !defined(HAVE_CCOSH)
   1340      1.1  mrg #define HAVE_CCOSH 1
   1341      1.1  mrg double complex ccosh (double complex a);
   1342      1.1  mrg 
   1343      1.1  mrg double complex
   1344      1.1  mrg ccosh (double complex a)
   1345      1.1  mrg {
   1346      1.1  mrg   double r, i;
   1347      1.1  mrg   double complex v;
   1348      1.1  mrg 
   1349      1.1  mrg   r = REALPART (a);
   1350      1.1  mrg   i = IMAGPART (a);
   1351      1.1  mrg   COMPLEX_ASSIGN (v, cosh (r) * cos (i),  sinh (r) * sin (i));
   1352      1.1  mrg   return v;
   1353      1.1  mrg }
   1354      1.1  mrg #endif
   1355      1.1  mrg 
   1356      1.1  mrg #if !defined(HAVE_CCOSHL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
   1357      1.1  mrg #define HAVE_CCOSHL 1
   1358      1.1  mrg long double complex ccoshl (long double complex a);
   1359      1.1  mrg 
   1360      1.1  mrg long double complex
   1361      1.1  mrg ccoshl (long double complex a)
   1362      1.1  mrg {
   1363      1.1  mrg   long double r, i;
   1364      1.1  mrg   long double complex v;
   1365      1.1  mrg 
   1366      1.1  mrg   r = REALPART (a);
   1367      1.1  mrg   i = IMAGPART (a);
   1368      1.1  mrg   COMPLEX_ASSIGN (v, coshl (r) * cosl (i), sinhl (r) * sinl (i));
   1369      1.1  mrg   return v;
   1370      1.1  mrg }
   1371      1.1  mrg #endif
   1372      1.1  mrg 
   1373      1.1  mrg 
   1374      1.1  mrg /* tanh(a + i b) = (tanh(a) + i tan(b)) / (1 + i tanh(a) tan(b))  */
   1375      1.1  mrg #if !defined(HAVE_CTANHF)
   1376      1.1  mrg #define HAVE_CTANHF 1
   1377      1.1  mrg float complex ctanhf (float complex a);
   1378      1.1  mrg 
   1379      1.1  mrg float complex
   1380      1.1  mrg ctanhf (float complex a)
   1381      1.1  mrg {
   1382      1.1  mrg   float rt, it;
   1383      1.1  mrg   float complex n, d;
   1384      1.1  mrg 
   1385      1.1  mrg   rt = tanhf (REALPART (a));
   1386      1.1  mrg   it = tanf (IMAGPART (a));
   1387      1.1  mrg   COMPLEX_ASSIGN (n, rt, it);
   1388      1.1  mrg   COMPLEX_ASSIGN (d, 1, rt * it);
   1389      1.1  mrg 
   1390      1.1  mrg   return n / d;
   1391      1.1  mrg }
   1392      1.1  mrg #endif
   1393      1.1  mrg 
   1394      1.1  mrg #if !defined(HAVE_CTANH)
   1395      1.1  mrg #define HAVE_CTANH 1
   1396      1.1  mrg double complex ctanh (double complex a);
   1397      1.1  mrg double complex
   1398      1.1  mrg ctanh (double complex a)
   1399      1.1  mrg {
   1400      1.1  mrg   double rt, it;
   1401      1.1  mrg   double complex n, d;
   1402      1.1  mrg 
   1403      1.1  mrg   rt = tanh (REALPART (a));
   1404      1.1  mrg   it = tan (IMAGPART (a));
   1405      1.1  mrg   COMPLEX_ASSIGN (n, rt, it);
   1406      1.1  mrg   COMPLEX_ASSIGN (d, 1, rt * it);
   1407      1.1  mrg 
   1408      1.1  mrg   return n / d;
   1409      1.1  mrg }
   1410      1.1  mrg #endif
   1411      1.1  mrg 
   1412      1.1  mrg #if !defined(HAVE_CTANHL) && defined(HAVE_TANL) && defined(HAVE_TANHL)
   1413      1.1  mrg #define HAVE_CTANHL 1
   1414      1.1  mrg long double complex ctanhl (long double complex a);
   1415      1.1  mrg 
   1416      1.1  mrg long double complex
   1417      1.1  mrg ctanhl (long double complex a)
   1418      1.1  mrg {
   1419      1.1  mrg   long double rt, it;
   1420      1.1  mrg   long double complex n, d;
   1421      1.1  mrg 
   1422      1.1  mrg   rt = tanhl (REALPART (a));
   1423      1.1  mrg   it = tanl (IMAGPART (a));
   1424      1.1  mrg   COMPLEX_ASSIGN (n, rt, it);
   1425      1.1  mrg   COMPLEX_ASSIGN (d, 1, rt * it);
   1426      1.1  mrg 
   1427      1.1  mrg   return n / d;
   1428      1.1  mrg }
   1429      1.1  mrg #endif
   1430      1.1  mrg 
   1431      1.1  mrg 
   1432      1.1  mrg /* sin(a + i b) = sin(a) cosh(b) + i cos(a) sinh(b)  */
   1433      1.1  mrg #if !defined(HAVE_CSINF)
   1434      1.1  mrg #define HAVE_CSINF 1
   1435      1.1  mrg float complex csinf (float complex a);
   1436      1.1  mrg 
   1437      1.1  mrg float complex
   1438      1.1  mrg csinf (float complex a)
   1439      1.1  mrg {
   1440      1.1  mrg   float r, i;
   1441      1.1  mrg   float complex v;
   1442      1.1  mrg 
   1443      1.1  mrg   r = REALPART (a);
   1444      1.1  mrg   i = IMAGPART (a);
   1445      1.1  mrg   COMPLEX_ASSIGN (v, sinf (r) * coshf (i), cosf (r) * sinhf (i));
   1446      1.1  mrg   return v;
   1447      1.1  mrg }
   1448      1.1  mrg #endif
   1449      1.1  mrg 
   1450      1.1  mrg #if !defined(HAVE_CSIN)
   1451      1.1  mrg #define HAVE_CSIN 1
   1452      1.1  mrg double complex csin (double complex a);
   1453      1.1  mrg 
   1454      1.1  mrg double complex
   1455      1.1  mrg csin (double complex a)
   1456      1.1  mrg {
   1457      1.1  mrg   double r, i;
   1458      1.1  mrg   double complex v;
   1459      1.1  mrg 
   1460      1.1  mrg   r = REALPART (a);
   1461      1.1  mrg   i = IMAGPART (a);
   1462      1.1  mrg   COMPLEX_ASSIGN (v, sin (r) * cosh (i), cos (r) * sinh (i));
   1463      1.1  mrg   return v;
   1464      1.1  mrg }
   1465      1.1  mrg #endif
   1466      1.1  mrg 
   1467      1.1  mrg #if !defined(HAVE_CSINL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
   1468      1.1  mrg #define HAVE_CSINL 1
   1469      1.1  mrg long double complex csinl (long double complex a);
   1470      1.1  mrg 
   1471      1.1  mrg long double complex
   1472      1.1  mrg csinl (long double complex a)
   1473      1.1  mrg {
   1474      1.1  mrg   long double r, i;
   1475      1.1  mrg   long double complex v;
   1476      1.1  mrg 
   1477      1.1  mrg   r = REALPART (a);
   1478      1.1  mrg   i = IMAGPART (a);
   1479      1.1  mrg   COMPLEX_ASSIGN (v, sinl (r) * coshl (i), cosl (r) * sinhl (i));
   1480      1.1  mrg   return v;
   1481      1.1  mrg }
   1482      1.1  mrg #endif
   1483      1.1  mrg 
   1484      1.1  mrg 
   1485      1.1  mrg /* cos(a + i b) = cos(a) cosh(b) - i sin(a) sinh(b)  */
   1486      1.1  mrg #if !defined(HAVE_CCOSF)
   1487      1.1  mrg #define HAVE_CCOSF 1
   1488      1.1  mrg float complex ccosf (float complex a);
   1489      1.1  mrg 
   1490      1.1  mrg float complex
   1491      1.1  mrg ccosf (float complex a)
   1492      1.1  mrg {
   1493      1.1  mrg   float r, i;
   1494      1.1  mrg   float complex v;
   1495      1.1  mrg 
   1496      1.1  mrg   r = REALPART (a);
   1497      1.1  mrg   i = IMAGPART (a);
   1498      1.1  mrg   COMPLEX_ASSIGN (v, cosf (r) * coshf (i), - (sinf (r) * sinhf (i)));
   1499      1.1  mrg   return v;
   1500      1.1  mrg }
   1501      1.1  mrg #endif
   1502      1.1  mrg 
   1503      1.1  mrg #if !defined(HAVE_CCOS)
   1504      1.1  mrg #define HAVE_CCOS 1
   1505      1.1  mrg double complex ccos (double complex a);
   1506      1.1  mrg 
   1507      1.1  mrg double complex
   1508      1.1  mrg ccos (double complex a)
   1509      1.1  mrg {
   1510      1.1  mrg   double r, i;
   1511      1.1  mrg   double complex v;
   1512      1.1  mrg 
   1513      1.1  mrg   r = REALPART (a);
   1514      1.1  mrg   i = IMAGPART (a);
   1515      1.1  mrg   COMPLEX_ASSIGN (v, cos (r) * cosh (i), - (sin (r) * sinh (i)));
   1516      1.1  mrg   return v;
   1517      1.1  mrg }
   1518      1.1  mrg #endif
   1519      1.1  mrg 
   1520      1.1  mrg #if !defined(HAVE_CCOSL) && defined(HAVE_COSL) && defined(HAVE_COSHL) && defined(HAVE_SINL) && defined(HAVE_SINHL)
   1521      1.1  mrg #define HAVE_CCOSL 1
   1522      1.1  mrg long double complex ccosl (long double complex a);
   1523      1.1  mrg 
   1524      1.1  mrg long double complex
   1525      1.1  mrg ccosl (long double complex a)
   1526      1.1  mrg {
   1527      1.1  mrg   long double r, i;
   1528      1.1  mrg   long double complex v;
   1529      1.1  mrg 
   1530      1.1  mrg   r = REALPART (a);
   1531      1.1  mrg   i = IMAGPART (a);
   1532      1.1  mrg   COMPLEX_ASSIGN (v, cosl (r) * coshl (i), - (sinl (r) * sinhl (i)));
   1533      1.1  mrg   return v;
   1534      1.1  mrg }
   1535      1.1  mrg #endif
   1536      1.1  mrg 
   1537      1.1  mrg 
   1538      1.1  mrg /* tan(a + i b) = (tan(a) + i tanh(b)) / (1 - i tan(a) tanh(b))  */
   1539      1.1  mrg #if !defined(HAVE_CTANF)
   1540      1.1  mrg #define HAVE_CTANF 1
   1541      1.1  mrg float complex ctanf (float complex a);
   1542      1.1  mrg 
   1543      1.1  mrg float complex
   1544      1.1  mrg ctanf (float complex a)
   1545      1.1  mrg {
   1546      1.1  mrg   float rt, it;
   1547      1.1  mrg   float complex n, d;
   1548      1.1  mrg 
   1549      1.1  mrg   rt = tanf (REALPART (a));
   1550      1.1  mrg   it = tanhf (IMAGPART (a));
   1551      1.1  mrg   COMPLEX_ASSIGN (n, rt, it);
   1552      1.1  mrg   COMPLEX_ASSIGN (d, 1, - (rt * it));
   1553      1.1  mrg 
   1554      1.1  mrg   return n / d;
   1555      1.1  mrg }
   1556      1.1  mrg #endif
   1557      1.1  mrg 
   1558      1.1  mrg #if !defined(HAVE_CTAN)
   1559      1.1  mrg #define HAVE_CTAN 1
   1560      1.1  mrg double complex ctan (double complex a);
   1561      1.1  mrg 
   1562      1.1  mrg double complex
   1563      1.1  mrg ctan (double complex a)
   1564      1.1  mrg {
   1565      1.1  mrg   double rt, it;
   1566      1.1  mrg   double complex n, d;
   1567      1.1  mrg 
   1568      1.1  mrg   rt = tan (REALPART (a));
   1569      1.1  mrg   it = tanh (IMAGPART (a));
   1570      1.1  mrg   COMPLEX_ASSIGN (n, rt, it);
   1571      1.1  mrg   COMPLEX_ASSIGN (d, 1, - (rt * it));
   1572      1.1  mrg 
   1573      1.1  mrg   return n / d;
   1574      1.1  mrg }
   1575      1.1  mrg #endif
   1576      1.1  mrg 
   1577      1.1  mrg #if !defined(HAVE_CTANL) && defined(HAVE_TANL) && defined(HAVE_TANHL)
   1578      1.1  mrg #define HAVE_CTANL 1
   1579      1.1  mrg long double complex ctanl (long double complex a);
   1580      1.1  mrg 
   1581      1.1  mrg long double complex
   1582      1.1  mrg ctanl (long double complex a)
   1583      1.1  mrg {
   1584      1.1  mrg   long double rt, it;
   1585      1.1  mrg   long double complex n, d;
   1586      1.1  mrg 
   1587      1.1  mrg   rt = tanl (REALPART (a));
   1588      1.1  mrg   it = tanhl (IMAGPART (a));
   1589      1.1  mrg   COMPLEX_ASSIGN (n, rt, it);
   1590      1.1  mrg   COMPLEX_ASSIGN (d, 1, - (rt * it));
   1591      1.1  mrg 
   1592      1.1  mrg   return n / d;
   1593      1.1  mrg }
   1594      1.1  mrg #endif
   1595      1.1  mrg 
   1596      1.1  mrg 
   1597      1.1  mrg /* Complex ASIN.  Returns wrongly NaN for infinite arguments.
   1598      1.1  mrg    Algorithm taken from Abramowitz & Stegun.  */
   1599      1.1  mrg 
   1600      1.1  mrg #if !defined(HAVE_CASINF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
   1601      1.1  mrg #define HAVE_CASINF 1
   1602      1.1  mrg complex float casinf (complex float z);
   1603      1.1  mrg 
   1604      1.1  mrg complex float
   1605      1.1  mrg casinf (complex float z)
   1606      1.1  mrg {
   1607      1.1  mrg   return -I*clogf (I*z + csqrtf (1.0f-z*z));
   1608      1.1  mrg }
   1609      1.1  mrg #endif
   1610      1.1  mrg 
   1611      1.1  mrg 
   1612      1.1  mrg #if !defined(HAVE_CASIN) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
   1613      1.1  mrg #define HAVE_CASIN 1
   1614      1.1  mrg complex double casin (complex double z);
   1615      1.1  mrg 
   1616      1.1  mrg complex double
   1617      1.1  mrg casin (complex double z)
   1618      1.1  mrg {
   1619      1.1  mrg   return -I*clog (I*z + csqrt (1.0-z*z));
   1620      1.1  mrg }
   1621      1.1  mrg #endif
   1622      1.1  mrg 
   1623      1.1  mrg 
   1624      1.1  mrg #if !defined(HAVE_CASINL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL)
   1625      1.1  mrg #define HAVE_CASINL 1
   1626      1.1  mrg complex long double casinl (complex long double z);
   1627      1.1  mrg 
   1628      1.1  mrg complex long double
   1629      1.1  mrg casinl (complex long double z)
   1630      1.1  mrg {
   1631      1.1  mrg   return -I*clogl (I*z + csqrtl (1.0L-z*z));
   1632      1.1  mrg }
   1633      1.1  mrg #endif
   1634      1.1  mrg 
   1635      1.1  mrg 
   1636      1.1  mrg /* Complex ACOS.  Returns wrongly NaN for infinite arguments.
   1637      1.1  mrg    Algorithm taken from Abramowitz & Stegun.  */
   1638      1.1  mrg 
   1639      1.1  mrg #if !defined(HAVE_CACOSF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
   1640      1.1  mrg #define HAVE_CACOSF 1
   1641      1.1  mrg complex float cacosf (complex float z);
   1642      1.1  mrg 
   1643      1.1  mrg complex float
   1644      1.1  mrg cacosf (complex float z)
   1645      1.1  mrg {
   1646      1.1  mrg   return -I*clogf (z + I*csqrtf (1.0f-z*z));
   1647      1.1  mrg }
   1648      1.1  mrg #endif
   1649      1.1  mrg 
   1650      1.1  mrg 
   1651      1.1  mrg #if !defined(HAVE_CACOS) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
   1652      1.1  mrg #define HAVE_CACOS 1
   1653      1.1  mrg complex double cacos (complex double z);
   1654      1.1  mrg 
   1655      1.1  mrg complex double
   1656      1.1  mrg cacos (complex double z)
   1657      1.1  mrg {
   1658      1.1  mrg   return -I*clog (z + I*csqrt (1.0-z*z));
   1659      1.1  mrg }
   1660      1.1  mrg #endif
   1661      1.1  mrg 
   1662      1.1  mrg 
   1663      1.1  mrg #if !defined(HAVE_CACOSL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL)
   1664      1.1  mrg #define HAVE_CACOSL 1
   1665      1.1  mrg complex long double cacosl (complex long double z);
   1666      1.1  mrg 
   1667      1.1  mrg complex long double
   1668      1.1  mrg cacosl (complex long double z)
   1669      1.1  mrg {
   1670      1.1  mrg   return -I*clogl (z + I*csqrtl (1.0L-z*z));
   1671      1.1  mrg }
   1672      1.1  mrg #endif
   1673      1.1  mrg 
   1674      1.1  mrg 
   1675      1.1  mrg /* Complex ATAN.  Returns wrongly NaN for infinite arguments.
   1676      1.1  mrg    Algorithm taken from Abramowitz & Stegun.  */
   1677      1.1  mrg 
   1678      1.1  mrg #if !defined(HAVE_CATANF) && defined(HAVE_CLOGF)
   1679      1.1  mrg #define HAVE_CACOSF 1
   1680      1.1  mrg complex float catanf (complex float z);
   1681      1.1  mrg 
   1682      1.1  mrg complex float
   1683      1.1  mrg catanf (complex float z)
   1684      1.1  mrg {
   1685      1.1  mrg   return I*clogf ((I+z)/(I-z))/2.0f;
   1686      1.1  mrg }
   1687      1.1  mrg #endif
   1688      1.1  mrg 
   1689      1.1  mrg 
   1690      1.1  mrg #if !defined(HAVE_CATAN) && defined(HAVE_CLOG)
   1691      1.1  mrg #define HAVE_CACOS 1
   1692      1.1  mrg complex double catan (complex double z);
   1693      1.1  mrg 
   1694      1.1  mrg complex double
   1695      1.1  mrg catan (complex double z)
   1696      1.1  mrg {
   1697      1.1  mrg   return I*clog ((I+z)/(I-z))/2.0;
   1698      1.1  mrg }
   1699      1.1  mrg #endif
   1700      1.1  mrg 
   1701      1.1  mrg 
   1702      1.1  mrg #if !defined(HAVE_CATANL) && defined(HAVE_CLOGL)
   1703      1.1  mrg #define HAVE_CACOSL 1
   1704      1.1  mrg complex long double catanl (complex long double z);
   1705      1.1  mrg 
   1706      1.1  mrg complex long double
   1707      1.1  mrg catanl (complex long double z)
   1708      1.1  mrg {
   1709      1.1  mrg   return I*clogl ((I+z)/(I-z))/2.0L;
   1710      1.1  mrg }
   1711      1.1  mrg #endif
   1712      1.1  mrg 
   1713      1.1  mrg 
   1714      1.1  mrg /* Complex ASINH.  Returns wrongly NaN for infinite arguments.
   1715      1.1  mrg    Algorithm taken from Abramowitz & Stegun.  */
   1716      1.1  mrg 
   1717      1.1  mrg #if !defined(HAVE_CASINHF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
   1718      1.1  mrg #define HAVE_CASINHF 1
   1719      1.1  mrg complex float casinhf (complex float z);
   1720      1.1  mrg 
   1721      1.1  mrg complex float
   1722      1.1  mrg casinhf (complex float z)
   1723      1.1  mrg {
   1724      1.1  mrg   return clogf (z + csqrtf (z*z+1.0f));
   1725      1.1  mrg }
   1726      1.1  mrg #endif
   1727      1.1  mrg 
   1728      1.1  mrg 
   1729      1.1  mrg #if !defined(HAVE_CASINH) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
   1730      1.1  mrg #define HAVE_CASINH 1
   1731      1.1  mrg complex double casinh (complex double z);
   1732      1.1  mrg 
   1733      1.1  mrg complex double
   1734      1.1  mrg casinh (complex double z)
   1735      1.1  mrg {
   1736      1.1  mrg   return clog (z + csqrt (z*z+1.0));
   1737      1.1  mrg }
   1738      1.1  mrg #endif
   1739      1.1  mrg 
   1740      1.1  mrg 
   1741      1.1  mrg #if !defined(HAVE_CASINHL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL)
   1742      1.1  mrg #define HAVE_CASINHL 1
   1743      1.1  mrg complex long double casinhl (complex long double z);
   1744      1.1  mrg 
   1745      1.1  mrg complex long double
   1746      1.1  mrg casinhl (complex long double z)
   1747      1.1  mrg {
   1748      1.1  mrg   return clogl (z + csqrtl (z*z+1.0L));
   1749      1.1  mrg }
   1750      1.1  mrg #endif
   1751      1.1  mrg 
   1752      1.1  mrg 
   1753      1.1  mrg /* Complex ACOSH.  Returns wrongly NaN for infinite arguments.
   1754      1.1  mrg    Algorithm taken from Abramowitz & Stegun.  */
   1755      1.1  mrg 
   1756      1.1  mrg #if !defined(HAVE_CACOSHF) && defined(HAVE_CLOGF) && defined(HAVE_CSQRTF)
   1757      1.1  mrg #define HAVE_CACOSHF 1
   1758      1.1  mrg complex float cacoshf (complex float z);
   1759      1.1  mrg 
   1760      1.1  mrg complex float
   1761      1.1  mrg cacoshf (complex float z)
   1762      1.1  mrg {
   1763      1.1  mrg   return clogf (z + csqrtf (z-1.0f) * csqrtf (z+1.0f));
   1764      1.1  mrg }
   1765      1.1  mrg #endif
   1766      1.1  mrg 
   1767      1.1  mrg 
   1768      1.1  mrg #if !defined(HAVE_CACOSH) && defined(HAVE_CLOG) && defined(HAVE_CSQRT)
   1769      1.1  mrg #define HAVE_CACOSH 1
   1770      1.1  mrg complex double cacosh (complex double z);
   1771      1.1  mrg 
   1772      1.1  mrg complex double
   1773      1.1  mrg cacosh (complex double z)
   1774      1.1  mrg {
   1775      1.1  mrg   return clog (z + csqrt (z-1.0) * csqrt (z+1.0));
   1776      1.1  mrg }
   1777      1.1  mrg #endif
   1778      1.1  mrg 
   1779      1.1  mrg 
   1780      1.1  mrg #if !defined(HAVE_CACOSHL) && defined(HAVE_CLOGL) && defined(HAVE_CSQRTL)
   1781      1.1  mrg #define HAVE_CACOSHL 1
   1782      1.1  mrg complex long double cacoshl (complex long double z);
   1783      1.1  mrg 
   1784      1.1  mrg complex long double
   1785      1.1  mrg cacoshl (complex long double z)
   1786      1.1  mrg {
   1787      1.1  mrg   return clogl (z + csqrtl (z-1.0L) * csqrtl (z+1.0L));
   1788      1.1  mrg }
   1789      1.1  mrg #endif
   1790      1.1  mrg 
   1791      1.1  mrg 
   1792      1.1  mrg /* Complex ATANH.  Returns wrongly NaN for infinite arguments.
   1793      1.1  mrg    Algorithm taken from Abramowitz & Stegun.  */
   1794      1.1  mrg 
   1795      1.1  mrg #if !defined(HAVE_CATANHF) && defined(HAVE_CLOGF)
   1796      1.1  mrg #define HAVE_CATANHF 1
   1797      1.1  mrg complex float catanhf (complex float z);
   1798      1.1  mrg 
   1799      1.1  mrg complex float
   1800      1.1  mrg catanhf (complex float z)
   1801      1.1  mrg {
   1802      1.1  mrg   return clogf ((1.0f+z)/(1.0f-z))/2.0f;
   1803      1.1  mrg }
   1804      1.1  mrg #endif
   1805      1.1  mrg 
   1806      1.1  mrg 
   1807      1.1  mrg #if !defined(HAVE_CATANH) && defined(HAVE_CLOG)
   1808      1.1  mrg #define HAVE_CATANH 1
   1809      1.1  mrg complex double catanh (complex double z);
   1810      1.1  mrg 
   1811      1.1  mrg complex double
   1812      1.1  mrg catanh (complex double z)
   1813      1.1  mrg {
   1814      1.1  mrg   return clog ((1.0+z)/(1.0-z))/2.0;
   1815      1.1  mrg }
   1816      1.1  mrg #endif
   1817      1.1  mrg 
   1818      1.1  mrg #if !defined(HAVE_CATANHL) && defined(HAVE_CLOGL)
   1819      1.1  mrg #define HAVE_CATANHL 1
   1820      1.1  mrg complex long double catanhl (complex long double z);
   1821      1.1  mrg 
   1822      1.1  mrg complex long double
   1823      1.1  mrg catanhl (complex long double z)
   1824      1.1  mrg {
   1825      1.1  mrg   return clogl ((1.0L+z)/(1.0L-z))/2.0L;
   1826      1.1  mrg }
   1827      1.1  mrg #endif
   1828      1.1  mrg 
   1829      1.1  mrg 
   1830      1.1  mrg #if !defined(HAVE_TGAMMA)
   1831      1.1  mrg #define HAVE_TGAMMA 1
   1832      1.1  mrg double tgamma (double);
   1833      1.1  mrg 
   1834      1.1  mrg /* Fallback tgamma() function. Uses the algorithm from
   1835      1.1  mrg    http://www.netlib.org/specfun/gamma and references therein.  */
   1836      1.1  mrg 
   1837      1.1  mrg #undef SQRTPI
   1838      1.1  mrg #define SQRTPI 0.9189385332046727417803297
   1839      1.1  mrg 
   1840      1.1  mrg #undef PI
   1841      1.1  mrg #define PI 3.1415926535897932384626434
   1842      1.1  mrg 
   1843      1.1  mrg double
   1844      1.1  mrg tgamma (double x)
   1845      1.1  mrg {
   1846      1.1  mrg   int i, n, parity;
   1847      1.1  mrg   double fact, res, sum, xden, xnum, y, y1, ysq, z;
   1848      1.1  mrg 
   1849      1.1  mrg   static double p[8] = {
   1850      1.1  mrg     -1.71618513886549492533811e0,  2.47656508055759199108314e1,
   1851      1.1  mrg     -3.79804256470945635097577e2,  6.29331155312818442661052e2,
   1852      1.1  mrg      8.66966202790413211295064e2, -3.14512729688483675254357e4,
   1853      1.1  mrg     -3.61444134186911729807069e4,  6.64561438202405440627855e4 };
   1854      1.1  mrg 
   1855      1.1  mrg   static double q[8] = {
   1856      1.1  mrg     -3.08402300119738975254353e1,  3.15350626979604161529144e2,
   1857      1.1  mrg     -1.01515636749021914166146e3, -3.10777167157231109440444e3,
   1858      1.1  mrg      2.25381184209801510330112e4,  4.75584627752788110767815e3,
   1859      1.1  mrg     -1.34659959864969306392456e5, -1.15132259675553483497211e5 };
   1860      1.1  mrg 
   1861      1.1  mrg   static double c[7] = {             -1.910444077728e-03,
   1862      1.1  mrg      8.4171387781295e-04,            -5.952379913043012e-04,
   1863      1.1  mrg      7.93650793500350248e-04,        -2.777777777777681622553e-03,
   1864      1.1  mrg      8.333333333333333331554247e-02,  5.7083835261e-03 };
   1865      1.1  mrg 
   1866      1.1  mrg   static const double xminin = 2.23e-308;
   1867      1.1  mrg   static const double xbig = 171.624;
   1868      1.1  mrg   static const double xnan = __builtin_nan ("0x0"), xinf = __builtin_inf ();
   1869      1.1  mrg   static double eps = 0;
   1870      1.1  mrg 
   1871      1.1  mrg   if (eps == 0)
   1872      1.1  mrg     eps = nextafter (1., 2.) - 1.;
   1873      1.1  mrg 
   1874      1.1  mrg   parity = 0;
   1875      1.1  mrg   fact = 1;
   1876      1.1  mrg   n = 0;
   1877      1.1  mrg   y = x;
   1878      1.1  mrg 
   1879      1.1  mrg   if (isnan (x))
   1880      1.1  mrg     return x;
   1881      1.1  mrg 
   1882      1.1  mrg   if (y <= 0)
   1883      1.1  mrg     {
   1884      1.1  mrg       y = -x;
   1885      1.1  mrg       y1 = trunc (y);
   1886      1.1  mrg       res = y - y1;
   1887      1.1  mrg 
   1888      1.1  mrg       if (res != 0)
   1889      1.1  mrg 	{
   1890      1.1  mrg 	  if (y1 != trunc (y1*0.5l)*2)
   1891      1.1  mrg 	    parity = 1;
   1892      1.1  mrg 	  fact = -PI / sin (PI*res);
   1893      1.1  mrg 	  y = y + 1;
   1894      1.1  mrg 	}
   1895      1.1  mrg       else
   1896      1.1  mrg 	return x == 0 ? copysign (xinf, x) : xnan;
   1897      1.1  mrg     }
   1898      1.1  mrg 
   1899      1.1  mrg   if (y < eps)
   1900      1.1  mrg     {
   1901      1.1  mrg       if (y >= xminin)
   1902      1.1  mrg         res = 1 / y;
   1903      1.1  mrg       else
   1904      1.1  mrg 	return xinf;
   1905      1.1  mrg     }
   1906      1.1  mrg   else if (y < 13)
   1907      1.1  mrg     {
   1908      1.1  mrg       y1 = y;
   1909      1.1  mrg       if (y < 1)
   1910      1.1  mrg 	{
   1911      1.1  mrg 	  z = y;
   1912      1.1  mrg 	  y = y + 1;
   1913      1.1  mrg 	}
   1914      1.1  mrg       else
   1915      1.1  mrg 	{
   1916      1.1  mrg 	  n = (int)y - 1;
   1917      1.1  mrg 	  y = y - n;
   1918      1.1  mrg 	  z = y - 1;
   1919      1.1  mrg 	}
   1920      1.1  mrg 
   1921      1.1  mrg       xnum = 0;
   1922      1.1  mrg       xden = 1;
   1923      1.1  mrg       for (i = 0; i < 8; i++)
   1924      1.1  mrg 	{
   1925      1.1  mrg 	  xnum = (xnum + p[i]) * z;
   1926      1.1  mrg 	  xden = xden * z + q[i];
   1927      1.1  mrg 	}
   1928      1.1  mrg 
   1929      1.1  mrg       res = xnum / xden + 1;
   1930      1.1  mrg 
   1931      1.1  mrg       if (y1 < y)
   1932      1.1  mrg         res = res / y1;
   1933      1.1  mrg       else if (y1 > y)
   1934      1.1  mrg 	for (i = 1; i <= n; i++)
   1935      1.1  mrg 	  {
   1936      1.1  mrg 	    res = res * y;
   1937      1.1  mrg 	    y = y + 1;
   1938      1.1  mrg 	  }
   1939      1.1  mrg     }
   1940      1.1  mrg   else
   1941      1.1  mrg     {
   1942      1.1  mrg       if (y < xbig)
   1943      1.1  mrg 	{
   1944      1.1  mrg 	  ysq = y * y;
   1945      1.1  mrg 	  sum = c[6];
   1946      1.1  mrg 	  for (i = 0; i < 6; i++)
   1947      1.1  mrg 	    sum = sum / ysq + c[i];
   1948      1.1  mrg 
   1949      1.1  mrg 	  sum = sum/y - y + SQRTPI;
   1950      1.1  mrg 	  sum = sum + (y - 0.5) * log (y);
   1951      1.1  mrg 	  res = exp (sum);
   1952      1.1  mrg 	}
   1953      1.1  mrg       else
   1954      1.1  mrg 	return x < 0 ? xnan : xinf;
   1955      1.1  mrg     }
   1956      1.1  mrg 
   1957      1.1  mrg   if (parity)
   1958      1.1  mrg     res = -res;
   1959      1.1  mrg   if (fact != 1)
   1960      1.1  mrg     res = fact / res;
   1961      1.1  mrg 
   1962      1.1  mrg   return res;
   1963      1.1  mrg }
   1964      1.1  mrg #endif
   1965      1.1  mrg 
   1966      1.1  mrg 
   1967      1.1  mrg 
   1968      1.1  mrg #if !defined(HAVE_LGAMMA)
   1969      1.1  mrg #define HAVE_LGAMMA 1
   1970      1.1  mrg double lgamma (double);
   1971      1.1  mrg 
   1972      1.1  mrg /* Fallback lgamma() function. Uses the algorithm from
   1973      1.1  mrg    http://www.netlib.org/specfun/algama and references therein,
   1974      1.1  mrg    except for negative arguments (where netlib would return +Inf)
   1975      1.1  mrg    where we use the following identity:
   1976      1.1  mrg        lgamma(y) = log(pi/(|y*sin(pi*y)|)) - lgamma(-y)
   1977      1.1  mrg  */
   1978      1.1  mrg 
   1979      1.1  mrg double
   1980      1.1  mrg lgamma (double y)
   1981      1.1  mrg {
   1982      1.1  mrg 
   1983      1.1  mrg #undef SQRTPI
   1984      1.1  mrg #define SQRTPI 0.9189385332046727417803297
   1985      1.1  mrg 
   1986      1.1  mrg #undef PI
   1987      1.1  mrg #define PI 3.1415926535897932384626434
   1988      1.1  mrg 
   1989      1.1  mrg #define PNT68  0.6796875
   1990      1.1  mrg #define D1    -0.5772156649015328605195174
   1991      1.1  mrg #define D2     0.4227843350984671393993777
   1992      1.1  mrg #define D4     1.791759469228055000094023
   1993      1.1  mrg 
   1994      1.1  mrg   static double p1[8] = {
   1995      1.1  mrg               4.945235359296727046734888e0, 2.018112620856775083915565e2,
   1996      1.1  mrg               2.290838373831346393026739e3, 1.131967205903380828685045e4,
   1997      1.1  mrg               2.855724635671635335736389e4, 3.848496228443793359990269e4,
   1998      1.1  mrg               2.637748787624195437963534e4, 7.225813979700288197698961e3 };
   1999      1.1  mrg   static double q1[8] = {
   2000      1.1  mrg               6.748212550303777196073036e1,  1.113332393857199323513008e3,
   2001      1.1  mrg               7.738757056935398733233834e3,  2.763987074403340708898585e4,
   2002      1.1  mrg               5.499310206226157329794414e4,  6.161122180066002127833352e4,
   2003      1.1  mrg               3.635127591501940507276287e4,  8.785536302431013170870835e3 };
   2004      1.1  mrg   static double p2[8] = {
   2005      1.1  mrg               4.974607845568932035012064e0,  5.424138599891070494101986e2,
   2006      1.1  mrg               1.550693864978364947665077e4,  1.847932904445632425417223e5,
   2007      1.1  mrg               1.088204769468828767498470e6,  3.338152967987029735917223e6,
   2008      1.1  mrg               5.106661678927352456275255e6,  3.074109054850539556250927e6 };
   2009      1.1  mrg   static double q2[8] = {
   2010      1.1  mrg               1.830328399370592604055942e2,  7.765049321445005871323047e3,
   2011      1.1  mrg               1.331903827966074194402448e5,  1.136705821321969608938755e6,
   2012      1.1  mrg               5.267964117437946917577538e6,  1.346701454311101692290052e7,
   2013      1.1  mrg               1.782736530353274213975932e7,  9.533095591844353613395747e6 };
   2014      1.1  mrg   static double p4[8] = {
   2015      1.1  mrg               1.474502166059939948905062e4,  2.426813369486704502836312e6,
   2016      1.1  mrg               1.214755574045093227939592e8,  2.663432449630976949898078e9,
   2017      1.1  mrg               2.940378956634553899906876e10, 1.702665737765398868392998e11,
   2018      1.1  mrg               4.926125793377430887588120e11, 5.606251856223951465078242e11 };
   2019      1.1  mrg   static double q4[8] = {
   2020      1.1  mrg               2.690530175870899333379843e3,  6.393885654300092398984238e5,
   2021      1.1  mrg               4.135599930241388052042842e7,  1.120872109616147941376570e9,
   2022      1.1  mrg               1.488613728678813811542398e10, 1.016803586272438228077304e11,
   2023      1.1  mrg               3.417476345507377132798597e11, 4.463158187419713286462081e11 };
   2024      1.1  mrg   static double  c[7] = {
   2025      1.1  mrg              -1.910444077728e-03,            8.4171387781295e-04,
   2026      1.1  mrg              -5.952379913043012e-04,         7.93650793500350248e-04,
   2027      1.1  mrg              -2.777777777777681622553e-03,   8.333333333333333331554247e-02,
   2028      1.1  mrg               5.7083835261e-03 };
   2029      1.1  mrg 
   2030      1.1  mrg   static double xbig = 2.55e305, xinf = __builtin_inf (), eps = 0,
   2031      1.1  mrg 		frtbig = 2.25e76;
   2032      1.1  mrg 
   2033      1.1  mrg   int i;
   2034      1.1  mrg   double corr, res, xden, xm1, xm2, xm4, xnum, ysq;
   2035      1.1  mrg 
   2036      1.1  mrg   if (eps == 0)
   2037      1.1  mrg     eps = __builtin_nextafter (1., 2.) - 1.;
   2038      1.1  mrg 
   2039      1.1  mrg   if ((y > 0) && (y <= xbig))
   2040      1.1  mrg     {
   2041      1.1  mrg       if (y <= eps)
   2042      1.1  mrg 	res = -log (y);
   2043      1.1  mrg       else if (y <= 1.5)
   2044      1.1  mrg 	{
   2045      1.1  mrg 	  if (y < PNT68)
   2046      1.1  mrg 	    {
   2047      1.1  mrg 	      corr = -log (y);
   2048      1.1  mrg 	      xm1 = y;
   2049      1.1  mrg 	    }
   2050      1.1  mrg 	  else
   2051      1.1  mrg 	    {
   2052      1.1  mrg 	      corr = 0;
   2053      1.1  mrg 	      xm1 = (y - 0.5) - 0.5;
   2054      1.1  mrg 	    }
   2055      1.1  mrg 
   2056      1.1  mrg 	  if ((y <= 0.5) || (y >= PNT68))
   2057      1.1  mrg 	    {
   2058      1.1  mrg 	      xden = 1;
   2059      1.1  mrg 	      xnum = 0;
   2060      1.1  mrg 	      for (i = 0; i < 8; i++)
   2061      1.1  mrg 		{
   2062      1.1  mrg 		  xnum = xnum*xm1 + p1[i];
   2063      1.1  mrg 		  xden = xden*xm1 + q1[i];
   2064      1.1  mrg 		}
   2065      1.1  mrg 	      res = corr + (xm1 * (D1 + xm1*(xnum/xden)));
   2066      1.1  mrg 	    }
   2067      1.1  mrg 	  else
   2068      1.1  mrg 	    {
   2069      1.1  mrg 	      xm2 = (y - 0.5) - 0.5;
   2070      1.1  mrg 	      xden = 1;
   2071      1.1  mrg 	      xnum = 0;
   2072      1.1  mrg 	      for (i = 0; i < 8; i++)
   2073      1.1  mrg 		{
   2074      1.1  mrg 		  xnum = xnum*xm2 + p2[i];
   2075      1.1  mrg 		  xden = xden*xm2 + q2[i];
   2076      1.1  mrg 		}
   2077      1.1  mrg 	      res = corr + xm2 * (D2 + xm2*(xnum/xden));
   2078      1.1  mrg 	    }
   2079      1.1  mrg 	}
   2080      1.1  mrg       else if (y <= 4)
   2081      1.1  mrg 	{
   2082      1.1  mrg 	  xm2 = y - 2;
   2083      1.1  mrg 	  xden = 1;
   2084      1.1  mrg 	  xnum = 0;
   2085      1.1  mrg 	  for (i = 0; i < 8; i++)
   2086      1.1  mrg 	    {
   2087      1.1  mrg 	      xnum = xnum*xm2 + p2[i];
   2088      1.1  mrg 	      xden = xden*xm2 + q2[i];
   2089      1.1  mrg 	    }
   2090      1.1  mrg 	  res = xm2 * (D2 + xm2*(xnum/xden));
   2091      1.1  mrg 	}
   2092      1.1  mrg       else if (y <= 12)
   2093      1.1  mrg 	{
   2094      1.1  mrg 	  xm4 = y - 4;
   2095      1.1  mrg 	  xden = -1;
   2096      1.1  mrg 	  xnum = 0;
   2097      1.1  mrg 	  for (i = 0; i < 8; i++)
   2098      1.1  mrg 	    {
   2099      1.1  mrg 	      xnum = xnum*xm4 + p4[i];
   2100      1.1  mrg 	      xden = xden*xm4 + q4[i];
   2101      1.1  mrg 	    }
   2102      1.1  mrg 	  res = D4 + xm4*(xnum/xden);
   2103      1.1  mrg 	}
   2104      1.1  mrg       else
   2105      1.1  mrg 	{
   2106      1.1  mrg 	  res = 0;
   2107      1.1  mrg 	  if (y <= frtbig)
   2108      1.1  mrg 	    {
   2109      1.1  mrg 	      res = c[6];
   2110      1.1  mrg 	      ysq = y * y;
   2111      1.1  mrg 	      for (i = 0; i < 6; i++)
   2112      1.1  mrg 		res = res / ysq + c[i];
   2113      1.1  mrg 	    }
   2114      1.1  mrg 	  res = res/y;
   2115      1.1  mrg 	  corr = log (y);
   2116      1.1  mrg 	  res = res + SQRTPI - 0.5*corr;
   2117      1.1  mrg 	  res = res + y*(corr-1);
   2118      1.1  mrg 	}
   2119      1.1  mrg     }
   2120      1.1  mrg   else if (y < 0 && __builtin_floor (y) != y)
   2121      1.1  mrg     {
   2122      1.1  mrg       /* lgamma(y) = log(pi/(|y*sin(pi*y)|)) - lgamma(-y)
   2123      1.1  mrg          For abs(y) very close to zero, we use a series expansion to
   2124      1.1  mrg 	 the first order in y to avoid overflow.  */
   2125      1.1  mrg       if (y > -1.e-100)
   2126      1.1  mrg         res = -2 * log (fabs (y)) - lgamma (-y);
   2127      1.1  mrg       else
   2128      1.1  mrg         res = log (PI / fabs (y * sin (PI * y))) - lgamma (-y);
   2129      1.1  mrg     }
   2130      1.1  mrg   else
   2131      1.1  mrg     res = xinf;
   2132      1.1  mrg 
   2133      1.1  mrg   return res;
   2134      1.1  mrg }
   2135      1.1  mrg #endif
   2136      1.1  mrg 
   2137      1.1  mrg 
   2138      1.1  mrg #if defined(HAVE_TGAMMA) && !defined(HAVE_TGAMMAF)
   2139      1.1  mrg #define HAVE_TGAMMAF 1
   2140      1.1  mrg float tgammaf (float);
   2141      1.1  mrg 
   2142      1.1  mrg float
   2143      1.1  mrg tgammaf (float x)
   2144      1.1  mrg {
   2145      1.1  mrg   return (float) tgamma ((double) x);
   2146      1.1  mrg }
   2147      1.1  mrg #endif
   2148      1.1  mrg 
   2149      1.1  mrg #if defined(HAVE_LGAMMA) && !defined(HAVE_LGAMMAF)
   2150      1.1  mrg #define HAVE_LGAMMAF 1
   2151      1.1  mrg float lgammaf (float);
   2152      1.1  mrg 
   2153      1.1  mrg float
   2154      1.1  mrg lgammaf (float x)
   2155      1.1  mrg {
   2156      1.1  mrg   return (float) lgamma ((double) x);
   2157      1.1  mrg }
   2158      1.1  mrg #endif
   2159  1.1.1.2  mrg 
   2160  1.1.1.2  mrg #ifndef HAVE_FMA
   2161  1.1.1.2  mrg #define HAVE_FMA 1
   2162  1.1.1.2  mrg double fma (double, double, double);
   2163  1.1.1.2  mrg 
   2164  1.1.1.2  mrg double
   2165  1.1.1.2  mrg fma (double x, double y, double z)
   2166  1.1.1.2  mrg {
   2167  1.1.1.2  mrg   return x * y + z;
   2168  1.1.1.2  mrg }
   2169  1.1.1.2  mrg #endif
   2170  1.1.1.2  mrg 
   2171  1.1.1.2  mrg #ifndef HAVE_FMAF
   2172  1.1.1.2  mrg #define HAVE_FMAF 1
   2173  1.1.1.2  mrg float fmaf (float, float, float);
   2174  1.1.1.2  mrg 
   2175  1.1.1.2  mrg float
   2176  1.1.1.2  mrg fmaf (float x, float y, float z)
   2177  1.1.1.2  mrg {
   2178  1.1.1.2  mrg   return fma (x, y, z);
   2179  1.1.1.2  mrg }
   2180  1.1.1.2  mrg #endif
   2181  1.1.1.2  mrg 
   2182  1.1.1.2  mrg #ifndef HAVE_FMAL
   2183  1.1.1.2  mrg #define HAVE_FMAL 1
   2184  1.1.1.2  mrg long double fmal (long double, long double, long double);
   2185  1.1.1.2  mrg 
   2186  1.1.1.2  mrg long double
   2187  1.1.1.2  mrg fmal (long double x, long double y, long double z)
   2188  1.1.1.2  mrg {
   2189  1.1.1.2  mrg   return x * y + z;
   2190  1.1.1.2  mrg }
   2191  1.1.1.2  mrg #endif
   2192