You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

#### 39 lines 837 B Raw Blame History

 ```#include "libm.h" ``` ``` ``` ```/* sinh(x) = (exp(x) - 1/exp(x))/2 ``` ``` * = (exp(x)-1 + (exp(x)-1)/exp(x))/2 ``` ``` * = x + x^3/6 + o(x^5) ``` ``` */ ``` ```double sinh(double x) ``` ```{ ``` ``` union {double f; uint64_t i;} u = {.f = x}; ``` ``` uint32_t w; ``` ``` double t, h, absx; ``` ``` ``` ``` h = 0.5; ``` ``` if (u.i >> 63) ``` ``` h = -h; ``` ``` /* |x| */ ``` ``` u.i &= (uint64_t)-1/2; ``` ``` absx = u.f; ``` ``` w = u.i >> 32; ``` ``` ``` ``` /* |x| < log(DBL_MAX) */ ``` ``` if (w < 0x40862e42) { ``` ``` t = expm1(absx); ``` ``` if (w < 0x3ff00000) { ``` ``` if (w < 0x3ff00000 - (26<<20)) ``` ``` /* note: inexact and underflow are raised by expm1 */ ``` ``` /* note: this branch avoids spurious underflow */ ``` ``` return x; ``` ``` return h*(2*t - t*t/(t+1)); ``` ``` } ``` ``` /* note: |x|>log(0x1p26)+eps could be just h*exp(x) */ ``` ``` return h*(t + t/(t+1)); ``` ``` } ``` ``` ``` ``` /* |x| > log(DBL_MAX) or nan */ ``` ``` /* note: the result is stored to handle overflow */ ``` ``` t = 2*h*__expo2(absx); ``` ``` return t; ``` ```} ``` ``` ```