RFR: 8375285: Port fdlibm asinh to Java

Anton Artemov aartemov at openjdk.org
Mon Jan 26 11:54:29 UTC 2026


Hi, please consider the following changes:

This is a port of FDLIBM asinh method.

Original C vs transliteration port:


$ diff -w fdlib_asinh.c Asinh.translit.java
1c1,3
< /* asinh(x)
---
> /**
> * Return the Inverse Hyperbolic Sine of x
> *
2a5
> *
10a14,17
> private static final class Asinh {
>       private static final double one = 1.0;
>       private static final double ln2 = 6.93147180559945286227e-01;
>       private static final double huge = 1.0e300;
12,29c19
< #include "fdlibm.h"
<
< #ifdef __STDC__
< static const double
< #else
< static double
< #endif
< one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
< ln2 =  6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
< huge=  1.00000000000000000000e+300;
<
< #ifdef __STDC__
<       double asinh(double x)
< #else
<       double asinh(x)
<       double x;
< #endif
< {
---
>       static double compute(double x) {
39c29
<           w = __ieee754_log(fabs(x))+ln2;
---
>                       w = log(Math.abs(x))+ln2;
41,42c31,32
<           t = fabs(x);
<           w = __ieee754_log(2.0*t+one/(sqrt(x*x+one)+t));
---
>                       t = Math.abs(x);
>                       w = log(2.0*t+one/(sqrt(x*x+one)+t));
45c35
<           w =log1p(fabs(x)+t/(one+sqrt(one+t)));
---
>                       w =log1p(Math.abs(x)+t/(one+sqrt(one+t)));
47a38
>       }

Transliteration port vs more idiomatic port:


$ diff -w Asinh.translit.java Asinh.fdlibm.java
6,9c6,12
< *  Based on
< *    asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ]
< *   we have
< *   asinh(x) := x  if  1+x*x=1,
---
>  *
>  *      asinh(x) is defined so that asinh(sinh(alpha)) = alpha -INF < alpha < < INF
>  *      and sinh(asinh(x)) = x, -INF < x  < INF.
>  *      It can be written as asinh(x) = ln(x + sqrt(x^2 + 1)), -INF < x  < INF.
>  *      1. Replace x by |x| as the function is odd.
>  *      2.
>  *          asinh(x) := x, if 1+x^2 = 1,
12a16,22
>  *
>  *
>  *
>  * Special cases:
>  *      only asinh(0)=0 is exact for finite x.
>  *      asinh(NaN) is NaN
>  *      asinh(INF) is INF
14,15c24
< private static final class Asinh {
<       private static final double one = 1.0;
---
> static final class Asinh {
24c33,35
<               if(ix>=0x7ff00000) return x+x;  /* x is inf or NaN */
---
>               if(ix >= 0x7ff00000) {
>                       return x + x;                       /* x is inf or NaN */
>               }
26c37,39
<                       if(huge+x>one) return x;    /* return x inexact except 0 */
---
>                       if(huge + x > 1.0) {
>                               return x;                       /* return x inexact except 0 */
>                       }
29c42
<                       w = log(Math.abs(x))+ln2;
---
>                       w = Log.compute(Math.abs(x)) + ln2;
32c45
<                       w = log(2.0*t+one/(sqrt(x*x+one)+t));
---
>                       w = Log.compute(2.0 * t + 1.0 / (Sqrt.compute(x * x + 1.0) + t));
35c48
<                       w =log1p(Math.abs(x)+t/(one+sqrt(one+t)));
---
>                       w = Log1p.compute(Math.abs(x) + t / (1.0 + Sqrt.compute(1.0 + t)));
37c50
<               if(hx>0) return w; else return -w;
---
>               return hx > 0 ? w : -w;

-------------

Commit messages:
 - 8375285: Addressed the reviewer's comments.
 - 8375285: Port of fdlibm asinh function

Changes: https://git.openjdk.org/jdk/pull/29273/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=29273&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8375285
  Stats: 584 lines in 7 files changed: 580 ins; 0 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/29273.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/29273/head:pull/29273

PR: https://git.openjdk.org/jdk/pull/29273


More information about the core-libs-dev mailing list