RFR: 8375285: Port fdlibm asinh to Java [v3]

Anton Artemov aartemov at openjdk.org
Tue Jan 27 09:17:57 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...

Anton Artemov has updated the pull request incrementally with one additional commit since the last revision:

  8375285: Added versions.

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/29273/files
  - new: https://git.openjdk.org/jdk/pull/29273/files/d6ed1b89..ed1d4d3c

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=29273&range=02
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=29273&range=01-02

  Stats: 2 lines in 2 files changed: 2 ins; 0 del; 0 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