Commit 860c1578 authored by Alex Henrie's avatar Alex Henrie Committed by Alexandre Julliard

msvcr120: Add atanh.

parent f1dad148
...@@ -17410,6 +17410,8 @@ for ac_func in \ ...@@ -17410,6 +17410,8 @@ for ac_func in \
acoshf \ acoshf \
asinh \ asinh \
asinhf \ asinhf \
atanh \
atanhf \
cbrt \ cbrt \
cbrtf \ cbrtf \
erf \ erf \
......
...@@ -2598,6 +2598,8 @@ AC_CHECK_FUNCS(\ ...@@ -2598,6 +2598,8 @@ AC_CHECK_FUNCS(\
acoshf \ acoshf \
asinh \ asinh \
asinhf \ asinhf \
atanh \
atanhf \
cbrt \ cbrt \
cbrtf \ cbrtf \
erf \ erf \
......
...@@ -136,9 +136,9 @@ ...@@ -136,9 +136,9 @@
@ cdecl atan2(double double) ucrtbase.atan2 @ cdecl atan2(double double) ucrtbase.atan2
@ cdecl -arch=arm,x86_64 atan2f(float float) ucrtbase.atan2f @ cdecl -arch=arm,x86_64 atan2f(float float) ucrtbase.atan2f
@ cdecl -arch=arm,x86_64 atanf(float) ucrtbase.atanf @ cdecl -arch=arm,x86_64 atanf(float) ucrtbase.atanf
@ stub atanh @ cdecl atanh(double) ucrtbase.atanh
@ stub atanhf @ cdecl atanhf(float) ucrtbase.atanhf
@ stub atanhl @ cdecl atanhl(double) ucrtbase.atanhl
@ stub cabs @ stub cabs
@ stub cabsf @ stub cabsf
@ stub cabsl @ stub cabsl
......
...@@ -2025,9 +2025,9 @@ ...@@ -2025,9 +2025,9 @@
@ cdecl -arch=arm,x86_64 atanf(float) MSVCRT_atanf @ cdecl -arch=arm,x86_64 atanf(float) MSVCRT_atanf
@ cdecl atan2(double double) MSVCRT_atan2 @ cdecl atan2(double double) MSVCRT_atan2
@ cdecl -arch=arm,x86_64 atan2f(float float) MSVCRT_atan2f @ cdecl -arch=arm,x86_64 atan2f(float float) MSVCRT_atan2f
@ stub atanh @ cdecl atanh(double) MSVCR120_atanh
@ stub atanhf @ cdecl atanhf(float) MSVCR120_atanhf
@ stub atanhl @ cdecl atanhl(double) MSVCR120_atanhl
@ cdecl -private atexit(ptr) MSVCRT_atexit # not imported to avoid conflicts with Mingw @ cdecl -private atexit(ptr) MSVCRT_atexit # not imported to avoid conflicts with Mingw
@ cdecl atof(str) MSVCRT_atof @ cdecl atof(str) MSVCRT_atof
@ cdecl atoi(str) MSVCRT_atoi @ cdecl atoi(str) MSVCRT_atoi
......
...@@ -1691,9 +1691,9 @@ ...@@ -1691,9 +1691,9 @@
@ cdecl -arch=arm,x86_64 atanf(float) msvcr120.atanf @ cdecl -arch=arm,x86_64 atanf(float) msvcr120.atanf
@ cdecl atan2(double double) msvcr120.atan2 @ cdecl atan2(double double) msvcr120.atan2
@ cdecl -arch=arm,x86_64 atan2f(float float) msvcr120.atan2f @ cdecl -arch=arm,x86_64 atan2f(float float) msvcr120.atan2f
@ stub atanh @ cdecl atanh(double) msvcr120.atanh
@ stub atanhf @ cdecl atanhf(float) msvcr120.atanhf
@ stub atanhl @ cdecl atanhl(double) msvcr120.atanhl
@ cdecl -private atexit(ptr) msvcr120.atexit @ cdecl -private atexit(ptr) msvcr120.atexit
@ cdecl atof(str) msvcr120.atof @ cdecl atof(str) msvcr120.atof
@ cdecl atoi(str) msvcr120.atoi @ cdecl atoi(str) msvcr120.atoi
......
...@@ -2944,6 +2944,72 @@ LDOUBLE CDECL MSVCR120_acoshl(LDOUBLE x) ...@@ -2944,6 +2944,72 @@ LDOUBLE CDECL MSVCR120_acoshl(LDOUBLE x)
} }
/********************************************************************* /*********************************************************************
* atanh (MSVCR120.@)
*/
double CDECL MSVCR120_atanh(double x)
{
double ret;
if (x > 1 || x < -1) {
MSVCRT_fenv_t env;
*MSVCRT__errno() = MSVCRT_EDOM;
/* on Linux atanh returns -NAN in this case */
MSVCRT_fegetenv(&env);
env.status |= MSVCRT__SW_INVALID;
MSVCRT_fesetenv(&env);
return NAN;
}
#ifdef HAVE_ATANH
ret = atanh(x);
#else
if (-1e-6 < x && x < 1e-6) ret = x + x*x*x/3;
else ret = (log(1+x) - log(1-x)) / 2;
#endif
if (!isfinite(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
return ret;
}
/*********************************************************************
* atanhf (MSVCR120.@)
*/
float CDECL MSVCR120_atanhf(float x)
{
#ifdef HAVE_ATANHF
double ret;
if (x > 1 || x < -1) {
MSVCRT_fenv_t env;
*MSVCRT__errno() = MSVCRT_EDOM;
MSVCRT_fegetenv(&env);
env.status |= MSVCRT__SW_INVALID;
MSVCRT_fesetenv(&env);
return NAN;
}
ret = atanhf(x);
if (!isfinite(ret)) *MSVCRT__errno() = MSVCRT_ERANGE;
return ret;
#else
return MSVCR120_atanh(x);
#endif
}
/*********************************************************************
* atanhl (MSVCR120.@)
*/
LDOUBLE CDECL MSVCR120_atanhl(LDOUBLE x)
{
return MSVCR120_atanh(x);
}
/*********************************************************************
* _scalb (MSVCRT.@) * _scalb (MSVCRT.@)
* scalbn (MSVCR120.@) * scalbn (MSVCR120.@)
* scalbln (MSVCR120.@) * scalbln (MSVCR120.@)
......
...@@ -2167,9 +2167,9 @@ ...@@ -2167,9 +2167,9 @@
@ cdecl atan2(double double) MSVCRT_atan2 @ cdecl atan2(double double) MSVCRT_atan2
@ cdecl -arch=arm,x86_64 atan2f(float float) MSVCRT_atan2f @ cdecl -arch=arm,x86_64 atan2f(float float) MSVCRT_atan2f
@ cdecl -arch=arm,x86_64 atanf(float) MSVCRT_atanf @ cdecl -arch=arm,x86_64 atanf(float) MSVCRT_atanf
@ stub atanh @ cdecl atanh(double) MSVCR120_atanh
@ stub atanhf @ cdecl atanhf(float) MSVCR120_atanhf
@ stub atanhl @ cdecl atanhl(double) MSVCR120_atanhl
@ cdecl atof(str) MSVCRT_atof @ cdecl atof(str) MSVCRT_atof
@ cdecl atoi(str) MSVCRT_atoi @ cdecl atoi(str) MSVCRT_atoi
@ cdecl atol(str) ntdll.atol @ cdecl atol(str) ntdll.atol
......
...@@ -50,6 +50,12 @@ ...@@ -50,6 +50,12 @@
/* Define to 1 if you have the <asm/user.h> header file. */ /* Define to 1 if you have the <asm/user.h> header file. */
#undef HAVE_ASM_USER_H #undef HAVE_ASM_USER_H
/* Define to 1 if you have the `atanh' function. */
#undef HAVE_ATANH
/* Define to 1 if you have the `atanhf' function. */
#undef HAVE_ATANHF
/* Define to 1 if you have the <AudioToolbox/AudioConverter.h> header file. */ /* Define to 1 if you have the <AudioToolbox/AudioConverter.h> header file. */
#undef HAVE_AUDIOTOOLBOX_AUDIOCONVERTER_H #undef HAVE_AUDIOTOOLBOX_AUDIOCONVERTER_H
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment