/********************************************************************* + * acosh (MSVCR120.@) + */ +double CDECL MSVCR120_acosh(double x) +{ + if (x < 1) { + *MSVCRT__errno() = MSVCRT_EDOM; + return NAN; + } +#ifdef HAVE_ACOSH + return acosh(x); +#else + if (!isfinite(x*x)) return log(2) + log(x); + return log(x + sqrt(x*x-1)); +#endif +} + +/********************************************************************* + * acoshf (MSVCR120.@) + */ +float CDECL MSVCR120_acoshf(float x) +{ +#ifdef HAVE_ACOSHF + return acoshf(x); +#else + return MSVCR120_acosh(x); +#endif +}
Thanks for the help. Are you sure that acosh and atanh require bounds checking, but acoshf and atanhf do not? Also, aren't they supposed to set an exception flag if x is less than 1?
-Alex