Hi, please consider the following changes:
This is a port of FDLIBM acosh method.
Original C vs transliteration port:
$ diff -w fdlib_acosh.c.txt Acosh.translit.java 1c1,3 < /* __ieee754_acosh(x) ---
/** * Return the Inverse Hyperbolic Cosine of x * 7,8c9,10 < * acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else < * acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
* := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else * := log1p(t+sqrt(2.0*t+t*t)); where t=x-1. 14,31c16,19 < < #include "fdlibm.h" < < #ifdef __STDC__ < static const double < #else < static double < #endif < one = 1.0, < ln2 = 6.93147180559945286227e-01; /* 0x3FE62E42, 0xFEFA39EF */ < < #ifdef __STDC__ < double __ieee754_acosh(double x) < #else < double __ieee754_acosh(x) < double x; < #endif < {
private static final class Acosh { private static final double one = 1.0; private static final double ln2 = 6.93147180559945286227e-01; static double compute(double x) { 41c29 < return __ieee754_log(x)+ln2; /* acosh(huge)=log(2x) */
return log(x)+ln2; /* acosh(huge)=log(2x) */
46c34 < return __ieee754_log(2.0*x-one/(x+sqrt(t-one))); ---
return log(2.0*x-one/(x+sqrt(t-one)));
49a38
}
Transliteration vs more idiomatic port:
$ diff -w Acosh.translit.java Acosh.fdlibm.java 5,7c5,9 < * Based on < * acosh(x) = log [ x + sqrt(x*x-1) ] < * we have ---
* * * acosh(x) is defined so that acosh(cosh(alpha)) = alpha, -INF < alpha < < INF * and cosh(acosh(x)) = x, 1 <= x < INF. * It can be written as acosh(x) = ln(x + sqrt(x^2 - 1)), 1 <= x < INF. 11a14,15 * * 16,17c20 < private static final class Acosh { < private static final double one = 1.0;
static final class Acosh { 18a22
23c27 < if(hx<0x3ff00000) { /* x < 1 */ ---
if(hx < 0x3ff00000) { // x < 1 */
25,26c29,30 < } else if(hx >=0x41b00000) { /* x > 2**28 */ < if(hx >=0x7ff00000) { /* x is inf of NaN */ ---
} else if (hx >= 0x41b00000) { // x > 2**28 if(hx >= 0x7ff00000) { // x is inf of NaN
28,29c32,34 < } else < return log(x)+ln2; /* acosh(huge)=log(2x) *...
Anton Artemov has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 11 commits: - 8376665: Resolved merge conflicts. - 8376665: Fixed definition of inverse cosh. - 8376665: Fixed range, added special test case. - 8376665: Fixed whitespaces. - 8376665: Fixed whitespaces. - 8376665: Ported fdlibm acosh function. Added tests. - Merge remote-tracking branch 'origin/master' into JDK-8375285-port-fdlibm-asinh-to-java - 8375285: Added versions. - 8375285: Addressed the reviewer's comments, fixed year in the copyright notice. - 8375285: Addressed the reviewer's comments. - ... and 1 more: https://git.openjdk.org/jdk/compare/56afb460...32e51c37 ------------- Changes: https://git.openjdk.org/jdk/pull/29488/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=29488&range=03 Stats: 582 lines in 7 files changed: 573 ins; 0 del; 9 mod Patch: https://git.openjdk.org/jdk/pull/29488.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/29488/head:pull/29488 PR: https://git.openjdk.org/jdk/pull/29488