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