msvcrt: Import sinh implementation from musl.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Piotr Caban 2021-05-29 19:13:46 +02:00 committed by Alexandre Julliard
parent c395ec77d7
commit 739d4f0c94
3 changed files with 27 additions and 13 deletions

View File

@ -2527,9 +2527,33 @@ double CDECL sin( double x )
*/
double CDECL sinh( double x )
{
double ret = unix_funcs->sinh( x );
if (isnan(x)) return math_error(_DOMAIN, "sinh", x, 0, ret);
return ret;
UINT64 ux = *(UINT64*)&x;
UINT32 w;
double t, h, absx;
h = 0.5;
if (ux >> 63)
h = -h;
/* |x| */
ux &= (UINT64)-1 / 2;
absx = *(double*)&ux;
w = ux >> 32;
/* |x| < log(DBL_MAX) */
if (w < 0x40862e42) {
t = __expm1(absx);
if (w < 0x3ff00000) {
if (w < 0x3ff00000 - (26 << 20))
return x;
return h * (2 * t - t * t / (t + 1));
}
return h * (t + t / (t + 1));
}
/* |x| > log(DBL_MAX) or nan */
/* note: the result is stored to handle overflow */
t = __expo2(absx, 2 * h);
return t;
}
static BOOL sqrt_validate( double *x, BOOL update_sw )

View File

@ -268,14 +268,6 @@ static float CDECL unix_powf( float x, float y )
return powf( x, y );
}
/*********************************************************************
* sinh
*/
static double CDECL unix_sinh( double x )
{
return sinh( x );
}
/*********************************************************************
* sinhf
*/
@ -351,7 +343,6 @@ static const struct unix_funcs funcs =
unix_log2f,
unix_pow,
unix_powf,
unix_sinh,
unix_sinhf,
unix_tanh,
unix_tanhf,

View File

@ -46,7 +46,6 @@ struct unix_funcs
float (CDECL *log2f)(float x);
double (CDECL *pow)(double x, double y);
float (CDECL *powf)(float x, float y);
double (CDECL *sinh)(double x);
float (CDECL *sinhf)(float x);
double (CDECL *tanh)(double x);
float (CDECL *tanhf)(float x);